20个Nginx Web服务器最佳安全实战

  Nginx是个轻量级高性能Web服务器/反向代理和电子邮件代理(IMAP/POP3)它可以运行在UNIXGNU/LinuxBSD变种MAC OS XSolaris和Microsoft Windows上根据Netcraft调查数据显示互联网上6%域名都使用了Nginx Web服务器Nginx是解决C10K问题服务器的和传统服务器不Nginx不依赖于线程处理请求相反它使用了个更具扩展性事件驱动(异步)架构Nginx在很多高流量网站WebSite上得到了应用如WordPressHuluGithub和SourceForge
  本文主要目是介绍如何提高运行在Linux或UNIX类操作系统上Nginx Web服务器安全性
  Nginx默认配置文件和默认端口
  ◆ /usr/local/nginx/conf/ - Nginx服务器配置目录/usr/local/nginx/conf/nginx.conf 是主配置文件
  ◆ /usr/local/nginx/html/ - 默认文档位置
  ◆ /usr/local/nginx/logs/ - 默认日志文件位置
  ◆ Nginx HTTP默认端口:TCP 80
  ◆ Nginx HTTPS默认端口:TCP 443
  可以使用下面命令测试Nginx配置是否正确:
  # /usr/local/nginx/sbin/nginx –t
  输出举例:
  the configuration file /usr/local/nginx/conf/nginx.conf syntax is okconfiguration file /usr/local/nginx/conf/nginx.conf test is successful
  要让修改后配置生效执行下面命令:
  # /usr/local/nginx/sbin/nginx -s reload
  如果要停止服务器运行:
  # /usr/local/nginx/sbin/nginx -s stop
  1、开启SELinux
  SELinux(安全增强Linux)是个Linux内核功能它提供了个机制支持访问控制安全策略提供了巨大安全保护能力它可以防止大多数系统root级攻击请参考“如何在CentOS/Red Hat系统上开启SELinux”(http://www.cyberciti.biz/faq/rhel-fedora-redhat-selinux-protection/)
  运行getsebool –a命令查看SELinux设置项:
  getsebool -a | lessgetsebool -a | grep offgetsebool -a | grep o
  然后使用sebool命令开启需要配置项注意:开启SELinux后在RHEL或CentOS上通常会增加2-8%系统开销
  2、通过mount参数提供最低权限
  为你/html/php文件创建独立分区例如创建个/dev/sda5分区挂载在/ngnix上确定/ngnix使用了noexecnodev和nouid权限挂载下面是我个挂载例子:
  LABEL=/nginx     /nginx          ext3   defaults,nosuid,noexec,nodev 1 2
  注意你需要使用fdisk和mkfs.ext3命令创建个新分区
  3、通过/etc/sysctl.conf加固
  可以通过/etc/sysctl.conf控制和配置Linux内核及网络设置
  另外请参考:
  # 避免放大攻击net.ipv4.icmp_echo_ignore_broadcasts = 1# 开启恶意icmp消息保护net.ipv4.icmp_ignore_bogus_error_responses = 1# 开启SYN洪水攻击保护net.ipv4.tcp_syncookies = 1# 开启并记录欺骗源路由和重定向包net.ipv4.conf.all.log_martians = 1net.ipv4.conf.default.log_martians = 1# 处理无源路由包net.ipv4.conf.all.accept_source_route = 0net.ipv4.conf.default.accept_source_route = 0# 开启反向路径过滤net.ipv4.conf.all.rp_filter = 1
  net.ipv4.conf.default.rp_filter = 1
  # 确保无人能修改路由表
  net.ipv4.conf.all.accept_redirects = 0
  net.ipv4.conf.default.accept_redirects = 0
  net.ipv4.conf.all.secure_redirects = 0
  net.ipv4.conf.default.secure_redirects = 0
  # 不充当路由器
  net.ipv4.ip_forward = 0
  net.ipv4.conf.all.send_redirects = 0
  net.ipv4.conf.default.send_redirects = 0
  # 开启execshild
  kernel.exec-shield = 1
  kernel.randomize_va_space = 1
  # IPv6设置
  net.ipv6.conf.default.router_solicitations = 0
  net.ipv6.conf.default.accept_ra_rtr_pref = 0
  net.ipv6.conf.default.accept_ra_pinfo = 0
  net.ipv6.conf.default.accept_ra_defrtr = 0
  net.ipv6.conf.default.autoconf = 0
  net.ipv6.conf.default.dad_transmits = 0
  net.ipv6.conf.default.max_addresses = 1
  # 优化LB使用端口
  # 增加系统文件描述符限制
  fs.file-max = 65535
  # 允许更多PIDs (减少滚动翻转问题); may some programs 32768
  kernel.pid_max = 65536
  # 增加系统IP端口限制
  net.ipv4.ip_local_port_range = 2000 65000
  # 增加TCP最大缓冲区大小
  net.ipv4.tcp_rmem = 4096 87380 8388608
  net.ipv4.tcp_wmem = 4096 87380 8388608
  # 增加Linux自动调整TCP缓冲区限制
  # 最小默认和最大可使用字节数
  # 最大值不低于4MB如果你使用非常高BDP路径可以设置得更高
  # Tcp窗口等
  net.core.rmem_max = 8388608
  net.core.wmem_max = 8388608
  net.core.netdev_max_backlog = 5000
  net.ipv4.tcp_window_scaling = 1
  ◆ Linux VM调优(内存)子系统(http://www.cyberciti.biz/faq/linux-kernel-tuning-virtual-memory-subsystem/)
  ◆ Linux网络堆栈调优(缓冲区大小)提高网络性能(http://www.cyberciti.biz/faq/linux-tcp-tuning/)
  4、移除所有不需要Nginx模块
  你需要最大限度地将Nginx加载模块最小化意思是满足Web服务器需要就可以了多余模块个不留例如禁用SSI和autoindex模块命令如下:
  # ./configure --without-http_autoindex_modu
Tags: 

延伸阅读

最新评论

发表评论