0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

7 Mẹo Bảo Mật Nginx với TLS, Tường Lửa và Fail2Ban

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

• 4 phút đọc

Giới thiệu

Khi bạn sử dụng Nginx làm front-end cho các ứng dụng web, bước đầu tiên trong việc bảo mật là thiết lập một chính sách bảo mật vững chắc. Danh sách kiểm tra này sẽ hướng dẫn bạn qua những bước hiệu quả, ít bảo trì mà một người quản lý DevOps có thể áp dụng để làm cứng Nginx trên máy chủ Linux. Cuối cùng, bạn sẽ có TLS được cấu hình với các mã hóa hiện đại, một tường lửa tối thiểu và bảo vệ tự động khỏi các cuộc tấn công brute-force thông qua Fail2Ban.


1. Chỉ sử dụng TLS 1.2+

Các phiên bản giao thức cũ hơn có nhiều điểm yếu đã được biết đến. Hãy chỉnh sửa khối server hoặc ngữ cảnh http để vô hiệu hóa SSLv3, TLS 1.0 và TLS 1.1.

nginx Copy
# /etc/nginx/nginx.conf (hoặc một snippet riêng)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers \
    "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

Dòng ssl_ciphers ưu tiên các bộ mã hóa bảo mật tiến lên và loại bỏ các mã CBC-mode dễ bị tổn thương với BEAST và Lucky 13.


2. Kích hoạt HTTP/2 và HSTS

HTTP/2 giúp giảm độ trễ và HSTS yêu cầu trình duyệt luôn sử dụng HTTPS.

nginx Copy
listen 443 ssl http2;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Hãy chắc chắn rằng bạn đã gửi tên miền của mình vào danh sách preload của Chrome nếu bạn muốn cờ preload được tôn trọng.


3. Ẩn Thông Tin Phiên Bản Server

Các kẻ tấn công thường bắt đầu bằng cách xác định phiên bản Nginx chính xác. Tắt tiêu đề Server mặc định và bất kỳ tiêu đề X-Powered-By nào.

nginx Copy
server_tokens off;
more_clear_headers Server;

Chỉ thị more_clear_headers đến từ ngx_http_headers_more_filter_module, bạn có thể kích hoạt thông qua gói Nginx chính thức hoặc tự biên dịch.


4. Giới hạn Quyền Truy Cập đến Các Vị Trí Nhạy Cảm

Không bao giờ để lộ các điểm cuối nội bộ như /status hoặc /api/debug ra internet công cộng.

nginx Copy
location /status {
    allow 127.0.0.1;      # Chỉ localhost có thể truy vấn
    deny all;             # Chặn tất cả các IP khác
    stub_status on;
}

Áp dụng cùng một mẫu này cho bất kỳ giao diện quản trị nào, các URL kiểm tra sức khỏe, hoặc các điểm cuối phiên bản.


5. Triển khai Tường Lửa Tối Thiểu (Ví dụ UFW)

Một tường lửa ở cấp độ máy chủ giảm thiểu đáng kể diện tích tấn công. Chỉ cho phép HTTP/HTTPS và SSH từ các IP tin cậy.

bash Copy
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp from 203.0.113.5   # IP quản trị của bạn
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Nếu bạn sử dụng iptables trực tiếp, cùng một logic cũng áp dụng: chặn tất cả trừ các cổng mà bạn cần.


6. Cài đặt Fail2Ban để Bảo Vệ Khỏi Các Cuộc Tấn Công Brute-Force

Fail2Ban theo dõi nhật ký Nginx và cấm các IP vượt quá số lượng yêu cầu thất bại có thể cấu hình.

ini Copy
# /etc/fail2ban/jail.d/nginx-http-auth.conf
[nginx-http-auth]
enabled = true
port    = http,https
filter  = nginx-http-auth
logpath = /var/log/nginx/*error.log
maxretry = 5
bantime = 3600

Tạo bộ lọc tương ứng (/etc/fail2ban/filter.d/nginx-http-auth.conf) tìm kiếm các mã trạng thái 401 hoặc 403. Khởi động lại dịch vụ bằng systemctl restart fail2ban.


7. Giữ Nginx và Các Gói Hệ Thống Cập Nhật

Các bản vá bảo mật sẽ trở nên vô ích nếu chúng không bao giờ được áp dụng. Tự động hóa cập nhật với trình quản lý gói của hệ điều hành bạn.

bash Copy
# Debian/Ubuntu
sudo apt-get update && sudo apt-get upgrade -y
# Kích hoạt cập nhật không giám sát
sudo dpkg-reconfigure unattended-upgrades

Trên các hệ thống dựa trên RHEL, sử dụng yum-cron hoặc dnf-automatic. Lên lịch kiểm tra hàng tuần cấu hình Nginx (nginx -t) để phát hiện lỗi cú pháp trước khi khởi động lại.


Bonus: Sao Lưu Cấu Hình Một Cách Định Kỳ

Một tác vụ rsync đơn giản đến một máy chủ từ xa hoặc bucket S3 đảm bảo bạn có thể khôi phục trạng thái đã được bảo mật sau thảm họa.

bash Copy
rsync -avz /etc/nginx/ user@backup.example.com:/backups/nginx-$(date +%F)

Kết hợp điều này với kiểm soát phiên bản (Git) để phục hồi dựa trên sự khác biệt.


Thực hành tốt nhất

  • Luôn kiểm tra cấu hình: Trước khi khởi động lại Nginx, hãy luôn chạy lệnh nginx -t để kiểm tra cấu hình.
  • Sử dụng HTTPS Everywhere: Đảm bảo rằng tất cả các trang web của bạn đều sử dụng HTTPS, không chỉ các trang đăng nhập.

Những cạm bẫy thường gặp

  • Quên cập nhật: Nhiều người quản trị quên cập nhật Nginx và hệ thống, dẫn đến các lỗ hổng bảo mật.
  • Thiết lập sai tường lửa: Đảm bảo rằng bạn không vô tình mở các cổng không cần thiết.

Mẹo Hiệu Năng

  • Sử dụng bộ nhớ cache: Thiết lập caching để giảm thiểu tải cho Nginx và cải thiện tốc độ tải trang.
  • Giám sát hiệu suất: Sử dụng các công cụ giám sát để theo dõi hiệu suất của Nginx.

Khắc phục sự cố

  • Nginx không khởi động: Kiểm tra nhật ký lỗi để xác định nguyên nhân.
  • Không thể truy cập trang web: Đảm bảo rằng tường lửa không chặn các yêu cầu đến.

Kết luận

Việc làm cứng Nginx không đòi hỏi phải thay đổi quá lớn; một danh sách kiểm tra kỷ luật như trên sẽ giúp bạn có TLS, một tường lửa an toàn, giảm thiểu tự động các cuộc tấn công brute-force và một quy trình cập nhật đáng tin cậy. Áp dụng các bước này một cách dần dần, thử nghiệm từng thay đổi trong môi trường staging và bạn sẽ giảm thiểu đáng kể khả năng xảy ra một cuộc tấn công thành công. Để biết thêm các hướng dẫn thực tiễn về cơ sở hạ tầng web, bạn có thể tìm thấy tài nguyên tại https://lacidaweb.com hữu ích.

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