1. 隐藏Nginx版本信息
通过隐藏Nginx版本号,避免攻击者利用已知版本漏洞发起针对性攻击。配置方法:在Nginx的http、server或location块中添加server_tokens off;指令,生效后可隐藏响应头中的版本信息。
2. 配置安全HTTP响应头
添加关键HTTP响应头可有效防御常见Web攻击:
X-Frame-Options: DENY/SAMEORIGIN:防止点击劫持(禁止页面被嵌入iframe);X-XSS-Protection: 1; mode=block:启用浏览器XSS过滤器并阻止恶意脚本执行;X-Content-Type-Options: nosniff:防止MIME类型混淆攻击(强制浏览器遵守Content-Type);Referrer-Policy: no-referrer:控制Referer信息泄露(增强隐私保护);Content-Security-Policy: default-src 'self':限制资源加载来源(仅允许同源资源)。server或location块中。3. 限制连接数与请求频率
通过限制单个IP的并发连接数和请求频率,预防DoS/DDoS攻击及暴力破解:
limit_conn_zone定义共享内存区域(如limit_conn_zone $binary_remote_addr zone=conn_limit:10m;),再用limit_conn指令限制并发连接数(如limit_conn conn_limit 10;,每个IP最多10个并发连接);limit_req_zone定义请求频率限制(如limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;),再用limit_req指令限制请求速率(如limit_req zone=req_limit burst=5 nodelay;,每秒1个请求,允许突发5个)。http、server或location块中。4. 配置敏感区域IP白名单
对管理后台、API接口等敏感路径,仅允许信任的IP地址访问,减少暴露面:
在Nginx的location块中使用allow(允许)和deny(拒绝)指令,例如:
location /admin/ {
allow 192.168.1.100; # 允许特定IP
allow 10.0.0.0/8; # 允许IP段
deny all; # 拒绝其他所有IP
}
此配置可有效限制敏感区域的访问权限。
5. 启用SSL/TLS安全配置
通过HTTPS加密数据传输,防止数据被窃听或篡改,并强制使用HTTPS:
server块中配置listen 443 ssl;及证书路径(ssl_certificate /path/to/cert.pem;、ssl_certificate_key /path/to/key.pem;);add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";指令启用HSTS(HTTP严格传输安全),强制浏览器始终通过HTTPS访问网站。6. 日志分析与异常识别
通过分析访问日志(access.log)和错误日志(error.log),及时发现恶意行为:
grep ' 404 ' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr;awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10;grep ' 401 ' /var/log/nginx/access.log;/config/目录):grep '/config/' /var/log/nginx/access.log。7. 日志轮转与管理
通过日志轮转避免单个日志文件过大,占用磁盘空间并影响性能:
logrotate工具(Linux系统自带),创建/etc/logrotate.d/nginx配置文件,内容示例:/var/log/nginx/*.log {
daily # 每天轮转
missingok # 文件不存在时不报错
rotate 30 # 保留30天日志
compress # 压缩旧日志
delaycompress # 延迟压缩(避免压缩当天日志)
notifempty # 日志为空时不轮转
create 0640 www-data adm # 创建新日志文件并设置权限
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
/etc/init.d/nginx reload > /dev/null 2>&1 || true
endscript
}
配置后,logrotate会每天自动执行日志轮转。8. 监控与自动报警
设置实时监控与报警机制,及时响应安全事件:
/etc/fail2ban/jail.local,添加[nginx-auth] section:[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=HTTP, port="http,https", protocol=tcp]
logpath = /var/log/nginx/access.log
bantime = 3600 # 封禁1小时
findtime = 600 # 10分钟内
maxretry = 3 # 3次失败后封禁