Nginx合集-安全设置

2026年01月19日/ 浏览 8

操作之前先备份nginx.conf配置文件

1. 日志配置

1.1修改配置,按如下设置日志记录文件、记录内容、记录格式,添加标签为main的log_format格式

鉴于日志的输出格式还未确定,目前暂时先使用Nginx默认的日志格式。

(http标签内,在所有的server标签内可以调用):

log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for";

1.2 在server标签内,定义日志路径

access_log logs/host.access.log main

1.3 保存,然后后重启nginx服务。

2 禁止目录浏览

默认是不允许列出整个目录的,如果不是做下载服务器的,就不要打开这个,避免敏感信息暴露给黑客并下载

编辑

如果开启了就会是下面这样的效果

编辑

配置关闭即可

autoindex off;

3 限制目录执行权限

  3.1编辑配置文件,在server标签内添加如下内容:

示例:去掉单个目录的PHP执行权限 location ~ /attachments/.*\.(php|php5)?$ { deny all; } #示例:去掉多个目录的PHP执行权限 location ~ /(attachments|upload)/.*\.(php|php5)?$ { deny all; }

3.2保存,然后后重启nginx服务。

  需要注意两点:

    1、以上的配置文件代码需要放到 location ~ .php{...}上面,如果放到下面是无效的;

    2、attachments需要写相对路径,不能写绝对路径。

4 错误页面重定向

  4.1修改配置,在http{}段加入如下内容

避免错误页面提供敏感信息,一般我们会定制一些通用的错误页面返回给客户端

我们在http段配置

error_page 500 502 503 504 /50x.html;

类似上面这种配置,将状态码500、502、503、504全部重定向到50x.html

4.2保存,重启 nginx 服务生效

5 隐藏版本信息

5.1编辑配置文件,添加http模块中如下一行内容:

server_tokens off; 检查:

5.2保存,然后后重启nginx服务。

6 限制HTTP请求方法

 6.1 编辑配置文件,添加如下内容:

if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }

这个要放到最前面 

6.2 保存,然后后重启nginx服务。

  备注:只允许常用的GET和POST方法,顶多再加一个HEAD方法

7 限制IP/域名访问

7.1 编辑配置文件,在server标签内添加如下内容:

