CentOS Nginx日志安全保障体系构建指南
确保Nginx日志文件及所在目录的权限设置符合最小权限原则,防止未授权访问。Nginx通常以nginx或www-data用户运行(CentOS默认为nginx),需将日志文件的所有者设为该用户,并限制组内其他用户及公众的访问权限。
具体操作:
# 设置日志目录所有者及权限(如/var/log/nginx)
sudo chown -R nginx:nginx /var/log/nginx
sudo chmod -R 750 /var/log/nginx
# 单个日志文件权限示例(如error.log、access.log)
sudo chown nginx:nginx /var/log/nginx/error.log
sudo chmod 640 /var/log/nginx/error.log
注意:若日志目录权限过严(如700),可能导致Nginx无法写入日志,需平衡安全性与功能性。
使用logrotate工具定期切割、压缩旧日志,避免日志文件无限增长占用磁盘空间,同时降低日志泄露风险。编辑CentOS的默认日志轮转配置文件/etc/logrotate.d/nginx,添加以下内容:
/var/log/nginx/*.log {
daily # 每日轮转
missingok # 忽略缺失日志文件
rotate 7 # 保留最近7份日志
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免压缩当天日志)
notifempty # 空日志不轮转
create 0640 nginx nginx # 轮转后创建新日志文件并设置权限
sharedscripts # 所有日志轮转完成后执行postrotate脚本
postrotate
/bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || true
endscript
}
作用:每日生成新日志文件,保留7天压缩日志,自动触发Nginx重新打开日志文件,确保日志连续性。
日志中可能包含用户IP、请求参数、Cookie等敏感信息,需通过以下方式减少泄露风险:
/etc/nginx/nginx.conf或虚拟主机配置),移除不必要的变量(如$args请求参数、$http_cookie Cookie),仅保留必要字段(如$remote_addr客户端IP、$request_method请求方法、$uri请求URI):log_format minimal '$remote_addr - $remote_user [$time_local] "$request_method $uri" '
'$status $body_bytes_sent';
access_log /var/log/nginx/access.log minimal;
grep、sed等工具剔除或替换敏感信息(如IP地址),例如:sed -i 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/XXX.XXX.XXX.XXX/g' /var/log/nginx/access.log
rsyslog的omfwd模块或logstash的ssl配置),防止数据在传输过程中被窃取。chmod设置日志文件权限为640(所有者可读写,组用户可读,其他用户无权限),并通过chown将组设置为adm(CentOS中负责系统日志的组):sudo chown nginx:adm /var/log/nginx/*.log
sudo chmod 640 /var/log/nginx/*.log
access_log指令,减少日志量及潜在泄露风险:# access_log /var/log/nginx/access.log; # 注释掉该行以禁用访问日志
map模块仅记录特定IP或请求的日志,例如仅记录来自内部网络的请求:map $remote_addr $loggable {
default 0;
"~^10\." 1; # 仅记录10.x.x.x网段的请求
}
access_log /var/log/nginx/access.log combined if=$loggable;
enforcing模式(默认开启),并正确设置日志文件的SELinux上下文。Nginx日志文件的上下文应为var_log_t,可使用以下命令修复:sudo restorecon -Rv /var/log/nginx # 恢复默认上下文
若需自定义策略,可使用audit2allow工具根据SELinux审计日志生成自定义模块:sudo ausearch -c 'nginx' --raw | audit2allow -M my-nginx-log
sudo semodule -i my-nginx-log.pp
firewalld或iptables限制对Nginx端口(80/443)的访问,仅允许必要IP地址访问。例如,使用firewalld添加IP白名单:sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept'
sudo firewall-cmd --reload
或使用iptables限制端口访问:sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
定期审查Nginx日志,及时发现异常行为(如大量404错误、SQL注入尝试、暴力破解)。可使用以下工具提升监控效率:
tail、grep实时查看日志,例如查看最近10条404错误:sudo tail -n 10 /var/log/nginx/error.log | grep "404"
ELK Stack(Elasticsearch+Logstash+Kibana)、Graylog或GoAccess,实现日志的可视化、实时告警及趋势分析。例如,使用GoAccess生成访问报告:sudo yum install goaccess -y
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/html/report.html
通过浏览器访问http://服务器IP/report.html即可查看可视化报告。/etc/nginx/nginx.conf)的全局块中添加server_tokens off;,关闭HTTP响应头中的版本号(如Server: nginx/1.20.1),减少攻击者利用版本漏洞攻击的风险。error_page指令,使用自定义错误页面(如404.html、500.html)替代默认页面,避免泄露服务器路径、PHP版本等信息。例如:error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /404.html {
internal;
}
location = /50x.html {
internal;
}
limit_req_zone模块限制单个IP的请求速率,防止DDoS攻击或暴力破解。例如,在http块中添加:limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;
在server或location块中应用:location / {
limit_req zone=req_per_ip burst=20 nodelay;
}