如何将Nginx配置成安全的web服务器

来源:小新 时间:2021-07-01 09:10:25阅读:0

Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器。它运行在UNIX,GNU/Linux,BSD各种版本,Mac OS X,Solaris和Windows。根据调查统计,6%的网站使用Nginx Web服务器。Nginx是少数能处理C10K问题的服务器之一。跟传统的服务器不同,Nginx不依赖线程来处理请求。相反,它使用了更多的可扩展的事件驱动(异步)架构。Nginx为一些高流量的网站提供动力,比如WordPress,人人网,腾讯,微云网络等。这篇文章主要是介绍如何提高运行在Linux或UNIX系统的Nginx Web服务器的安全性。

Nginx配置 默认配置文件和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配置文件准确性。

 
  1. /usr/local/nginx/sbin/nginx-t

将会输出。

the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

configuration file /usr/local/nginx/conf/nginx.conf test is successful

执行以下命令来重新加载配置文件。

 
  1. /usr/local/nginx/sbin/nginx-sreload

执行以下命令来停止服务器。

 
  1. /usr/local/nginx/sbin/nginx-sstop

一、配置SELinux

安全增强型Linux(SELinux)的是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。它可以大部分的攻击。下面我们来看如何启动基于CentOS/RHEL系统的SELinux。

安装SELinux

 
  1. rpm-qa|grepselinux

libselinux-1.23.10-2

selinux-policy-targeted-1.23.16-6

如果没有返回任何结果,代表没有安装 SELinux,如果返回了类似上面的结果,则说明系统安装了 SELinux。

布什值锁定

运行命令getsebool -a来锁定系统。

 
  1. getsebool-a|less
  2. getsebool-a|grepoff
  3. getsebool-a|grepo

二、通过分区挂载允许最少特权

服务器上的网页/html/php文件单独分区。例如,新建一个分区/dev/sda5(第一逻辑分区),并且挂载在/nginx。确保/nginx是以noexec, nodev and nosetuid的权限挂载。以下是我的/etc/fstab的挂载/nginx的信息:

LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2

注意:你需要使用fdisk和mkfs.ext3命令创建一个新分区。

三、配置/etc/sysctl.conf强化Linux安全

你可以通过编辑/etc/sysctl.conf来控制和配置Linux内核、网络设置。

 
  1. #Avoidasmurfattack
  2. net.ipv4.icmp_echo_ignore_broadcasts=1
  3.  
  4. #Turnonprotectionforbadicmperrormessages
  5. net.ipv4.icmp_ignore_bogus_error_responses=1
  6.  
  7. #TurnonsyncookiesforSYNfloodattackprotection
  8. net.ipv4.tcp_syncookies=1
  9.  
  10. #Turnonandlogspoofed,sourcerouted,andredirectpackets
  11. net.ipv4.conf.all.log_martians=1
  12. net.ipv4.conf.default.log_martians=1
  13.  
  14. #Nosourceroutedpacketshere
  15. net.ipv4.conf.all.accept_source_route=0
  16. net.ipv4.conf.default.accept_source_route=0
  17.  
  18. #Turnonreversepathfiltering
  19. net.ipv4.conf.all.rp_filter=1
  20. net.ipv4.conf.default.rp_filter=1
  21.  
  22. #Makesurenoonecanaltertheroutingtables
  23. net.ipv4.conf.all.accept_redirects=0
  24. net.ipv4.conf.default.accept_redirects=0
  25. net.ipv4.conf.all.secure_redirects=0
  26. net.ipv4.conf.default.secure_redirects=0
  27.  
  28. #Don'tactasarouter
  29. net.ipv4.ip_forward=0
  30. net.ipv4.conf.all.send_redirects=0
  31. net.ipv4.conf.default.send_redirects=0
  32.  
  33. #Turnonexecshild
  34. kernel.exec-shield=1
  35. kernel.randomize_va_space=1
  36.  
  37. #TuenIPv6
  38. net.ipv6.conf.default.router_solicitations=0
  39. net.ipv6.conf.default.accept_ra_rtr_pref=0
  40. net.ipv6.conf.default.accept_ra_pinfo=0
  41. net.ipv6.conf.default.accept_ra_defrtr=0
  42. net.ipv6.conf.default.autoconf=0
  43. net.ipv6.conf.default.dad_transmits=0
  44. net.ipv6.conf.default.max_addresses=1
  45.  
  46. #OptimizationforportuseforLBs
  47. #Increasesystemfiledescriptorlimit
  48. fs.file-max=65535
  49.  
  50. #AllowformorePIDs(toreducerolloverproblems);maybreaksomeprograms32768
  51. kernel.pid_max=65536
  52.  
  53. #IncreasesystemIPportlimits
  54. net.ipv4.ip_local_port_range=200065000
  55.  
  56. #IncreaseTCPmaxbuffersizesetableusingsetsockopt()
  57. net.ipv4.tcp_rmem=4096873798289608
  58. net.ipv4.tcp_wmem=4096873798289608
  59.  
  60. #IncreaseLinuxautotuningTCPbufferlimits
  61. #min,default,andmaxnumberofbytestouse
  62. #setmaxtoatleast4MB,orhigherifyouuseveryhighBDPpaths
  63. #TcpWindowsetc
  64. net.core.rmem_max=8289608
  65. net.core.wmem_max=8289608
  66. net.core.netdev_max_backlog=5000
  67. net.ipv4.tcp_window_scaling=1

