技术文章
隐藏 Nginx 版本号
在 /etc/nginx.conf中添加配置隐藏服务器信息
server_tokens off;
防止点击劫持、防止 MIME 类型嗅探、启用 XSS 保护
在 /etc/nginx.conf中添加配置增加响应头信息
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
禁止访问隐藏文件(如 .git) 在 /etc/nginx.conf中的server配置中增加
location ~ /. {
deny all;
}
sudo apt install logrotate
logrotate 的配置文件通常位于 /etc/logrotate.d/ 目录下。为 Nginx 创建一个专用的配置文件,例如 /etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily # 每天轮转
rotate 7 # 保留 7 份归档日志
compress # 压缩归档日志
delaycompress # 延迟压缩(归档后下一轮再压缩)
missingok # 如果日志文件不存在,不报错
notifempty # 如果日志为空,不轮转
create 0640 www-data adm # 创建新日志文件,设置权限和所有者
sharedscripts # 脚本只执行一次
postrotate # 轮转后执行的脚本
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid` # 向 Nginx 发送 USR1 信号,重新打开日志文件
fi
endscript
}
在 /etc/nginx中启用ssl设置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:...';
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
location / {
limit_req zone=req_limit_per_ip burst=20 nodelay;
}
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;
当访问的ip在短时间内发生大量的404访问,可以通过fail2ban操作防火墙直接deny ip 访问
sudo apt update
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Fail2Ban 通过日志匹配识别恶意请求,首先确保 Nginx 的访问日志中包含状态码和客户端 IP。
在 /etc/nginx/nginx.conf 或虚拟主机配置中设置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log main;
路径:/etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).+" 404
ignoreregex =
匹配状态码 404 的请求 <HOST> 会自动匹配 IP 地址
/etc/fail2ban/jail.d/nginx-404.conf
[nginx-404]
enabled = truefilter = nginx-404
action = ufw # 或 iptables、iptables-multiport、nftables 等,取决于你的防火墙logpath = /var/log/nginx/access.log
bantime = 900 # 封禁时间(秒),如 15 分钟findtime = 60 # 观察窗口时间(秒)maxretry = 20 # 在 findtime 秒内最多允许 20 次 404,超过则封禁
可根据实际需求调整: bantime:被封锁的时间(如 900 秒 = 15 分钟) findtime:在这个时间窗口内监控行为(如 5 分钟) maxretry:最大允许的 404 次数
/etc/fail2ban/action.d/ufw.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ufw deny from <ip> to any
actionunban = ufw delete deny from <ip> to any
[Init]
insertpos = 1
blocktype = reject
destination = any
application =
ModSecurity v3 是当前推荐在 Nginx 中使用的版本
sudo apt update
sudo apt install -y git g++ autoconf automake libtool libxml2 libxml2-dev
libpcre++-dev libyajl-dev pkg-config libcurl4-openssl-dev
libgeoip-dev doxygen zlib1g-dev
git clone --depth 1 -b v3/master https://github.com/SpiderLabs/ModSecuritycd ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make
sudo make install
sudo apt install -y libnginx-mod-http-modsecurity nginx
启用模块(在 nginx.conf 开头):
load_module modules/ngx_http_modsecurity_module.so;
在 server 或 location 中启用:
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
下载 Core Rule Set(CRS):
cd /etc/nginx/modsec/
git clone https://github.com/coreruleset/coreruleset.gitmv coreruleset crscp crs/crs-setup.conf.example crs/crs-setup.conf
创建主配置文件 /etc/nginx/modsec/main.conf:
Include /usr/local/modsecurity/lib/modsecurity.conf-recommended
Include /etc/nginx/modsec/crs/crs-setup.conf
Include /etc/nginx/modsec/crs/rules/*.conf
DetectionOnly 为 On
sudo nginx -t
sudo systemctl restart nginx
访问网站时查看 /var/log/modsec_audit.log 或 /var/log/nginx/error.log 是否有拦截日志。
sudo apt install nginx-module-geoip geoip-database
注册获取下载链接:
https://dev.maxmind.com/geoip/geolite2/
修改 /etc/nginx/nginx.conf:
http {
geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
auto_reload 5m; $geoip2_data_country_code default=CN source=$remote_addr;
}
map $geoip2_data_country_code $allowed_country {
default no;
CN yes;
US yes; # 可允许多个国家
}
server {
listen 80; if ($allowed_country = no) { return 403;
}
location / { # 正常服务配置
}
}
}