二.Nginx 通讯原理:
三.nginx相关加固配置
1.隐藏或伪装nginx的版本及版本相关提示信息
在nginx新版本发布后,公布旧版本的漏洞,攻击者极容易获得这些信息,并针对更新不及时或者补丁未打的nginx进行攻击。通过修改配置文件nginx.conf,提供nginx安全。
打开nginx.conf,在http服务器中配置指令server_tokens为off。如下所示:
http {
…
server_tokens off;
…
}
2.禁用不必要的http方法:DELETE、PUT、TRACE、OPTIONS等
nginx的反向代理功能,有一部分请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。后端可能有Tomcat或者Apache服务器,默认http方法包括GET、HEAD、POST、PUT、DELETE、OPTIONS等方法。在这些方法中,虽然PUT、DELETE方法很少被使用到,但可能被利用来进行攻击。对于Web服务来讲标准的请求只使用GET,POST和HEAD,其它方法不使用的需要禁止掉。例外:如果确实是业务需要使用(例如Restful接口需要使用GET,POST,PUT,DELETE),则不强制要求。
方法一:在nginx.conf配置所允许的http。
语法:
limit_except method
... {...}
配置块:location
例如:
http {
…
Server {
…
location / {
#http请求方法在全目录“/”下,除了GET POST HEAD,均禁止
#默认返回403错误
limit_except GET POST HEAD
{
deny all;
}
}
}
}
方法二:在nginx.conf针对某一个http方法禁止,根据业务需求。
if ($request_method = PUT ) {
return 403;
}
if ($request_method = DELETE ) {
return 403;
}
3.禁止开启nginx的目录列表功能
如果访问nginx下的一个Web应用,如果输入是一个目录名,而且该目录下没有一个默认访问文件,那么nginx会将该目录下的所有文件列出来,这种敏感信息泄露是严格禁止的。nginx默认的是关闭目录列表,但是为了程序调试方便,部分程序员也有可能开启这一功能。因此,要确认该项配置是否正确。
在配置文件nginx.conf中,修改autoindex参数的值为off。或者该参数没有出现(默认情况下是关闭目录列表功能):
在location server段或者http段,
http {
...
autoindex off;
...
}
4.限制允许访问的IP
nginx允许限制某些IP地址的客户端访问,限制IP访问可以保护nginx避免DDOS攻击。
具体配置以用户实际需求为准,举例如下所示:
location/ {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
denyall;
}
5.配置超时时间
设置合理的超时参数,防止慢速攻击:
配置nginx的超时时间,提高服务器的性能,降低客户端的等待时间。同时,在受到DOS攻击时,可以起到缓解作用。特殊情况下,请根据具体性能需求进行调优。
在配置文件nginx.conf中的http段配置超时,单位秒(s):
http {
...
...
}
6.启用XSS保护
X-XSS-Protection这个响应头是用来防范XSS的。现在主流浏览器都支持,并且默认都开启了XSS保护,用这个header可以关闭它。它有几种配置:
0:禁用XSS保护;
1:启用XSS保护;
1; mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);
浏览器提供的XSS保护机制并不完美,但是开启后仍然可以提升攻击难度,总之没有特别的理由,不要关闭它。
推荐配置:
add_header X-XSS-Protection "1; mode=block";
7.减少点击劫持
X-Frame-Options这个功能主要为了减少了点击劫持(Clickjacking)的发生。X-Frame-Options,已经转正为Frame-Options,但现阶段使用最好还是带上X-。
这个响应头支持三种配置:
DENY:不允许被任何页面嵌入;
SAMEORIGIN:不允许被本域以外的页面嵌入;
ALLOW-FROM uri:不允许被指定的域名以外的页面嵌入(Chrome现阶段不支持);
如果某页面被不被允许的页面以<iframe>或<frame>的形式嵌入,IE会显示类似于“此内容无法在框架中显示”的提示信息,Chrome和Firefox都会在控制台打印信息。由于嵌入的页面不会加载,这就减少了点击劫持(Clickjacking)的发生。
推荐配置:
add_header X-frame-options SAMEORIGIN;
8.禁用浏览器的类型猜测
互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:"text/html"代表html文档,"image/png"是PNG图片,"text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。
例如,即使给一个html文档指定Content-Type为"text/plain",在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让应该解析为图片的请求被解析为JavaScript。通过X-Content-Type-Options这个响应头可以禁用浏览器的类型猜测行为:
这个响应头的值只能是nosniff,可用于IE8+和Chrome。另外,它还被Chrome用于扩展下载。
推荐配置:
add_header X-Content-Type-Options nosniff;
9.nginx 拦截非法字符,nginx禁止url访问特定字符,nginx过滤url访问
参考代码一
#前缀为无限,后面的精准屏蔽字符 123
if ($request_uri ~* "123"){
return 403 "I've recorded your ip Wait to check the water meter";
}
参考代码二
#前缀为index.php,后面的精准屏蔽字符 123
if($request_uri ~* "/index.php\123"){
return 403 "I've recorded your ip Wait to check the water meter";
}
参考代码三
注释
过滤链接中的?在nginx的配置文件中写入
location / {
# 当访问的url中含有/%#时返回404
if ($request_uri ~* "/%#") {
return 404;
}
当访问url的后面带有?的链接 返回404
if ($request_uri ~*^/a/m/(.*)\.html\?(.*)$) {
return 404;
}
10.nginx 正则表达式
=开头表示精确匹配,如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
^~ 开头表示uri以某个常规字符串开头,不是正则匹配
~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配
.* .匹配任意字符,*匹配数量0到正无穷;
\. \转义,匹配.
/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "no-referrer-when-downgrade";
limit_conn_zone $binary_remote_addr zone=one1:50m;
#定义一个用于限制请求速率的共享内存区域,基于漏桶算法
limit_req_zone $binary_remote_addr zone=one2:50m rate=500r/s;
limit_conn one1 500;
#限制单个连接向客户端传输响应的速率,即带宽限速
limit_rate 300k;
#应用请求速率限制规则,并配置突发请求处理策略
limit_req zone=one2 burst=15 nodelay;
四.nginx综合配置示例
将以上安全配置整合为完整示例,可根据需求调整配置:
ssl_certificate /usr/share/nginx/xm.ss.cn.pem;
ssl_certificate_key /usr/share/nginx/xm.ss.cn.key;
ssl_session_timeout 5m;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:1m;

