近期安全部门内部漏扫时,发现部分tomcat存在通过OPTIONS方法提交特定的请求的问题,在响应中查看allow头信息,在allow头中发现delete、put等选项,delete方法是用来调试web服务器连接的http方式,支持该方式的服务器文件可能被非法删除;put方法用来向服务器提交文件,测试显示部分请求中这些方法是允许的。借此机会,顺手整理了下针对tomcat的安全加固。
一、删除示例文档
删除webapps/docs、examples、manager、ROOT、host-manager,这个步骤不提供了,拿到tomcat一般第一件事就做这个,老生常谈了。
二、禁止列目录
打开web.xml,将listings 改成 false ,防止直接访问目录时由于找不到默认页面而列出目录下的文件。
三、修改默认端口
编辑conf/server.xml文件,把8080改成1024-65535的未使用端口。
四、禁用tomcat默认帐号
打开conf/tomcat-user.xml文件,将以下用户注释掉:
<!--
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
-->
五、禁用不需要的http方法
对应开头,一般禁用delete,put方法,修改web.xml文件,增加如下内容:
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
注意,web.xml文件的修改,需重启tomcat生效。
六、启用安全cookie
防止xss跨站点攻击,tomcat6开始支持此属性,此处在context.xml中添加启用配置,context.xml配置即调用时生效不需要重启tomcat
# http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
<Context useHttpOnly="true">
七、修改tomcat版本信息
进入apache-tomcat目录lib下,找到catalina.jar,使用压缩工具依次找到org\apache\catalina\util下的ServerInfo.properties。打开ServerInfo.properties编辑:(去掉版本信息)如下:
server.info=Apache Tomcat
server.number=
server.built=
八、重定向错误页面
conf/web.xml在倒数第1行之前加如下内容:
<error-page>
<error-code>401</error-code>
<location>/401.htm</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.htm</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.htm</location>
</error-page>
然后在webapps\manger目录中创建相应的401.html\404.htm\500.htm文件,错误返回页也可在应用中配置,应用中配置则只在当前应用生效。
九、其他
以下这个项可能不完全和安全相关,也单独列下吧。
1、禁止使用root用户运行
这个只针对类linux系统而言的,一旦有漏洞,被人注入上传木马,以什么样的用户运行就获取了什么权限。
2、虚拟目录
配置类似如下:
<Host name="XXXXx" appBase="D:\webroot"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" reloadable="true" docBase="D:\webroot\xxx\WebRoot\" />
</Host>
默认server.xml里一般只有appBase,没有docBase,两者的区别是:appBase这个目录下面的子目录将自动被部署为应用,且war文件将被自动解压缩并部署为应用。如果不想自动war部署,就把autoDeploy配置为false。默认为tomcat下的ROOT目录;docBase只是指向了你某个应用的虚拟目录,这个可以和appBase没有任何关系。这个可以拿apache httpd的默认目录DocumentRoot和虚拟主机VirtualHost对比。
3、日志审核
access log,新的版本里默认都是开启这个的:
修改conf/server.xml,取消注释如下部分:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
启用access_log后,重启tomcat,在tomcat_home/logs中可以看到访问日志。