Tính năng:
- Chặn tấn công DDoS layer 7 (tầng Application)
- Có thể cấu hình chặn request từ quốc tế, chỉ cho phép một vài quốc gia truy cập.
## Summary
– Nginx with ModSecurity v3 dynamic module enabled
– OWASP CRS loaded via ModSecurity rules
– CrowdSec installed with Nginx bouncer to block attacks detected by logs or ModSecurity alerts
Bài này đã test trên Ubuntu 22.04 và 24.04
Prerequisites
apt update -y && apt upgrade -y
apt install -y gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext \
pkg-config libgeoip-dev libyajl-dev doxygen libpcre2-16-0 libpcre2-dev libpcre2-posix3 zlib1g zlib1g-dev liblua5.1-0-devluarocks install lua-resty-http
luarocks install lua-resty-string
Bắt đầu cài WAF
Cài nginx
add-apt-repository ppa:ondrej/nginx -y
apt install nginx -ysystemctl enable nginx
systemctl status nginx
Cài ModSecurity
cd /opt && git clone https://github.com/owasp-modsecurity/ModSecurity.git
cd ModSecuritygit submodule init
git submodule update./build.sh
./configuremake -j$(nproc)
make install
Cài và cấu hình ModSecurity – nginx connector
cd /opt && git clone https://github.com/owasp-modsecurity/ModSecurity-nginx.git
Cấu hình bật module modsec trên nginx
cd /opt && wget https://nginx.org/download/nginx-1.28.0.tar.gz
tar -xzf nginx-1.28.0.tar.gz
cd nginx-1.28.0./configure –with-compat –add-dynamic-module=/opt/ModSecurity-nginx
make -j$(nproc)
make modules
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules-enabled/
cp /opt/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsecurity.conf
cp /opt/ModSecurity/unicode.mapping /etc/nginx/unicode.mapping
Chỉnh file /etc/nginx/nginx.conf
include /etc/nginx/modules-enabled/*.conf;
load_module /etc/nginx/modules-enabled/ngx_http_modsecurity_module.so;http {
log_format custom ‘$remote_addr – $remote_user [$time_local] ‘
‘”$request” $status $body_bytes_sent ‘
‘”$http_referer” “$http_user_agent” “$gzip_ratio”‘;
Chỉnh sửa file /etc/nginx/sites-enabled/default
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity.conf;
Chỉnh sửa file /etc/nginx/modsecurity.conf
SecRuleEngine On
Sau khi tạo vhost xong thì xóa file /etc/nginx/sites-enabled/default cũng được.
Cài OWASP
cd /etc/nginx
git clone https://github.com/coreruleset/coreruleset.git /etc/nginx/owasp-crs
cp /etc/nginx/owasp-crs/crs-setup.conf{.example,}
Thêm vào /etc/nginx/modsecurity.conf
Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf
systemctl restart nginx
Thử truy cập https://ip_address/as.php?s=/bin/bash thấy 403 là ok
Check log
tail -f /var/log/modsec_audit.log
tail -f /var/log/nginx/error.log
Cài CrowdSec
cd /opt
curl -s https://install.crowdsec.net | sudo sh
apt install -y lua5.1 libnginx-mod-http-lua luarocks gettext-base lua-cjson#curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
apt install crowdsec crowdsec-firewall-bouncer-iptables crowdsec-nginx-bouncer -y
Chặn quốc tế, sửa ở đầu file /etc/crowdsec/profile.yaml
name: not_VN
#debug: true
filters:
– Alert.Remediation == true && Alert.GetScope() == “Ip” && Alert.Source.Cn != ‘VN’## Or Alert.Source.Cn not in [‘GB’, ‘FR’] if you want multiple
decisions:
– type: ban
duration: 24h
#duration_expr: “Sprintf(‘%dh’, (GetDecisionsCount(Alert.GetValue()) + 1) * 4)”
#notifications:
# – slack_default # Set the webhook in /etc/crowdsec/notifications/slack.yaml before enabling this.
on_success: break
—
systemctl enable crowdsec
systemctl start crowdsec
Sửa file /etc/crowdsec/acquis.yaml
filenames:
– /var/log/nginx/*.log
– /var/log/nginx/*.log
labels:
type: nginx
# Enable reCAPTCHA
# Truy cập https://www.google.com/recaptcha/admin/create
# Chỉnh sửa file /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf
Site key: 6Lee7D4rAAAAAPu0Bunxo_1YXZ5D1IYAnYzAJnc0
Secret key: 6Lee7D4rAAAAAIoVtYKBkM645B030BMmvNKUUmGl
systemctl reload nginx
apt install crowdsec-firewall-bouncer -y
systemctl enable crowdsec-firewall-bouncer
systemctl start crowdsec-firewall-bouncer
Nginx vhost sample
limit_req_zone $binary_remote_addr zone=mayapmic:10m rate=250r/s;
proxy_cache_path /var/cache/nginx/mayapmic levels=1:2 keys_zone=mayapmic_cache:10m max_size=500m inactive=30m use_temp_path=off;server {
listen 80;
#listen [::]:80; # Dùng nếu có IPv6
http2 on;include /etc/nginx/blocklists/mayapmic.com.conf;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity.conf;server_name mayapmic.com www.mayapmic.com;
access_log /var/log/nginx/mayapmic.com-ssl.log;
error_log /var/log/nginx/mayapmic.com-ssl.error.log warn;location / {
limit_req zone=mayapmic burst=70 delay=10;
proxy_cache mayapmic_cache;
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_bypass $http_cache_control;
add_header X-Proxy-Cache $upstream_cache_status;proxy_buffering on;
proxy_buffer_size 16k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
proxy_max_temp_file_size 0;proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;proxy_pass https://103.97.125.172;
}}
map $http_upgrade $connection_upgrade {
default upgrade;
” close;
}server {
listen 443 ssl;
#listen [::]:443 ssl; # Dung neu co IPv6
http2 on;include /etc/nginx/blocklists/mayapmic.com.conf;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity.conf;server_name mayapmic.com www.mayapmic.com;
access_log /var/log/nginx/mayapmic.com-ssl.log;
error_log /var/log/nginx/mayapmic.com-ssl.error.log warn;ssl_certificate /etc/nginx/ssl/mayapmic.com.crt;
ssl_certificate_key /etc/nginx/ssl/mayapmic.com.key;location / {
limit_req zone=mayapmic burst=70 delay=10;
proxy_cache mayapmic_cache;
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_bypass $http_cache_control;
add_header X-Proxy-Cache $upstream_cache_status;proxy_buffering on;
proxy_buffer_size 16k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
proxy_max_temp_file_size 0;proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;proxy_pass https://103.97.125.172;
}
}
Was this helpful?
0 / 0