Giới thiệu
Trong vai trò là một quản lý DevOps, bạn biết rằng một máy chủ web được cấu hình sai là một cơ hội vàng cho các kẻ tấn công. Nginx là một máy chủ web nhanh chóng và linh hoạt, nhưng khi được cài đặt mặc định, nó thiếu những cấu hình bảo mật cần thiết cho môi trường sản xuất. Danh sách kiểm tra này sẽ hướng dẫn bạn từng bước cần thiết để bảo vệ Nginx trên Ubuntu, bao gồm thiết lập TLS, quy tắc tường lửa, sử dụng fail2ban và các biện pháp bảo mật hệ điều hành cơ bản. Thực hiện từng mục và bạn sẽ giảm thiểu đáng kể bề mặt tấn công của máy chủ.
1. Cập nhật Hệ Điều Hành và Cài Đặt Các Gói Cần Thiết
bash
sudo apt update && sudo apt upgrade -y
sudo apt install nginx ufw fail2ban -y
- Đảm bảo cập nhật kernel và các gói phần mềm thường xuyên - thiết lập tự động cập nhật nếu bạn chưa làm.
- Cài đặt
certbotđể tự động hóa việc cấp chứng chỉ Let's Encrypt:
bash
sudo apt install certbot python3-certbot-nginx -y
2. Củng Cố Hệ Thống Linux Cơ Bản
2.1 Vô Hiệu Hóa Các Dịch Vụ Không Sử Dụng
bash
sudo systemctl list-unit-files --type=service | grep enabled
# Ví dụ: vô hiệu hóa telnet, ftp, v.v.
sudo systemctl disable telnet.service
2.2 Thực Thi Chính Sách Mật Khẩu Mạnh
Chỉnh sửa tệp /etc/pam.d/common-password và thiết lập:
bash
password requisite pam_pwquality.so retry=3 minlen=12 difok=4
2.3 Kích Hoạt Cập Nhật Bảo Mật Tự Động
bash
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure unattended-upgrades
3. Cấu Hình Tường Lửa (UFW)
Chỉ cho phép các cổng bạn cần. Đối với một trang web chỉ sử dụng HTTPS:
bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh # 22 (hoặc cổng SSH tùy chỉnh)
sudo ufw allow http # 80 (tùy chọn, cho chuyển hướng HTTP→HTTPS)
sudo ufw allow https # 443
sudo ufw enable
Xác minh:
bash
sudo ufw status verbose
4. Nhận và Củng Cố Chứng Chỉ TLS
4.1 Nhận Chứng Chỉ Miễn Phí với Certbot
bash
sudo certbot --nginx -d example.com -d www.example.com
Certbot sẽ tự động chỉnh sửa cấu hình Nginx của bạn để sử dụng các chứng chỉ mới và thiết lập thời gian gia hạn.
4.2 Thực Thi Các Bộ Mã Mạnh
Chỉnh sửa khối máy chủ (hoặc tạo tệp /etc/nginx/snippets/ssl-params.conf):
bash
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305";
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
Bao gồm đoạn mã này trong mỗi khối máy chủ:
bash
server {
listen 443 ssl http2;
server_name example.com www.example.com;
include snippets/ssl-params.conf;
# ... các chỉ thị khác ...
}
4.3 Kiểm Tra Cấu Hình TLS của Bạn
Chạy sslscan hoặc sử dụng bài kiểm tra Qualys SSL Labs. Nhắm đến xếp hạng A+.
5. Củng Cố Nginx
- Vô Hiệu Hóa Các Module Không Sử Dụng – biên dịch Nginx chỉ với các module cần thiết nếu bạn kiểm soát việc xây dựng.
- Hạn Chế Kích Thước Yêu Cầu – ngăn chặn các cuộc tấn công tràn bộ đệm:
bash
client_max_body_size 2M;
- Giới Hạn Kết Nối – giảm thiểu các nỗ lực tấn công brute-force:
bash
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_req zone=one burst=20 nodelay;
- Ẩn Phiên Bản Nginx:
bash
server_tokens off;
6. Triển Khai Fail2Ban cho Nhật Ký Nginx
Tạo tệp /etc/fail2ban/filter.d/nginx-http-auth.conf (nếu sử dụng xác thực HTTP) hoặc tái sử dụng bộ lọc nginx-http-auth hiện có.
Sau đó thêm một jail trong /etc/fail2ban/jail.local:
bash
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
Khởi động lại Fail2Ban:
bash
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-http-auth
7. Kích Hoạt HTTP Strict Transport Security (HSTS) Preload
Dòng add_header Strict-Transport-Security từ đoạn mã TLS đã bao gồm preload. Gửi miền của bạn đến danh sách preload HSTS để các trình duyệt thực thi HTTPS ngay cả khi lần liên hệ đầu tiên.
8. Thiết Lập Giám Sát Tự Động Gia Hạn Chứng Chỉ
Certbot tạo một bộ hẹn giờ systemd, nhưng bạn cần xác minh rằng nó hoạt động:
bash
sudo systemctl list-timers | grep certbot
sudo certbot renew --dry-run
Cân nhắc thêm một kịch bản kiểm tra sức khỏe đơn giản để cảnh báo bạn nếu việc gia hạn thất bại.
9. Xác Minh Toàn Bộ Hệ Thống
- Quét Cổng –
nmap -sS -p 80,443 <địa-chỉ-ip-của-bạn>nên chỉ hiển thị cổng 443 mở (nếu bạn đã vô hiệu hóa HTTP). - Kiểm Tra Tiêu Đề –
curl -I https://example.comvà xác nhận các tiêu đề bảo mật. - Xem Nhật Ký –
sudo tail -f /var/log/nginx/access.logtrong khi bạn duyệt để bắt bất kỳ bất thường 4xx/5xx nào.
10. Danh Sách Kiểm Tra Bảo Trì Liên Tục
- [ ] Áp dụng các bản vá bảo mật hệ điều hành hàng tuần.
- [ ] Xem xét các quy tắc UFW sau mỗi lần triển khai dịch vụ mới.
- [ ] Thay đổi khóa TLS mỗi 12-18 tháng.
- [ ] Kiểm tra các lệnh cấm của Fail2Ban hàng tháng để điều chỉnh ngưỡng.
- [ ] Chạy bài kiểm tra SSL Labs sau mỗi thay đổi cấu hình Nginx.
Kết Luận
Bảo mật Nginx là một nỗ lực nhiều lớp: giữ cho hệ điều hành được cập nhật, khóa mạng với tường lửa, áp đặt TLS mạnh mẽ và thêm các biện pháp bảo vệ thời gian chạy như Fail2Ban. Bằng cách hoàn thành từng mục trong danh sách kiểm tra này, bạn sẽ chuyển từ một cài đặt mặc định thành một máy chủ web đã được củng cố, sẵn sàng cho sản xuất.
Nếu bạn cần một môi trường lưu trữ nhanh chóng và đáng tin cậy mà đã tuân theo nhiều thực tiễn tốt nhất này, hãy xem xét https://lacidaweb.com để tìm các giải pháp quản lý phù hợp cho các nhà phát triển.