Có nhiều khía cạnh cần bảo mật trên các hệ thống Linux - từ việc thiết lập tài khoản để đảm bảo rằng người dùng khác không có nhiều đặc quyền hơn những gì họ cần để thực hiện công việc. Đây là một số lệnh bảo mật quan trọng nhất cho công việc hàng ngày trên các hệ thống Linux.
Mỗi lệnh Linux cơ bản dưới đây đều được nêu rõ chức năng, nhiệm vụ, ví dụ, cách viết lệnh. Một số lệnh đã quá quen thuộc với người dùng Linux lâu năm, tuy nhiên vẫn có những lệnh khá mới mẻ. Nếu là người quan tâm đến các vấn đề bảo mật trên hệ thống Linux của mình, bạn đừng bỏ qua những lệnh bảo mật hữu ích này nhé.
22 lệnh bảo mật Linux
Lệnh sudo
Chạy các lệnh đặc quyền với sudo, thay vì chuyển người dùng thành root, là một hành động cần thiết vì nó giúp đảm bảo rằng bạn chỉ sử dụng đặc quyền root khi cần và hạn chế tác động của các lỗi xảy ra. Quyền truy cập của bạn vào lệnh sudo phụ thuộc vào các thiết lập trong file /etc/sudoers và /etc/group.
$ sudo adduser shark
Adding user `shark' ...
Adding new group `shark' (1007) ...
Adding new user `shark' (1007) with group `shark' ...
Creating home directory `/home/shark' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for shark
Enter the new value, or press ENTER for the default
Full Name []: shark
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
Ví dụ, nếu bạn chạy sudo và muốn tìm hiểu vai trò của mình là gì, bạn sẽ nhận được xác nhận rằng bạn đang chạy lệnh dưới dạng root.
$ sudo whoami
root
Nếu bạn quản lý thiết lập sudo cho nhiều người dùng, bạn cũng sẽ thấy thoải mái với lệnh visudo.
Lệnh visudo
Lệnh visudo cho phép bạn thay đổi file /etc/sudoers bằng cách mở file trong trình soạn thảo văn bản và kiểm tra các thay đổi của bạn đối với cú pháp. Chạy lệnh “sudo visudo” và chắc chắn rằng bạn hiểu rõ về cú pháp. Các đặc quyền có thể được gán bởi một người dùng hoặc theo nhóm. Trên hầu hết các hệ thống Linux, file /etc/sudoers sẽ được cấu hình với các nhóm giống như được hiển thị bên dưới, cho phép các đặc quyền được gán cho các nhóm được thiết lập trong file /etc/group. Trong những trường hợp đó, bạn hoàn toàn không cần phải sử dụng lệnh visudo, mà chỉ cần làm quen với các nhóm có đặc quyền root theo cách này, và thực hiện các cập nhật của bạn cho file /etc/group.
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
%wheel ALL=(ALL:ALL) ALL
Lưu ý: Tên nhóm có ký hiệu % đứng trước.
Bạn có thể hiển thị nhóm cung cấp truy cập sudo trong file /etc/group của bạn như sau:
$ egrep "admin|sudo|wheel" /etc/group
sudo:x:27:shs,jdoe
Cách dễ nhất để cung cấp cho ai đó đặc quyền sudo là thêm chúng vào nhóm được uỷ quyền trong /etc/group. Tuy nhiên, điều đó có nghĩa là họ có thể chạy bất kỳ lệnh nào dưới dạng root. Nếu bạn muốn một số người dùng có quyền root cho một nhóm lệnh nhất định (ví dụ, thêm và xóa tài khoản), bạn có thể xác định các lệnh bạn muốn họ có thể chạy qua lệnh như sau:
Cmnd_Alias ACCT_CMDS = /usr/sbin/adduser, /usr/sbin/deluser
Sau đó cung cấp cho người dùng hoặc nhóm người dùng khả năng chạy các lệnh này bằng sudo với một lệnh như sau:
nemo ALL=(ALL) ACCT_CMDS
%techs ALL=(ALL:ALL) ACCT_CMDS
Dòng đầu tiên cho phép người dùng "Nemo" chạy các lệnh twp (adduser và deluser) với sudo, trong khi lệnh thứ hai gán cùng các đặc quyền cho bất kỳ ai thuộc nhóm "tech" trong file /etc/group.
Lệnh who và w
Lệnh who và w cho bạn biết ai đã đăng nhập vào hệ thống, trong đó w hiển thị thêm thông tin, như nơi họ đăng nhập, khi nào họ đăng nhập và thời gian họ đăng nhập là bao lâu.
$ w
18:03:35 up 9 days, 22:48, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
joe tty2 /dev/tty2 27Apr18 9days 7:34 0.09s /usr/lib/x86_64-linux
shs pts/1 192.168.0.15 09:50 7.00s 0.28s 0.00s w
Sử dụng lệnh "sudo update-alternatives – config editor", nếu bạn không thích dùng trình soạn thảo mặc định được gọi khi chạy lệnh visudo. Nó sẽ cung cấp một số trình chỉnh sửa tùy chọn và thay đổi cài đặt của bạn.
Lệnh last
Lệnh last hiển thị cho bạn thông tin đăng nhập gần đây của người dùng và thường hữu ích khi bạn đang cố gắng theo dõi các thay đổi hoặc hoạt động khác.
$ last nemo
nemo pts/1 192.168.0.15 Wed May 2 07:01 - 08:29 (01:27)
wtmp begins Tue May 1 10:21:35 2018
“Nemo” đã không đăng nhập trong một thời gian. Anh ấy có thể đi nghỉ mát (hoặc có thể đi câu cá?) hay vừa mới rời công ty. Loại thông tin này có thể hữu ích trong việc quyết định xem, bạn có cần theo dõi điều này hay không.
Lệnh find
Lệnh find được sử dụng cho nhiều loại tìm kiếm. Khi nói đến bảo mật, bạn có thể thấy mình đang tìm kiếm các file không có chủ sở hữu (không có tài khoản tương ứng) hoặc các file mà bất cứ ai cũng có thể ghi và thực thi được. Lệnh find rất dễ thực hiện, nhưng yêu cầu một số tính năng quen thuộc và nhiều tùy chọn để xác định những gì bạn đang tìm kiếm. Lệnh đầu tiên trong hai lệnh này sẽ tìm các file không có chủ sở hữu xác định. Lệnh thứ hai sẽ tìm thấy các file mà bất kỳ ai cũng có thể chạy và sửa đổi.
$ sudo find /home -nouser
$ sudo find / -perm -o=wx
Hãy nhớ rằng -o trong lệnh thứ hai chỉ nhóm "other" - không phải là chủ sở hữu và không phải là nhóm được liên kết với các file.
Lệnh file
Lệnh file xem xét một file và xác định loại file dựa trên nội dung của file đó, chứ không phải tên file. File “.jpg” trong ví dụ bên dưới rõ ràng không phải là file .jpeg thực, mà là file thực thi.
jdoe@stinkbug:~$ ls -l
total 24
-rw-r--r-- 1 root root 0 Apr 13 09:59 empty
-rwxr-xr-x 1 jdoe jdoe 18840 May 10 17:39 myphoto.jpg
-rwx------ 1 jdoe jdoe 24 May 2 07:06 trythis
jdoe@stinkbug:~$ file myphoto.jpg
myphoto.jpg: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=5d19f7a492405ea9b022a9aa8151f6fb4143633d, stripped
Lệnh which
Lệnh which xác định file thực thi sẽ chạy khi bạn gõ tên của nó. Điều này không phải lúc nào cũng giống như bạn nghĩ. Nếu một Trojan đã được chèn vào hệ thống file ở một vị trí hiển thị trong đường dẫn tìm kiếm của bạn, nó sẽ được chạy thay thế. Đây là lý do chính đáng để đảm bảo rằng đường dẫn tìm kiếm của bạn bao gồm các thư mục như /usr/bin, trước khi nó thêm các vị trí kém chuẩn hơn và đặc biệt là trước "." (thư mục hiện hành).
$ which date
/usr/local/bin/date <=== probably not what we wanted
Bạn có thể kiểm tra đường dẫn tìm kiếm của người dùng bằng cách chuyển sang vai trò người dùng và làm như sau:
shs@stinkbug:~$ sudo su - nemo
nemo@stinkbug:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin
Ngay cả khi đường dẫn tìm kiếm của người dùng được thiết lập trong file hệ thống như /etc/profile hoặc /etc/bash.bashrc, chúng có thể đã bị thay đổi bởi các cài đặt cục bộ.
$ which date
/usr/local/bin/date <=== probably not what we wanted
Lệnh ss
Lệnh ss là một công cụ để điều tra các socket và cho phép bạn làm những việc như hiển thị các cổng nghe và các kết nối hoạt động. Nếu không thêm một số điều kiện, ss sẽ hiển thị nhiều thông tin hơn những gì bạn có thể muốn xem xét. Sau tất cả, nhiều phần của hệ điều hành giao tiếp thông qua các socket. Nếu bạn muốn tạo danh sách các kết nối đã được thiết lập hoặc các cổng nghe (nghĩa là các dịch vụ có sẵn cho các hệ thống bên ngoài), các lệnh như thế này sẽ rất hữu ích.
Cho các kết nối được thiết lập:
$ ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 224 192.168.0.20:ssh 192.168.0.15:56647
$ ss | grep ESTAB | grep tcp
tcp ESTAB 0 64 192.168.0.20:ssh 192.168.0.15:64885
Cho các cổng nghe:
$ ss -ltn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 5 127.0.0.1:631 *:*
LISTEN 0 50 *:445 *:*
LISTEN 0 50 *:139 *:*
LISTEN 0 128 *:5355 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 5 ::1:631 :::*
LISTEN 0 50 :::445 :::*
LISTEN 0 128 :::5355 :::*
LISTEN 0 50 :::139 :::*
Lưu ý: Cổng 631 (CUPS) chỉ nghe trên giao diện loopback (127.0.0.1).
Lệnh ufw
Nếu bạn đang chạy tường lửa trên hệ thống Linux của mình - một bước quan trọng để kiểm soát quyền truy cập vào hệ thống, các lệnh được sử dụng để bắt đầu/kết thúc, bật/tắt, sửa đổi và hiển thị trạng thái hoặc các quy tắc hoạt động là rất quan trọng. Dưới đây là một số lệnh mẫu cho ufw mà bạn sẽ tìm thấy trên nhiều hệ thống Ubuntu:
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22 ALLOW IN 192.168.0.0/24
Tường lửa này đang hoạt động và chỉ cho phép các kết nối từ mạng cục bộ đến ssh. Các lệnh sau đây sẽ:
- Thiết lập quy tắc được hiển thị ở trên
- Vô hiệu hóa tường lửa.
$ sudo ufw allow from 192.168.0.0/24 to any port 22
$ sudo ufw disable
Lệnh iptables
Điều quan trọng là phải biết cách liệt kê các quy tắc tường lửa cho iptables. Các lệnh này sẽ cung cấp cho bạn một danh sách đầy đủ các quy tắc netfilter:
sudo iptables -vL -t filter
sudo iptables -vL -t nat
sudo iptables -vL -t mangle
sudo iptables -vL -t raw
sudo iptables -vL -t security
Lệnh ip
Lệnh ip cho phép bạn hiển thị thông tin trên các giao diện mạng của mình. Trong ví dụ bên dưới, chúng ta sẽ thấy loopback (vòng lặp) và giao diện công khai.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff
inet 192.168.0.20/24 brd 192.168.0.255 scope global dynamic enp0s25
valid_lft 59794sec preferred_lft 59794sec
inet6 fe80::f233:4f72:4556:14c2/64 scope link
valid_lft forever preferred_lft forever
Lệnh ip route
Lệnh ip route sẽ hiển thị bảng định tuyến của bạn:
$ ip route
default via 192.168.0.1 dev enp0s25 proto static metric 100
169.254.0.0/16 dev enp0s25 scope link metric 1000
192.168.0.0/24 dev enp0s25 proto kernel scope link src 192.168.0.20 metric 100
Lệnh kill, pkill và killall
Các hệ thống Unix và Linux cung cấp một lựa chọn thuận tiện cho các lệnh để chấm dứt các tiến trình, bất cứ khi nào bạn muốn. Bạn có thể kết thúc bằng ID của tiến trình hoặc theo tên của nó. Bạn có thể kết thúc từng tiến trình một hoặc theo nhóm. Trong bất kỳ trường hợp nào, các lệnh kết thúc khác nhau đều có sẵn cho bạn sử dụng khi cần thiết. Những ví dụ bao gồm:
$ kill 1234
$ pkill bad
$ killall badproc
Lệnh passwd
Lệnh passwd có lẽ là khá rõ ràng khi nói đến bảo mật hệ thống, nhưng nó không nên bị bỏ qua trong bất kỳ danh sách cần thiết về bảo mật nào. Thay đổi mật khẩu, đặc biệt là khi nhiều người dùng đến rồi đi hoặc vai trò của họ thay đổi, là rất quan trọng.
Tuy nhiên, lệnh passwd không chỉ được sử dụng để thay đổi mật khẩu. Bạn cũng có thể sử dụng nó với đặc quyền sudo để thay đổi mật khẩu của người dùng khác, khóa/mở khóa hoặc làm tài khoản hết hạn, kiểm tra trạng thái tài khoản và thay đổi cài đặt để xác định thời điểm mật khẩu hết hạn hoặc cảnh báo mật khẩu thời gian.
Kiểm tra trang man (man passwd) để biết chi tiết và sử dụng các lệnh như sau:
$ sudo passwd nemo <== change nemo's password
$ sudo passwd -e dory <== expire dory's password (forces her to reset it)
$ sudo passwd -i shark <== disable shark's account
Lệnh pwck
Lệnh pwck thực hiện kiểm tra trên các file /etc/passwd và /etc/shadow của bạn, đảm bảo các trường bắt buộc có mặt, các file và thư mục tồn tại, v.v...
$ sudo pwck
user 'squash': directory '/home/squash' does not exist
user 'squash': program '/bin/bsh' does not exist
Lệnh setfacl và getfacl
Đừng để rwxr-x --- đánh lừa bạn rằng đây là tất cả những gì cần có để cấp quyền cho các file trên các hệ thống Linux. Với lệnh setfacl và getfacl, bạn có thể cấp quyền cho ai đó không phải là chủ sở hữu của file và không phải là thành viên của nhóm được liên kết (và bạn cũng không muốn họ trở thành thành viên của nhóm này) truy cập vào file. Giả sử bạn muốn “Nemo” có quyền đọc đối với một file phác thảo hướng dẫn thiết lập ufw của bạn và chỉ vậy thôi. Sử dụng lệnh như sau để sửa đổi danh sách điều khiển truy cập (ACL) cho file:
$ setfacl -m u:nemo:r ufw-setup
Lệnh getfacl sau đó sẽ hiển thị rằng thay đổi đã được thực hiện:
$ getfacl ufw-setup
# file: ufw-setup
# owner: shs
# group: shs
user::rwx
user:nemo:r-- <===
group::rw- #effective:r--
mask::r--
other::---
Lệnh sestatus & apparmor
Lệnh sestatus và apparmor có thể hiển thị trạng thái của các công cụ SELinux và apparmor, cung cấp sự cách ly giữa các ứng dụng sử dụng điều khiển truy cập bắt buộc. Nếu bạn đang sử dụng một hoặc các công cụ khác, bạn nên biết cách hiển thị trạng thái của chúng.
sestatus
$ sudo sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
apparmor
$ sudo apparmor_status
apparmor module is loaded.
18 profiles are loaded.
18 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/evince
/usr/bin/evince-previewer
/usr/bin/evince-previewer//sanitized_helper
/usr/bin/evince-thumbnailer
/usr/bin/evince-thumbnailer//sanitized_helper
/usr/bin/evince//sanitized_helper
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/connman/scripts/dhclient-script
/usr/lib/cups/backend/cups-pdf
/usr/lib/snapd/snap-confine
/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
/usr/sbin/cups-browsed
/usr/sbin/cupsd
/usr/sbin/cupsd//third_party
/usr/sbin/ippusbxd
/usr/sbin/tcpdump
0 profiles are in complain mode.
3 processes have profiles defined.
3 processes are in enforce mode.
/sbin/dhclient (705)
/usr/sbin/cups-browsed (30173)
/usr/sbin/cupsd (26828)
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
Bạn cũng nên biết cách bắt đầu và dừng các công cụ này.
$ sudo /etc/init.d/apparmor start
$ sudo /etc/init.d/apparmor stop
$ sudo /etc/init.d/apparmor restart
Đối với SELinux, các chế độ khác nhau đại diện cho:
enforcing -- SELinux security policy is enforced
permissive -- SELinux prints warnings instead of enforcing
disabled -- SELinux is fully disabled
Nhiều lệnh trên các hệ thống Linux có thể giúp bạn quản lý bảo mật. Các mô tả ở trên chỉ giới thiệu các lệnh này, nhưng không giải thích mọi thứ về cách chúng hoạt động hoặc có thể được sử dụng.