20步打造最安全的Nginx Web服务器

阻止Soso和有道的机器人:

  1. ## Block some robots ##
  2.      if ($http_user_agent ~* Sosospider|YodaoBot) {
  3.             return 403;
  4.      }

十三、如何防止图片盗链

图片或HTML盗链的意思是有人直接用你网站的图片地址来显示在他的网站上。最终的结果,你需要支付额外的宽带费用。这通常是在论坛和博客。我强烈建议您封锁,并阻止盗链行为。

  1. # Stop deep linking or hot linking
  2. location /images/ {
  3.   valid_referers none blocked www.example.com example.com;
  4.    if ($invalid_referer) {
  5.      return   403;
  6.    }
  7. }

例如:重定向并显示指定图片

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

十四、目录限制

你可以对指定的目录设置访问权限。所有的网站目录应该一一的配置,只允许必须的目录访问权限。
通过IP地址限制访问
你可以通过IP地址来限制访问目录/admin/:

  1. location /docs/ {
  2.   ## block one workstation
  3.   deny    192.168.1.1;
  4.   ## allow anyone in 192.168.1.0/24
  5.   allow   192.168.1.0/24;
  6.   ## drop rest of the world
  7.   deny    all;
  8. }

通过密码保护目录
首先创建密码文件并增加“user”用户:

  1. mkdir /usr/local/nginx/conf/.htpasswd/
  2.  htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd user

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

  1. ### Password Protect /personal-images/ and /delta/ directories ###
  2. location ~ /(personal-images/.*|delta/.*) {
  3.   auth_basic  “Restricted”;
  4.   auth_basic_user_file   /usr/local/nginx/conf/.htpasswd/passwd;
  5. }

一旦密码文件已经生成,你也可以用以下的命令来增加允许访问的用户:

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

十五、Nginx SSL配置

HTTP是一个纯文本协议,它是开放的被动监测。你应该使用SSL来加密你的用户内容。
创建SSL证书
执行以下命令:

  1. cd /usr/local/nginx/conf
  2. openssl genrsa -des3 -out server.key 1024
  3. openssl req -new -key server.key -out server.csr
  4. cp server.key server.key.org
  5. openssl rsa -in server.key.org -out server.key
  6. openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

编辑nginx.conf并按如下来更新:

  1. server {
  2.     server_name example.com;
  3.     listen 443;
  4.     ssl on;
  5.     ssl_certificate /usr/local/nginx/conf/server.crt;
  6.     ssl_certificate_key /usr/local/nginx/conf/server.key;
  7.     access_log /usr/local/nginx/logs/ssl.access.log;
  8.     error_log /usr/local/nginx/logs/ssl.error.log;
  9. }

重启nginx:

  1. /usr/local/nginx/sbin/nginx -s reload

十六、Nginx与PHP安全建议

PHP是流行的服务器端脚本语言之一。如下编辑/etc/php.ini文件:

  1. # Disallow dangerous functions
  2. disable_functions = phpinfo, system, mail, exec
  3. ## Try to limit resources  ##
  4. # Maximum execution time of each script, in seconds
  5. max_execution_time = 30
  6. # Maximum amount of time each script may spend parsing request data
  7. max_input_time = 60
  8. # Maximum amount of memory a script may consume (8MB)
  9. memory_limit = 8M
  10. # Maximum size of POST data that PHP will accept.
  11. post_max_size = 8M
  12. # Whether to allow HTTP file uploads.
  13. file_uploads = Off
  14. # Maximum allowed size for uploaded files.
  15. upload_max_filesize = 2M
  16. # Do not expose PHP error messages to external users
  17. display_errors = Off
  18. # Turn on safe mode
  19. safe_mode = On
  20. # Only allow access to executables in isolated directory
  21. safe_mode_exec_dir = php-required-executables-path
  22. # Limit external access to PHP environment
  23. safe_mode_allowed_env_vars = PHP_
  24. # Restrict PHP information leakage
  25. expose_php = Off
  26. # Log all errors
  27. log_errors = On
  28. # Do not register globals for input data
  29. register_globals = Off
  30. # Minimize allowable PHP post size
  31. post_max_size = 1K
  32. # Ensure PHP redirects appropriately
  33. cgi.force_redirect = 0
  34. # Disallow uploading unless necessary
  35. file_uploads = Off
  36. # Enable SQL safe mode
  37. sql.safe_mode = On
  38. # Avoid Opening remote files
  39. allow_url_fopen = Off

十七、如果可能让Nginx运行在一个chroot监狱

把nginx放在一个chroot监狱以减小潜在的非法进入其它目录。你可以使用传统的与nginx一起安装的chroot。如果可能,那使用FreeBSD jails,Xen,OpenVZ虚拟化的容器概念。

十八、在防火墙级限制每个IP的连接数

网络服务器必须监视连接和每秒连接限制。PF和Iptales都能够在进入你的nginx服务器之前阻止最终用户的访问。
Linux Iptables:限制每次Nginx连接数
下面的例子会阻止来自一个IP的60秒钟内超过15个连接端口80的连接数。

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

请根据你的具体情况来设置限制的连接数。

十九:配置操作系统保护Web服务器

像以上介绍的启动SELinux.正确设置/nginx文档根目录的权限。Nginx以用户nginx运行。但是根目录(/nginx或者/usr/local/nginx/html)不应该设置属于用户nginx或对用户nginx可写。找出错误权限的文件可以使用如下命令:

  1. find /nginx -user nginx
  2. find /usr/local/nginx/html -user nginx

确保你更所有权为root或其它用户,一个典型的权限设置 /usr/local/nginx/html/

  1. ls -l /usr/local/nginx/html/

示例输出:

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

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

  1. find /nginx -name ‘.?*’ -not -name .ht* -or -name ‘*~’ -or -name ‘*.bak*’ -or -name ‘*.old*’
  2.  find /usr/local/nginx/html/ -name ‘.?*’ -not -name .ht* -or -name ‘*~’ -or -name ‘*.bak*’ -or -name ‘*.old*’

通过find命令的-delete选项来删除这些文件。

二十、限制Nginx连接传出

黑客会使用工具如wget下载你服务器本地的文件。使用Iptables从nginx用户来阻止传出连接。ipt_owner模块试图匹配本地产生的数据包的创建者。下面的例子中只允许user用户在外面使用80连接。

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

通过以上的配置,你的nginx服务器已经非常安全了并可以发布网页。可是,你还应该根据你网站程序查找更多的安全设置资料。例如,wordpress或者第三方程序。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>