[Nginx] Hướng dẫn cấu hình Nginx drop các request có Header “Host” không hợp lệ

Cấu hình Nginx ngừng xử lý các request được gửi đến server không có thông tin Header "Host" hoặc thông tin Header "Host" không nằm trong danh sách các VirtualHost server_name đang được cấu hình hoạt động (cũng như trường hợp "Host" có các ký tự không hợp lệ).

Với bài post này thì mình sẽ đề cập đến một vấn đề rất cơ bản khi bảo mật cũng như tinh chỉnh dịch vụ Web Server Nginx. Đó là cấu hình Nginx ngừng xử lý các request được gửi đến server không có thông tin Header “Host” hoặc thông tin Header “Host” không nằm trong danh sách các VirtualHost server_name đang được cấu hình hoạt động (cũng như trường hợp “Host” có các ký tự không hợp lệ).

Khi bạn cấu hình nhiều website tên miền khác nhau trên hệ thống Web Server Nginx thì bạn sẽ cấu hình rất nhiều block server khác nhau tương ứng các tên miền khác nhau. Ví dụ :

server {
           server_name a.cuongquach.com ;
            ...
}

server {
            server_name b.cuongquach.vn;
            ...
}

server {
            server_name cuongquach.org;
            ...
}

Thế nhưng bây giờ, server của bạn tiếp nhận các request có thông tin như sau :

HTTP Request 1

GET /
Host : omgcuongquach.com
...

HTTP Request 2

GET /index.php
Host : *./.\
...

HTTP Request 3

GET /
Host :
...

– Với request 1,2 thì chúng ta có thông tin HTTP Header “Host” lạ là “omgcuongquach.com” và “*./.\” .
– Với request 3 thì chúng ta nhận được thông tin Header “Host” là rỗng không có giá trị.
Thông thường thì với 2 trường hợp này chúng ta nên cấu hình Nginx từ chối xử lý thẳng các gói tin HTTP Request không hợp lệ như “request 1,2” và “request 3” điều này giúp giảm tải việc xử lý các gói tin không cần thiết cũng như việc bị footprinting thông tin về Vhost của web server.
Chúng ta sẽ sử dụng mã lỗi status code 444 được cung cấp bởi Nginx đặc thù. Vậy status code 444 có ý nghĩa như sau :
– Nginx sẽ đóng kết nối từ người dùng và không trả về bất kì thông tin nào cho người dùng biết vấn đề gì đang xảy ra.

1. Cấu hình Nginx từ chối xử lý dạng request 3

server {
          listen 192.168.1.1:80;
          server_name "";
          return 444;
}

– Nếu giá trị “Host” trong HTTP Request mà trống không, rỗng thì sẽ cắt đứt kết nối của người dùng luôn.

2. Cấu hình Nginx từ chối các request dạng 1,2

server {
          listen 192.168.1.1:80 default_server;
          server_name _;
          return 444;
 }

– Chúng ta sử dụng cấu hình “default_server”, để chỉ định ra nếu Nginx kiểm tra không thấy bất kì thông tin “server_name” của các block server phù hợp với giá trị HTTP Header “Host” của gói tin thì gói tin này sẽ được đẩy đến block server mặc định của Nginx. Lúc này ta sẽ từ chối xử lý các request có thông tin “Host” không hợp lệ ở block server mặc định này.

Như vậy là xong tiếp bài post này rồi. 🙂

Previous article[Apache] Hướng dẫn xác định cơ chế MPM mà dịch vụ Apache đang sử dụng
Next article[Memcached] 10 điều cần lưu ý khi làm việc với dịch vụ Memcached
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !