中航西安飞机工业集团股份有限公司,陕西西安 ,710089
摘要:Nginx作为一款开源的Web服务软件,因其具有性能稳定、高并发、低内存耗用、高性能的处理能力等特点,可实现负载均衡、业务应用请求解析及转发、会话保持等功能,而被广泛应用到各类实际生产架构中,其安全特性至关重要。本文结合nginx已知的漏洞,从原理、被利用条件、危害方面进行分析,详细论述了nginx服务器可能存在的攻击面及安全问题;并从可执行程序安全、配置安全、通信安全及其他安全防护措施四个方面,详细介绍了如何安全地编译、安装、部署、使用nginx服务器,以最大程度地减少攻击面,降低安全风险。
关键词:Nginx;漏洞分析;安全防护;Web服务器
Nginx vulnerability analysis and protection scheme
Xu Chi, Lv Xiaobing*, Huang Tengfei
AVIC Xi’An Aircraft Industry Group Company Ltd , Xian,710089
Abstract: As an open source Web service software, nginx has the characteristics of high concurrency, low memory consumption, stable and high performance. It can achieve load balancing, service application request parsing and forwarding, session persisting and other functions, and is widely used in various practical production architecture whose security features are essential. Based on the known vulnerabilities of nginx, we analyze the possible attack surface and security problems of nginx server from the aspects of mechanism, exploiting condition and harm. And from the executable program security, configuration security, communication security and other security protection measures, we introduce how to compile, install, deploy and use nginx server securely, in order to minimize attack surface and reduce security risk.
Keywords: Nginx; Vulnerability; Security protection; Web Server
引言
Nginx作为一款开源的Web服务软件,因其具有性能稳定、高并发、低内存耗用、高性能的处理能力等特点,可用于大规模、高性能、安全稳定的网站构建,以实现负载均衡、业务应用请求解析及转发、会话保持等应用功能,并可满足云计算、微服务等新技术的应用需求,已被广泛使用。作为开源软件,nginx服务器漏洞也常常被披露出来,网络犯罪分子经常寻求利用最轻微的漏洞窃取敏感信息和破坏网站的安全性。合理地配置、部署和使用nginx服务器,将攻击面降至最低,才能为用户提供安全的web服务。
1 Nginx介绍
作为一款Web服务软件,nginx可实现Web服务器的基本功能,通过简单的配置可快速搭建Web服务器;通过网络通讯协议的处理,实现通讯协议的请求解析、代理转发、会话保持等互联网架构中的常见功能;且其模块化架构、多进程事件驱动处理机制带来的高并发性为高负载系统提供了很好的解决方案。它是俄罗斯程序设计工程师Igor使用C 语言编写研发的,最开始用于rambler.ru 站点,第一个公开版本是0.1.0,发布于2004 年10 月4 日,以BSD协议开源。在互联网时代,nginx作为开源软件一直处于活跃的开发状态,并与云计算、微服务等新技术紧密集成,提供了许多优秀的解决方案,现已被被国内外各大厂商及企业广泛使用,包括百度、腾讯、阿里、Instagram、Netflix、SoundCloud和Zappos。
2漏洞分析
本章将从迄今为止发现的nginx漏洞中选取5个较为经典且危害巨大的漏洞进行分析,讨论nginx漏洞形成的原因以及其可能造成的危害。它们分别是:NGINX-SPDY堆缓冲区溢出(CVE-2014-0133)、NGINX根权限提升漏洞(CVE-2016-1247)、远程整数溢出漏洞(CVE-2017-7529)、NGINX控制器漏洞(CVE-2020-5894)、远程代码执行漏洞(CVE-2021-23017)。
2.1NGINX-SPDY堆缓冲区溢出
缓冲区溢出是一种十分常见、普遍但是却非常危险的漏洞,其主要是针对软件程序设计上的缺陷,通过向程序的输入缓冲区写入超过其缓冲区能保存的最大数据量的数据的方法,来破坏程序运行,更为严重的是,攻击者可以趁机在程序中断时获取到程序甚至是整个系统的控制权,从而进行各种非法操作。
Nginx的SPDY在实现过程中,因为指针使用不恰当,受基于堆的缓冲区溢出的攻击。攻击条件是在nginx的配置文件中使用了“listen”指令的“spdy”选项,编译时增加了ngx_http_spdy_module模块(默认情况下不编译),并且编译时没用使用–with-debug configure选项。利用该漏洞,攻击者通过发送精心制定的网络请求包,从而导致堆内存缓冲区溢出,最终可以达到执行任意代码的目的。这将严重危害web服务器及上面运行的应用程序。
2.2NGINX root权限提升漏洞
在Linux操作系统中,root权限是超级管理员用户的最高管理权限,其可以超越任何用户和用户组队文件或目录进行读取修改或者删除。如果攻击者获取到系统的root级权限,就等同于其获取整个系统的控制权。
这个漏洞的原理是,当从基于Debian的系统上的默认安装源安装nginx时,它会在/var/log/nginx创建nginx日志目录,由于/var/log/nginx目录的属主是普通用户,攻击者可以在访问系统时将日志文件替换为指向任意文件的软链接。重新启动时,日志将写入软链接指向的文件,通过该软链接,攻击者将权限升级到root。
NGINX root权限提升漏洞的危害性很大。这导致攻击者可以创建具有root权限的日志目录,且已经获取本地执行权限的攻击者可以利用这些漏洞将其权限从普通用户升级到root用户,从而破坏部署在nginx服务器上的任何web应用程序。
2.3远程整数溢出漏洞
NGINX远程整数溢出漏洞也叫作nginx越界读取缓存漏洞,它是一种边界条件错误类型的漏洞。Nginx在反向代理站点的时候,通常会对一下静态文件进行缓存,当接收到请求时,nginx会根据请求指定的位置返回指定长度的内容。由于nginx没有对用户提供的数据进行充分的边界检查,当攻击者构造另个为负的位置时,将可能读取到缓存文件中的位于“HTTP返回包体”前的数据。利用此漏洞,攻击者可以访问敏感信息或使应用程序崩溃,从而达到使nginx服务器拒绝服务的目的。
2.4远程代码执行漏洞
远程代码执行漏洞是用户通过客户端提交可执行命令,开发人员并没有针对代码中的可执行的特殊函数入口进行过滤等处理,导致执行命令在没有指定绝对路径的情况下被服务端执行,可能会允许攻击者通过改变环境变量或程序执行环境的其它方面来执行恶意构造的代码。
Nginx的DNS解析器中存在1字节内存覆盖漏洞,攻击者能够伪造来自DNS服务器的UDP数据包触发该漏洞。利用该漏洞,最终可以达到远程代码执行、敏感信息泄露、数据添加及修改或拒绝服务(DoS)攻击的目标。
2.5 NGINX Controller漏洞
NGINX Controller是美国F5公司开发的nginx的监视管理系统,支持可视化管理多个nginx服务器实例。拥有普通用户权限的攻击者经过身份验证的后可以使用NGINX Controller的API管理尚未公开的API,在nginx托管数据面板上注入并执行JavaScript代码,从而达到破坏程序运行的目的。
3防护方案
本章将从Nginx可执行程序安全、配置安全、通信安全及其他安全防护措施四个方面详细介绍nginx服务器的防护方案,如图3-1所示。
图3-1 nginx防护方案
3.1可执行程序安全
要保证可执行程序安全,首先需要保持定期将nginx更新到最新版本。尽管nginx的可执行程序本身的漏洞会不时出现,nginx的核心代码的依赖库(内存管理、套接字处理等)还是非常安全和稳定。因此,保持nginx版本的最新状态非常重要。大多数Linux发行版不会将最新版本的nginx推送到其默认软件包列表中,因此要通过手动下载软件包安装最新版本的nginx,或者向系统中添加其他软件包安装源。
此外,编译源代码也非常重要。作为构建包的替代方案,可以从源代码自行编译构建nginx可执行程序。这样做的好处是可以得到nginx开发团队提供的最新版本。从源代码构建有以下几个步骤。首先,需要根据操作系统的类型安装好对应的依赖包。接下来,从nginx官方网站下载最新的nginx源代码包及其签名文件。验证签名后,编译并安装nginx即可。
最后,删除不必要的模块,当这些模块出现安全漏洞时可以不受其影响。默认情况下,nginx在编译时会加入许多具有扩展功能的模块,但并不是在每一个服务器上都会用到这些模块。删除未使用的模块,不仅可以减小编译得到的二进制文件的大小,还可以减少nginx服务器的安全风险(例如,uwsgi代理中发现的漏洞无法在未使用uswgi模块的服务器进行攻击)。nginx的configure脚本提供了大量编译时选项,因此可以在编译时通过配置脚本删除不需要的模块。
3.2配置安全
Nginx服务器的安全性很大程度上依赖于使用者对它的配置,同一个漏洞在一些配置不合理的nginx服务器上可能产生巨大的危害,在另一些配置合理的nginx服务器上也可能产生不了任何危害。因此合理地配置nginx服务器至关重要。
在安全性方面,最小特权原则规定,应限定每个主体所必须的最小特权,确保可能的事故、错误、网络部件的篡改等原因造成的损失最小。因此,我们应该以普通用户权限而非root用户权限去运行nginx。首先,需要创建一个没有sudo权限的新用户,然后可以将nginx配置为以非特权系统用户(不是root且不具有sudo权限的用户)的身份运行。
去除HTTP头中的版本信息。HTTP规范建议(但不强制要求)web服务器通过HTTP头标识自己。通常情况下,web服务器将其版本信息包含在此HTTP头中,导致其nginx版本信息遭到泄露。通过编辑nginx配置文件,可以将nginx配置为不在HTTP头中显示其版本信息。可以有效地阻止攻击者寻找漏洞。
去除HTTP头中上游服务器的版本信息。同样的道理,当使用nginx代理来自上游服务器(例如PHP-FPM)的请求时,隐藏上游响应中发送的某些头(例如,运行PHP的版本)会有很大的好处。当在HTTP头中包含了PHP版本信息时,攻击者可以很方便地去找到对应版本的安全漏洞并进行相关的攻击。通过编辑nginx配置文件,可以将nginx配置为不在HTTP头中显示其上游服务器的版本信息。可以有效地阻止攻击者寻找漏洞。
为HTTP头添加安全认证。除了去除敏感信息外,nginx还可以在HTTP头中添加具有安全认证功能的信息。例如可以添加X-Frame-Options信息以防止中间人劫持攻击。
通过IP限制访问。对于网站的敏感区域(如管理控制面板),应该对其进行严格的访问控制。nginx可以通过配置为网站敏感区域的添加访问白名单,拒绝所有其他IP地址的访问。
通过密码限制访问。通过nginx配置文件,为敏感区域添加密码访问验证,使用方法类似于apache的.htaccess文件和.htpasswd文件。
3.3 通信安全
Nginx主要用于SSL/TLS流量的传输。通过相关通信协议的配置,为客户端提供安全的SSL/TLS通信连接,对于维护nginx服务器的安全至关重要。
首先,强烈建议有加密需求的流量仅使用较新的TLS协议,而不是传统的SSL协议。目前广泛使用的SSL协议有两个版本(SSLv2和SSLv3),都存在严重的安全缺陷,绝不应在生产环境中使用。
打开SSL/TLS选项。在nginx的配置文件中,每台服务器可以使用配置文件自行决定是否打开SSL/TLS。为了打开流量加密功能,需要为服务器启用SSL/TLS。
启用强TLS密码。默认情况下,nginx允许在TLS连接中使用多种密码。其中一些密码是脆弱或容易受到攻击的遗留产品,不应该再被使用。理想情况下建议使用Mozilla概述的现代或中级密码套件。现代的密码安全性更强,缺点是会给Internet Explorer或Windows XP等旧平台带来连接问题。
启用TLS会话缓存。由于涉及到加密协议,服务器中建立新的TLS连接的成本非常高。为了维护高性能环境,建议缓存现有TLS连接,以便来自客户端/浏览器的每个新请求不需要执行完整的TLS握手。
使用自定义Diffie-Hellman参数。2015年发布的Logjam攻击表明,攻击者有可能破坏Diffie-Hellman密钥交换,该密钥交换用于实现前向保密(基本上是现有加密消息之上的另一层)。通过计算一组独特的Diffie-Hellman参数并配置nginx使用此值,可以在nginx中防止此攻击。
强制所有连接使用TLS选项。每个连接是否使用TLS选项是通过HTTP头中的相关字段来决定的。通过修改nginx配置文件,在HTTP头中明确标识强制每个连接必须使用TLS选项。此外,还可以通过配置nginx将明文HTTP请求的301重定向发送到站点的TLS接口。
3.4 其他安全防护措施
除了可执行程序安全、配置安全和通信安全之外,还可以采取以下步骤增强安全防护特性。
安装WAF(web application firewall)。WAF是一种用于检查HTTP/HTTPS流量、拒绝恶意请求的软件,通常作为web堆栈中的附加安全层。正确地配置WAF可以保护nginx服务器免受SQL注入、XSS、CSRF和DDoS攻击。nginx有多个开源WAF软件可供选择。
通过IPTables限制输入流量。除了保护nginx本身之外,保护用于托管web服务器的主机环境也很重要。通过阻止入侵尝试,锁定对SSH等内容的访问可以极大地提高主机的安全性。一种常见的方法是将通过SSH访问主机的已知IP列入白名单,并拒绝所有其他IP对22号端口的流量,或者使用一个跳板机来严格过滤shell访问。
ModSecurity引擎。ModSecurity最初是用于Apache服务器,实际上是开源WAF解决方案的标准。该项目的近期工作已将重点转向对nginx的支持;有关安装和配置的更多详细信息,请参见项目主页和GitHub页面。
Naxsi引擎。Naxsi是ModSecurity的轻量级替代品,是nginx服务器自带的一个模块,主要用于在请求参数中识别并防止XSS和SQL注入攻击。
自动日志分析及监控。Fail2Ban等程序可用于监视nginx访问和错误日志,自动分析攻击模式并对攻击者的客户端采取行动(例如删除其IP地址,报告恶意行为等)。Fail2Ban是可扩展的,可以编写自己的分析模式和响应行为。有关安装和配置的更多详细信息,请参见该项目的GitHub页面。
4 结 论
近年来,web服务器安全始终是热门研究领域。本文首先通过分析五个典型的nginx服务器漏洞,介绍了nginx服务器的攻击思路、漏洞原理及相关漏洞可能产生的危害。然后从可执行程序安全、配置安全、通信安全及其他安全防护措施四个方面详细介绍了nginx服务器的防护方案,使用本文介绍的安全防护方案,可以大幅度减少nginx服务器的攻击面,降低其安全风险,为用户的应用程序稳定运行提供有效的支持。
参考文献
[1] 许红军. 灵活配置,强化Nginx安全管理[J]. 网络安全和信息化, 2018(6):4.
[2] 张秀云. 让Nginx支持多证书[J]. 网管员世界, 2012(17):2.
[3] 王思远, 卞佳丽. 利用Nginx反向代理机制实现计算机网络传输安全[J]. 2017.
[4] 网管之家. 设置安全的nginx+PHP网站目录权限[J]. 计算机与网络, 2013, 39(12):1.
[5] 余波. 构建安全可靠的Web服务器[J]. 中文信息, 2018, 000(009):12.
[6] 聂鹏. 基于Nginx的云计算访问控制网关的设计与实现[D]. 北京交通大学, 2011.
[7] 孙晓林, 张新刚. 基于Nginx的网站安全优化方案[J]. 网络安全技术与应用, 2017(11):2.
[8] 朱来雪. 基于Nginx技术的Web系统安全部署方案[J]. 信息与电脑, 2019(17):3.
[9] 余小喜, 肖钦定. 基于Nginx的Web应用防护系统构建[J]. 电脑编程技巧与维护, 2017(9):3.
[10] 吴迪. 基于Nginx的安全管理系统的设计与实现[D]. 北京邮电大学.
[11] 田宏, 李子木. Nginx在四川邮政安全对外服务网关中的应用探讨[J]. 邮政研究, 2021, 37(3):4.