基于Nginx反向代理的Web系统安全及优化

◆吴翠芳 阎虎勤

(厦门国家会计学院 福建 361000)

随着信息技术的发展,越来越多的事情需要通过互联网来完成,网络技术已渗透到人类生活的各个方面。与此同时,各种黑客手段、计算机病毒、木马也在不断变异,信息系统建设必须直面日益严峻的安全问题。

近些年网站被恶意攻击事件时有发生,网站作为对外宣传的窗口,其安全性尤为重要。但大多数用户在开发Web系统时一般只在乎页面的布局与美观,重视业务功能实现及系统的稳定性,而往往忽略了系统的安全问题。Web系统的安全与程序代码、服务器的漏洞及相关设置等综合因素有关,在缺少Web安全设备的条件下,搭建反向代理服务器,把Web服务器隔离在内网,起到防火墙的作用。

正向代理是代理客户端,而反向代理是代理服务器,因多了一个中间代理屏障,客户不能直接访问后端服务,在实现负载均衡的同时增强安全性。反向代理是通过异步非阻塞的方式把请求传给后端,提升并发处理能力;
利用缓存,压缩响应提高响应速度。使用反向代理,可以防止外网对内网服务器的恶性攻击,缓存以减少服务器的压力,并进行访问安全控制,还可以实现负载均衡,将用户请求分配给多个服务器。

Nginx作为Web服务器一个重要的功能就是反向代理,用于管理从外部网络到内部网络的连接或任何特定请求。反向代理服务器架设在外网与目标服务器之间,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络的目标服务器,并将从服务器得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器,如图1。

图1 Nginx反向代理

Nginx是一个很强大的高性能Web和反向代理服务,具有性能高、稳定性好、并发性强、资源消耗低,配置简单等优点,可运行在多操作系统上,因轻巧、模块化、友好的配置格式和强大的反向代理能力被广泛应用。本文介绍的Nginx反向代理是运行在Linux操作系统上,主要从安全配置、性能优化、日志管理三个方面介绍基于Nginx反向代理Web系统的安全与优化管理。

Nginx反向代理配置简单,只需要修改配置文件就可以实现,nginx.conf是其默认的配置文件。

2.1 隐藏Web系统信息

多数情况下,软件的漏洞与版本有关,因此,对在客户端显示有关Web系统的各类敏感信息应尽量隐藏或者消除,如隐藏使用软件的版本号、Web系统名称等信息,以增加恶意用户攻击服务器的难度,从而加强Web服务器的安全性。在Nginx配置文件中增加server_tokens参数可隐藏Nginx的版本,由于用户不清楚版本信息就难以做一些有针对性的攻击;
另外,响应头输出的x-powered-by参数也会泄露Web系统的相关信息,可以通过 proxy_hide_header 指令隐藏它。设置如下:

隐藏系统的版本和Web系统的相关信息,只能在一定程度上防止恶意攻击,及时升级软件、修补漏洞才是最终的解决方法。

2.2 合理配置响应头

在部署Nginx时经常会忽略HTTP响应头的设置,合理配置响应头,可以有效防止XSS攻击,避免点击劫持和frame恶意引用等骚扰。如下设置:

案例1:本站在开启响应头防XSS攻击后,导致代理转发的某一Web系统无法使用,主要原因是该系统使用了大量的跨站调用被阻止,无奈只能关闭该项功能。所以,在响应头配置防XSS攻击,对应用系统的调用关系要求很高,如果程序中采用大量的跨站访问模式,会造成系统无法正常运行。

2.3 关闭空头主机

Nginx的默认配置中的虚拟主机允许用户通过IP访问,或者通过未设置的域名访问。为了防止其他用户恶意将域名解析到本站的IP上,可将默认的虚拟主机server段修改为:

以上配置,还可以用rewrite进行跳转设置,把这些流量收集起来,导入到自己的网站。

2.4 配置HTTPS

HTTPS是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证传输过程的安全性。HTTPS 协议是由HTTP 加上TLS/SSL协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

TLS是传输层安全性协议,提供安全及数据完整性保障。随着数据传输加密安全技术的更新升级,TLSv1.0和TLS1.1被扫描出存在安全漏洞,为防黑客进行概念验证式攻击,加固数据安全,建议禁用TLSv1.0和TLS1.1,启用TLS 1.2或TLS1.3。如下配置:

为加强Web访问安全,可以在HTTP的server中设置301重定向,将HTTP访问强制跳转到HTTPS访问。

