得意淡然,失意坦然;喜而不狂,忧而不伤。

Nginx安全配置规范

Linux/Unix admin 2014次浏览 已收录 0个评论 扫描二维码

Nginx安全配置规范

为了保证nginx配置安全,防止信息泄露,恶性攻击,配置的标准规范等,特制定此nginx安全配置标准,此标准从安全、性能等方面进行配置标准化。

本标准适用于nginx 0.7.xnginx 0.8.x

标准定位:作为《公司运维标准》的一部分,只对nginx 的安全部分配置进行标准规范。

1. 限制access权限[强制]

1) Nginx默认不打开目录浏览功能。因此,除非特殊需求,强烈建议不要在server段或httpd段中加入autoindex on;配置

 

2. 限制file extension[强制]

1) 只允许访问指定的扩展名,配置方法:server段中配置

location ~* .(sql|bak|inc|old)$

{

return 403;

}

2) 对于有PHP上传功能的nginx服务, 需要防止用户上传的脚本文件被服务器执行。在server段中配置:

location ^~ /upload/ {

if ($request_filename !~* .(jpg|jpeg|gif|png|swf|zip|rar|txt)$) {

return 403;

}

alias /home/work/path/to/upload/;

}

3. 性能,ddos相关[强制]

1) Nginx可以采用epoll机制,处理高并发连接的请求。在全局配置段中配置:

events {

use epoll;

worker_connections 51200;

}

worker_rlimit_nofile 51200

需要注意,为使得nginx工作进程能打开足够多的文件句柄(包括socket),需要采用

limit工具启动nginx,具体方式如下,在nginx的启动脚本中加入:

limit -n 65535 sbin/nginx

limit的属主应该为root,并且打开了s标准位:

-rwsr-sr-x 1 root root 33871 Dec 4 2006 /bin/limit

这样可以保证nginx工作进程能打开足够多得文件句柄,同时以工作账号(而非root)运行。

 

4. 防止信息泄露及信息保护[强制]

1) 对与PHP配合使用的nginx,需要 相关产品线RD确认,是否需要pathinfo。如不需要,则修改php.ini,设置cgi.fix_pathinfo = 0

2) 不在错误页和响应包头部中显示nginx版本号。在server段中配置:

server_tokens off;

3) Web Server类型置为其它Web Server(如Apache),以防止外部利用nginx可能在漏洞进行攻击。在server段中配置:

more_set_headers 'Server: Apache';

4) 重定向错误页面

将错误页面重定向到指定的错误页面,避免显示nginx缺省的错误页面。在server段中配置:

error_page 400 403 404 500 501 502 503 504 505 http://www.domain.com/search/error.html

# http://www.domain.com/search/error.html可根据产品线的需要配置为自己的错误页面。

注意,但这里的错误页需要指定完整的url,不能省略域名而仅配置相对路径。

例如,如下配置可能会存在问题:

error_page 400 403 404 500 501 502 503 504 505 /tb/error.html

因为在配置所在的server段中,可能会对该段的root(web服务的虚拟根目录)进行其它设定,导致按相对路径无法找到error.html。因此建议配置完整的url。另外,不要将将错误页面重定向到与自己无关的服务上。

5) 对非法域名指向的重定向,防止其它非公司域名非法指向公司IP。在server段中配置:

if ($host !~ ".domain.com$|.domain.com:|.domain.com.cn$|.domain.com.cn:|.domain.cn$|.domain.cn:|^d{1,3}.d{1,3}.d{1,3}.d{1,3}$|^d{1,3}.d{1,3}.d{1,3}.d{1,3}:")

{

rewrite ^/(.*)$ http://error.domain.com/errorname.html?url=%1&fr=xxx redirect;

}

#若产品线自有的域名不在上面正则式匹配的范围之内,请自行添加

#其中,xxx表示产品线,image,news

6) Nginx状态查询:

如果存在nginx-status页面,加上相应的访问控制,ip改为内网ip;配置方法:

location /nginx-status {

stub_status on;

access_log off;

allow 127.0.0.1;#此处可配置为其它内网机器IP地址,但不能配置为外网或办公网地址

deny all;

}

然后再通过在允许访问该nginx服务的内网机器搭建代理来满足来自其它内网机器或办公网机器的状态查询请求。

 

5. url请求过滤[强制]

1) 拒绝url中包含.svn目录和CVS文件的请求。防止违规上线的svn等文件被黑客恶意读取,造成产品线源代码泄露。

