基本安全设置
隐藏 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; }
使用logrorate进行nginx日志归档
安装 logrotate
sudo apt install logrotate
创建或编辑 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 }
https设置
在 /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; }
限制单 IP 并发连接数
limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn addr 10;
使用 安装Fail2Ban 配合 Nginx 限制渗透ip
当访问的ip在短时间内发生大量的404访问,可以通过fail2ban操作防火墙直接deny ip 访问
安装Fail2Ban
sudo apt update sudo apt install fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban
nginx 日志格式准备
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;
创建 Fail2Ban 过滤器
路径:/etc/fail2ban/filter.d/nginx-404.conf
[Definition] failregex = ^<HOST> -.*"(GET|POST|HEAD).+" 404 ignoreregex =
匹配状态码 404 的请求 <HOST> 会自动匹配 IP 地址
配置 Fail2Ban 监狱(Jail)
/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 次数
配置fail2ban action 脚本
/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 WAF
ModSecurity v3 是当前推荐在 Nginx 中使用的版本
安装 ModSecurity v3 及其依赖
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
下载并构建 ModSecurity v3 Core Library
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
编译 Nginx ModSecurity 连接模块
sudo apt install -y libnginx-mod-http-modsecurity nginx
配置 Nginx 加载模块并启用 ModSecurity
在 Nginx 配置中添加
启用模块(在 nginx.conf 开头):
load_module modules/ngx_http_modsecurity_module.so;
在 server 或 location 中启用:
modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf;
准备 ModSecurity 配置规则
下载 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
重启 Nginx 验证
sudo nginx -t sudo systemctl restart nginx
访问网站时查看 /var/log/modsec_audit.log 或 /var/log/nginx/error.log 是否有拦截日志。
根据 IP 归属地(国家、地区)限制访问
安装 GeoIP 依赖
sudo apt install nginx-module-geoip geoip-database
下载并更新 GeoLite2 数据库(需注册账号)
注册获取下载链接:
https://dev.maxmind.com/geoip/geolite2/
配置 Nginx 使用 GeoIP
修改 /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 / { # 正常服务配置 } } }
暂无评论内容