2.5 防盗链配置

如果网站内的图片资源被其他站点所盗用,会额外消耗本站的带宽资源和服务器的资源,还会影响Web系统的稳定性,为了防止本站上的图片资源被其他站点所盗用,可以在Nginx服务器上配置防盗链。nginx.conf配置文件中图片防盗链配置如下:

以上是针对几种图片格式的防盗链,目录防盗链的配置类似,也可以使用第三方模块ngx_http_accesskey_module实现Nginx防盗链。

运行在Linux操作系统上的Nginx性能稳定,能够支撑站点的大多数任务,但是随着代理转发应用业务和访问量的增多,需要对Nginx服务进行调优配置。可以从两方面优化Nginx服务,一是调优Nginx配置,使Nginx服务与硬件达到最大的协调;
另一是操作系统层面的优化,主要是系统资源上的限制优化,让系统提供最优的服务。

3.1 设置Nginx进程数

Nginx定义了对外提供Web服务时的worker进程数,一般设置等于CPU的核数,worker进程数除了要和CPU核数匹配外,也和硬盘存储的数据及系统的负载有关。如果访问量快速增加,Nginx会启动更多的worker进程以保证快速响应处理用户的请求,以避免造成拥塞。所以,在高流量高并发的场景下,可适当加大worker进程数,在响应访问请求时,Nginx就不需要临时启动新的进程来提供服务,这样可缩短系统瞬时的开销及提供服务的时间,提升服务速度。

Nginx默认没有开启利用多核CPU,需要用参数worker_cpu_affinity将worker process与指定CPU核绑定,以减少由于多CPU核切换造成的性能损耗。可以将worker_process 和worker_cpu_affinity设置为auto,这样系统会根据实际业务情况自动调节数量。

3.2 设置每个进程允许的最多连接数

work_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,理论上每台Nginx服务器的最大连接数为进程数*连接数。Nginx默认最大的并发数为1024,如果站点访问量过大,已经远远超过默认并发数,必须修改worker_connecions的值,值越大并发数就越大,但是不能设置太大,以避免CPU满负荷运转。另外,进程的最大连接数受 Linux 系统进程的最大打开文件数和Nginx最大打开文件数的限制,必须综合考虑设置一个最优的值。

3.3 Nginx最大打开文件数

worker_rlimit_nofile指令是描述单个Nginx进程打开的最多文件数目,理论值应该是最多打开文件数与Nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与Linux系统限制的最大进程数保持一致。Linux 默认安装值只有1024,当访问量增大时,容易出现拥塞,文件打不开,日志提示“Too many open files”的错误信息。所以,在设置Nginx最大打开文件数时,应先考虑Linux用户的最大进程数,可以用ulimit命令来查看和设置Linux系统用户的最大进程数,worker_rlimit_nofile参数的值不能超过这个数。

案例2:由于远程在线直播课程的开展,访问量直线上升,出现大量的拥塞、访问速度慢等问题,导致站点一时崩溃,在Nginx日志中,查看到大量的异常信息:“Too many open files”。紧急排查后加大worker进程数、最大连接数及Nginx最大打开文件数,问题得到缓解。考虑到进程数需与CPU核数相匹配,故将CPU数扩展翻倍,最终解决拥塞问题。

3.4 使用epoll的I/O模型

epoll是多路复用I/O中的一种方式,用这个模型来高效处理异步事件。Web服务器在面对高并发的情况下,网络的I/O一般选择I/O复用,Nginx在linux 2.6后选择Epoll做网络IO,能增加Nginx系统的并发能力,从而提高Web服务的访问速率。

3.5 开启高效文件传输模式

sendfile是一个操作系统特性,可以在Nginx上启用,提供更快的TCP数据传输,能达到零拷贝的效率。与传统文件传输相比,sendfile系统切换更少、数据拷贝更少,从而提升了文件传输的性能。在开启高效文件传输模式的同时,可以将tcp_nopush on 和tcp_nodelay on 开启,以防止网络及磁盘I/O阻塞,提升Nginx工作效率。

3.6 设置连接超时时间

keepalive_timeout用来设置http连接超时时间,默认60s,功能是让客户端到服务器端的连接在设定的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重新建立连接。这个参数不能设置过大,否则会导致许多无效的http连接占据着Nginx的连接数,由于长时间占着连接资源不释放,导致请求的堆积,使Nginx处理请求效率大大降低。所以在对连接控制的同时要注意设置超时时间,通过超时机制自动回收资源、避免资源浪费。

3.7 设置后端服务器处理请求时间

Nginx代理和后端服务器之间的超时时间由proxy_read_timeout参数来设定,当从upstream服务器读取返回数据时,Nginx用来获得请求响应的等待时间,默认60s,如果连续的60s内没有收到任何数据,连接关闭。proxy_read_timeout是个局部参数,具体操作在server的location中做配置:

案例3:代理转发的某一Web系统,有大量学员反应在操作过程中,出现超时提示,不能继续完成任务。查看Nginx的error.log日志,提示“[error]7748#0:*159043835 upstream timed out(110:Connection timed out)…”错误信息。考虑到该系统要求在线阅读15s的学员须知,可能是Nginx代理等待请求响应超时,试将proxy_read_timeout设置值提高到120s,该问题解决。

Nginx调优配置如图2。

图2 Nginx调优配置

经过优化配置后的Nginx反向代理服务运行稳定,性能优化需要在日常运维工作中不断总结和积累经验,根据实际业务情况选择配置的参数,让服务和硬件发挥最佳的性能。

Nginx的默认日志文件为access.log和error.log,通过访问日志,可以得到客户端的地域来源、跳转来源、使用终端、某个URL访问量等相关信息;
通过错误日志,可以得到某个Web系统服务或server的性能瓶颈等。

4.1 日志分离

如果代理转发有多个server,每个server的访问日志默认是一起混杂写在access.log文件中,为便于查看和管理,需要对访问日志按不同server进行分离。在nginx.conf文件的server中配置如下:

4.2 日志切割

随着反向代理转发的系统增多及访问量的增长,访问数据越来越多,access日志文件也越来越大,如果不按时间做合理的切割,访问日志文件将增大到无法打开地步。为保证日志的正常访问,可以编写一个Nginx日志切割脚本来自动切割日志文件,在做日志分离的同时,按时间进行切割,并保存到其他目录中。

根据网络安全的要求,安全日志保留时间必须在180天以上。为保证日志的安全和方便存储管理,可以编写shell脚本,Nginx日志按每天自动切割,并自动删除180天以前的日志。具体步骤如下:

(1)新建shell脚本:vi/usr/local/nginx/cutlog.sh 配置如图3。

图3 配置

(2)设置定时任务

定时任务在Linux系统中设置:

通过Nginx 日志可以查看系统运行记录和出错说明,可以分析系统和服务器运行的状态,了解业务数据情况。日志文件对日常运维至关重要,如果没有日志,排查问题时很难判断异常所在,日志管理是信息安全工作不可缺少的重要组成部分。

随着网站的发展和对外应用业务的增加,需要公网IP数也日益增长,搭建反向代理服务器转发代理多个目标应用服务,一方面可以加强安全防护,同时也可以节约公网IP资源。网站的安全防护措施很多,利用Nginx反向代理技术是其中的一种方法,反向代理服务器介于内网与外网之间,把Web应用服务与外部隔离,起到安全过滤的作用,为站点提供基于Web攻击行为的防护,相当于应用防火墙(WAF)的功能。在加强安全防护的同时对Nginx配置进行优化,提升站点的访问性能,让用户有更好的访问体验。

信息安全建设已越来越被广大用户重视,网络技术的发展,数据的共享,信息安全已提高到一个新的高度。网络安全无处不在,信息安全是数字化校园的重要组成部分,维护Web系统的安全与稳定是长期而艰巨的任务。

猜你喜欢 日志进程代理 一名老党员的工作日志华人时刊(2021年13期)2021-11-27读扶贫日志诗选刊(2020年12期)2020-12-03Dalvik虚拟机进程模型研究数码世界(2019年6期)2019-09-091号异星球餐馆·不可思议的代理老板红领巾·成长(2019年3期)2019-04-16雅皮的心情日志思维与智慧·上半月(2018年10期)2018-11-30雅皮的心情日志思维与智慧·上半月(2018年9期)2018-09-22快速杀掉顽固进程电脑爱好者(2018年15期)2018-08-23不留死角 全方位监控系统电脑爱好者(2018年6期)2018-04-23《航空模型》团体代理招募航空模型(2017年4期)2017-07-29澳航货运代理有限公司船期表航运交易公报(2016年42期)2017-02-28

推荐访问:系统安全 优化 代理