hoatranlab.io.vn Zalo: 0917516878 Hotline: 0917516878 [email protected]
HoaTranLab Logo HoaTranLab
Linux Bible Phiên bản 11 - Chương 26

Bảo mật Linux trên Mạng

Sử dụng firewalld, iptables, fail2ban, TCP wrappers và củng cố SSH để bảo vệ Linux trên môi trường mạng

Mục Tiêu Chương 26

Sau chương này bạn sẽ nắm được

Các kỹ thuật bảo mật Linux từ tường lửa đến cơ chế xác thực SSH an toàn

Vùng & Quy tắc firewalld

Quản lý vùng (zone), dịch vụ, cổng và các quy tắc chi tiết (rich rules) trong firewalld

Cơ bản về iptables

Tìm hiểu chuỗi INPUT/OUTPUT/FORWARD, chính sách ACCEPT/DROP/REJECT và lưu quy tắc

fail2ban

Tự động chặn IP tấn công, cấu hình jail.local và quản lý danh sách cấm

TCP Wrappers

Sử dụng hosts.allow và hosts.deny để kiểm soát truy cập dịch vụ theo máy khách

Tăng cường bảo mật SSH

Tắt đăng nhập root, xác thực bằng khóa và tối ưu hóa sshd_config

Xác thực khóa SSH

Sử dụng ssh-keygen, ssh-copy-id và quản lý tệp authorized_keys

Lý Thuyết

Nội dung kỹ thuật chi tiết

Các câu lệnh và cấu hình quan trọng cho bảo mật mạng Linux

C1. firewalld - Quản lý tường lửa động

firewalld là giải pháp tường lửa mặc định trên RHEL 7+, Fedora, CentOS. Nó sử dụng khái niệm vùng (zone) để xác định mức độ tin cậy cho kết nối mạng. Mọi thay đổi có thể áp dụng ngay lập tức (runtime) hoặc lưu vĩnh viễn (permanent).

terminal - lệnh firewalld
$ firewall-cmd --state running $ firewall-cmd --get-default-zone public $ firewall-cmd --get-active-zones public interfaces: ens160 $firewall-cmd --list-all$ firewall-cmd --list-all-zones # Thêm dịch vụ $firewall-cmd --add-service=http --permanent$ firewall-cmd --add-service=https --permanent # Thêm cổng $firewall-cmd --add-port=8080/tcp --permanent$ firewall-cmd --reload # Xóa dịch vụ/cổng $ firewall-cmd --remove-service=http --permanent # Quản lý vùng (zone) $firewall-cmd --set-default-zone=dmz$ firewall-cmd --change-interface=eth0 --zone=public --permanent # Quy tắc chi tiết (Rich rules) $firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 service name=ssh accept' --permanent$ firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.5 drop' --permanent $ firewall-cmd --reload

Lưu ý: Flag --permanent lưu cấu hình vào ổ đĩa, cần chạy --reload để áp dụng. Nếu không có flag này, thay đổi sẽ mất sau khi khởi động lại máy.

C2. iptables - Bộ lọc gói tin cấp thấp

iptables là công cụ tường lửa truyền thống trên Linux, làm việc trực tiếp với Netfilter trong nhân (kernel). Gồm 3 chuỗi chính: INPUT (gói tin đến), OUTPUT (gói tin đi), FORWARD (chuyển tiếp). Các đích đến (target): ACCEPT, DROP, REJECT.

terminal - lệnh iptables
$ iptables -L -n -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination $iptables -A INPUT -p tcp --dport 22 -j ACCEPT$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT $iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT$ iptables -P INPUT DROP $iptables -D INPUT -p tcp --dport 80 -j ACCEPT$ iptables-save > /etc/sysconfig/iptables

Cảnh báo: Lệnh iptables -P INPUT DROP sẽ chặn mọi kết nối đến nếu không có quy tắc ACCEPT trước đó. Luôn thêm quy tắc cho SSH trước khi đặt chính sách DROP!

C3. fail2ban - Tự động chặn tấn công dò mật khẩu

fail2ban giám sát nhật ký (log) của các dịch vụ, phát hiện các IP có hành vi tấn công dò mật khẩu (brute-force) và tự động chặn chúng thông qua iptables hoặc firewalld. Cấu hình chủ yếu qua tệp jail.local.