四、删除所有不需要的Nginx模块

你需要直接通过编译Nginx源代码使模块数量最少化。通过限制只允许web服务器访问模块把风险降到最低。你可以只配置安装nginx你所需要的模块。例如,禁用SSL和autoindex模块你可以执行以下命令:

 
  1. ./configure--without-http_autoindex_module--without-http_ssi_module
  2. make
  3. makeinstall

通过以下命令来查看当编译nginx服务器时哪个模块能开户或关闭:

 
  1. ./configure--help|less

禁用你用不到的nginx模块。

(可选项)更改nginx版本名称。

编辑文件/http/ngx_http_header_filter_module.c:

 
  1. vi+48src/http/ngx_http_header_filter_module.c

找到行:

 
  1. staticcharngx_http_server_string[]="Server:nginx"CRLF;
  2. staticcharngx_http_server_full_string[]="Server:"NGINX_VERCRLF;

按照以下行修改:

 
  1. staticcharngx_http_server_string[]="Server:NinjaWebServer"CRLF;
  2. staticcharngx_http_server_full_string[]="Server:NinjaWebServer"CRLF;

保存并关闭文件。现在你可以编辑服务器了。增加以下代码到nginx.conf文件来关闭nginx版本号的显示。

server_tokens off

五、使用mod_security

只适合后端Apache服务器

mod_security为Apache提供一个应用程序级的防火墙。为后端Apache Web服务器安装mod_security,这会阻止很多注入式攻击。

六、安装SELinux策略

默认的SELinux不会保护Nginx Web服务器,但是你可以安装和编译保护软件。

1、安装编译SELinux所需环境支持

 
  1. yum-yinstallselinux-policy-targetedselinux-policy-devel

2、下载SELinux策略以强化Nginx Web服务器。

 
  1. cd/opt
  2. wget'http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc'

3、解压文件

 
  1. tar-zxvfse-ngix_1_0_10.tar.gz

4、编译文件

 
  1. cdse-ngix_1_0_10/nginx
  2. make

将会输出如下:

Compiling targeted nginx module

/usr/bin/checkmodule: loading policy configuration from tmp/nginx.tmp

/usr/bin/checkmodule: policy configuration loaded

/usr/bin/checkmodule: writing binary representation (version 6) to tmp/nginx.mod

Creating targeted nginx.pp policy package

 
  1. rmtmp/nginx.mod.fctmp/nginx.mod

5、安装生成的nginx.pp SELinux模块:

 
  1. /usr/sbin/semodule-inginx.pp

七、基于Iptables防火墙的限制

下面的防火墙脚本阻止任何除了允许:

来自HTTP(TCP端口80)的请求

来自ICMP ping的请求

ntp(端口123)的请求输出

