如何全面加固Nginx生产环境,从移除版本号到设置请求方法白名单?
- 内容介绍
- 文章标签
- 相关推荐
本文共计803个文字,预计阅读时间需要4分钟。
Nginx生产环境加固,非堆配置,而是围绕信息最小暴露、权限最小分配、行为最大约束三个核心展开。关键不在全开所有防护项,而在于每一条规则都有明确意图和验证效果。
一、彻底隐藏服务指纹:从响应头到错误页
攻击者第一眼就看 Server 头和 4xx/5xx 页面——这是最廉价的情报来源。仅靠 server_tokens off 不够,它只隐藏版本号,Server 字段仍为 nginx。
- 在
http块中启用基础隐藏:server_tokens off; - 若已编译安装
headers-more-nginx-module,添加:more_set_headers 'Server: WebServer'; - 源码安装用户建议直接修改
src/core/nginx.h:将NGINX_VER改为自定义字符串(如"AppServer/1.0"),再重新编译 - 验证方式必须包含两步:用
curl -I检查首页响应头;用curl http://domain/nonexist触发 404 页面,确认 HTML 中无 nginx 字样
二、运行身份与文件权限双隔离
默认以 root 或 nobody 运行是高危习惯。nobody 无组归属,root 则权限过大,都违背最小权限原则。
- 创建专用低权用户:
useradd -M -s /sbin/nologin nginx - 在 nginx.conf 全局块顶部指定:
user nginx nginx;(注意:第二个 nginx 是组名) - 配置文件权限收紧至
640:chmod 640 /usr/local/nginx/conf/nginx.conf,属主 root,属组 nginx - 日志目录(如
/usr/local/nginx/logs)属组设为 nginx,并赋写权限:chgrp nginx logs && chmod g+w logs
三、HTTP 方法严格白名单控制
绝大多数业务只需 GET 和 POST。TRACE、OPTIONS、PUT、DELETE 等方法若未显式禁用,可能被用于探测或攻击(如 HTTP 方法绕过、缓存投毒)。
- 在需保护的
location块内使用limit_except: limit_except GET POST { deny all; }- 若接口明确需要 HEAD 或 OPTIONS(如 CORS 预检),可显式加入:
limit_except GET HEAD POST OPTIONS { deny all; } - 避免在全局
http块使用该指令,防止误伤健康检查等必要请求
四、敏感资源与路径访问封堵
静态资源目录、配置备份、日志文件、临时文件等,一旦被直接访问,极易导致信息泄露甚至远程代码执行。
- 关闭目录浏览:
autoindex off;(放在http或server块) - 禁止访问常见敏感后缀:
location ~* \.(conf|ini|log|bak|swp|git|env)$ { deny all; } - 限制对
.htaccess、.user.ini等 Apache/PHP 类配置文件的访问 - 对 API 接口路径(如
/api/v1/admin)单独加 IP 白名单或 Basic Auth,不依赖前端逻辑
本文共计803个文字,预计阅读时间需要4分钟。
Nginx生产环境加固,非堆配置,而是围绕信息最小暴露、权限最小分配、行为最大约束三个核心展开。关键不在全开所有防护项,而在于每一条规则都有明确意图和验证效果。
一、彻底隐藏服务指纹:从响应头到错误页
攻击者第一眼就看 Server 头和 4xx/5xx 页面——这是最廉价的情报来源。仅靠 server_tokens off 不够,它只隐藏版本号,Server 字段仍为 nginx。
- 在
http块中启用基础隐藏:server_tokens off; - 若已编译安装
headers-more-nginx-module,添加:more_set_headers 'Server: WebServer'; - 源码安装用户建议直接修改
src/core/nginx.h:将NGINX_VER改为自定义字符串(如"AppServer/1.0"),再重新编译 - 验证方式必须包含两步:用
curl -I检查首页响应头;用curl http://domain/nonexist触发 404 页面,确认 HTML 中无 nginx 字样
二、运行身份与文件权限双隔离
默认以 root 或 nobody 运行是高危习惯。nobody 无组归属,root 则权限过大,都违背最小权限原则。
- 创建专用低权用户:
useradd -M -s /sbin/nologin nginx - 在 nginx.conf 全局块顶部指定:
user nginx nginx;(注意:第二个 nginx 是组名) - 配置文件权限收紧至
640:chmod 640 /usr/local/nginx/conf/nginx.conf,属主 root,属组 nginx - 日志目录(如
/usr/local/nginx/logs)属组设为 nginx,并赋写权限:chgrp nginx logs && chmod g+w logs
三、HTTP 方法严格白名单控制
绝大多数业务只需 GET 和 POST。TRACE、OPTIONS、PUT、DELETE 等方法若未显式禁用,可能被用于探测或攻击(如 HTTP 方法绕过、缓存投毒)。
- 在需保护的
location块内使用limit_except: limit_except GET POST { deny all; }- 若接口明确需要 HEAD 或 OPTIONS(如 CORS 预检),可显式加入:
limit_except GET HEAD POST OPTIONS { deny all; } - 避免在全局
http块使用该指令,防止误伤健康检查等必要请求
四、敏感资源与路径访问封堵
静态资源目录、配置备份、日志文件、临时文件等,一旦被直接访问,极易导致信息泄露甚至远程代码执行。
- 关闭目录浏览:
autoindex off;(放在http或server块) - 禁止访问常见敏感后缀:
location ~* \.(conf|ini|log|bak|swp|git|env)$ { deny all; } - 限制对
.htaccess、.user.ini等 Apache/PHP 类配置文件的访问 - 对 API 接口路径(如
/api/v1/admin)单独加 IP 白名单或 Basic Auth,不依赖前端逻辑

