如何将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端口
/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 ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful
执行以下命令来重新加载配置文件。
- /usr/local/nginx/sbin/nginx-sreload
执行以下命令来停止服务器。
- /usr/local/nginx/sbin/nginx-sstop
一、配置SELinux
安全增强型Linux(SELinux)的是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。它可以大部分的攻击。下面我们来看如何启动基于CentOS/RHEL系统的SELinux。
安装SELinux
- rpm-qa|grepselinux
libselinux-1.23.10-2
selinux-policy-targeted-1.23.16-6
如果没有返回任何结果,代表没有安装 SELinux,如果返回了类似上面的结果,则说明系统安装了 SELinux。
布什值锁定
运行命令getsebool -a来锁定系统。
- getsebool-a|less
- getsebool-a|grepoff
- 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内核、网络设置。
- #Avoidasmurfattack
- net.ipv4.icmp_echo_ignore_broadcasts=1
- #Turnonprotectionforbadicmperrormessages
- net.ipv4.icmp_ignore_bogus_error_responses=1
- #TurnonsyncookiesforSYNfloodattackprotection
- net.ipv4.tcp_syncookies=1
- #Turnonandlogspoofed,sourcerouted,andredirectpackets
- net.ipv4.conf.all.log_martians=1
- net.ipv4.conf.default.log_martians=1
- #Nosourceroutedpacketshere
- net.ipv4.conf.all.accept_source_route=0
- net.ipv4.conf.default.accept_source_route=0
- #Turnonreversepathfiltering
- net.ipv4.conf.all.rp_filter=1
- net.ipv4.conf.default.rp_filter=1
- #Makesurenoonecanaltertheroutingtables
- 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
- #Don'tactasarouter
- net.ipv4.ip_forward=0
- net.ipv4.conf.all.send_redirects=0
- net.ipv4.conf.default.send_redirects=0
- #Turnonexecshild
- kernel.exec-shield=1
- kernel.randomize_va_space=1
- #TuenIPv6
- 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
- #OptimizationforportuseforLBs
- #Increasesystemfiledescriptorlimit
- fs.file-max=65535
- #AllowformorePIDs(toreducerolloverproblems);maybreaksomeprograms32768
- kernel.pid_max=65536
- #IncreasesystemIPportlimits
- net.ipv4.ip_local_port_range=200065000
- #IncreaseTCPmaxbuffersizesetableusingsetsockopt()
- net.ipv4.tcp_rmem=4096873798289608
- net.ipv4.tcp_wmem=4096873798289608
- #IncreaseLinuxautotuningTCPbufferlimits
- #min,default,andmaxnumberofbytestouse
- #setmaxtoatleast4MB,orhigherifyouuseveryhighBDPpaths
- #TcpWindowsetc
- net.core.rmem_max=8289608
- net.core.wmem_max=8289608
- net.core.netdev_max_backlog=5000
- net.ipv4.tcp_window_scaling=1
四、删除所有不需要的Nginx模块
你需要直接通过编译Nginx源代码使模块数量最少化。通过限制只允许web服务器访问模块把风险降到最低。你可以只配置安装nginx你所需要的模块。例如,禁用SSL和autoindex模块你可以执行以下命令:
- ./configure--without-http_autoindex_module--without-http_ssi_module
- make
- makeinstall
通过以下命令来查看当编译nginx服务器时哪个模块能开户或关闭:
- ./configure--help|less
禁用你用不到的nginx模块。
(可选项)更改nginx版本名称。
编辑文件/http/ngx_http_header_filter_module.c:
- vi+48src/http/ngx_http_header_filter_module.c
找到行:
- staticcharngx_http_server_string[]="Server:nginx"CRLF;
- staticcharngx_http_server_full_string[]="Server:"NGINX_VERCRLF;
按照以下行修改:
- staticcharngx_http_server_string[]="Server:NinjaWebServer"CRLF;
- 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所需环境支持
- yum-yinstallselinux-policy-targetedselinux-policy-devel
2、下载SELinux策略以强化Nginx Web服务器。
- cd/opt
- wget'http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc'
3、解压文件
- tar-zxvfse-ngix_1_0_10.tar.gz
4、编译文件
- cdse-ngix_1_0_10/nginx
- 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
- rmtmp/nginx.mod.fctmp/nginx.mod
5、安装生成的nginx.pp SELinux模块:
- /usr/sbin/semodule-inginx.pp
七、基于Iptables防火墙的限制
下面的防火墙脚本阻止任何除了允许:
来自HTTP(TCP端口80)的请求
来自ICMP ping的请求
ntp(端口123)的请求输出
smtp(TCP端口25)的请求输出
- #!/bin/bash
- IPT="/sbin/iptables"
- ####IPS######
- #Getserverpublicip
- SERVER_IP=$(ifconfigeth0|grep'inetaddr:'|awk-F'inetaddr:''{print$2}'|awk'{print$1}')
- LB1_IP="204.54.1.1"
- LB2_IP="204.54.1.2"
- #DosomesmartlogicsothatwecanusedammscriptonLB2too
- OTHER_LB=""
- SERVER_IP=""
- [["$SERVER_IP"=="$LB1_IP"]]&&OTHER_LB="$LB2_IP"||OTHER_LB="$LB1_IP"
- [["$OTHER_LB"=="$LB2_IP"]]&&OPP_LB="$LB1_IP"||OPP_LB="$LB2_IP"
- ###IPs###
- PUB_SSH_ONLY="122.xx.yy.zz/29"
- ####FILES#####
- BLOCKED_IP_TDB=/root/.fw/blocked.ip.txt
- 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"
- BADIPS=$([[-f${BLOCKED_IP_TDB}]]&&egrep-v"^#|^$"${BLOCKED_IP_TDB})
- ###Interfaces###
- PUB_IF="eth0"#publicinterface
- LO_IF="lo"#loopback
- VPN_IF="eth1"#vpn/privatenet
- ###startfirewall###
- echo"SettingLB1$(hostname)Firewall..."
- #DROPandcloseeverything
- $IPT-PINPUTDROP
- $IPT-POUTPUTDROP
- $IPT-PFORWARDDROP
- #Unlimitedloaccess
- $IPT-AINPUT-i${LO_IF}-jACCEPT
- $IPT-AOUTPUT-o${LO_IF}-jACCEPT
- #Unlimitedvpn/pnetaccess
- $IPT-AINPUT-i${VPN_IF}-jACCEPT
- $IPT-AOUTPUT-o${VPN_IF}-jACCEPT
- #Dropsync
- $IPT-AINPUT-i${PUB_IF}-ptcp!--syn-mstate--stateNEW-jDROP
- #DropFragments
- $IPT-AINPUT-i${PUB_IF}-f-jDROP
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLFIN,URG,PSH-jDROP
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLALL-jDROP
- #DropNULLpackets
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLNONE-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"NULLPackets"
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLNONE-jDROP
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsSYN,RSTSYN,RST-jDROP
- #DropXMAS
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsSYN,FINSYN,FIN-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"XMASPackets"
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsSYN,FINSYN,FIN-jDROP
- #DropFINpacketscans
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsFIN,ACKFIN-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"FinPacketsScan"
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsFIN,ACKFIN-jDROP
- $IPT-AINPUT-i${PUB_IF}-ptcp--tcp-flagsALLSYN,RST,ACK,FIN,URG-jDROP
- #Logandgetridofbroadcast/multicastandinvalid
- $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typebroadcast-jLOG--log-prefix"Broadcast"
- $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typebroadcast-jDROP
- $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typemulticast-jLOG--log-prefix"Multicast"
- $IPT-AINPUT-i${PUB_IF}-mpkttype--pkt-typemulticast-jDROP
- $IPT-AINPUT-i${PUB_IF}-mstate--stateINVALID-jLOG--log-prefix"Invalid"
- $IPT-AINPUT-i${PUB_IF}-mstate--stateINVALID-jDROP
- #Logandblockspoofedips
- $IPT-Nspooflist
- foripblockin$SPOOFIP
- do
- $IPT-Aspooflist-i${PUB_IF}-s$ipblock-jLOG--log-prefix"SPOOFListBlock"
- $IPT-Aspooflist-i${PUB_IF}-s$ipblock-jDROP
- done
- $IPT-IINPUT-jspooflist
- $IPT-IOUTPUT-jspooflist
- $IPT-IFORWARD-jspooflist
- #Allowsshonlyfromselectedpublicips
- foripin${PUB_SSH_ONLY}
- do
- $IPT-AINPUT-i${PUB_IF}-s${ip}-ptcp-d${SERVER_IP}--destination-port22-jACCEPT
- $IPT-AOUTPUT-o${PUB_IF}-d${ip}-ptcp-s${SERVER_IP}--sport22-jACCEPT
- done
- #allowincomingICMPpingpongstuff
- $IPT-AINPUT-i${PUB_IF}-picmp--icmp-type8-s0/0-mstate--stateNEW,ESTABLISHED,RELATED-mlimit--limit30/sec-jACCEPT
- $IPT-AOUTPUT-o${PUB_IF}-picmp--icmp-type0-d0/0-mstate--stateESTABLISHED,RELATED-jACCEPT
- #allowincomingHTTPport80
- $IPT-AINPUT-i${PUB_IF}-ptcp-s0/0--sport1024:65535--dport80-mstate--stateNEW,ESTABLISHED-jACCEPT
- $IPT-AOUTPUT-o${PUB_IF}-ptcp--sport80-d0/0--dport1024:65535-mstate--stateESTABLISHED-jACCEPT
- #allowoutgoingntp
- $IPT-AOUTPUT-o${PUB_IF}-pudp--dport123-mstate--stateNEW,ESTABLISHED-jACCEPT
- $IPT-AINPUT-i${PUB_IF}-pudp--sport123-mstate--stateESTABLISHED-jACCEPT
- #allowoutgoingsmtp
- $IPT-AOUTPUT-o${PUB_IF}-ptcp--dport25-mstate--stateNEW,ESTABLISHED-jACCEPT
- $IPT-AINPUT-i${PUB_IF}-ptcp--sport25-mstate--stateESTABLISHED-jACCEPT
- ###addyourotherruleshere####
- #######################
- #dropandlogeverythingelse
- $IPT-AINPUT-mlimit--limit5/m--limit-burst7-jLOG--log-prefix"DEFAULTDROP"
- $IPT-AINPUT-jDROP
- exit0
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:shawn.lee@vecloud.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
本站原创内容未经允许不得转载,或转载时需注明出处:https://news.kd010.com/fwqjs/19.html
TAG标签: