在Ubuntu上部署Nginx時,需通過基礎配置加固、SSL/TLS加密、訪問控制、防火墻聯動、日志監控及高級防護等多層措施,全面提升服務器安全性。以下是具體實現步驟:
隱藏Nginx版本信息
編輯Nginx主配置文件(/etc/nginx/nginx.conf),在http塊中添加server_tokens off;,禁用響應頭中的版本標識(如Server: nginx/1.18.0 (Ubuntu))。此操作可防止攻擊者通過版本號識別已知漏洞,降低針對性攻擊風險。
限制HTTP方法
在server或location塊中,通過if指令過濾非法HTTP方法(如PUT、DELETE),僅允許必要的GET、HEAD、POST方法:
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444; # 直接關閉連接
}
此配置可阻斷通過非法方法發起的攻擊(如文件上傳漏洞利用)。
配置合理超時設置
在nginx.conf的http塊中,調整以下超時參數,防止慢速攻擊(如Slowloris)耗盡服務器資源:
client_body_timeout 12; # 請求體讀取超時(秒)
client_header_timeout 12; # 請求頭讀取超時(秒)
keepalive_timeout 15; # 長連接保持時間(秒)
send_timeout 10; # 響應發送超時(秒)
這些參數需根據業務場景調整,平衡安全性與用戶體驗。
限制請求體與并發連接
server或location塊中添加client_max_body_size 10M;,防止大文件上傳(如超過10MB的惡意文件)耗盡磁盤空間。limit_conn_zone和limit_conn指令,限制單個IP的并發連接數(如每個IP最多1個連接):http {
limit_conn_zone $binary_remote_addr zone=ops:10m; # 定義共享內存區域
}
server {
location / {
limit_conn ops 1; # 限制并發連接數
}
}
此配置可防止DDoS攻擊或惡意爬蟲占用過多服務器資源。啟用HTTPS并強制跳轉
yourdomain.com為實際域名):sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot會自動修改Nginx配置,啟用443端口的HTTPS監聽。/etc/nginx/sites-available/default),添加以下server塊:server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri; # 永久重定向至HTTPS
}
此配置確保所有流量均通過加密通道傳輸。優化SSL/TLS參數
在HTTPS的server塊中,配置安全的加密協議與算法:
ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLS 1.0/1.1
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; # 使用強加密套件
ssl_prefer_server_ciphers on; # 優先使用服務器端加密套件
ssl_session_timeout 1d; # 會話超時時間(1天)
ssl_session_cache shared:SSL:50m; # 會話緩存大?。?0MB)
ssl_stapling on; # 啟用OCSP裝訂(提升證書驗證效率)
這些配置可防止降級攻擊(如POODLE),提升加密安全性。
配置HSTS
添加Strict-Transport-Security頭部,強制瀏覽器使用HTTPS(即使用戶手動輸入HTTP):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
max-age=31536000表示有效期為1年,includeSubDomains覆蓋所有子域名,有效預防SSL剝離攻擊。
基于IP的白名單/黑名單
/admin/),僅允許內網IP訪問:location /admin/ {
allow 192.168.1.0/24; # 允許內網IP段
allow 10.0.0.0/8; # 允許另一個內網IP段
deny all; # 拒絕其他所有IP
}
deny指令直接拒絕特定IP(如攻擊源IP):location / {
deny 192.168.1.100; # 屏蔽單個IP
allow all;
}
此配置可防止未經授權的訪問。限制請求頻率
使用limit_req_zone和limit_req指令,限制單個IP的請求頻率(如每秒最多1個請求,允許突發5個):
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; # 定義共享內存區域與速率
}
server {
location / {
limit_req zone=mylimit burst=5 nodelay; # 限制請求頻率
proxy_pass http://backend;
}
}
此配置可有效防御暴力破解(如密碼猜測)和DDoS攻擊。
安裝與配置UFW
UFW(Uncomplicated Firewall)是Ubuntu的簡易防火墻工具,可通過以下命令配置:
sudo apt install ufw
sudo ufw allow 22/tcp # 允許SSH(遠程管理)
sudo ufw allow 80/tcp # 允許HTTP(可選,若未啟用HTTPS)
sudo ufw allow 443/tcp # 允許HTTPS
sudo ufw enable # 啟用防火墻
sudo ufw status # 查看狀態(確認規則正確)
此配置可阻止未經授權的網絡流量訪問服務器。
配置iptables高級規則
若需更細粒度的控制,可使用iptables限制連接速率(如每個IP每秒最多5個新連接):
sudo iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 5 -j DROP
sudo iptables -A INPUT -p tcp --dport 443 -m limit --limit 5/min -j ACCEPT
此配置可防止大量并發連接耗盡服務器資源。
增強型日志配置
自定義Nginx日志格式,包含客戶端IP、請求時間、響應狀態、請求體大小等信息,便于后續分析:
log_format security '$remote_addr - $http_x_forwarded_for - $time_iso8601 '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time';
access_log /var/log/nginx/security.log security; # 記錄安全相關日志
error_log /var/log/nginx/error.log crit; # 記錄錯誤日志(僅嚴重級別)
此配置可幫助快速定位異常請求(如大量404錯誤)。
集成Fail2Ban
Fail2Ban是一款入侵檢測工具,可自動屏蔽惡意IP(如頻繁訪問404頁面的IP)。
sudo apt install fail2ban/etc/fail2ban/filter.d/nginx-badbots.conf):[Definition]
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*" 404 .*$
ignoreregex =
/etc/fail2ban/jail.local):[nginx-badbots]
enabled = true
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2 # 2次錯誤后屏蔽
bantime = 86400 # 屏蔽1天
sudo systemctl restart fail2bansudo apt install libmodsecurity3 libmodsecurity-dev
sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
cd ModSecurity-nginx
sudo make && sudo make install
/etc/nginx/nginx.conf的http塊中加載模塊:load_module modules/ngx_http_modsecurity_module.so;server塊中啟用ModSecurity并指定規則文件:server {
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
}
/etc/nginx/modsec/main.conf):sudo mkdir /etc/nginx/modsec
cd /etc/nginx/modsec
sudo git clone --depth 1 https://github.com/coreruleset/coreruleset.git
sudo cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf
sudo cp coreruleset/rules/*.conf /etc/nginx/modsec/coreruleset/
echo -e "SecRuleEngine On\nSecRequestBodyAccess On\nSecResponseBodyAccess On\nInclude /etc/nginx/modsec/coreruleset/crs-setup.conf\nInclude /etc/nginx/modsec/coreruleset/rules/*.conf" > /etc/nginx/modsec/main.conf
sudo systemctl restart nginx通過以上步驟,可全面加固Ubuntu上Nginx的安全性,降低被攻擊的風險。需定期更新Nginx、SSL證書及系統組件,確保安全配置的有效性。