配置方法:在location段中配置:

if ($request_uri ~* (/.svn/|CVS/Entries)) {

rewrite (.*) http://$host:$server_port/ redirect;

}

注意,由于此配置会屏蔽请求中的“/.svn/”和“CVS/Entries”,因此需要和产品线RD确认不会影响正常请求后方可使用。

6. cgiweb server可访问目录隔离[强制]

建议将由服务器执行的CGI程序或脚本放置在nginx可访问路径之外。对于无法做到此要求的服务,可通过对存放CGI程序或脚本的路径进行访问限制来实现。配置方法:在server段配置:

root /home/work/nginx/htdocs/;#假设这是本server段的document root

#建议CGI程序或脚本放置在document root之外,如无法做到,则需要配置:

location ~* /bin

{ #禁止对bin目录的请求

return 403;

}

7. 备选[可选]

1) Keep alive和其它性能相关:

a) sendfile on

允许sendfile系统调用,避免经过内存缓冲区发送数据的开销。

b) tcp_nodelay on

打开TCP协助栈中的TCP_NODELAY选项,禁用nagle缓冲算法,使得服务端立即发送数据,而不是等待数据量达到一定大小之后再发出。对于需要即时相应请求的服务或小文件较多的静态服务推荐打开。

2) 拒绝url里包含< 等有害字符的请求。这些字符在正常的GET请求里基本不会出现,但是经常被黑客用来完成脚本攻击,采用这样的规则类似于简单的url防火墙,很多程度上可以缓解反射型的跨站脚本攻击和其他来自于url的攻击行为。

配置方法:在location段中配置:

if ($request_uri ~* ('|<|"|%00|%22|%27|%3e|%3c|>)) {

rewrite (.*) http://$host:$server_port/ redirect;

}

注意,由于此配置会屏蔽请求中的特殊字符,因此需要和产品线RD确认不会影响正常请求后方可使用。

执行办法:

删除配置项中已有的autoindex on;配置

server段中加入:

location ~* .(sql|bak|inc|old)$

{

return 403;

}

对于有文件上传功能的nginx,需要在server段中对于文件上传目录(/upload/)作如下配置

location ^~ /upload/ {

if ($request_filename !~* .(jpg|jpeg|gif|png|swf|zip|rar|txt)$) {

return 403;

}

alias /home/work/path/to/upload/;

}

在全局段中配置:

events {

use epoll;

worker_connections 51200;

}

worker_rlimit_nofile 51200;

nginx的启动脚本中使用如下命令来启动nginx

limit –n 65535 sbin/nginx

limit工具的属主应为root,并且打开s标志位。

-rwsr-sr-x 1 root root 33871 Dec 4 2006 /bin/limit

server段中配置

server_tokens off;

more_set_headers 'Server: Apache';

error_page 400 403 404 500 501 502 503 504 505 /tb/error.html;

#/tb/error.html可根据产品线的需要配置为自己的错误页面

if ($host !~ ".domain.com$|.domain.com:|.domain.com.cn$|.domain.com.cn:|.domain.cn$|.domain.cn:|^d{1,3}.d{1,3}.d{1,3}.d{1,3}$|^d{1,3}.d{1,3}.d{1,3}.d{1,3}:")

{

rewrite ^/(.*)$ http://error.domain.com/errorname.html?url=%1&fr=xxx redirect;

}

#若产品线自有的域名或确认可以指向公司IP的第三方域名不在上面正则式匹配的范围之内,请自行添加

#其中,xxx表示产品线,image,news

#对于使用NOAH进行语义监控的nginx,如果在监控请求中未包含HOST字段(或HOST字段不符合上述规则),则监控请求会被重定向。请产品线在配置相关语义监控时在监控请求中指定HOST字段为nginx所在的域名。

如果存在nginx-status页面,需要加上如下全局配置:

location /nginx-status {

stub_status on;

access_log off;

allow 127.0.0.1; #此处可配置为其它内网机器IP地址,但不能配置为外网或办公网地址

deny all;

}

location段中配置:

if ($request_uri ~* (/.svn/|CVS/Entries)) {

rewrite (.*) http://$host:$server_port/ redirect;

 

}


pitata技术乐园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Nginx安全配置规范
喜欢 (0)
[103531948@qq.com]
分享 (0)
发表我的评论
取消评论
表情 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址