「第三篇」服务器端应用安全
批注
[……] 表示他人、自己、网络批注
参考资料来源于
* 书中批注
* 优快云
* GitHub
* Google
* 维基百科
* YouTube
* MDN Web Docs
由于编写过程中无法记录所有的URL
所以如需原文,请自行查询
{……} 重点内容
*……* 表示先前提到的内容,不赘述
「第三篇」服务器端应用安全
「0.6本书结构」
就常见的服务器端应用安全问题进行了阐述
这些问题往往能引起非常严重的后果,在网站的安全建设之初需要优先解决这些问题,避免留下任何隐患
「第十五章」Web Server配置安全
「15.1Apache安全」
Web服务器是Web应用的载体,如果这个载体出现安全问题,那么运行在其中的Web应用程序的安全也无法得到保障,因此Web服务器的安全不容忽视
Web服务器安全,考虑的是应用布署时的运行环境安全,这个运行环境包括Web Server、脚本语言解释器、中间件等软件,这些软件所提供的一些配置参数,也可以起到安全保护的作用
管近年来Nginx、LightHttpd等Web Server的市场份额增长得很快,但Apache仍然是这个领域中独一无二的巨头,互联网上大多数的Web应用依然跑在Apache Httpd上
先从Apache讲起,因为Apache最具有代表性,其他的Web Server所面临的安全问题也可依此类推
[在本章中,Apache均代指Apache Httpd]
Web Server的安全我们关注两点
* 一是Web Server本身是否安全
* 二是Web Server是否提供了可使用的安全功能
纵观Apache的漏洞史,它曾经出现过许多次高危漏洞
但这些高危漏洞,大部分是由Apache的Module造成的,Apache核心的高危漏洞几乎没有
Apache有很多官方与非官方的Module,默认启动的Module出现过的高危漏洞非常少,大多数的高危漏洞集中在默认没有安装或enable的Module上
因此,检查Apache安全的第一件事情,就是检查Apache的Module安装情况,根据最小权限原则,应该尽可能地减少不必要的Module,对于要使用的Module,则检查其对应版本是否存在已知的安全漏洞
定制好了Apache的安装包后,接下来需要做的,就是指定Apache进程以单独的用户身份运行,这通常需要为Apache单独建立一个user/group
需要注意的是,Apache以root身份或者admin身份运行是一个非常糟糕的决定
这里的admin身份是指服务器管理员在管理机器时使用的身份
这个身份的权限也是比较高的,因为管理员有操作管理脚本、访问配置文件、读/写日志等需求
使用高权限身份运行Apache的结果可能是灾难性的
* 当黑客入侵Web成功时,将直接获得一个高权限(比如root或admin)的shell
* 应用程序本身将具备较高权限,当出现bug时,可能会带来较高风险,比如删除本地重要文件、杀死进程等不可预知的结果
比较好的做法是使用专门的用户身份运行Apache,这个用户身份不应该具备shell,它唯一的作用就是用来运行Web应用
以什么身份启动进程,在使用其他Web容器时也需要注意这个问题
很多JSP网站的管理员喜欢将Tomcat配置为root身份运行,导致的后果就是黑客们通过漏洞得到了webshell后,发现这个webshell已经具备root权限了
Apache还提供了一些配置参数,可以用来优化服务器的性能,提高对抗DDOS攻击的能力
在Apache的官方文档中,对如何使用这些参数给出了指导
http://httpd.apache.org/docs/trunk/misc/security_tips.html
这些参数能够起到一定的作用,但单台机器的性能毕竟有限,所以对抗DDOS不可依赖于这些参数,但聊胜于无
最后,要保护好Apache Log,一般来说,攻击者入侵成功后,要做的第一件事情就是清除入侵痕迹,修改、删除日志文件,因此access log应当妥善保管,比如实时地发送到远程的syslog服务器上
「15.2Nginx安全」
近年来Nginx发展很快,它的高性能和高并发的处理能力使得用户在Web Server的选择上有了更多的空间
但从安全的角度来看,Nginx近年来出现的影响默认安装版本的高危漏洞却比Apache要多
在Nginx的官方网站有这些安全问题的列表
http://nginx.org/en/security_advisories.html
因此多多关注Nginx的漏洞信息,并及时将软件升级到安全的版本,是非常有必要的一件事情
从历史的经验来看,如果一个软件出现的漏洞较多,那么说明代码维护者的安全意识与安全经验有所欠缺,同时由于破窗效应,这个软件未来往往会出现更多的漏洞
就软件安全本身来看,Nginx与Apache最大的区别在于,检查Apache安全时更多的要关注Module的安全,而Nginx则需要注意软件本身的安全,及时升级软件版本
与Apache—样,Nginx也应该以单独的身份运行,这是所有Web Server、容器软件应该共同遵守的原则
* Nginx的配置非常灵活,在对抗DDOS和CC攻击方面也能起到一定的缓解作用
* 在Nginx配置中还可以做一些简单的条件判断,比如客户端User-Agent具有什么特征,或者来自某个特定referer、IP等条件,响应动作可以是返回错误号,或进行重定向
在此仍需强调的是,Web Server对于DDOS攻击的防御作用是有限的
对于大规模的拒绝服务攻击,需要使用更加专业的保护方案
「15.3jBoos远程命令执行」
jBoss是J2EE环境中一个流行的Web容器,但是jBoss在默认安装时提供的一些功能却不太安全,如果配置不得当,则可能直接造成远程命令执行
由于jBoss在默认安装时会有一个管理后台,叫做JMX-Console,它提供给管理员一些强大的功能,其中包括配置MBeans,这同样也会为黑客们打开方便之门
通过8080端又(默认安装时会监听8080端又)访问/jmx-console能够进入到这个管理界面
默认安装时访问JMX-Console是没有任何认证的
在JMX-Console中,有多种可以远程执行命令的方法
最简单的方式,是通过DeploymentScanner远程加载一个war包
默认的DeploymentScanner将检查URL是否是file:/[JBOSSHOME]/server/default/deploy/,但通过addURL()方法却可以添加一个远程的war包
出于安全防御的目的,在加固时,需要删除JMX-Console后台,事实上,jBoss的使用兀全可以不依赖于匕
http://wiki.jboss.org/wiki/Wiki.jsp?passage=SecureTheJmxConsole
要移除JMX-Console,只需要删除jmx-console.war和web-console.war即可,它们分别位于$JBOSS_HOME/server/all/deploy和$JBOSS_HOME/server/default/deploy目录下
如果出于业务需要不得不使用JMX-Console,则应该使用一个强壮的密码,并且运行JMX-Console的端又不应该面向整个Internet开放
「15.4Tomcat远程命令执行」
Apache Tomcat与jBoss—样,默认也会运行在8080端口
它提供的Tomcat Manager的作用与JMX-Console类似,管理员也可以在Tomcat Manager中部署war包
但值得庆幸的是,Tomcat Manager布署war包需要有manager权限,而这一权限是在配置文件中定义的
它直接将tomcat用户添加为manager角色,而tomcat用户的密码很可能是一个默认密码,这种配置违背了最小权限原则
虽然Tomcat后台有密码认证,但笔者仍然强烈建议删除这一后台,因为攻击者可以通过暴力破解等方式获取后台的访问权限,从安全的角度看,这增加了系统的攻击面,得不偿失
「15.5HTTP Parameter Pollution」
Luca、Carettoni等人演示了这种被称为HPP的攻击
简单来说,就是通过GET或POST向服务器发起请求时,提交两个相同的参数
在某些服务端环境中,会只取第一个参数,而在另外一些环境中,比如.net环境中,则会变成
这种特性在绕过一些服务器端的逻辑判断时,会非常有用
这种HPP攻击,与Web服务器环境、服务器端使用的脚本语言有关
HPP本身可以看做服务器端软件的一种功能,参数选择的顺序是由服务器端软件所决定的
但是正如我们在本书中所举的很多例子一样,当程序员不熟悉软件的这种功能时,就有可能造成误用,或者程序逻辑涵盖范围不够全面,从而形成漏洞
HPP这一问题再次提醒我们,设计安全方案必须要熟悉Web技术方方面面的细节,才不至于有所疏漏
从防范上来看,由于HPP是服务器软件的一种功能,所以只需在具体的环境中注意服务器环境的参数取值顺序即可
「15.6总结」
在搭建服务器端环境时,需要注意最小权限原则,应该以独立的低权限身份运行Web进程
同时Web Server的一些参数能够优化性能,有助于缓解DDOS攻击,在实际运用时可以酌情使用
Web Server本身的漏洞也需要时刻关注,而有些Web容器的默认配置甚至可能还会成为弱点,一名合格的安全工程师应该熟知这些问题