Mục Tiêu Chương 23
Sau khi hoàn thành chương này, bạn sẽ nắm vững các kỹ thuật bảo mật cơ bản cho hệ thống Linux
Bảo mật tài khoản người dùng
Giới hạn quyền truy cập root, đặt hạn tài khoản tạm thời, xóa tài khoản không dùng để giảm bề mặt tấn công.
Chính sách mật khẩu mạnh
Sử dụng PAM pwquality, faillock, shadow file để thực thi chính sách mật khẩu phức tạp và chống brute-force.
Bảo mật hệ thống file
chmod, chown, umask, tìm SUID/SGID nguy hiểm và cấu hình mount options an toàn cho filesystem.
Giám sát hệ thống
Sử dụng tripwire/AIDE, rkhunter, clamscan, auditd để phát hiện xâm nhập và giám sát toàn vẹn hệ thống.
Cập nhật bảo mật
Dùng dnf check-update --security, theo dõi CVE và áp dụng patches kịp thời để vá lỗ hổng bảo mật.
Kiểm tra dấu hiệu xâm nhập
Xem xét log hệ thống, quét rootkit, xác minh tính toàn vẹn package và phân tích audit trail.
Lý Thuyết
C1 Bảo Mật Tài Khoản Người Dùng
Nguyên tắc cơ bản
- Mỗi tài khoản chỉ dùng cho một người duy nhất — đảm bảo trách nhiệm giải trình (accountability)
- Giới hạn quyền truy cập root: dùng
sudothay vì đăng nhập trực tiếp vào root - Mọi lần dùng sudo được ghi lại tại
/var/log/securehoặc systemd journal - Đặt ngày hết hạn cho tài khoản tạm thời (interns, consultants)
- Xóa tài khoản không còn sử dụng để tránh backdoor
Đặt ngày hết hạn tài khoản với usermod
# usermod -e 2027-01-01 tim
# chage -l tim | grep Account
Account expires : Jan 01, 2027
Quản lý password aging với chage
# Xem thông tin aging hiện tại
# chage -l tim | grep days
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires: 7
# Đặt: max 90 ngày, cảnh báo 7 ngày trước
# chage -M 90 -W 7 tim
# Khóa tài khoản 5 ngày sau khi mật khẩu hết hạn
# chage -M 30 -I 5 tim
Cấu hình /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 5
PASS_WARN_AGE 7
PASS_MIN_LEN 12
Khóa / mở khóa tài khoản
# Khóa tài khoản
# usermod -L username
# passwd -l username
# Mở khóa tài khoản
# passwd -u username
# Xóa tài khoản và home directory
# userdel -r username
Tìm tài khoản đã hết hạn trong /etc/shadow
$ TODAY=$(( $(date --utc +%s) / 86400 ))
$ echo $TODAY
20202
# gawk -F: '{if (($8 > 0) && (ENVIRON["TODAY"] > $8)) print $1,$8}' /etc/shadow
consultant 19005
intern 19005
C2 Bảo Mật Mật Khẩu
/etc/passwd vs /etc/shadow
- /etc/passwd: Readable bởi tất cả user (-rw-r--r--). Trước đây chứa password hash — không còn an toàn
- /etc/shadow: Chỉ root đọc được (----------). Chứa password hash SHA-512, thông tin aging
- Password được hash (one-way) và salt (thêm giá trị ngẫu nhiên trước khi hash) để chống rainbow table
# ls -l /etc/passwd /etc/shadow
-rw-r--r--. 1 root root 1644 Feb 2 02:30 /etc/passwd
----------. 1 root root 1049 Feb 2 09:45 /etc/shadow
# tail -2 /etc/shadow
johndoe:$6$jJjdRN9/qELmb8xWM1LgOYGhEIxc/:15364:0:99999:7:::
tim:$6$z760AJ42$QXdhFyndpbVPVM5oVtNHs4B/:15372:5:30:7:16436::
PAM pwquality — Thực thi chính sách mật khẩu
$ grep -v '^#' /etc/security/pwquality.conf
minlen = 12
dcredit = 2
ucredit = 3
lcredit = 2
difok = 4
# minlen=12: tối thiểu 12 ký tự
# dcredit=2: ít nhất 2 chữ số
# ucredit=3: ít nhất 3 chữ hoa
# lcredit=2: ít nhất 2 chữ thường
# difok=4: ít nhất 4 ký tự khác mật khẩu cũ
PAM faillock — Chống brute-force
$ cat /etc/security/faillock.conf
deny = 5
unlock_time = 300
fail_interval = 900
# deny=5: khóa sau 5 lần nhập sai
# unlock_time=300: tự mở khóa sau 300 giây (5 phút)
# Xem trạng thái faillock của user
# faillock --user username
# Reset faillock
# faillock --user username --reset
C3 Bảo Mật Hệ Thống File
chmod và umask
# Phân quyền octal
$ chmod 750 /script.sh
rwxr-x--- (owner: rwx, group: r-x, other: ---)
# umask mặc định 022 → file tạo ra có 644, dir có 755
# umask bảo mật hơn 027 → file có 640, dir có 750
$ umask 027
$ umask
0027
Tìm file nguy hiểm có bit SUID/SGID
# Tìm tất cả file có SUID hoặc SGID bit
# find / -perm /4000 -o -perm /2000 2>/dev/null
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/su
/usr/bin/newgrp
# Chỉ tìm SUID (chạy với quyền owner)
# find / -perm -4000 -type f 2>/dev/null | xargs ls -la
Mount options bảo mật trong /etc/fstab
/dev/sda3 /tmp ext4 defaults,noexec,nosuid,nodev 0 0
/dev/sda4 /var ext4 defaults,nosuid 0 0
# noexec: không cho chạy binary từ /tmp
# nosuid: bỏ qua SUID/SGID bit trên filesystem này
# nodev: không cho dùng device files
File immutability với chattr
# Làm file không thể sửa/xóa dù là root
# chattr +i /etc/resolv.conf
# lsattr /etc/resolv.conf
----i--------e-- /etc/resolv.conf
# Gỡ bỏ immutable flag
# chattr -i /etc/resolv.conf
C4 Bảo Mật Phần Mềm và Dịch Vụ
- Nguyên tắc minimal install: chỉ cài những gì cần thiết
- Tắt các dịch vụ không dùng để thu hẹp attack surface
- Theo dõi CVE (Common Vulnerabilities and Exposures) thường xuyên
- Áp dụng security patches kịp thời
# Kiểm tra cập nhật bảo mật chưa áp dụng
# dnf check-update --security
kernel.x86_64 5.14.0-427.28.1.el9_4 baseos
openssl.x86_64 3.0.7-28.el9_4 baseos
# Xem danh sách advisory bảo mật
# dnf updateinfo list security
# Áp dụng toàn bộ security updates
# dnf update --security
# Kiểm tra các service đang chạy
# systemctl list-units --state=running --type=service
sshd.service loaded active running OpenSSH server daemon
firewalld.service loaded active running firewalld
# Tắt service không cần thiết
# systemctl disable --now cups.service
C5 Giám Sát Hệ Thống và Phát Hiện Xâm Nhập
AIDE — Advanced Intrusion Detection Environment
AIDE tạo database checksum của các file quan trọng. Sau đó so sánh định kỳ để phát hiện thay đổi trái phép.
# Cài đặt AIDE
# dnf install aide -y
# Khởi tạo database ban đầu (baseline)
# aide --init
AIDE initialized database at /var/lib/aide/aide.db.new.gz
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# Kiểm tra toàn vẹn so với baseline
# aide --check
AIDE found differences between database and filesystem!
Changed: /etc/passwd
Changed: /etc/shadow
rkhunter — Rootkit Hunter
# Cập nhật database rootkit
# rkhunter --update
[ Rootkit Hunter version 1.4.6 ]
Checking rkhunter data files...
Checking file mirrors.dat [ Updated ]
# Chạy kiểm tra toàn diện
# rkhunter --checkall
System checks summary
=====================
File properties checks: Passed
Rootkit checks: Passed
Application checks: Passed
ClamAV — Quét virus
# Cập nhật signature database
# freshclam
# Quét thư mục /home recursively
# clamscan -r /home
----------- SCAN SUMMARY -----------
Known viruses: 8677143
Scanned files: 4523
Infected files: 0
auditd — Linux Audit Framework
# Xem các audit rules đang áp dụng
# auditctl -l
-a always,exit -F arch=b64 -S open -k file_access
# Thêm rule: theo dõi truy cập /etc/passwd
# auditctl -w /etc/passwd -p wa -k passwd_changes
# Tìm kiếm sự kiện theo key
# ausearch -k passwd_changes
# Tạo báo cáo tổng hợp
# aureport --auth
Authentication Report
============================================
yes 42 root ssh 192.168.1.10 1234
Lab Thực Hành
Kiểm tra bảo mật cơ bản cho Linux server — thực hành từng bước theo thứ tự
Kiểm tra các tài khoản người dùng
Liệt kê tất cả tài khoản có UID >= 1000 (tài khoản người dùng thường, không phải system account)
$ cat /etc/passwd | awk -F: '$3>=1000{print}'
alice:x:1000:1000:Alice Smith:/home/alice:/bin/bash
bob:x:1001:1001:Bob Jones:/home/bob:/bin/bash
consultant:x:1002:1002::/home/consultant:/bin/bash
Kiểm tra mật khẩu và expiry
Xem thông tin aging của từng tài khoản và nội dung trong shadow file
# chage -l alice
Last password change : Mar 15, 2025
Password expires : Jun 13, 2025
Password inactive : never
Account expires : never
Minimum days between change : 5
Maximum days between change : 90
Number of days of warning : 7
# grep alice /etc/shadow
alice:$6$XxYy...:19800:5:90:7:::
Tìm file có quyền SUID/SGID nguy hiểm
Xác định các file có SUID bit — chạy với quyền của owner dù user bình thường gọi
# find / -perm /4000 2>/dev/null
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/su
/usr/bin/newgrp
/usr/bin/chfn
/tmp/suspicious_binary <-- NGUY HIỂM! Điều tra ngay
Cấu hình chính sách mật khẩu với PAM
Xem và điều chỉnh các tham số trong pwquality.conf để thực thi mật khẩu mạnh
# cat /etc/security/pwquality.conf
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
difok = 4
maxrepeat = 3
# Giá trị âm = số lượng tối thiểu bắt buộc
Cấu hình faillock
Thiết lập giới hạn đăng nhập sai để chặn tấn công brute-force
# cat /etc/security/faillock.conf
deny = 5
unlock_time = 300
fail_interval = 900
audit
# Kiểm tra user bị khóa
# faillock --user alice
alice:
When Type Source Valid
2025-03-20 10:30:05 TTY ssh V
Kiểm tra filesystem mounts
Xác minh các partition quan trọng được mount với options bảo mật
# cat /etc/fstab | grep -E 'noexec|nosuid'
/dev/sda3 /tmp ext4 defaults,noexec,nosuid,nodev 0 0
/dev/sda5 /var ext4 defaults,nosuid 0 0
# Xác minh mount options đang áp dụng
$ mount | grep /tmp
/dev/sda3 on /tmp type ext4 (rw,nosuid,nodev,noexec,relatime)
Chạy rkhunter để kiểm tra rootkit
Quét hệ thống tìm rootkit, backdoor và các file binary bị thay đổi
# rkhunter --checkall --report-warnings-only
[ Rootkit Hunter version 1.4.6 ]
Checking system commands...
/usr/bin/awk [ OK ]
/usr/bin/basename [ OK ]
Checking for rootkits...
Suckit Rootkit [ Not found ]
Adore Rootkit [ Not found ]
System checks summary: No warnings found.
Thiết lập AIDE
Khởi tạo baseline database và thực hiện kiểm tra toàn vẹn hệ thống file
# Bước 1: Khởi tạo database
# aide --init
AIDE initialized database at /var/lib/aide/aide.db.new.gz
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# Bước 2: Kiểm tra (chạy định kỳ qua cron)
# aide --check
AIDE found differences between database and filesystem!
Summary:
Total number of files: 45231
Added files: 0
Removed files: 0
Changed files: 2
Changed: /etc/passwd
Changed: /etc/group
Câu Hỏi Ôn Tập
10 câu hỏi củng cố kiến thức về bảo mật Linux cơ bản
Sự khác nhau giữa /etc/passwd và /etc/shadow là gì?
/etc/passwd có thể đọc bởi mọi user (permissions: -rw-r--r--), chứa thông tin tài khoản cơ bản nhưng KHÔNG chứa password hash. /etc/shadow chỉ root đọc được (permissions: ----------), chứa password hash SHA-512 đã được salt, cùng với thông tin aging (ngày đổi mật khẩu, ngày hết hạn, số ngày cảnh báo...). Tách biệt này bảo vệ hash khỏi bị đọc bởi rainbow table attacks.
Lệnh nào dùng để đặt ngày hết hạn mật khẩu cho user?
Dùng lệnh chage với các tùy chọn: chage -M 90 -W 7 username — đặt tối đa 90 ngày trước khi phải đổi, cảnh báo 7 ngày trước. Hoặc dùng chage -M 30 -I 5 username để khóa tài khoản 5 ngày sau khi mật khẩu hết hạn. Lệnh chage -l username để xem thông tin hiện tại.
umask 027 có nghĩa là gì với file permissions?
umask 027 nghĩa là: file mới tạo sẽ có permissions 640 (rw-r-----), directory mới tạo sẽ có 750 (rwxr-x---). Tính bằng cách lấy max permissions (666 cho file, 777 cho dir) trừ đi umask (027): file = 666-027 = 640, dir = 777-027 = 750. "Other" (người ngoài group) không có quyền gì cả — an toàn hơn umask mặc định 022.
Tại sao SUID bit trên file nhị phân có thể gây rủi ro bảo mật?
SUID (Set User ID) bit khiến chương trình chạy với quyền của owner file thay vì user đang gọi. Nếu một binary thuộc root có SUID và có lỗ hổng (buffer overflow, command injection...), attacker có thể lợi dụng để thực thi lệnh với quyền root — dù chỉ là user thường. Đây là kỹ thuật privilege escalation phổ biến. Cần kiểm tra định kỳ bằng find / -perm /4000 và loại bỏ SUID trên các file không cần thiết.
PAM faillock hoạt động như thế nào?
faillock theo dõi số lần đăng nhập thất bại của mỗi user. Khi vượt quá ngưỡng deny (mặc định 5 lần) trong khoảng thời gian fail_interval (900 giây), tài khoản bị khóa tạm thời. Sau unlock_time giây (300 = 5 phút), tài khoản tự mở lại. Admin có thể dùng faillock --user username --reset để mở ngay. Cơ chế này bảo vệ khỏi brute-force attacks.
Sự khác nhau giữa rkhunter và AIDE?
rkhunter (Rootkit Hunter): Chuyên phát hiện rootkit, backdoor, và so sánh binary hệ thống với known-good hashes từ database của nó. Tập trung vào phát hiện malware đã biết. AIDE (Advanced Intrusion Detection Environment): Tạo baseline checksum của toàn bộ filesystem, sau đó so sánh định kỳ để phát hiện BẤT KỲ thay đổi nào — dù là thêm/xóa/sửa file. AIDE phát hiện cả thay đổi không mong muốn không nhất thiết là malware.
Lệnh nào kiểm tra các cập nhật bảo mật chưa áp dụng?
Trên RHEL/Fedora/CentOS dùng: dnf check-update --security — liệt kê các package có security updates. dnf updateinfo list security — xem danh sách advisory kèm mã CVE. dnf update --security — áp dụng tất cả security updates. Nên tích hợp vào cron job để tự động kiểm tra hàng ngày và gửi email cảnh báo khi có patches mới.
Tại sao mount /tmp với tùy chọn noexec?
/tmp là thư mục có thể ghi bởi mọi user — attacker thường upload malware hoặc exploit script vào đây. Option noexec ngăn không cho thực thi bất kỳ binary nào từ /tmp, kể cả khi file đã được chmod +x. Kết hợp với nosuid (bỏ qua SUID bit) và nodev (không cho dùng device files), đây là lớp bảo vệ quan trọng chống privilege escalation qua /tmp.
chattr +i làm gì với một file?
chattr +i đặt thuộc tính immutable (bất biến) cho file. Khi đó, không ai — kể cả root — có thể sửa, xóa, rename, hay tạo hard link tới file đó cho đến khi thuộc tính được gỡ bỏ bằng chattr -i. Hữu ích để bảo vệ file cấu hình quan trọng như /etc/resolv.conf, /etc/hosts. Dùng lsattr để xem các attributes hiện tại.
Auditd được dùng để làm gì trong Linux security?
auditd là Linux Audit Framework — ghi lại chi tiết các sự kiện bảo mật: ai đọc/ghi file nào, ai dùng lệnh gì, thay đổi quyền, đăng nhập thành công/thất bại... Dùng auditctl để thêm rules theo dõi, ausearch để tìm kiếm sự kiện theo keyword/user/file, aureport để tạo báo cáo tổng hợp. Audit logs được lưu tại /var/log/audit/audit.log và rất quan trọng cho forensics và compliance (PCI-DSS, HIPAA).