0
0
Lập trình
Admin Team
Admin Teamtechmely

7 Mẹo Bảo Mật Nginx với TLS và Fail2Ban trên Ubuntu

Đăng vào 1 tháng trước

• 4 phút đọc

Mục Lục

  1. Giới thiệu
  2. Cập nhật hệ điều hành và gói phần mềm
  3. Cài đặt Nginx từ kho chính thức
  4. Nhận chứng chỉ TLS mạnh
  5. Cấu hình TLS cho Nginx
  6. Hạn chế quyền truy cập với UFW
  7. Triển khai Fail2Ban để ngăn chặn tấn công brute-force
  8. Tự động gia hạn chứng chỉ và tải lại Nginx
  9. Giám sát và ghi log
  10. Kết luận
  11. 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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
# /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 Copy
server {
    listen 443 ssl http2;
    include snippets/ssl-params.conf;
    ...
}

Tải lại Nginx:

bash Copy
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 Copy
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 Copy
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 Copy
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 Copy
[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 Copy
sudo systemctl restart fail2ban

Bạn có thể xem các lệnh cấm với:

bash Copy
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 Copy
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 Copy
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 Copy
/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 Labsfail2ban-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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào