Cách bảo mật Nginx bằng NAXSI trên Ubuntu 16.04
Nginx là một server HTTP open-souce phổ biến và Reverse Proxy được biết đến với tính ổn định, cấu hình đơn giản và yêu cầu tài nguyên tiết kiệm. Bạn có thể tăng cường bảo mật cho server Nginx của bạn bằng cách sử dụng một module như NAXSI. NAXSI ( Nginx Anti XSS & SQL Injection ) là một module Nginx bên thứ ba, miễn phí cung cấp các tính năng firewall ứng dụng web. NAXSI phân tích, lọc và bảo mật lưu lượng truy cập đến ứng dụng web của bạn và hoạt động giống như firewall DROP theo mặc định, nghĩa là nó chặn tất cả lưu lượng truy cập trừ khi được hướng dẫn cụ thể cho phép truy cập.Sự đơn giản mà user có thể thao tác truy cập là một tính năng chính giúp phân biệt NAXSI với các firewall ứng dụng web khác (WAF) có chức năng tương tự như ModSecurity . Mặc dù ModSecurity đi kèm với một bộ tính năng phong phú, nhưng nó khó bảo trì hơn NAXSI. Điều này làm cho NAXSI trở thành một lựa chọn đơn giản và dễ thích ứng, cung cấp các luật sẵn có hoạt động tốt với các ứng dụng web phổ biến như WordPress.
Trong hướng dẫn này, bạn sẽ sử dụng NAXSI để bảo mật Nginx trên server Ubuntu 16.04 của bạn . Vì module NAXSI không đi kèm với gói Nginx theo mặc định, bạn cần phải biên dịch Nginx từ nguồn với NAXSI. Đến cuối hướng dẫn này, bạn sẽ biết NAXSI có thể chặn các loại tấn công nào và cách cấu hình các luật NAXSI.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Một server Ubuntu 16.04 được cài đặt theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 , bao gồm user không phải root có quyền sudo và firewall .
Bước 1 - Cài đặt Nginx và NAXSI
Hầu hết các module Nginx không có sẵn thông qua các repository và NAXSI cũng không ngoại lệ. Bởi vì điều này, bạn sẽ phải download và biên dịch Nginx theo cách thủ công từ nguồn với NAXSI.
Đầu tiên, download Nginx bằng lệnh sau.
Lưu ý: Hướng dẫn này sử dụng version 1.14 của Nginx. Để sử dụng version mới hơn, bạn có thể truy cập trang download và thay thế văn bản được đánh dấu trong lệnh trước bằng số version cập nhật. Bạn nên sử dụng version ổn định mới nhất.
- wget http://nginx.org/download/nginx-1.14.0.tar.gz
Tiếp theo, download NAXSI từ bản phát hành 0.56 ổn định trên Github.
Lưu ý: Hướng dẫn này sử dụng version 0.56 của NAXSI. Bạn có thể tìm thêm các bản phát hành gần đây tại trang NAXSI Github . Bạn nên sử dụng version ổn định mới nhất.
- wget https://github.com/nbs-system/naxsi/archive/0.56.tar.gz -O naxsi
Như bạn có thể nhận thấy, repository Nginx là một repository tar
. Trước tiên, bạn cần extract nó để có thể biên dịch và cài đặt nó, bạn có thể thực hiện bằng cách sử dụng lệnh tar
.
- tar -xvf nginx-1.14.0.tar.gz
Trong lệnh trước, -x
chỉ định tiện ích extract , -v
làm cho tiện ích này chạy ở chế độ tiết và -f
cho biết tên của file lưu trữ cần extract .
Đến đây bạn đã extract các file Nginx, bạn có thể chuyển sang extract các file NAXSI bằng lệnh sau:
- tar -xvf naxsi
Đến đây bạn có folder naxsi- 0.56
và nginx- 1.14.0
trong folder chính của bạn. Sử dụng các file bạn vừa download và extract , bạn có thể biên dịch server Nginx với NAXSI. Di chuyển vào bạn nginx- 1.14.0
folder
- cd nginx-1.14.0
Để biên dịch Nginx từ nguồn, bạn cần trình biên dịch C gcc
, thư viện Biểu thức chính quy Tương thích Perl libpcre3-dev
và libssl-dev
, thực hiện các giao thức mật mã SSL và TLD. Những phụ thuộc này có thể được thêm vào bằng apt-get
.
Trước tiên, hãy chạy lệnh sau đảm bảo bạn có danh sách các gói được cập nhật.
- sudo apt-get update
Sau đó cài đặt các phụ thuộc:
- sudo apt-get install build-essential libpcre3-dev libssl-dev
Đến đây bạn có tất cả các phụ thuộc của bạn , bạn có thể biên dịch Nginx từ nguồn. Để chuẩn bị cho Nginx được biên dịch từ nguồn trên hệ thống của bạn, hãy thực thi tập lệnh sau, tập lệnh này sẽ tạo Makefile
hiển thị nơi tìm tất cả các phụ thuộc cần thiết.
- ./configure \
- --conf-path=/etc/nginx/nginx.conf \
- --add-module=../naxsi-0.56/naxsi_src/ \
- --error-log-path=/var/log/nginx/error.log \
- --http-client-body-temp-path=/var/lib/nginx/body \
- --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
- --http-log-path=/var/log/nginx/access.log \
- --http-proxy-temp-path=/var/lib/nginx/proxy \
- --lock-path=/var/lock/nginx.lock \
- --pid-path=/var/run/nginx.pid \
- --user=www-data \
- --group=www-data \
- --with-http_ssl_module \
- --without-mail_pop3_module \
- --without-mail_smtp_module \
- --without-mail_imap_module \
- --without-http_uwsgi_module \
- --without-http_scgi_module \
- --prefix=/usr
Mỗi dòng của lệnh trước đó xác định một tham số cho web server Nginx. Quan trọng nhất trong số này là tham số --add-module=../naxsi- 0.56 /naxsi_src/
, kết nối module NAXSI với Nginx và tham số --user=www-data
và --group=www-data
paramaters , làm cho Nginx chạy với user và quyền group của user / group chuyên dụng được gọi là www-data
đi kèm với server Ubuntu 16.04 của bạn. Các --with-http_ssl_module
tham số cho phép server Nginx để mã hóa sử dụng SSL, và --without-mail_pop3_module
, --without-mail_smtp_module
, và --without-mail_imap_module
thông số tắt các giao thức email không cần thiết mà nếu không sẽ được tự động đưa vào. Để biết thêm giải thích về các thông số này, hãy xem tài liệu chính thức của Nginx .
Sau khi sử dụng lệnh ./configure
, hãy chạy lệnh make
để thực hiện một loạt các việc được xác định trong Makefile
mà bạn vừa tạo để xây dựng chương trình từ mã nguồn.
- make
Khi Nginx được xây dựng và sẵn sàng chạy, hãy sử dụng lệnh make install
làm siêu user để sao chép chương trình đã xây dựng và các thư viện của nó vào đúng vị trí trên server của bạn.
- sudo make install
Khi điều này thành công, bạn sẽ có một version đã biên dịch của Nginx với module NAXSI. Để NAXSI bắt đầu chặn lưu lượng truy cập không mong muốn, bây giờ bạn cần cài đặt một bộ luật mà NAXSI sẽ thực hiện bằng cách tạo một loạt các file cấu hình.
Bước 2 - Cấu hình NAXSI
Phần quan trọng nhất trong hoạt động của firewall là các luật của nó, xác định cách các yêu cầu bị chặn từ server . Bộ luật cơ bản đi kèm theo mặc định với NAXSI được gọi là luật cốt lõi . Các luật này nhằm tìm kiếm các mẫu trong các phần của yêu cầu và lọc ra những mẫu có thể là các cuộc tấn công. Luật cốt lõi NAXSI được áp dụng trên phạm vi global cho server để khớp chữ ký.
Để cấu hình Nginx để sử dụng các luật cốt lõi này, hãy sao chép file naxsi_core.rules
vào folder cấu hình Nginx.
- sudo cp ~/naxsi-0.56/naxsi_config/naxsi_core.rules /etc/nginx/
Như vậy, các luật cốt lõi đã được cài đặt , hãy thêm các luật Naxsi cơ bản, cho phép và triển khai các luật cốt lõi trên cơ sở mỗi vị trí và chỉ định các hành động để server thực hiện khi yêu cầu URL không đáp ứng các luật cốt lõi. Tạo một file có tên naxsi.rules
bên trong folder /etc/nginx/
. Để làm như vậy, hãy sử dụng lệnh sau để mở file trong editor có tên nano hoặc sử dụng editor mà bạn chọn.
- sudo nano /etc/nginx/naxsi.rules
Thêm khối mã sau xác định một số luật firewall cơ bản.
SecRulesEnabled; DeniedUrl "/error.html"; ## Check for all the rules CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK;
Mã trước đó xác định DeniedUrl
, là URL
NAXSI sẽ chuyển hướng đến khi một yêu cầu bị chặn. Tệp cũng cho phép một danh sách kiểm tra các loại tấn công khác nhau mà NAXSI nên chặn, bao gồm chèn SQL, tập lệnh trang web chéo (XSS) và bao gồm file từ xa (RFI). Khi bạn đã thêm mã trước đó vào file , hãy lưu và thoát khỏi editor .
Vì bạn đã chuyển hướng các yêu cầu bị chặn đến /error.html
, nên bây giờ bạn có thể tạo file error.html
bên trong folder /usr/html
để cung cấp cho trang đích này một trang đích. Mở file trong editor của bạn:
- sudo nano /usr/html/error.html
Tiếp theo, thêm mã HTML sau vào file để tạo trang web cho phép user biết rằng yêu cầu của họ đã bị chặn:
<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>
Lưu file và thoát khỏi editor .
Tiếp theo, mở file cấu hình Nginx /etc/nginx/nginx.conf
trong editor của bạn.
- sudo nano /etc/nginx/nginx.conf
Để thêm file cấu hình NAXSI vào cấu hình của Nginx để web server biết cách sử dụng NAXSI, hãy chèn các dòng mã được đánh dấu vào phần http
của file nginx.conf
:
. . . http { include mime.types; include /etc/nginx/naxsi_core.rules; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; default_type application/octet-stream; . . .
Sau đó, trong phần server
của cùng một file , hãy thêm dòng được đánh dấu sau:
. . . server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { include /etc/nginx/naxsi.rules; root html; index index.html index.htm; } . . .
Đến đây bạn đã cấu hình Nginx với các luật cơ bản và cốt lõi cho NAXSI, firewall sẽ chặn các yêu cầu độc hại phù hợp khi bạn khởi động web server . Tiếp theo, bạn có thể viết một tập lệnh khởi động đảm bảo rằng Nginx khởi động khi bạn khởi động lại server .
Bước 3 - Tạo tập lệnh khởi động cho Nginx
Vì bạn đã cài đặt Nginx theo cách thủ công, nên bước tiếp theo là tạo tập lệnh khởi động để làm cho web server tự động khởi động lại khi reload hệ thống.
Hướng dẫn này sử dụng bộ phần mềm Systemd để tạo tập lệnh. Để thực hiện việc này, bạn sẽ tạo Tệp Đơn vị (xem phần Tìm hiểu Đơn vị Systemd và Tệp Đơn vị để nghiên cứu thêm) để cấu hình cách Systemd khởi động và quản lý dịch vụ Nginx.
Tạo một file có tên nginx.service
và mở nó trong editor của bạn:
- sudo nano /lib/systemd/system/nginx.service
Thêm các dòng sau vào file :
[Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/usr/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
Phần [Unit]
xác định chương trình mà bạn đang cấu hình , [Service]
mô tả cách Nginx sẽ hoạt động khi khởi động và [Install]
cung cấp thông tin về cài đặt đơn vị. Khi bạn thêm những dòng này vào file nginx.service
, systemd
sẽ biết cách khởi động Nginx.
Tiếp theo, Nginx cần một folder để lưu trữ tạm thời dữ liệu yêu cầu gửi đến trước khi xử lý trong trường hợp server của bạn không có đủ bộ nhớ. Vì bạn đã cài đặt Nginx từ nguồn, bạn cần tạo một folder mà Nginx có thể sử dụng để lưu trữ dữ liệu này. Tạo một folder có tên body
bên trong /var/lib/nginx
:
- sudo mkdir -p /var/lib/nginx/body
Với tập lệnh khởi động được cài đặt , bây giờ bạn có thể khởi động server Nginx.
Sử dụng lệnh sau để khởi động server .
- sudo systemctl start nginx
Để kiểm tra xem server của bạn có đang hoạt động hay không, hãy chạy lệnh sau:
- sudo systemctl status nginx
Bạn sẽ thấy kết quả sau trong terminal của bạn cho biết rằng server đã khởi động thành công:
Output● nginx.service - The NGINX HTTP and reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2018-11-05 13:59:40 UTC; 1s ago Process: 16199 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 16194 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Main PID: 16201 (nginx) Tasks: 2 Memory: 1.3M CPU: 17ms CGroup: /system.slice/nginx.service ├─16201 nginx: master process /usr/sbin/ngin └─16202 nginx: worker proces . . .
Đến đây bạn có một server Nginx đang chạy được bảo mật bởi NAXSI. Bước tiếp theo là chạy một cuộc tấn công mô phỏng XSS và SQL injection đảm bảo rằng NAXSI đang bảo vệ server của bạn một cách hiệu quả.
Bước 4 - Kiểm tra NAXSI
Để kiểm tra xem Nginx có đang hoạt động với module NAXSI được bật hay không, bạn sẽ thử đánh server với các yêu cầu HTTP độc hại và phân tích các phản hồi.
Đầu tiên, sao chép IP Công cộng của server của bạn và sử dụng lệnh curl
để thực hiện yêu cầu độc hại đối với server Nginx.
- curl 'http://your_server_ip/?q="><script>alert(0)</script>'
URL này bao gồm tập lệnh XSS "><script>alert(0)</script>
trong tham số q
và sẽ bị server từ chối. Theo luật NAXSI mà bạn đã cài đặt trước đó, bạn sẽ được chuyển hướng đến error.html
file error.html
và nhận được phản hồi sau:
Output<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>
Tường lửa NAXSI đã chặn yêu cầu.
Bây giờ, hãy xác minh điều tương tự bằng cách sử dụng log Nginx bằng cách gắn đuôi log server Nginx bằng lệnh sau:
- tail -f /var/log/nginx/error.log
Trong log , bạn sẽ thấy rằng yêu cầu XSS từ địa chỉ IP từ xa đang bị NAXSI chặn:
Output2018/11/07 17:05:05 [error] 21356#0: *1 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=1&total_blocked=1&block=1&cscore0=$SQL&score0=8&cscore1=$XSS&score1=8&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q="><script>alert(0)</script> HTTP/1.1", host: "your_server_ip"
Nhấn CTRL-C
để thoát tail
và dừng xuất file log lỗi.
Tiếp theo, hãy thử một yêu cầu URL khác, lần này với truy vấn SQL Injection độc hại.
- curl 'http://your_server_ip/?q=1" or "1"="1"'
Phần or "1"="1"
của URL trước có thể hiển thị dữ liệu của user trong database và sẽ bị NAXSI chặn. Nó sẽ tạo ra cùng một phản hồi trong terminal :
Output<html> <head> <title>Blocked By NAXSI</title> </head> <body> <div style="text-align: center"> <h1>Malicious Request</h1> <hr> <p>This Request Has Been Blocked By NAXSI.</p> </div> </body> </html>
Bây giờ sử dụng tail
để theo dõi lại log server :
- tail -f /var/log/nginx/error.log
Trong file log , bạn sẽ thấy mục nhập bị chặn cho nỗ lực Chèn SQL:
Output2018/11/07 17:08:01 [error] 21356#0: *2 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=2&total_blocked=2&block=1&cscore0=$SQL&score0=40&cscore1=$XSS&score1=40&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q=1" or "1"="1" HTTP/1.1", host: "your_server_ip"
Nhấn CTRL-C
để thoát khỏi log .
NAXSI hiện đã chặn thành công một cuộc tấn công XSS và SQL injection, điều này chứng tỏ rằng NAXSI đã được cấu hình chính xác và web server Nginx của bạn được bảo mật.
Kết luận
Đến đây bạn đã có hiểu biết cơ bản về cách sử dụng NAXSI để bảo vệ web server của bạn khỏi các cuộc tấn công nguy hiểm. Để tìm hiểu thêm về cách cài đặt Nginx, hãy xem Cách cài đặt khối server Nginx ( Server ảo) trên Ubuntu 16.04 . Nếu bạn muốn tiếp tục nghiên cứu về bảo mật trên web server , hãy xem Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 16.04 và Cách tạo certificate SSL tự ký cho Nginx trong Ubuntu 16.04 .
Các tin liên quan
Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 92018-09-07
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 9
2018-09-06
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 9
2018-09-05
Cách cài đặt Nginx trên Debian 9
2018-09-04
Cách cài đặt Nginx trên Ubuntu 18.04 [Quickstart]
2018-07-23
Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 18.04
2018-07-13
Cách di chuyển web root Nginx đến vị trí mới trên Ubuntu 18.04
2018-07-12
Cách cấu hình Jenkins với SSL bằng Nginx Reverse Proxy trên Ubuntu 18.04
2018-07-10
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 18.04
2018-07-09
Cách tạo chứng chỉ SSL tự ký cho Nginx trong Ubuntu 18.04
2018-07-05