Nginx在Ubuntu中的安全设置指南
导读:Nginx 在 Ubuntu 的安全设置指南 一 基础加固与最小暴露面 更新系统与组件:执行 sudo apt update && sudo apt upgrade -y,保持 Nginx 与依赖为最新安全版本。 防火墙仅...
Nginx 在 Ubuntu 的安全设置指南
一 基础加固与最小暴露面
- 更新系统与组件:执行 sudo apt update & & sudo apt upgrade -y,保持 Nginx 与依赖为最新安全版本。
- 防火墙仅放行必要端口:使用 UFW 放行 SSH(22)、HTTP(80)、HTTPS(443),并启用防火墙。
示例:sudo ufw allow 22/tcp;sudo ufw allow 80/tcp;sudo ufw allow 443/tcp;sudo ufw enable。 - 隐藏版本与指纹:在 /etc/nginx/nginx.conf 的 http 块设置 server_tokens off; ,减少信息泄露。
- 限制可用 HTTP 方法:在需要的 server 块中仅允许 GET/HEAD/POST,其余返回 444 关闭连接。
- 合理的超时与缓冲:设置 client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10; ,降低慢速攻击与资源占用。
- 日志与监控:定义结构化日志格式,记录 $remote_addr、X-Forwarded-For 等关键字段,便于审计与溯源。
- 资源与速率限制:在 http 定义共享内存区,在 server/location 应用 limit_req,抑制暴力扫描与突发流量。
- 错误页面安全:统一错误页面并标记为 internal,避免泄露目录结构与内部路径。
二 传输加密与 HTTPS 部署
- 获取证书:使用 Certbot 一键申请并自动配置 Let’s Encrypt 证书(同时支持自动续期)。
示例:sudo apt install -y certbot python3-certbot-nginx;sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com。 - 强制 HTTPS:新增 listen 80 的 server 块,返回 301 跳转至 https://$host$request_uri。
- 现代 TLS 配置:启用 TLSv1.2/TLSv1.3,使用 ECDHE 与 AEAD 套件,开启 HTTP/2,并开启 OCSP Stapling 提升握手与验证性能与安全。
- 证书与密钥路径:将 ssl_certificate 指向 fullchain.pem,ssl_certificate_key 指向私钥 domain.key。
- 可选 WSS:如需 WebSocket Secure,在 location /wss/ 使用 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “Upgrade”; 反向代理到后端 WebSocket 服务。
三 访问控制与速率限制
- 速率限制:在 http 定义 limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; ,在 location / 应用 limit_req zone=one burst=5 nodelay; ,平滑突发并抑制滥用。
- 方法限制:仅允许 GET/HEAD/POST,对 PUT/DELETE/TRACE 等危险或不必要的动词直接拒绝(返回 444)。
- 连接与缓冲:结合 worker_processes auto; worker_connections 1024; 与 client_max_body_size 8m; 等,防止资源耗尽与放大攻击。
- 防火墙层面:仅开放 22/80/443,对管理口与数据库等后端端口不做公网暴露。
四 运行环境与持续运维
- 进程与权限:以 www-data 运行 Nginx,使用最小权限原则;静态资源与日志目录设置合适的 ownership 与 mode。
- 自动安全更新:安装并启用 unattended-upgrades,仅勾选安全更新,减少暴露窗口。
- 配置与证书备份:定期备份 /etc/nginx 与 /var/log/nginx,并验证配置语法 sudo nginx -t 后再重载。
- 监控与指标:部署 nginx-prometheus-exporter 暴露 /nginx_status,结合 Prometheus/Grafana 做可用性与攻击面观测。
- 变更流程:遵循“编辑→语法检查→灰度/重载→回滚预案”的闭环,变更前先备份。
五 可直接使用的配置片段
# /etc/nginx/nginx.conf 关键片段
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
server_tokens off;
# 速率限制:每 IP 10 r/s,突发 5
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
client_max_body_size 8m;
client_body_buffer_size 10K;
client_header_buffer_size 1k;
large_client_header_buffers 2 1k;
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
# 现代 TLS 套件与 HTTP/2
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# /etc/nginx/sites-available/example.com 关键片段
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/example.com/html;
index index.html;
# 仅允许 GET/HEAD/POST
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444;
}
# 速率限制
limit_req zone=one burst=5 nodelay;
# 安全错误页面
error_page 404 500 502 503 504 /error.html;
location = /error.html {
internal;
root /var/www/secure-errors;
}
location / {
try_files $uri $uri/ =404;
}
# 可选:WebSocket Secure
# location /wss/ {
# proxy_pass http://127.0.0.1:8080;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "Upgrade";
# proxy_read_timeout 3600s;
# }
}
- 启用站点:sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
- 检查与生效:sudo nginx -t & & sudo systemctl reload nginx
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Nginx在Ubuntu中的安全设置指南
本文地址: https://pptw.com/jishu/749367.html
