引言作為使用最廣泛的Web服務器之一,Nginx的安全配置顯得尤為重要。本文將從多個維度詳細介紹如何增強Nginx的安全性,幫助開發運維人員構建一個更安全的Web服務環境。基礎安全配置1.隱藏版本號信息默認...
引言
作為使用最廣泛的Web服務器之一,Nginx的安全配置顯得尤為重要。本文將從多個維度詳細介紹如何增強Nginx的安全性,幫助開發運維人員構建一個更安全的Web服務環境。
一、基礎安全配置
1. 隱藏版本號信息
默認情況下,Nginx會在響應頭中顯示版本號,這可能會給攻擊者提供服務器信息。攻擊者可以根據版本號查找對應版本的已知漏洞進行定向攻擊。
http {
# 關閉在響應頭中顯示Nginx版本號
# 默認響應頭: Server: nginx/1.18.0
# 關閉后響應頭: Server: nginx
server_tokens off;
}
2. 配置安全Headers
添加安全相關的HTTP響應頭,可以有效防御常見的Web攻擊:
# 防止網站被嵌入惡意網頁中,避免點擊劫持
add_header X-Frame-Options "SAMEORIGIN";
# 啟用瀏覽器XSS防護功能,并在檢測到攻擊時,停止渲染頁面
add_header X-XSS-Protection "1; mode=block";
# 禁止瀏覽器猜測(嗅探)資源的MIME類型,防止資源類型混淆攻擊
add_header X-Content-Type-Options "nosniff";
# 控制引用地址信息的傳遞,增強隱私保護
add_header Referrer-Policy "strict-origin-origin-when-cross-origin";
# 內容安全策略,控制資源加載來源,防止XSS等攻擊
# default-src 'self': 只允許加載同源資源
# http: https:: 允許通過HTTP和HTTPS加載資源
# data:: 允許data:URI的資源(如base64編碼的圖片)
# blob:: 允許blob:URI的資源(如視頻流)
# 'unsafe-inline': 允許內聯腳本和樣式(根據需要配置)
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'";
二、訪問控制優化
1. 限制連接數
為防止DOS攻擊,應該限制單個IP的連接數和請求頻率:
http {
# 定義一個共享內存區域,用于存儲IP連接數信息
# $binary_remote_addr: 使用二進制格式存儲客戶端IP,節省空間
# zone=addr:10m: 指定共享內存區域名稱為addr,大小為10MB
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 限制每個IP同時最多100個連接
limit_conn addr 100;
# 定義請求頻率限制,每個IP每秒最多10個請求
# rate=10r/s: 每秒10個請求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;
# 應用請求頻率限制,burst=20表示最多允許20個請求排隊
limit_req zone=req_zone burst=20 nodelay;
}
2. 配置白名單
對于管理后臺等敏感區域,建議配置IP白名單:
location /admin/ {
# 允許內網IP段訪問
# 192.168.1.0/24: 允許192.168.1.x網段的所有IP
allow 192.168.1.0/24;
# 允許另一個內網IP段訪問
allow 10.0.0.0/8;
# 拒絕其他所有IP訪問
deny all;
# 開啟基礎認證
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
}
三、SSL/TLS安全配置
1. 啟用HTTPS
配置SSL證書并強制HTTPS訪問:
server {
# 監聽443端口,啟用SSL
listen 443 ssl;
# 指定SSL證書路徑
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 將所有HTTP請求重定向到HTTPS
if ($scheme != "https") {
return 301 https://$server_name$request_uri;
}
# 啟用HSTS,強制瀏覽器在指定時間內使用HTTPS訪問
add_header Strict-Transport-Security "max-age=31536000" always;
}
2. 優化SSL配置
使用更安全的SSL配置參數:
# 只允許TLS 1.2和1.3版本,禁用不安全的SSL和早期TLS版本
ssl_protocols TLSv1.2 TLSv1.3;
# 配置加密套件,按推薦順序排列
# ECDHE: 使用橢圓曲線密鑰交換
# AES-GCM: 使用AES-GCM加密模式
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# 優先使用服務器的加密套件
ssl_prefer_server_ciphers on;
# 配置SSL會話緩存,提高性能
# shared:SSL:10m: 所有工作進程共享的緩存,大小為10MB
ssl_session_cache shared:SSL:10m;
# SSL會話超時時間
ssl_session_timeout 10m;
# 啟用OCSP Stapling,提供證書狀態信息
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
四、文件上傳安全
1. 限制上傳文件大小
防止通過上傳大文件耗盡服務器資源:
# 限制請求體大小,即上傳文件的最大大小為10MB
client_max_body_size 10m;
# 設置請求體緩沖區大小為128KB
# 超過此大小的請求體會被寫入臨時文件
client_body_buffer_size 128k;
# 配置臨時文件存儲路徑
client_body_temp_path /var/nginx/client_body_temp;
2. 配置上傳目錄權限
確保上傳目錄的權限配置正確:
location /uploads/ {
# 指定上傳根目錄
root /var/www/uploads;
# 指定臨時文件目錄
client_body_temp_path /var/www/tmp;
# 允許的WebDAV方法
dav_methods PUT DELETE MKCOL COPY MOVE;
# 自動創建上傳目錄
create_full_put_path on;
# 設置目錄訪問權限
# user:rw - 文件所有者可讀寫
# group:rw - 組用戶可讀寫
# all:r - 其他用戶只讀
dav_access user:rw group:rw all:r;
# 限制上傳文件類型
if ($request_filename ~* ^.*?\.(php|php5|sh|pl|py)$) {
return 403;
}
}
五、防止常見攻擊
1. 防止SQL注入
配置特殊字符過濾:
location / {
# 檢查URL中是否包含特殊字符
# 如果包含分號、單引號、尖括號等字符,返回444狀態碼
# 444是Nginx特殊狀態碼,表示關閉連接而不發送響應頭
if ($request_uri ~* [;'<>] ) {
return 444;
}
# 檢查查詢字符串中的特殊字符
if ($args ~* [;'<>] ) {
return 444;
}
# 保護敏感URI
location ~* /(admin|backup|config|db|src)/ {
deny all;
}
}
2. 防止目錄遍歷
禁止訪問隱藏文件和目錄:
# 禁止訪問所有以點開頭的隱藏文件和目錄
location ~ /\. {
# 拒絕所有請求
deny all;
# 禁止記錄訪問日志
access_log off;
# 禁止記錄404錯誤日志
log_not_found off;
}
# 禁止訪問特定目錄
location ~* ^/(uploads|images)/.*\.(php|php5|sh|pl|py|asp|aspx|jsp)$ {
deny all;
}
# 防止目錄列表
location / {
autoindex off;
}
六、日志安全
1. 配置訪問日志
詳細記錄訪問信息,便于安全分析:
# 定義詳細的日志格式
log_format detailed '$remote_addr - $remote_user [$time_local] ' # 記錄客戶端IP和訪問時間
'"$request" $status $body_bytes_sent ' # 記錄請求信息、狀態碼和發送字節數
'"$http_referer" "$http_user_agent" ' # 記錄來源頁面和用戶代理
'$request_time $upstream_response_time'; # 記錄請求處理時間和上游響應時間
# 配置訪問日志
# buffer=32k: 使用32KB緩沖區
# flush=5s: 每5秒刷新一次日志
access_log /var/log/nginx/access.log detailed buffer=32k flush=5s;
# 對于靜態資源,可以關閉訪問日志以提高性能
location /static/ {
access_log off;
}
2. 配置錯誤日志
設置適當的錯誤日志級別:
# 設置錯誤日志級別為warn
# 可選級別: debug, info, notice, warn, error, crit, alert, emerg
error_log /var/log/nginx/error.log warn;
# 對于開發環境,可以使用debug級別獲取更多信息
# error_log /var/log/nginx/error.log debug;
七、其他安全措施
1. 禁止執行腳本
在靜態資源目錄中禁止執行腳本:
location /static/ {
# 禁止執行PHP文件
location ~ \.(php|php5)$ {
deny all;
}
# 只允許特定文件類型
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d; # 設置緩存時間
add_header Cache-Control "public, no-transform";
}
}
2. 配置超時時間
設置合理的超時參數,防止慢速攻擊:
# 客戶端請求體超時時間,單位秒
client_body_timeout 10;
# 客戶端請求頭超時時間
client_header_timeout 10;
# 客戶端保持連接超時時間
# 第一個參數是客戶端超時時間
# 第二個參數是在響應頭中的Keep-Alive超時時間
keepalive_timeout 5 5;
# 向客戶端發送響應的超時時間
send_timeout 10;
# 讀取代理服務器響應的超時時間
proxy_read_timeout 10;
# 連接代理服務器的超時時間
proxy_connect_timeout 10;
總結
以上配置涵蓋了Nginx安全加固的主要方面,每個配置都附帶了詳細的解釋和注釋。在實際應用中,建議根據具體的業務需求和安全級別要求,對這些配置進行適當的調整。同時,要注意以下幾點:
定期更新Nginx到最新的穩定版本
使用配置文件包含(include)來組織大型配置
在應用配置前,使用 nginx -t 檢查配置正確性
定期檢查日志文件,及時發現安全問題
配合WAF(Web應用防火墻)使用,提供更全面的安全防護
原文來源:https://mp.weixin.qq.com/s/OvKZE9wbGzlSL3pu0_2LXg
來源:本文內容搜集或轉自各大網絡平臺,并已注明來源、出處,如果轉載侵犯您的版權或非授權發布,請聯系小編,我們會及時審核處理。
聲明:江蘇教育黃頁對文中觀點保持中立,對所包含內容的準確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點負責,僅作分享之用,文章版權及插圖屬于原作者。
Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發布查詢平臺保留所有權利
蘇公網安備32010402000125
蘇ICP備14051488號-3技術支持:南京博盛藍睿網絡科技有限公司
南京思必達教育科技有限公司版權所有 百度統計