快捷搜索:   nginx

20个Nginx Web服务器最佳安全实践(2)

另外,你还需要控制超时时间,提高服务器性能,降低客户端的等待时间,做如下修改:

## Start: Timeouts 
##  client_body_timeout   
10;  client_header_timeout 10;

keepalive_timeout    
5 5;  send_timeout          
10;

## End: Timeouts ##

client_body_timeout 10:设置客户端请求主体读取超时时间,如果在这个时间后客户端还没有发送任何数据,Nginx返回“Request time out(408)”错误,默认值是60。

client_header_timeout 10:设置客户端请求头读取超时时间,如果在这个时间后客户端还没有发送任何数据,Nginx返回“Request time out(408)”错误。

keepalive_timeout 5 5:第一个参数指定客户端连接保持活动的超时时间,在这个时间之后,服务器会关掉连接,第二个参数是可选的,它指定了消息头保持活动的有效时间,即响应中的timeout=time,它可以告诉某些浏览器关闭连接,因此服务器就不必关闭连接了,如果没有这个参数,Nginx不会发送Keep-Alive头。

send_timeout 10:指定响应客户端的超时时间,这个超时仅限于两个阅读活动之间的时间,如果这个时间后客户端没有任何活动,Nginx将会关闭连接。

9、控制并发连接

你可以使用NginxHttpLimitZone模块限制指定会话,或某个IP的并发连接数,编辑nginx.conf:

### Directive describes the zone, in which the session states are stored i.e. store in slimits. 
### 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session ###

limit_zone slimits $binary_remote_addr 5m;

### Control maximum number of simultaneous connections for one session i.e. ###

### restricts the amount of connections from a single ip address ###

limit_conn slimits 5;

上述设置可以限制远程客户端每IP地址不能超过5个同时打开的连接。

10、只允许访问指定的域名

如果有机器人程序在随机扫描所有域,那就阻止它访问,你必须配置只允许虚拟域或反向代理请求。

## Only requests to our Host are allowed i.e. nixcraft.in, images.nixcraft.in and www.nixcraft.in   
if ($host !~ ^(nixcraft.in|www.nixcraft.in|images.nixcraft.in)$ ) {         
return 444;      }

##

11、限制可用的方法

GET和POST是互联网上最常用的方法,RFC 2616定义了Web服务器可用的方法,如果一个Web服务器不要求实现所有方法,那些方法就应该被禁止掉,下面的代码将过滤所有方法,只允许GET,HEAD和POST方法:

## Only allow these request methods ##     
if ($request_method !~ ^(GET|HEAD|POST)$ ) {         
return 444;     }

## Do not accept DELETE, SEARCH and other methods ##

关于HTTP方法的更多信息:

GET方法用于请求文档,如http://www.cyberciti.biz/index.php。

HEAD方法与GET相同,但服务器不会在响应中只返回消息主体。

POST方法功能就多了,如通过表单存储或更新数据,订购一个产品,发送电子邮件等,通常使用服务器端脚本(如PHP,Perl,Python等)处理,如果你要上传文件或在服务器上处理表单就必须用它。

12a、如何阻止某些用户代理(User-Agents)?

你可以轻松阻止用户代理,如扫描器,机器人和垃圾邮件,它们可能会滥用你的服务器。

## Block download agents ##     
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {         
return 403;     }

##

阻止msnbot和scrapbot机器人:

## Block some robots ##     
if ($http_user_agent ~* msnbot|scrapbot) {           
return 403;     }

12b、如何阻止被提名的垃圾邮件

被提名的垃圾邮件都很危险,它们可能会损害你的SEO排名,可以使用下面的代码阻止访问垃圾邮件发送者:

## Deny certain Referers ###   
if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )     
{        
# return 404;        
return 403;     }

##

13、如何停止图片热链

图片或HTML热链是指有人在他们的网站上引用了你网站的图片,你必须为其它网站的流量支付贷款费用,有点象是网站劫持,通常这种情况发生在博

客和论坛中,我强烈建议你在服务器级停止并阻止图片热链。

# Stop deep linking or hot linking
location /images/ {  valid_referers none blocked www.example.com example.com;   
if ($invalid_referer) {     
return   403;   }

}

例子:重写并显示禁令图片:

valid_referers blocked www.example.com example.com; 
if ($invalid_referer) { rewrite ^/images/uploads.*\.(gif|jpg|jpeg|png)$ 
http://www.examples.com/banned.jpg last

}

另外,请参考“How-to:使用Nginx映射阻止图片热链”(http://nginx.org/pipermail/nginx/2007-June/001082.html)。

14、目录限制

你可以为特定目录设置访问控制,所有网页目录都应配置为按需访问。

通过IP地址限制访问,你可以限制访问/docs/目录的IP地址:

location /docs/ {  ## block one workstation  deny    192.168.1.1;

## allow anyone in 192.168.1.0/24  allow   192.168.1.0/24;

## drop rest of the world  deny    all;

}

通过密码保护目录,首先创建一个密码文件,再添加一个用户vivek:

# mkdir /usr/local/nginx/conf/.htpasswd/
# htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd vivek

编辑nginx.conf添加需要保护的目录:

### Password Protect /personal-images/ and /delta/ directories ###
location ~ /(personal-images/.*|delta/.*) {  auth_basic  "Restricted";  
auth_basic_user_file   /usr/local/nginx/conf/.htpasswd/passwd;

}

创建好密码文件后,后面的用户可以使用下面的命令进行追加:

# htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName


15、Nginx SSL配置

HTTP是一个纯文本协议,很容易被窃听,你应该使用SSL加密传输的信息。

首先需要创建一个SSL证书,输入下面的命令:

# cd /usr/local/nginx/conf
# openssl genrsa -des3 -out server.key 1024
# openssl req -new -key server.key -out server.csr
# cp server.key server.key.org
# openssl rsa -in server.key.org -out server.key
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

编辑nginx.conf,找到对应位置,做如下修改:

server {    
server_name example.com;    
listen 443;    
ssl on;    
ssl_certificate /usr/local/nginx/conf/server.crt;    
ssl_certificate_key /usr/local/nginx/conf/server.key;    
access_log /usr/local/nginx/logs/ssl.access.log;    
error_log /usr/local/nginx/logs/ssl.error.log;

重启Nginx:

# /usr/local/nginx/sbin/nginx -s reload

另外,请参考Nginx SSL文档(http://wiki.nginx.org/NginxHttpSslModule)。

16、Nginx和PHP安全技巧

PHP是流行的服务器端脚本语言,对/etc/php.ini做如下修改:

# 禁用危险的函数
disable_functions = phpinfo, system, mail, exec
## 限制资源  ##
# 每个脚本的最大执行时间,单位秒
max_execution_time = 30
# 每个脚本解析请求数据的最大时间
max_input_time = 60
# 每个脚本可以消耗的最大内存(8MB)
memory_limit = 8M
# PHP要接收的POST数据最大大小
post_max_size = 8M
# 是否允许HTTP文件上传
file_uploads = Off
# 允许上传的最大文件大小
upload_max_filesize = 2M
# 不将PHP错误消息暴露给外部用户
display_errors = Off
# 启用安全模式
safe_mode = On
# 只允许访问隔离目录中的可执行文件
safe_mode_exec_dir = php-required-executables-path
# 限制外部访问PHP资源
safe_mode_allowed_env_vars = PHP_
# 限制泄露PHP信息
expose_php = Off
# 记录所有错误
log_errors = On
# 不为输入数据注册全局
register_globals = Off
# 最小化允许的php post大小
post_max_size = 1K
# 确保PHP重定向正确
cgi.force_redirect = 0
# 禁止上传,除非必要
file_uploads = Off
# 启用SQL安全模式
sql.safe_mode = On
# 避免打开远程文件
allow_url_fopen = Off

另外,请参考“PHP安全:限制脚本使用的资源”(http://www.cyberciti.biz/faq/php-resources-limits/),“PHP.INI:禁用exec,shell_exec,system,popen和其它功能提高安全”(http://www.cyberciti.biz/faq/linux-unix-apache-lighttpd-phpini-disable-functions/)。

17、尽可能在Chroot Jail(容器)中运行Nginx

将Nginx放入Chroot Jail可以最大限度地减少被攻击的危险,它将Web服务器隔离到文件系统的专用区域,注意你不能使用传统的chroot方法设置Nginx,但你可以使用FreeBSD jails,Xen或OpenVZ虚拟化,它们也使用了容器的概念。

18、在防火墙级限制每个IP的连接

Web服务器必须时刻关注连接和每秒的连接限制,pf和iptables都可以在访问Nginx服务器之前卡住最终用户。

Linux iptables:每秒卡住的Nginx连接

下面的例子表示如果某个IP在60秒尝试连接到80端口的次数超过了15,iptables将会丢掉来自它的入站连接:

/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent 
--update --seconds 60  --hitcount 15 -j DROP
service iptables save

BSD PF:每秒卡住的Nginx连接

编辑/etc/pf.conf,做如下更新,下面的命令限制了每个来源的最大连接数为100,15/5指定某时间跨度内的连接数限制,这里就是5秒内的最大连接数为

15,如果有人违背这条规则,将被加入到abusive_ips表,那么他以后就不能再连接了。最后刷新所有状态。

ebserver_ip="202.54.1.1"
table  persist
block in quick from 
pass in on $ext_if proto tcp to $webserver_ip port www flags S/SA keep state (max-src-conn 100, 
max-src-conn-rate 15/5, overload  flush)

请根据你的需要和通信流量调整所有的值(浏览器可能会打开多个连接)。

另外,请参考“PF防火墙脚本示例”(http://bash.cyberciti.biz/firewall/pf-firewall-script/),“iptables防火墙脚本示例”(http://bash.cyberciti.biz/firewall/linux-iptables-firewall-shell-script-for-standalone-server/)。

19、配置操作系统保护Web服务器

除了开启SELinux外,还要给/nginx目录设置正确的权限,运行Nginx的系统用户名是nginx,但在DocumentRoot(/nginx或/usr/local/nginx/html)中的文件不应该

属于该用户,他也不能进行修改。使用下面的命令找出权限设置不当的文件:

# find /nginx -user nginx
# find /usr/local/nginx/html -user nginx

请确保将文件的所有者修改为root或其它用户,一个典型的权限设置如下:

# ls -l /usr/local/nginx/html/

输出示例:

-rw-r--r-- 1 root root 925 Jan  3 00:50 error4xx.html
-rw-r--r-- 1 root root  52 Jan  3 10:00 error5xx.html
-rw-r--r-- 1 root root 134 Jan  3 00:52 index.html

另外,你必须删除由vi或其它文本编辑器创建的不必要的备份文件:

# find /nginx -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*'
# find /usr/local/nginx/html/ -name '.?*' -not -name .ht* -or -name '*~' 
-or -name '*.bak*' -or -name '*.old*'

给find命令传递-delete参数,它就会自动删除这些文件。

20、限制出站Nginx连接

攻击者可能要在你的Web服务器上使用如wget等工具下载文件,使用iptables阻止来自Nginx用户的出站连接,ipt_owner模块可以匹配各种包创建者的特征,只有在OUTPUT链中的才有效,在这里,允许vivek用户使用80端口连接外部资源(对RHN访问或通过仓库抓取CentOS更新特别有用)。

/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp 
--dport 80 -m state --state NEW,ESTABLISHED  -j ACCEPT

将上述规则添加到你的iptables基础shell脚本中,不允许nginx Web服务器用户连接外部资源。

附送技巧:观察日志和审核

检查日志文件,可以从中找到攻击者的一些行踪和攻击手段。

# grep "/login.php??" /usr/local/nginx/logs/access_log
# grep "...etc/passwd" /usr/local/nginx/logs/access_log
# egrep -i "denied|error|warn" /usr/local/nginx/logs/error_log

Auditd服务提供了系统审核功能,启动SELinux事件,认证事件,文件修改,帐户修改等的审核服务,象往常一样首先关闭所有服务,然后打开我在“Linux服务器加固”(http://www.cyberciti.biz/tips/linux-security.html)一文中指出的服务。

总结

通过这些设置,你的Nginx服务器就可以对外提供服务了,但你应该根据应用程序安全需要进一步查看另外的资源。例如,WordPress或其它第三方程序都有其自身的安全要求。

原文:Top 20 Nginx WebServer Best Security Practices  作者:VIVEK GITE

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论