terminal - fail2ban
$ systemctl enable --now fail2ban $ fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd $ fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 2 | `- Total failed: 10 `- Actions |- Currently banned: 1 `- Total banned: 3 $ fail2ban-client set sshd unbanip 192.168.1.100
/etc/fail2ban/jail.local
[DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 [sshd] enabled = true port = ssh logpath = %(sshd_log)s maxretry = 3

C4. TCP Wrappers - Kiểm soát truy cập dịch vụ

Sử dụng hai tệp cấu hình để kiểm soát truy cập theo máy chủ (host). Thứ tự ưu tiên: Đọc hosts.allow trước (nếu khớp thì CHO PHÉP), sau đó mới đến hosts.deny (nếu khớp thì CHẶN). Nếu không khớp cả hai, mặc định là CHO PHÉP.

/etc/hosts.allow
sshd: 192.168.1.0/24 httpd: ALL
/etc/hosts.deny
sshd: ALL ALL: ALL
terminal - tcpdmatch
$ tcpdmatch sshd 192.168.1.50 client: address 192.168.1.50 server: process sshd access: granted

C5. Củng cố SSH - Bảo mật dịch vụ SSH

Cấu hình tệp sshd_config là bước quan trọng nhất để bảo vệ máy chủ. Hãy tắt đăng nhập bằng root, tắt xác thực mật khẩu, giới hạn người dùng và thay đổi cổng mặc định.

/etc/ssh/sshd_config
PermitRootLogin no PasswordAuthentication no AllowUsers alice bob adminuser Port 2222 MaxAuthTries 3 LoginGraceTime 30 X11Forwarding no ClientAliveInterval 300 ClientAliveCountMax 2 Protocol 2
terminal - áp dụng cấu hình SSH
$ sshd -t (không có thông báo = OK) $ systemctl restart sshd

C6. Xác thực dựa trên khóa SSH

Xác thực bằng khóa SSH an toàn hơn mật khẩu vì không thể bị dò tìm. Ed25519 là thuật toán hiện đại, an toàn và hiệu quả hơn so với RSA truyền thống.

terminal - Khóa SSH (máy khách)
# Tạo cặp khóa SSH Ed25519 $ ssh-keygen -t ed25519 -C "[email protected]" Generating public/private ed25519 key pair. Enter file (/home/user/.ssh/id_ed25519): [Nhấn Enter] Enter passphrase: [Nhập mật khẩu bảo vệ khóa] Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub # Sao chép khóa công khai lên máy chủ $ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server Number of key(s) added: 1 # Kết nối sử dụng khóa $ ssh -i ~/.ssh/id_ed25519 user@server
terminal - xác minh trên máy chủ
$ cat ~/.ssh/authorized_keys ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... [email protected] $chmod 700 ~/.ssh$ chmod 600 ~/.ssh/authorized_keys

Ưu điểm Ed25519: Khóa ngắn hơn (256-bit so với 2048-bit của RSA), tốc độ tạo nhanh hơn và mức độ bảo mật tương đương RSA 3072-bit. Đây là lựa chọn được khuyến nghị hiện nay.

Thực Hành Lab

Lab Thực Hành: Bảo mật toàn diện máy chủ Linux

Thực hiện từng bước trên hệ thống RHEL/Fedora/CentOS để củng cố an ninh mạng

1

Kiểm tra và cấu hình firewalld

Xem trạng thái, danh sách các dịch vụ đang mở và thêm http/https/ssh vĩnh viễn

bước 1
$ firewall-cmd --state running $ firewall-cmd --list-all public (active) services: cockpit dhcpv6-client ssh $ firewall-cmd --add-service=http --permanent success $ firewall-cmd --add-service=https --permanent success $ firewall-cmd --reload success $ firewall-cmd --list-services cockpit dhcpv6-client http https ssh
2

Chặn một địa chỉ IP cụ thể

Sử dụng quy tắc chi tiết (rich rule) để chặn một IP nghi ngờ tấn công

bước 2
$ firewall-cmd --add-rich-rule='rule family=ipv4 source address=203.0.113.50 drop' --permanent success $ firewall-cmd --reload success $ firewall-cmd --list-rich-rules rule family="ipv4" source address="203.0.113.50" drop
3

Cài đặt và cấu hình fail2ban

Cài đặt từ kho dnf, tạo tệp cấu hình riêng và bảo vệ dịch vụ SSH

bước 3
$ dnf install fail2ban -y Installed: fail2ban-1.0.2-4.fc40.noarch $ cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Chỉnh sửa phần [sshd] trong tệp jail.local # enabled=true, port=ssh, maxretry=3, bantime=3600 $ systemctl enable --now fail2ban Created symlink ...fail2ban.service
4

Kiểm tra trạng thái fail2ban

Xem danh sách các IP đang bị chặn và lịch sử tấn công

bước 4
$ fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd $ fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 1 | `- Total failed: 4 `- Actions |- Currently banned: 1 |- Banned IP list: 198.51.100.22
5

Cấu hình TCP wrappers

Chỉnh sửa hosts.allow và hosts.deny để giới hạn SSH theo dải mạng

bước 5
$ echo "sshd: 192.168.1.0/24" >> /etc/hosts.allow $echo "sshd: ALL" >> /etc/hosts.deny$ tcpdmatch sshd 192.168.1.10 access: granted $ tcpdmatch sshd 10.0.0.99 access: denied
6

Tạo cặp khóa SSH

Sử dụng Ed25519 trên máy khách cùng với mật khẩu bảo vệ khóa (passphrase)

bước 6
$ ssh-keygen -t ed25519 -C "[email protected]" Generating public/private ed25519 key pair. Enter file: [Nhấn Enter] Enter passphrase: [Nhập mật khẩu bảo vệ] Your identification has been saved in /home/admin/.ssh/id_ed25519 Your public key has been saved in /home/admin/.ssh/id_ed25519.pub
7

Đưa khóa công khai lên máy chủ

Sử dụng ssh-copy-id để tự động thiết lập quyền truy cập cho máy khách

bước 7
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected] [email protected]'s password: Number of key(s) added: 1 $ ssh [email protected] Last login: Tue Apr 1 10:30:00 2026
8

Củng cố tệp cấu hình sshd_config

Khóa hoàn toàn đăng nhập bằng mật khẩu và tài khoản root sau khi khóa SSH đã hoạt động

bước 8
$ sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config $sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config$ sshd -t (không có thông báo = OK) $ systemctl reload sshd $ grep -E "^(PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config PermitRootLogin no PasswordAuthentication no
Câu Hỏi Ôn Tập

10 Câu hỏi ôn tập Chương 26

Kiểm tra hiểu biết về bảo mật mạng trên hệ điều hành Linux

Q1. Vùng (zone) trong firewalld là gì? Vùng nào được dùng mặc định?
Vùng là tập hợp các quy tắc định nghĩa mức độ tin cậy cho các kết nối mạng. Vùng public là mặc định cho hầu hết các giao diện mạng — nó chỉ cho phép một số dịch vụ tối thiểu như ssh và dhcpv6-client.
Q2. Câu lệnh nào thêm cổng 8443/tcp vào firewalld một cách vĩnh viễn?
firewall-cmd --add-port=8443/tcp --permanent sau đó chạy thêm firewall-cmd --reload để áp dụng cấu hình đã lưu vào bộ nhớ.
Q3. Sự khác nhau giữa --add-service và --add-port trong firewalld?
--add-service thêm dịch vụ theo tên (ví dụ: http), hệ thống tự tìm cổng tương ứng. --add-port yêu cầu bạn chỉ định trực tiếp số cổng và giao thức (ví dụ: 8080/tcp). Thêm theo dịch vụ thường dễ quản lý hơn.
Q4. fail2ban hoạt động như thế nào? Nó lấy dữ liệu từ đâu?
fail2ban giám sát các tệp nhật ký hệ thống (/var/log/secure hoặc qua journald). Khi phát hiện một IP nhập sai mật khẩu quá số lần quy định, nó sẽ ra lệnh cho tường lửa chặn IP đó trong một khoảng thời gian nhất định.
Q5. TCP wrappers hoạt động theo thứ tự ưu tiên như thế nào?
Thứ tự ưu tiên là: (1) Kiểm tra hosts.allow, nếu khớp thì cho phép ngay. (2) Nếu không, kiểm tra hosts.deny, nếu khớp thì chặn. (3) Nếu không khớp cả hai, mặc định sẽ là cho phép truy cập.
Q6. Tại sao việc tắt PasswordAuthentication trong cấu hình SSH lại quan trọng?
Mật khẩu rất dễ bị tấn công dò tìm hoặc đánh cắp. SSH key dựa trên các thuật toán mã hóa mạnh mà máy tính hiện nay không thể dò ra được, giúp loại bỏ hoàn toàn nguy cơ bị tấn công brute-force vào dịch vụ SSH.
Q7. Thuật toán Ed25519 có ưu điểm gì so với RSA truyền thống?
Ed25519 dựa trên đường cong Elliptic, tạo ra khóa rất ngắn (256-bit) nhưng có độ bảo mật tương đương khóa RSA 3072-bit. Nó cũng giúp quá trình xác thực và tạo khóa diễn ra nhanh hơn, chống lại một số kiểu tấn công mã hóa tốt hơn.
Q8. Tại sao cần chạy lệnh --reload sau khi thêm quy tắc vĩnh viễn trong firewalld?
Flag --permanent chỉ ghi các quy tắc vào tệp XML trên ổ đĩa để không bị mất khi khởi động lại. Lệnh --reload sẽ đọc lại các tệp đó và nạp vào tường lửa đang chạy mà không làm ngắt các kết nối mạng hiện hữu.
Q9. Việc đặt iptables -P INPUT DROP nguy hiểm như thế nào nếu chưa có quy tắc ACCEPT?
Nếu bạn đang kết nối qua SSH và chạy lệnh này mà chưa cho phép cổng 22, hệ thống sẽ chặn ngay lập tức gói tin phản hồi của SSH. Bạn sẽ bị mất kết nối và không thể đăng nhập lại trừ khi có quyền truy cập trực tiếp vào máy chủ (console).
Q10. Tham số MaxAuthTries trong cấu hình SSH có tác dụng gì?
Tham số này giới hạn số lần thử đăng nhập tối đa cho mỗi phiên kết nối. Nếu vượt quá số lần này (ví dụ: 3), máy chủ sẽ ngắt kết nối. Điều này làm chậm đáng kể quá trình tấn công dò mật khẩu tự động.