location / { deny 192.168.1.1; #拒绝IP allow 192.168.1.0/24; #允许IP allow 10.1.1.0/16; #允许IP deny all; #拒绝其他所有IP } location ~ .*my.html$ { root /usr/share/nginx/html; deny 192.168.0.105; #禁止ip allow 192.168.189.134; #允许ip deny all; #拒绝其他所有 }

限制访问的ip,即限制了服务的客户,防止不允许的人访问,减少风险

7.2 保存,然后后重启nginx服务。

8 设置timeout设低来防御DOS攻击

可以缓解dos攻击,避免黑客伪造用户访问服务,造成服务器压力过大,带宽占满,

8.1 编辑配置文件,具体设置如下:

client_body_timeout 10; #设置客户端请求主体读取超时时间 client_header_timeout 30; #设置客户端请求头读取超时时间 keepalive_timeout 30 30; #第一个参数指定客户端连接保持活动的超时时间,第二个参数是可选的,它指定了消息头保持活动的有效时间 send_timeout 10; #指定响应客户端的超时时间

8.2 保存,然后重启nginx服务

9 限制风险,Nginx降权,检查Nginx进程启动账号

9.1 描述

Nginx 进程启动账号状态,降低被攻击概率

9.2 加固建议

修改 Nginx 进程启动账号:

打开 conf/nginx.conf 配置文件; 查看配置文件的 user 配置项,确认是非 root 启动的; 如果是 root 启动,修改成 nobody 或者 nginx 账号; 修改完配置文件之后需要重新启动 Nginx。 user nobody;

9.2 保存,然后后重启nginx服务。

10 限制访问敏感资源

10.1 有些资源我们可能不想对外开放,比如一些版本控制的备份文件,如.git/.svn等,这些暴露了可能会将整个项目的结构或是源代码都泄露了,

location /my/ { deny all; }

10.2 上面我设置了my这个目录下的所有资源都拒绝,效果如下

编辑

所以要识别好公开的资源,限制敏感资源的访问

11 Nginx后端服务指定的Header隐藏状态

11.1 描述

隐藏 Nginx 后端服务 X-Powered-By 头

11.2加固建议

隐藏 Nginx 后端服务指定 Header 的状态:

打开 conf/nginx.conf 配置文件;在 http 下配置 proxy_hide_header 项; 增加或修改为proxy_hide_header X-Powered-By; proxy_hide_header Server;

11.3fastcgi_hide_header

Nginx 作为反向代理时,即 Nginx 后端是其他 Web Server,可以用 proxy_hide_header 来隐藏 Header。但是当 Nginx 作为 Web Server时(例如 Nginx+PHP-FPM),需要使用 fastcgi_hide_header 来隐藏 Header,特别是 PHP 相关的 Header。因此,建议配置为:

proxy_hide_header X-Powered-By; proxy_hide_header Server; fastcgi_hide_header X-Powered-By; fastcgi_hide_header Server;

12 Nginx的WEB访问日志记录状态

12.1 描述

应为每个核心站点启用 access_log 指令。默认情况下启用。

12.2 加固建议

开启 Nginx 的 WEB 访问日志记录:

打开 conf/nginx.conf 配置文件;在 http 下配置 access_log 项

access_log logs/host.access.log main;并删除off项

13 检查是否配置Nginx账号锁定策略

13.1 描述

执行系统命令 passwd -S nginx 来查看锁定状态

出现 Password locked 证明锁定成功

如:nginx LK ….. (Password locked.)或nginx L ….默认符合,修改后才有(默认已符合)执行系统命令passwd -l nginx进行锁定

13.2 加固建议

配置 Nginx 账号登录锁定策略: Nginx 服务建议使用非 root 用户(如 nginx,nobody )启动,并且确保启动用户的状态为锁定状态。可执行 passwd -l <Nginx启动用户> 如 passwd -l nginx 来锁定 Nginx 服务的启动用户。命令 passwd -S <用户> 如 passwd -S nginx 可查看用户状态。 修改配置文件中的 nginx 启动用户修改为 nginx 或 nobody 如: user nobody; 如果您是 docker 用户,可忽略该项(或添加白名单)

14 隐藏Nginx服务的Banner

14.1描述

Nginx 服务的 Banner 隐藏状态

14.2加固建议

Nginx 后端服务指定的 Header 隐藏状态隐藏 Nginx 服务 Banner 的状态:

打开 conf/nginx.conf 配置文件;在 server 栏目下,配置 server_tokens 项 server_tokens off; 如出现多项不支持,执行 ln <conf_path> /etc/nginx/nginx.conf

操作时建议做好记录或备份

14.3补充

一般在 http 中配置 server_tokens off 即可,不需要单独在每个 server 里指定。

15 确保Nginx配置文件权限为644

15.1描述

把控配置文件权限以抵御外来攻击

15.2加固建议

修改 Nginx 配置文件权限: 执行 chmod 644 <conf_path> 来限制 Nginx 配置文件的权限;(<conf_path> 为配置文件的路径,如 默认/安装目录/conf/nginx.conf 或者 /etc/nginx/nginx.conf,或用户自定义,请 自行查找)

操作时建议做好记录或备份

16 针对Nginx SSL协议进行安全加固

16.1 描述

Nginx SSL 协议的加密策略进行加固

16.2 加固建议

Nginx SSL 协议采用TLSv1.2:

打开 conf/nginx.cconf 配置文件(或主配置文件中的 inlude 文件);配置server { ... ssl_protocols TLSv1.2; ... }

备注:配置此项请确认 Nginx 支持 OpenSSL,运行 nginx -V 如果返回中包含 built with OpenSSL 则表示支持 OpenSSL。 如出现多项不支持,执行 ln <conf_path> /etc/nginx/nginx.conf

或者可能需要增加配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 如果尚未配置ssl协议,请尽快配置(参考连接

https://www.nginx.cn/doc/optional/ssl.html)

操作时建议做好记录或备份

17 防盗链

 17.1 编辑配置文件,在server标签内添加如下内容:

location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked server_names *.nsfocus.com http://localhost baidu.com; if ($invalid_referer) { rewrite ^/ [img]http://www.XXX.com/images/default/logo.gif[/img]; # return 403; } }

17.2 保存,然后后重启nginx服务。

18 检测到目标URL存在http host头攻击漏洞

详细描述:

为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。例如,在php里用_SERVER["HTTP_HOST"]。但是这个header是不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。

解决办法:

web应用程序应该使用SERVER_NAME而不是host header。 在Apache和Nginx里可以通过设置一个虚拟机来记录所有的非法host header。在Nginx里还可以通过指定一个SERVER_NAME名单,Apache也可以通过指定一个SERVER_NAME名单并开启UseCanonicalName选项。

# HTTP host头攻击的技术NGINX防护 if ($http_Host != xxx.com){ return 403; } # 匹配多个域名/IP set $flag 0; if ($http_Host != "xxx.com") { set $flag "${flag} 1"; } if ($http_Host != "10.0.0.100") { set $flag "${flag} 2"; } if ($flag = "012") { return 403; }

19 检测到目标X-Content-Type-Options响应头缺失

详细描述:

X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。 X-Content-Type-Options响应头的缺失使得目标URL更易遭受跨站脚本攻击

解决办法:

将您的服务器配置为在所有传出请求上发送值为“nosniff”的“X-Content-Type-Options”头。

# add_header X-Content-Type-Options: nosniff; # 如果服务器发送响应头 “X-Content-Type-Options: nosniff”,则 script 和 styleSheet # 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。

20 检测到目标X-XSS-Protection响应头缺失

详细描述:

HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。 X-XSS-Protection响应头的缺失使得目标URL更易遭受跨站脚本攻击。

解决办法:

将您的服务器配置为在所有传出请求上发送值为“1”(例如已启用)的“X-XSS-Protection”头。

# 0:# 禁用XSS保护; # 1:# 启用XSS保护; # 1; # mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换); # 浏览器提供的XSS保护机制并不完美,但是开启后仍然可以提升攻击难度,总之没有特别的理由,不要关闭它。 # add_header X-Xss-Protection: 1; # add_header X-Xss-Protection: mod=block;

21 检测到目标Content-Security-Policy响应头缺失

详细描述:

HTTP 响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。 Content-Security-Policy响应头的缺失使得目标URL更易遭受跨站脚本攻击。

解决办法:

将您的服务器配置为发送“Content-Security-Policy”头。

# 要使用 CSP,只需要服务端输出类似这样的响应头就行了: # Content-Security-Policy: default-src self # default-src 是 CSP 指令,多个指令之间用英文分号分割;self 是指令值,多个指令值用英文空格分割。 add_header Content-Security-Policy "default-src self static4.segway.com(该地址按需修改)或者10.14.102.70:81 unsafe-inline unsafe-eval blob: data: ;"; add_header X-Xss-Protection "1;mode=block"; add_header X-Content-Type-Options nosniff;

22 点击劫持:X-Frame-Options未配置

详细描述:

点击劫持(ClickJacking)是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。 HTTP 响应头信息中的X-Frame-Options,可以指示浏览器是否应该加载一个 iframe 中的页面。如果服务器响应头信息中没有X-Frame-Options,则该网站存在ClickJacking攻击风险。网站可以通过设置 X-Frame-Options 阻止站点内的页面被其他页面嵌入从而防止点击劫持.

解决办法:

修改web服务器配置,添加X-Frame-Options响应头。赋值有如下三种:

1、DENY:不能被嵌入到任何iframe或者frame中。

2、SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中。

3、ALLOW-FROM uri:只能被嵌入到指定域名的框架中。

# add_header X-Frame-Options:ALLOW-FROM https://tongji.baidu.com; # add_header X-Frame-Options:DENY;

23 检测到目标URL启用了不安全的HTTP方法

详细描述:

检测到目标Web服务器配置成允许下列其中一个(或多个)HTTP 方法:DELETE, SEARCH,COPY,MOVE, PROPFIND, PROPPATCH, MKCOL ,LOCK ,UNLOCK 。 这些方法表示可能在服务器上使用了 WebDAV。由于dav方法允许客户端操纵服务器上的文件,如果没有合理配置dav,有可能允许未授权的用户对其进行利用,修改服务器上的文件。

解决办法:

如果服务器不需要支持 WebDAV,请务必禁用它。 或者为允许webdav的目录配置严格的访问权限,如认证方法,认证需要的用户名,密码。

# dav_methods off;

nginx配置信息(含解释):

user nobody; #root启动 user nginx; #普通用户启动 http { ......... proxy_hide_header X-Powered-By; proxy_hide_header Server; } server { ......... server_tokens off; #隐藏版本号 #设置减缓DDOS攻击 client_body_timeout 10; client_header_timeout 20; keepalive_timeout 30 30; send_timeout 10; #防止跨站脚本攻击攻击 add_header X-Content-Type-Options: nosniff; add_header X-XSS-Protection "1; mode=block"; #防止点击劫持,页面只能被本站页面嵌入到iframe或者frame中。 add_header X-Frame-Options "SAMEORIGIN"; #并不限制内容加载来源 add_header Content-Security-Policy "script-src * unsafe-inline unsafe-eval"; #将本站内部http链接自动改为https,并不限制内容加载来源 #add_header Content-Security-Policy "upgrade-insecure-requests;content *;img-src *"; #Strict-Transport-Security响应头缺失 add_header Strict-Transport-Security value; #目标Referrer-Policy响应头缺失 add_header Referrer-Policy value; #目标X-Permitted-Cross-Domain-Policies响应头缺失 add_header X-Permitted-Cross-Domain-Policies value; #目标X-Download-Options响应头缺失 add_header X-Download-Options value; #目标URL启用了不安全的HTTP方法(编译nginx时要编译https模块才可设置) dav_methods off; #如果不是GET、POST、HEAD请求直接返回404 if ($request_method !~ ^(GET|HEAD|POST)$) { return 404; } #目标服务器启用了OPTIONS方法 if ($request_method ~* OPTIONS) { return 404; } }

nginx配置信息(不含解释):

user nobody; http { ......... proxy_hide_header X-Powered-By; proxy_hide_header Server; } server { ......... server_tokens off; client_body_timeout 10; client_header_timeout 20; keepalive_timeout 30 30; send_timeout 10; add_header X-Content-Type-Options: nosniff; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header Content-Security-Policy "script-src * unsafe-inline unsafe-eval"; #将本站内部http链接自动改为https,并不限制内容加载来源 #add_header Content-Security-Policy "upgrade-insecure-requests;content *;img-src *"; add_header Strict-Transport-Security value; add_header Referrer-Policy value; add_header X-Permitted-Cross-Domain-Policies value; add_header X-Download-Options value; #目标URL启用了不安全的HTTP方法(编译nginx时要编译https模块才可设置) dav_methods off; #如果不是GET、POST、HEAD请求直接返回404 if ($request_method !~ ^(GET|HEAD|POST)$) { return 404; } #目标服务器启用了OPTIONS方法 if ($request_method ~* OPTIONS) { return 404; } }

picture loss