smtp(TCP端口25)的请求输出

 
  1. #!/bin/bash
  2. IPT="/sbin/iptables"
  3.  
  4. ####IPS######
  5. #Getserverpublicip
  6. SERVER_IP=$(ifconfigeth0|grep'inetaddr:'|awk-F'inetaddr:''{print$2}'|awk'{print$1}')
  7. LB1_IP="204.54.1.1"
  8. LB2_IP="204.54.1.2"
  9.  
  10. #DosomesmartlogicsothatwecanusedammscriptonLB2too
  11. OTHER_LB=""
  12. SERVER_IP=""
  13. [["$SERVER_IP"=="$LB1_IP"]]&&OTHER_LB="$LB2_IP"||OTHER_LB="$LB1_IP"
  14. [["$OTHER_LB"=="$LB2_IP"]]&&OPP_LB="$LB1_IP"||OPP_LB="$LB2_IP"
  15.  
  16. ###IPs###
  17. PUB_SSH_ONLY="122.xx.yy.zz/29"
  18.  
  19. ####FILES#####
  20. BLOCKED_IP_TDB=/root/.fw/blocked.ip.txt
  21. SPOOFIP="127.0.0.0/8192.168.0.0/16172.16.0.0/1210.0.0.0/8169.254.0.0/160.0.0.0/8240.0.0.0/4255.255.255.255/32168.254.0.0/16224.0.0.0/4240.0.0.0/5248.0.0.0/5192.0.2.0/24"
  22. BADIPS=$([[-f${BLOCKED_IP_TDB}]]&&egrep-v"^#|^$"${BLOCKED_IP_TDB})
  23.  
  24. ###Interfaces###
  25. PUB_IF="eth0"#publicinterface
  26. LO_IF="lo"#loopback
  27. VPN_IF="eth1"#vpn/privatenet
  28.  
  29. ###startfirewall###
  30. echo"SettingLB1$(hostname)Firewall..."
  31.  
  32. #DROPandcloseeverything
  33. $IPT-PINPUTDROP
  34. $IPT-POUTPUTDROP
  35. $IPT-PFORWARDDROP
  36.  
  37. #Unlimitedloaccess
  38. $IPT-AINPUT-i${LO_IF}-jACCEPT
  39. $IPT-AOUTPUT-o${LO_IF}-jACCEPT
  40.  
  41. #Unlimitedvpn/pnetaccess
  42. $IPT-AINPUT-i${VPN_IF}-jACCEPT
  43. $IPT-AOUTPUT-o${VPN_IF}-jACCEPT
  44.  
  45. #Dropsync
  46. $IPT-AINPUT-i${PUB_IF}-ptcp!--syn-mstate--stateNEW-jDROP
  47.  
  48. #DropFragments
  49. $IPT-AINPUT-i${PUB_IF}-f-jDROP
  50.  
  51. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLFIN,URG,PSH-jDROP
  52. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLALL-jDROP
  53.  
  54. #DropNULLpackets
  55. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLNONE-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"NULLPackets"
  56. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLNONE-jDROP
  57.  
  58. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsSYN,RSTSYN,RST-jDROP
  59.  
  60. #DropXMAS
  61. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsSYN,FINSYN,FIN-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"XMASPackets"
  62. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsSYN,FINSYN,FIN-jDROP
  63.  
  64. #DropFINpacketscans
  65. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsFIN,ACKFIN-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"FinPacketsScan"
  66. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsFIN,ACKFIN-jDROP
  67.  
  68. $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLSYN,RST,ACK,FIN,URG-jDROP
  69.  
  70. #Logandgetridofbroadcast/multicastandinvalid
  71. $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typebroadcast-jLOG--log-prefix"Broadcast"
  72. $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typebroadcast-jDROP
  73.  
  74. $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typemulticast-jLOG--log-prefix"Multicast"
  75. $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typemulticast-jDROP
  76.  
  77. $IPT-AINPUT-i${PUB_IF}-mstate--stateINVALID-jLOG--log-prefix"Invalid"
  78. $IPT-AINPUT-i${PUB_IF}-mstate--stateINVALID-jDROP
  79.  
  80. #Logandblockspoofedips
  81. $IPT-Nspooflist
  82. foripblockin$SPOOFIP
  83. do
  84. $IPT-Aspooflist-i${PUB_IF}-s$ipblock-jLOG--log-prefix"SPOOFListBlock"
  85. $IPT-Aspooflist-i${PUB_IF}-s$ipblock-jDROP
  86. done
  87. $IPT-IINPUT-jspooflist
  88. $IPT-IOUTPUT-jspooflist
  89. $IPT-IFORWARD-jspooflist
  90.  
  91. #Allowsshonlyfromselectedpublicips
  92. foripin${PUB_SSH_ONLY}
  93. do
  94. $IPT-AINPUT-i${PUB_IF}-s${ip}-ptcp-d${SERVER_IP}--destination-port22-jACCEPT
  95. $IPT-AOUTPUT-o${PUB_IF}-d${ip}-ptcp-s${SERVER_IP}--sport22-jACCEPT
  96. done
  97.  
  98. #allowincomingICMPpingpongstuff
  99. $IPT-AINPUT-i${PUB_IF}-picmp--icmp-type8-s0/0-mstate--stateNEW,ESTABLISHED,RELATED-mlimit--limit30/sec-jACCEPT
  100. $IPT-AOUTPUT-o${PUB_IF}-picmp--icmp-type0-d0/0-mstate--stateESTABLISHED,RELATED-jACCEPT
  101.  
  102. #allowincomingHTTPport80
  103. $IPT-AINPUT-i${PUB_IF}-ptcp-s0/0--sport1024:65535--dport80-mstate--stateNEW,ESTABLISHED-jACCEPT
  104. $IPT-AOUTPUT-o${PUB_IF}-ptcp--sport80-d0/0--dport1024:65535-mstate--stateESTABLISHED-jACCEPT
  105.  
  106. #allowoutgoingntp
  107. $IPT-AOUTPUT-o${PUB_IF}-pudp--dport123-mstate--stateNEW,ESTABLISHED-jACCEPT
  108. $IPT-AINPUT-i${PUB_IF}-pudp--sport123-mstate--stateESTABLISHED-jACCEPT
  109.  
  110. #allowoutgoingsmtp
  111. $IPT-AOUTPUT-o${PUB_IF}-ptcp--dport25-mstate--stateNEW,ESTABLISHED-jACCEPT
  112. $IPT-AINPUT-i${PUB_IF}-ptcp--sport25-mstate--stateESTABLISHED-jACCEPT
  113.  
  114. ###addyourotherruleshere####
  115.  
  116. #######################
  117. #dropandlogeverythingelse
  118. $IPT-AINPUT-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"DEFAULTDROP"
  119. $IPT-AINPUT-jDROP
  120.  
  121. exit0

 

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:shawn.lee@vecloud.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

本站原创内容未经允许不得转载,或转载时需注明出处:https://news.kd010.com/fwqjs/19.html

TAG标签:

相关推荐

返回顶部