
基础安全防护必做1.1 隐藏敏感信息减少攻击面核心目标避免暴露Nginx版本号、服务器标识、敏感文件等信息防止攻击者针对性利用漏洞。隐藏Nginx版本号默认情况下Nginx会在错误页面和HTTP响应头中暴露版本号如Server: nginx/1.24.0需在主配置文件/etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf的http块中添加指令修改后需验证配置并重新加载。 配置示例 http { server_tokens off; # 关闭版本号显示移除响应头中的版本信息 # 其他原有配置... } 生效命令nginx -t 检查配置语法、nginx -s reload 重新加载配置自定义Server响应头可选若需进一步隐藏服务器标识可安装headers-more-nginx-module模块自定义Server头避免暴露Nginx身份。 配置示例more_set_headers Server: Custom-Server;禁止敏感文件/目录访问拦截.git项目版本信息、.htaccess、.htpasswd、config配置文件、backup备份文件等敏感资源防止信息泄露在站点server块中添加规则。 配置示例 server { # 禁止访问.git目录正则匹配忽略大小写 location ~ /\.git { deny all; } # 禁止访问.ht开头的隐藏文件 location ~ /\.ht { deny all; } # 禁止访问自定义敏感目录 location ~ /(config|backup)/ { deny all; } # 禁止访问备份、配置、日志等敏感文件 location ~* \.(bak|conf|sql|log|env)$ { deny all; return 404; } }禁用目录遍历默认autoindex已关闭显式配置确保禁止Nginx自动列出目录内容避免敏感文件路径泄露。 配置示例autoindex off; 添加在http、server或location块中自定义错误页面默认错误页面404、500等会暴露服务器信息配置自定义页面可隐藏敏感信息同时提升用户体验需使用internal指令禁止直接访问错误页面。 配置示例 server { error_page 404 /custom_404.html; error_page 500 502 503 504 /custom_50x.html; # 配置404错误页面路径internal禁止直接访问 location /custom_404.html { root /usr/share/nginx/html; internal; } }1.2 权限管控遵循最小权限原则核心目标避免高权限运行Nginx防止攻击者通过漏洞获取服务器最高权限同时限制文件/目录访问权限防止篡改、泄露。非root用户运行Nginx默认Nginx以root用户启动需创建专用低权限用户如nginx修改配置指定用户运行。 配置示例 user nginx nginx; # 添加在主配置文件顶部指定用户和用户组 注意需确保网站根目录、日志目录等对该用户有读写权限。文件/目录权限规范严格控制权限避免过度开放通用规则如下 - 文件权限644所有者读写组和其他用户仅读取 - 目录权限755所有者读写执行组和其他用户读执行 - 禁止Nginx用户拥有文件写入权限除上传目录等特殊场景禁用非必要模块编译Nginx时移除autoindex、ssi等非必要模块降低漏洞风险如编译时添加--without-http_autoindex_module参数。二、核心安全加固进阶2.1 加密传输防止数据窃听篡改核心目标启用HTTPS禁用弱协议和加密套件确保数据传输过程中不被窃听、篡改是企业级服务的必备配置。获取SSL证书可选择付费证书DigiCert、Comodo等或免费证书Lets Encrypt有效期3个月支持自动续期适合个人和中小企业。强制HTTPS跳转将所有HTTP请求301永久重定向到HTTPS避免明文传输。 配置示例 # HTTP站点配置仅用于跳转 server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$host$request_uri; # 永久重定向到HTTPS }HTTPS核心配置配置证书路径、启用安全协议和加密套件优化SSL性能。 配置示例 server { listen 443 ssl http2; # 启用HTTP/2提升传输效率 server_name yourdomain.com www.yourdomain.com; # 证书文件路径需替换为实际路径 ssl_certificate /etc/nginx/ssl/yourdomain.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.key; ssl_trusted_certificate /etc/nginx/ssl/intermediate.crt; # 中间证书 # 禁用弱协议SSLv3、TLS1.0/1.1存在漏洞 ssl_protocols TLSv1.2 TLSv1.3; # 优先使用服务器端加密套件启用强加密算法 ssl_prefer_server_ciphers on; ssl_ciphers EECDHAESGCM:EDHAESGCM:AES256EECDH:AES256EDH; # SSL会话缓存提升性能 ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; # 启用HSTS强制浏览器仅通过HTTPS访问 add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; }2.2 访问控制限制非法访问核心目标通过IP黑白名单、身份验证、请求限制等方式防止敏感接口被恶意扫描、暴力破解控制访问范围。IP黑白名单配置针对管理后台、敏感接口等关键路径仅允许指定IP/网段访问拒绝其他所有IP。 配置示例管理后台IP白名单 location /admin { allow 192.168.1.0/24; # 允许内网网段 allow 1.2.3.4; # 允许指定公网IP deny all; # 拒绝其他所有IP }Basic Auth身份验证对敏感路径如管理后台、私人接口启用基础认证需使用htpasswd工具生成用户密码文件。 操作步骤 1. 安装htpasswdyum install httpd-toolsCentOS或 apt install apache2-utilsUbuntu 2. 生成密码文件htpasswd -c /etc/nginx/.htpasswd adminadmin为用户名会提示输入密码 3. 配置Nginx location /private { auth_basic Admin Area; # 认证提示信息 auth_basic_user_file /etc/nginx/.htpasswd; # 密码文件路径 }请求频率与并发连接限制抵御CC攻击、DDoS攻击限制单IP请求速率和并发连接数避免服务器资源耗尽。 配置示例 http { # 定义请求速率限制单IP每秒最多5个请求缓存区10M limit_req_zone $binary_remote_addr zonereq_per_ip:10m rate5r/s; # 定义并发连接限制单IP最多20个并发连接 limit_conn_zone $binary_remote_addr zoneconn_per_ip:10m; server { location / { limit_req zonereq_per_ip burst10 nodelay; # burst允许突发流量nodelay不延迟丢弃 limit_conn conn_per_ip 20; } } }超时配置优化缩短空闲连接超时时间释放服务器资源防止慢速攻击。 配置示例添加在http块中 client_body_timeout 10s; # 读取请求体超时 client_header_timeout 10s; # 读取请求头超时 send_timeout 10s; # 发送响应超时 keepalive_timeout 65s; # 长连接超时时间2.3 反向代理安全若使用反向代理核心目标隐藏后端服务信息防止后端服务被直接攻击优化代理安全配置。隐藏后端服务响应头代理过程中隐藏后端服务的X-Powered-By、Server等敏感头信息。 配置示例 location /proxy { proxy_pass http://backend_server; proxy_hide_header X-Powered-By; # 隐藏后端语言标识 proxy_hide_header Server; # 隐藏后端服务器标识 }缓存安全配置防止缓存中毒合理设置缓存规则动态内容不缓存。 配置示例 proxy_cache_key $scheme$request_method$host$request_uri; # 自定义缓存键 proxy_cache_valid 200 302 10m; # 200、302状态码缓存10分钟 proxy_no_cache $cookie_sessionid; # 携带sessionid的动态内容不缓存三、常见攻击防御重点3.1 SQL注入与XSS跨站脚本攻击防御核心目标拦截包含恶意参数的请求防止恶意脚本注入、数据库 被攻击在server块中添加过滤规则。恶意参数过滤通过正则匹配拦截SQL注入、XSS相关的恶意特征。 配置示例 server { set $block 0; # SQL注入特征拦截可根据业务扩展 if ($query_string ~* union.*select|eval|base64_decode|phpinfo|insert|delete|drop) { set $block 1; } # XSS跨站脚本特征拦截 if ($request_uri ~* 启用安全响应头通过HTTP响应头增强浏览器安全机制防止XSS和点击劫持。 配置示例添加在server或location块中 # 防止点击劫持禁止页面被嵌入iframe add_header X-Frame-Options SAMEORIGIN always; # 限制资源加载来源防御XSS可根据业务调整 add_header Content-Security-Policy default-src self; script-src self unsafe-inline always; # 禁止浏览器自动解析未声明的MIME类型防止XSS add_header X-Content-Type-Options nosniff always;拦截恶意User-Agent匹配恶意爬虫、扫描器的User-Agent特征直接返回403。 配置示例 if ($http_user_agent ~* (sqlmap|nmap|burp|scanner|crawler|spider|bot)) { return 403; } # 可选拦截空User-Agent需根据业务调整部分正常请求可能为空 if ($http_user_agent ) { return 403; }限制HTTP请求方法仅允许业务必需的GET、POST、HEAD方法拒绝PUT、DELETE、OPTIONS等高危方法若业务不需要。 配置示例 if ($request_method !~ ^(GET|POST|HEAD)$) { return 405; # 方法不允许 }3.3 防盗链配置核心目标防止网站静态资源图片、视频、CSS、JS被其他网站盗用节省服务器带宽在location块中配置。配置示例 location ~* \.(jpg|png|gif|mp4|css|js)$ { # 允许自身域名及可信域名访问none允许直接访问blocked允许不带referer的请求 valid_referers none blocked *.yourdomain.com yourdomain.com; # 非法referer返回403 if ($invalid_referer) { return 403; } }3.4 动态IP封禁Fail2Ban集成核心目标自动封禁频繁发起攻击的IP无需手动操作适用于暴力破解、高频恶意请求场景。配置步骤 1. 安装Fail2Banyum install fail2banCentOS或 apt install fail2banUbuntu 2. 创建Nginx相关配置文件/etc/fail2ban/jail.d/nginx.conf 3. 配置示例 [nginx-bad-request] enabled true filter nginx-bad-request action iptables(namenginx, porthttp, protocoltcp) logpath /var/log/nginx/security.log # 监控的Nginx安全日志路径 maxretry 5 # 最大尝试次数 bantime 3600 # 封禁时间秒 4. 重启Fail2Bansystemctl restart fail2ban四、日志监控与应急响应4.1 日志配置优化核心目标规范日志记录分离安全日志便于后续审计、异常排查和攻击溯源避免日志包含敏感信息。安全日志分离自定义日志格式记录攻击相关的关键信息IP、User-Agent、请求、状态码单独存储。 配置示例 http { # 自定义安全日志格式 log_format security $remote_addr - $http_user_agent - ($time_local) $request $status; # 安全日志存储路径 access_log /var/log/nginx/security.log security; # 普通访问日志可选按需配置 access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; # 错误日志记录异常信息 }日志轮换与压缩使用logrotate工具定期归档、压缩日志避免日志文件过大占用磁盘空间。 配置示例/etc/logrotate.d/nginx /var/log/nginx/*.log { daily # 每日轮换 rotate 7 # 保留7天日志 compress # 压缩归档日志 missingok # 日志不存在时不报错 notifempty # 空日志不轮换 postrotate systemctl reload nginx # 轮换后重新加载Nginx endscript }4.2 实时监控核心目标及时发现异常访问行为快速响应攻击可结合工具实现自动化监控。工具推荐 - Prometheus Grafana通过nginx-module-vts模块监控Nginx流量、连接数、请求状态等关键指标可视化展示。 - ELK/Splunk集中化分析日志实现异常行为告警如高频403、500状态码。 - 自定义脚本编写Shell脚本定期检测日志中的异常模式如高频恶意请求触发邮件或短信 告警。4.3 应急响应流程核心目标攻击发生后快速止损、排查原因、恢复服务降低损失关键步骤如下快速止损封禁攻击IP通过iptables或Fail2Ban暂停受攻击的接口或服务若有WAF启用紧急防护规则。排查原因查看Nginx日志security.log、error.log定位攻击类型SQL注入、XSS、DDoS等、攻击IP和请求特征。修复漏洞根据攻击类型补充防护配置如添加恶意参数过滤、调整权限升级Nginx版本修复已知漏洞。恢复服务验证防护配置生效后恢复服务持续监控日志防止二次攻击。复盘优化记录攻击过程、防护措施和效果优化安全配置完善防护体系。五、日常维护与注意事项定期更新定期升级Nginx到最新稳定版本修补官方发布的安全漏洞同时更新依赖模块如OpenSSL。配置备份定期备份Nginx主配置文件、站点配置文件和证书文件防止配置丢失或被篡改建议每日自动备份。定期巡检检查配置文件语法nginx -t、日志异常、权限设置排查潜在安全隐患建议每周巡检一次。最小化配置删除Nginx默认的测试页面、无用的server块和配置关闭非必要功能减少攻击面。密码管理若使用Basic Auth定期更换密码密码需复杂度足够包含大小写、数字、特殊字符避免弱密码。多层防护结合防火墙iptables/ufw限制端口开放部署WAF如ModSecurity拦截Web攻击构建网络层、应用层、日志层的多层防护体系。六、常用安全命令备查检查Nginx配置语法nginx -t重新加载Nginx配置nginx -s reload重启Nginx服务systemctl restart nginx查看Nginx版本nginx -v简单版本、nginx -V详细版本包含模块查看Nginx运行状态systemctl status nginx封禁IPiptablesiptables -A INPUT -s 攻击IP -j DROP解除IP封禁iptablesiptables -D INPUT -s 攻击IP -j DROP查看Nginx访问日志实时tail -f /var/log/nginx/access.log生成Basic Auth密码文件htpasswd -c /etc/nginx/.htpasswd 用户名