Mục Lục
- Giới thiệu
- Cập nhật hệ điều hành và gói phần mềm
- Cài đặt Nginx từ kho chính thức
- Nhận chứng chỉ TLS mạnh
- Cấu hình TLS cho Nginx
- Hạn chế quyền truy cập với UFW
- Triển khai Fail2Ban để ngăn chặn tấn công brute-force
- Tự động gia hạn chứng chỉ và tải lại Nginx
- Giám sát và ghi log
- Kết luận
- Câu hỏi thường gặp
Giới thiệu
Nếu bạn là một SRE (Site Reliability Engineer) quản lý lưu lượng web trên Ubuntu, bạn có thể đã gặp phải những rắc rối từ các cuộc tấn công brute-force, các bộ mã hóa lạc hậu và tường lửa bị cấu hình sai. Nginx là một proxy đảo ngược rất mạnh mẽ, nhưng mặc định nó không được bảo mật cho môi trường internet đầy thách thức. Hướng dẫn này sẽ đưa bạn qua bảy bước thực tế để bảo vệ Nginx bằng TLS, một tường lửa nghiêm ngặt và Fail2Ban. Cuối cùng, bạn sẽ có một máy chủ không chỉ phục vụ nội dung nhanh chóng mà còn chống lại những vectơ tấn công phổ biến nhất.
1. Cập nhật hệ điều hành và gói phần mềm
Bảo mật bắt đầu từ một nền tảng sạch sẽ. Trên Ubuntu, hãy kích hoạt nâng cấp tự động cho các bản vá quan trọng:
bash
sudo apt-get install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
Đảm bảo cấu hình unattended-upgrades bao gồm repo -security. Thường xuyên kiểm tra với:
bash
sudo unattended-upgrade --dry-run --debug
2. Cài đặt Nginx từ kho chính thức
Tránh các PPA bên thứ ba; chúng có thể bị chậm trong việc cập nhật các bản vá bảo mật. Cài đặt phiên bản ổn định mới nhất:
bash
sudo apt-get update
sudo apt-get install nginx
Sau khi cài đặt, khóa phiên bản để ngăn chặn việc hạ cấp vô tình:
bash
sudo apt-mark hold nginx
3. Nhận chứng chỉ TLS mạnh
Let’s Encrypt cung cấp chứng chỉ miễn phí, tự động gia hạn. Cài đặt certbot và yêu cầu chứng chỉ cho miền của bạn:
bash
sudo apt-get install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
Trong quá trình tương tác, chọn "Chuyển hướng HTTP sang HTTPS". Certbot cũng sẽ tạo một đoạn mã Nginx mạnh mẽ áp dụng các thiết lập TLS hiện đại.
4. Cấu hình TLS cho Nginx
Ngay cả khi sử dụng Let’s Encrypt, bạn vẫn nên kiểm tra lại danh sách bộ mã hóa và giao thức. Thay thế đoạn mã mặc định (/etc/nginx/snippets/ssl-params.conf) bằng phiên bản được gia cố sau:
bash
# /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers \
"EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
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;
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 khối máy chủ của bạn:
bash
server {
listen 443 ssl http2;
include snippets/ssl-params.conf;
...
}
Tải lại Nginx:
bash
sudo systemctl reload nginx
5. Hạn chế quyền truy cập với UFW (Uncomplicated Firewall)
Một tường lửa tối thiểu giảm thiểu bề mặt tấn công. Chỉ cho phép HTTP/HTTPS, SSH (giới hạn cho một dải IP cụ thể), và nhà tù ssh của Fail2Ban:
bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp
sudo ufw enable
Kiểm tra trạng thái:
bash
sudo ufw status verbose
6. Triển khai Fail2Ban để ngăn chặn tấn công brute-force
Fail2Ban theo dõi các tệp log và cấm các IP vi phạm. Cài đặt và kích hoạt dịch vụ:
bash
sudo apt-get install fail2ban
sudo systemctl enable fail2ban
Tạo một cấu hình nhà tù cục bộ (/etc/fail2ban/jail.local) bảo vệ cả SSH và Nginx:
bash
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 5
bantime = 1h
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 2h
Bộ lọc nginx-http-auth được đi kèm với Fail2Ban và theo dõi các phản hồi 401. Khởi động lại daemon:
bash
sudo systemctl restart fail2ban
Bạn có thể xem các lệnh cấm với:
bash
sudo fail2ban-client status nginx-http-auth
7. Tự động gia hạn chứng chỉ và tải lại Nginx
Chứng chỉ Let’s Encrypt hết hạn sau 90 ngày. Certbot cài đặt một bộ hẹn giờ systemd, nhưng xác nhận nó hoạt động:
bash
sudo systemctl list-timers | grep certbot
Nếu bạn thích một cron job thủ công, thêm dòng này vào /etc/crontab:
bash
0 3 * * * root certbot renew --quiet --post-hook "systemctl reload nginx"
Giờ đây, máy chủ sẽ tự động lấy chứng chỉ mới và tải lại Nginx mà không cần can thiệp của con người.
Giám sát và ghi log
Một máy chủ đã được gia cố chỉ tốt như khả năng quan sát của nó. Cài đặt ufw và ghi log của fail2ban vào một máy chủ syslog trung tâm, hoặc sử dụng một ngăn xếp nhẹ như rsyslog + logrotate. Ví dụ về đoạn mã logrotate cho Nginx:
bash
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Kết luận
Bằng cách thực hiện bảy bước này - cập nhật thường xuyên, TLS mạnh mẽ, một tường lửa chặt chẽ và Fail2Ban - bạn sẽ giảm đáng kể nguy cơ các cuộc tấn công phổ biến trên máy chủ web trong khi vẫn giữ hiệu suất không bị ảnh hưởng. Hãy nhớ kiểm tra cấu hình của bạn bằng các công cụ như SSL Labs và fail2ban-client để xác minh rằng các lệnh cấm được áp dụng như mong đợi.
Nếu bạn cần một bài kiểm tra nhanh hoặc muốn khám phá các mẫu bảo mật nâng cao hơn, nhóm tại lacidaweb.com cung cấp các hướng dẫn thực tế và hỗ trợ cộng đồng cho các ngăn xếp web dựa trên Linux.