Mục tiêu chương / Learning objectives
- Mô tả cấu trúc Linux Filesystem Hierarchy Standard (FHS) và ý nghĩa bảo mật của từng thư mục.
- Tính toán và áp dụng quyền Unix (rwx/octal), giải thích rủi ro của SUID/SGID/Sticky bit.
- Quản lý người dùng và nhóm qua
/etc/passwd,/etc/shadow,/etc/sudoersmột cách an toàn. - Quản lý dịch vụ bằng systemd, phân tích log hệ thống bằng journalctl.
- Cài đặt và quản lý gói phần mềm bằng apt/yum; thực hiện hardening SSH toàn diện.
- Cấu hình tường lửa ufw và triển khai fail2ban để chống brute force.
1. Lý thuyết cốt lõi / Core theory
1.1. Cấu trúc hệ thống tập tin Linux / Linux filesystem hierarchy
Linux tuân theo chuẩn FHS (Filesystem Hierarchy Standard), tổ chức toàn bộ hệ thống dưới thư mục gốc / (root). Các thư mục quan trọng từ góc nhìn bảo mật:
/etc — Cấu hình hệ thống. Chứa passwd, shadow, sudoers, sshd_config. Mục tiêu đọc của attacker./var/log — Log hệ thống. auth.log, syslog, journal. Nguồn chứng cứ số quan trọng nhất./home — Thư mục cá nhân người dùng. Chứa .ssh/authorized_keys, .bash_history./proc — Filesystem ảo, thông tin runtime của kernel và tiến trình. Không lưu trên đĩa./tmp — Thư mục tạm, ai cũng có thể ghi. Malware thường giải nén và chạy từ đây./bin /sbin /usr/bin — Binary hệ thống. Thay đổi bất thường = dấu hiệu rootkit.1.2. Mô hình phân quyền Unix / Unix permission model
Mỗi file/directory Linux có ba bộ quyền: Owner (u), Group (g), Others (o). Mỗi bộ gồm: r (read=4), w (write=2), x (execute=1). Biểu diễn dạng octal: chmod 750 script.sh → Owner: rwx (7), Group: r-x (5), Others: --- (0).
Ba bit đặc biệt cực kỳ quan trọng từ góc nhìn bảo mật:
Cảnh báo bảo mật — SUID/SGID/Sticky Bit:
- SUID (Set User ID — bit 4000): File chạy với quyền của owner, không phải người chạy. Ví dụ:
/usr/bin/passwdcó SUID của root để user thường có thể đổi mật khẩu. Nguy hiểm nếu một file SUID tùy ý bị kẻ tấn công khai thác — sẽ có shell root. - SGID (Set Group ID — bit 2000): Tương tự SUID nhưng theo group. Trên directory: file tạo trong đó kế thừa group của thư mục.
- Sticky Bit (bit 1000): Trên directory (vd
/tmp): chỉ owner của file mới được xóa file của mình, dù directory có quyền write chung. Bảo vệ file dùng chung.
Lệnh chmod thay đổi quyền, chown thay đổi owner/group. Mặc định khi tạo file mới, quyền được xác định bởi umask — giá trị umask phổ biến là 022 (tạo file với 644, thư mục với 755).
1.3. Quản lý người dùng & sudoers / Users, groups & sudo
Ba file then chốt trong quản lý tài khoản Linux: /etc/passwd (thông tin user: tên, UID, GID, home, shell — đọc được bởi mọi người), /etc/shadow (mật khẩu đã hash — chỉ root đọc được, đây là mục tiêu của password cracking), /etc/group (nhóm và thành viên).
/etc/sudoers (chỉnh sửa qua visudo) xác định ai được dùng sudo và để chạy lệnh nào. Cú pháp: user ALL=(ALL:ALL) ALL — nghĩa là user này có thể chạy mọi lệnh trên mọi host với mọi quyền. Nguyên tắc bảo mật: chỉ cấp quyền sudo cho lệnh cụ thể cần thiết, không cấp ALL tùy tiện.
1.4. systemd & Quản lý gói phần mềm / systemd & package management
systemd là init system hiện đại trên hầu hết distro Linux, quản lý toàn bộ service (unit). Các lệnh cơ bản: systemctl start/stop/restart/status <service>, systemctl enable/disable <service> (bật/tắt autostart). Log của service xem qua journalctl -u <service>. Bảo mật: kiểm tra service lạ autostart là bước rà soát persistence trên Linux.
Package management: Debian/Ubuntu dùng apt, RHEL/CentOS dùng yum/dnf. Nguyên tắc bảo mật: luôn cập nhật package (apt upgrade), chỉ cài từ repository chính thức, xác minh GPG signature của package. Mỗi package cũ chưa vá = bề mặt tấn công tiềm năng.
1.5. Tường lửa ufw & SSH Hardening / Firewall & SSH hardening
ufw (Uncomplicated Firewall) là frontend thân thiện cho iptables trên Ubuntu. Các lệnh cơ bản: ufw allow/deny <port>, ufw enable/disable, ufw status verbose. ufw cũng hỗ trợ rate limiting: ufw limit 22/tcp — chặn IP sau 6 kết nối thất bại trong 30 giây.
SSH Hardening — 5 thay đổi quan trọng nhất trong /etc/ssh/sshd_config:
PermitRootLogin no— Tắt đăng nhập trực tiếp root qua SSH.PasswordAuthentication no— Chỉ cho phép xác thực bằng SSH key (khóa công khai), không dùng mật khẩu.MaxAuthTries 3— Giới hạn 3 lần thử xác thực mỗi kết nối.AllowUsers deploy admin— Chỉ những user được liệt kê mới được SSH vào.Port 2222— Đổi cổng khỏi mặc định 22 (giảm noise từ bot scanner, không phải biện pháp bảo mật thực sự).
2. Bài thực hành / Hands-on labs
Lab 1 — Rà soát bảo mật hệ thống Linux
OS: Ubuntu 22.04 LTS · Tool: Bash (Terminal)
- Tìm tất cả file có SUID bit — đây là bước rà soát tiêu chuẩn khi kiểm tra hệ thống lạ:
# Tìm tất cả file SUID (chạy với quyền owner, thường là root)
find / -perm -4000 2>/dev/null
# Tìm file SGID
find / -perm -2000 2>/dev/null
# Tìm file world-writable (ai cũng ghi được — rủi ro cao)
find / -perm -o+w -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null | head -20
# Xem thông tin người dùng trong hệ thống
getent passwd | awk -F: '$3 >= 1000 {print $1, $3, $6, $7}'
# Kiểm tra ai có shell đăng nhập (không phải /usr/sbin/nologin hoặc /bin/false)
grep -v "nologin\|false" /etc/passwd | awk -F: '{print $1, $7}'
Kết quả mong đợi / Expected output: Danh sách file SUID thường thấy: /usr/bin/passwd, /usr/bin/sudo, /usr/bin/su — đây là bình thường. Nếu thấy file lạ (vd /tmp/backdoor) có SUID root — đây là dấu hiệu compromise nghiêm trọng. getent passwd hiển thị user có UID ≥ 1000 (user thường). Xem ai có shell login giúp phát hiện tài khoản dịch vụ bị cấu hình sai.
- Kiểm tra cấu hình sudo, dịch vụ đang chạy và log SSH:
# Xem file sudoers (cần sudo để đọc)
sudo cat /etc/sudoers | grep -v "^#" | grep -v "^$"
# Xem các dịch vụ đang lắng nghe trên cổng mạng
ss -tlnp
# Xem trạng thái dịch vụ SSH
sudo systemctl status ssh
# Xem log SSH của ngày hôm nay
sudo journalctl -u ssh --since today
# Xem log xác thực (auth.log) — nguồn điều tra brute force
sudo tail -50 /var/log/auth.log
# Đếm số lần đăng nhập SSH thất bại theo IP
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10
Kết quả mong đợi: ss -tlnp cho thấy sshd đang lắng nghe trên :22. auth.log ghi lại mọi lần đăng nhập SSH — nếu thấy hàng nghìn dòng "Failed password" từ cùng một IP, đây là brute force attack đang diễn ra. Lệnh cuối đếm số lần thất bại theo IP — IP nào có số lần lớn nhất cần block ngay.
Lab 2 — SSH Hardening & Cấu hình tường lửa ufw
OS: Ubuntu 22.04 LTS · Tool: Bash + nano (hoặc vim)
⚠ Cảnh báo: Thực hiện trong môi trường lab hoặc đảm bảo còn phiên SSH khác đang mở trước khi thay đổi cấu hình SSH.
- Hardening file cấu hình SSH:
# Backup file cấu hình gốc trước khi thay đổi
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# Chỉnh sửa cấu hình SSH
sudo nano /etc/ssh/sshd_config
# Các dòng cần thay đổi/thêm:
# PermitRootLogin no
# PasswordAuthentication no
# MaxAuthTries 3
# LoginGraceTime 30
# X11Forwarding no
# AllowTcpForwarding no
# ClientAliveInterval 300
# ClientAliveCountMax 2
# Kiểm tra cú pháp trước khi restart (quan trọng!)
sudo sshd -t
# Reload SSH service (dùng reload, không restart để không mất phiên hiện tại)
sudo systemctl reload ssh
- Cấu hình tường lửa ufw và cài fail2ban:
# Cho phép SSH trước khi bật ufw (nếu không sẽ bị khóa!)
sudo ufw allow 22/tcp
# Bật rate limiting cho SSH (block IP sau 6 lần thất bại/30s)
sudo ufw limit 22/tcp
# Cho phép web nếu cần
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Mặc định từ chối mọi kết nối vào
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Bật tường lửa
sudo ufw enable
# Xem trạng thái
sudo ufw status verbose
# Cài và cấu hình fail2ban
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Xem trạng thái fail2ban và danh sách IP bị ban
sudo fail2ban-client status sshd
Kết quả mong đợi / Expected output: sshd -t không có output = cú pháp đúng. ufw status verbose hiển thị các rule với ALLOW/LIMIT. fail2ban-client status sshd hiển thị số IP đang bị ban và tổng số lần ban. Sau khi cấu hình, thử SSH bằng mật khẩu sai 6 lần liên tiếp — IP của bạn sẽ bị fail2ban block tự động.
3. Tình huống doanh nghiệp / Real-world scenario
Bối cảnh:
Một server Ubuntu 22.04 chạy ứng dụng web nội bộ bị phát hiện gửi traffic bất thường ra ngoài internet lúc 3 giờ sáng. Quản trị viên nhận thông báo từ hệ thống giám sát và bắt đầu điều tra.
Quá trình điều tra và phục hồi:
- Kiểm tra auth.log để phát hiện brute force SSH:
grep "Failed password" /var/log/auth.log | tail -50— thấy hàng trăm lần thất bại từ IP45.33.x.x, sau đó một dòng "Accepted password for www-data". - Xác nhận tài khoản
www-data(vốn là service account, không nên login SSH được) đã đăng nhập thành công — mật khẩu mặc định yếu bị crack trong vài giờ brute force. - Kiểm tra tiến trình đang chạy:
ps aux | grep www-data— phát hiện script Python lạ đang chạy từ/tmp/.hidden/. - Kiểm tra cron và systemd timer của www-data:
crontab -u www-data -l— thấy entry lạ download và chạy script từ IP ngoài mỗi giờ. - Khắc phục: Tắt shell của www-data (
usermod -s /usr/sbin/nologin www-data), xóa cron entry độc hại, kích hoạt PasswordAuthentication no trong sshd_config, cài fail2ban và ufw với rate limiting. Xem xét toàn bộ file trong/tmpvà/var/tmp.
Bài học: Service account không bao giờ nên có mật khẩu đăng nhập hoặc shell. PasswordAuthentication yes kết hợp mật khẩu yếu là công thức thảm họa trên server công khai. SSH key-based authentication + fail2ban + ufw là bộ ba tối thiểu cho mọi Linux server production.
4. Tự kiểm tra / Knowledge check
- File
/etc/shadowchứa gì và tại sao nó chỉ đọc được bởi root? Giải thích định dạng hash trong shadow. - Quyền
4755trên một file có nghĩa là gì? Khi nào nó nguy hiểm? - Giải thích tại sao
sudo nano /etc/sudoersnguy hiểm hơnsudo visudo. - Nếu fail2ban đang chạy nhưng brute force vẫn tiếp tục, bạn sẽ kiểm tra điều gì đầu tiên?
journalctl -u ssh --since "1 hour ago" --until "now"cho thấy gì? Hãy mô tả output.