一、严格设置日志文件权限
日志文件的权限是基础安全防线,需确保仅授权用户(如Nginx运行的用户)可访问。通常,Nginx以nginx或www-data用户运行,日志目录(如/var/log/nginx)及文件应遵循以下设置:
755(所有者可读、写、执行,组和其他用户可读、执行),避免其他用户修改目录结构;640(所有者可读、写,组用户可读,其他用户无权限),防止未授权用户读取敏感日志内容;chown命令将日志文件所有者设为Nginx运行用户(如sudo chown nginx:nginx /var/log/nginx/*.log)。find /var/www/html -type f -exec chmod 644 {} \;(文件设为644)和find /var/www/html -type d -exec chmod 755 {} \;(目录设为755)统一权限,再调整日志文件所有权。二、过滤敏感信息,避免日志泄露
日志中可能包含用户隐私(如Cookie、手机号)、系统路径(如404错误暴露的绝对路径)或业务敏感信息(如未公开API端点),需通过以下方式过滤:
log_format指令仅记录必要字段,排除敏感信息。例如,定义main格式时,避免包含$request_body(请求体,可能含密码)或$http_cookie(Cookie):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;
if指令拦截含恶意代码或敏感参数的请求,防止其写入日志。例如,拦截含<?php、eval、shell等字符的请求:if ($request_uri ~* "(\<\?php|\<script|eval|shell)") {
return 403;
}
if ($http_user_agent ~* "(\<\?php|eval|shell)") {
return 403;
}
<、>、<?),避免解析漏洞。例如,清洗access.log中的HTML标签和PHP标识:import re
def clean_log(log_content):
log_content = re.sub(r'<[^>]+>', '', log_content) # 移除HTML标签
log_content = re.sub(r'\<\?php|\?\>', '', log_content) # 移除PHP标识
return log_content
with open('/var/log/nginx/access.log', 'r', encoding='utf-8') as f:
clean_content = clean_log(f.read())
with open('/var/log/nginx/access_clean.log', 'w', encoding='utf-8') as f:
f.write(clean_content)
```。
三、配置日志轮转,防止日志膨胀
日志文件长期积累会导致磁盘空间耗尽,需通过logrotate工具定期压缩、删除旧日志。示例配置(/etc/logrotate.d/nginx):
/var/log/nginx/*.log {
daily # 每天轮转
missingok # 若日志不存在,不报错
rotate 30 # 保留30天日志
compress # 压缩旧日志(如access.log.1.gz)
delaycompress # 延迟压缩(避免压缩当天日志)
notifempty # 若日志为空,不轮转
create 640 nginx nginx # 轮转后创建新日志,设置权限和所有权
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
systemctl reload nginx # 重新加载Nginx,切换日志文件
endscript
}
此配置可确保日志文件不会无限增长,同时保留近期日志供审计使用。
四、加密传输与存储,保护日志机密性
若需将日志传输至远程服务器或存储系统,需采用加密方式防止窃取:
scp、rsync over SSH或SFTP替代FTP等明文传输协议,确保日志在传输过程中不被截获;五、监控日志访问与异常,及时响应风险
通过监控及时发现未授权访问或恶意操作,是日志安全的重要补充:
inotifywait工具监控日志目录,若检测到非授权IP(如外部IP)尝试访问日志文件,立即发送告警:inotifywait -m -e access /var/log/nginx/ | while read event; do
echo "日志被访问:$event" | mail -s "日志安全告警" admin@example.com
done
limit_req模块,监控含特殊字符(如<?php、eval)的请求,若短时间内出现多次同类请求,判定为投毒尝试并拉黑IP;sha256sum),确保日志未被篡改。六、其他辅助安全措施
server_tokens off;指令关闭响应头中的Nginx版本信息,防止攻击者根据版本号查找已知漏洞;X-Frame-Options(防止点击劫持)、X-XSS-Protection(强化XSS防护)、Content-Security-Policy(控制资源加载)等Headers,减少Web攻击面;limit_conn_zone和limit_req_zone模块,限制单个IP的并发连接数(如limit_conn addr 10;)和请求频率(如limit_req zone=req_zone burst=5 nodelay;),防止DDoS攻击和暴力破解。