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注入嘗試、暴力破解)??墒褂靡韵鹿ぞ咛嵘O控效率:
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;
}