Giới thiệu
Việc chạy Nginx trên máy chủ Linux là một mô hình phổ biến cho các dịch vụ web có lưu lượng truy cập cao. Tuy nhiên, nếu cấu hình không đúng, hệ thống này có thể trở thành mục tiêu dễ dàng cho các cuộc tấn công. Bài viết này sẽ hướng dẫn bạn qua bảy bước thực tiễn để tăng cường bảo mật cho Nginx và máy chủ Linux của bạn. Những bước này bao gồm: thắt chặt TLS, khóa tường lửa, tự động hóa fail2ban, bảo mật SSH, thiết lập sao lưu đáng tin cậy, thêm WAF nhẹ và giữ cho hệ thống được cập nhật. Bài viết được viết từ góc độ của một người lãnh đạo DevOps cần quy trình bảo mật có thể lặp lại và kiểm tra cho môi trường sản xuất.
1. Thiết lập TLS Mạnh Mẽ
TLS là hàng rào đầu tiên bảo vệ cho bất kỳ dịch vụ nào có mặt công khai. Tệp cấu hình ssl.conf của Nginx cần được tinh chỉnh để chỉ sử dụng các bộ mã hóa hiện đại và kích hoạt HTTP/2.
nginx
# /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "\
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256";
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
- Vô hiệu hóa TLS 1.0/1.1 – chúng đã lỗi thời.
- Ưu tiên các bộ mã hóa của máy chủ để tránh lựa chọn yếu từ phía khách hàng.
- Kích hoạt HSTS để buộc trình duyệt sử dụng HTTPS.
Sau khi chỉnh sửa, hãy kiểm tra cấu hình với lệnh openssl s_client -connect yourdomain.com:443 -tls1_2 và sử dụng các công cụ như SSL Labs để xác minh điểm số.
2. Tăng Cường Tường Lửa của Máy Chủ
Một tập hợp quy tắc iptables (hoặc nftables) tối thiểu sẽ giảm thiểu bề mặt tấn công. Ví dụ dưới đây sẽ chặn mọi thứ ngoại trừ HTTP/HTTPS, SSH (giới hạn cho một phạm vi IP đã biết) và loopback.
bash
# /etc/iptables.rules
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Cho phép loopback
-A INPUT -i lo -j ACCEPT
# Cho phép các kết nối đã thiết lập
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# HTTP/HTTPS
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# SSH từ subnet tin cậy (ví dụ: 203.0.113.0/24)
-A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -j ACCEPT
COMMIT
Tải các quy tắc với lệnh iptables-restore < /etc/iptables.rules và làm cho tệp này tồn tại vĩnh viễn bằng cách sử dụng dịch vụ tường lửa của phân phối của bạn (ví dụ, netfilter-persistent).
3. Triển Khai Fail2Ban để Bảo Vệ Chống Tấn Công Brute-Force
Fail2Ban theo dõi các tệp log và cấm các IP có dấu hiệu đáng ngờ. Một cấu hình điển hình cho Nginx và SSH trông như sau:
ini
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 5
bantime = 3600
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 7200
Khởi động lại dịch vụ với lệnh systemctl restart fail2ban. Kiểm tra các IP bị cấm với lệnh fail2ban-client status sshd.
4. Bảo Mật SSH Chỉ Với Xác Thực Dựa Trên Khóa
Đăng nhập bằng mật khẩu là điểm yếu nhất. Yêu cầu xác thực bằng khóa công khai và vô hiệu hóa đăng nhập root.
ini
# /etc/ssh/sshd_config (trích dẫn)
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
AllowUsers deploy@example.com
Sau khi chỉnh sửa, chạy ssh-keygen -t ed25519 trên máy quản trị, sao chép tệp ~/.ssh/id_ed25519.pub vào tệp ~/.ssh/authorized_keys của máy chủ và tải lại SSH: systemctl reload sshd.
5. Triển Khai Sao Lưu Tự Động
Một chiến lược sao lưu đáng tin cậy bảo vệ bạn khỏi ransomware và xóa nhầm. Dưới đây là một kịch bản đơn giản dựa trên rsync để sao lưu /var/www và /etc/nginx lên một máy chủ SFTP từ xa.
bash
#!/bin/bash
# /usr/local/bin/backup-nginx.sh
set -euo pipefail
REMOTE="backup@example.com"
DEST="/backups/$(hostname)/$(date +%Y%m%d)"
mkdir -p "$DEST"
# Đồng bộ thư mục gốc web và cấu hình
rsync -a --delete /var/www "$DEST/www"
rsync -a /etc/nginx "$DEST/nginx"
# Đẩy lên lưu trữ từ xa
sftp "$REMOTE" <<EOF
mkdir -p $DEST
put -r $DEST/* $DEST/
EOF
# Giữ lại 7 ngày cuối cùng tại chỗ
find /backups/$(hostname) -mindepth 1 -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +
Lên lịch kịch bản với cron (0 2 * * * /usr/local/bin/backup-nginx.sh). Thường xuyên kiểm tra khả năng khôi phục để đảm bảo tính toàn vẹn.
6. Thêm Tường Lửa Ứng Dụng Web Nhẹ (WAF)
ModSecurity hoạt động tốt với Nginx và cung cấp bộ lọc yêu cầu dựa trên quy tắc. Cài đặt module và kích hoạt Bộ Quy Tắc Cốt Lõi OWASP (CRS).
bash
# Ví dụ trên Ubuntu/Debian
apt-get install libnginx-mod-http-modsecurity
# Kích hoạt trong nginx.conf
modsecurity on;
modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
Chỉnh sửa /etc/modsecurity/modsecurity.conf để thiết lập SecRuleEngine On và chỉ định Include đến thư mục quy tắc CRS. Khởi động lại Nginx và theo dõi nhật ký audit (/var/log/modsec_audit.log).
7. Tự Động Hóa Quản Lý Bản Cập Nhật
Giữ cho hệ điều hành và các gói luôn được cập nhật sẽ đóng các lỗ hổng đã biết. Sử dụng nâng cấp không cần giám sát cho các bản cập nhật chỉ bảo mật.
bash
# Cài đặt unattended-upgrades
apt-get install unattended-upgrades
# Kích hoạt và cấu hình
dpkg-reconfigure --priority=low unattended-upgrades
Đối với các hệ thống dựa trên Red Hat, kích hoạt yum-cron với yum-cron.conf được thiết lập thành apply_updates = yes. Kết hợp điều này với một kịch bản kiểm tra sức khỏe hàng ngày để cảnh báo về các bản cập nhật không thành công.
Kết luận
Việc tăng cường bảo mật cho Nginx và máy chủ Linux là một nỗ lực nhiều lớp: TLS mạnh, tường lửa chặt chẽ, tự động hóa giảm thiểu tấn công brute-force, SSH chỉ với khóa, sao lưu đáng tin cậy, một WAF nhẹ và cập nhật liên tục. Bằng cách làm theo danh sách kiểm tra này, bạn sẽ giảm khả năng bị xâm nhập thành công và cải thiện tư thế tuân thủ. Để tìm hiểu sâu hơn về từng chủ đề và tìm các vai trò Ansible đã được chuẩn bị, hãy xem các tài nguyên tại https://lacidaweb.com.