一、目的
本标准是Qunar信息系统安全技术标准的一部分,主要目的是根据信息安全管理政策要求,为tomcat配置提供安全标准。
二、范围
适用于我司所有tomcat。
三、内容
3.1 版本
同一应用,TOMCAT和JDK使用统一版本,生成环境TOMCAT和JDK由OPS部门或PE维护,其他人员禁止变更。当前指定的最低版本如下:
开始执行日期 | 软件名称 | 指定版本 |
---|---|---|
2011/11/8 | tomcat | 6.0.29 |
2011/11/8 | jdk | 1.6.0_20-b02 |
3.2 删除默认文件
删除TOMCAT默认示例文件、帮助文件、后台管理界面等,禁止使用manager/admin管理后台。需删除的文件和目录清单如下:
$CATALINA_BASE/server/webapps/manager $CATALINA_BASE/server/webapps/host-manager $CATALINA_BASE/webapps/balancer $CATALINA_BASE/webapps/manager $CATALINA_BASE/webapps/host-manager $CATALINA_BASE/webapps/webdav $CATALINA_BASE/webapps/tomcat-docs $CATALINA_BASE/webapps/jsp-examples $CATALINA_BASE/webapps/servlets-examples $CATALINA_BASE/webapps/examples $CATALINA_BASE/webapps/docs $CATALINA_BASE/conf/tomcat-users.xml
3.3 启动帐号
建立独立用户,用户名和组名均为tomcat,不设置密码(即禁止SSH登录),tomcat进程以此帐号身份运行,严禁以root权限运行tomcat,禁止以个人帐号或其他有shell权限的帐号运行tomcat。可选如下方法之一来实现非ROOT启动tomcat:
3.3.1 修改启动脚本
在$CATALINA_BASE/startenv.sh里面export环境变量:
export TOMCAT_USER=tomcat
同时需要修改$CATALINA_HOME/bin/startup.sh
修改前
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
修改后
if [ -z "$TOMCAT_USER" ]; then exec "$PRGDIR"/"$EXECUTABLE" start "$@" else exec su $TOMCAT_USER -c "$PRGDIR/$EXECUTABLE start $@" fi
3.3.2 使用jsvc来启动tomcat
在jsvc配置文件里面指定参数
-u tomcat
3.4 禁止列目录
配置$CATALINA_BASE/conf/web.xml文件,防止直接访问目录时由于找不到默认主页而列出目录下所有文件。
<servlet> ...... <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> ...... </servlet>
3.5 日志记录
必须打开access log记录功能,按小时或按天记录。prefix/fileDateFormat/pattern可自定义,但必须记录关键信息,例如:源IP,Host、时间、请求、状态码、数据大小、UA等。注意:如果前端是NG做反向代理,默认的pattern="combined"和pattern="common"不能记录用户的真实IP,必须自定义pattern,记录客户端真实IP(X-Real-IP)。access log应该定期压缩上传至中央日志服务器保存。$CATALINA_BASE/conf/server.xml配置示例:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="自定义" suffix=".log" fileDateFormat="yyyy-MM-dd-HH" pattern="%a %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" " %{X-Real-IP}i" resolveHosts="false"/>
特殊情况如不需要记录日志,请向安全组报备,安全组将记录在wiki。
3.6 禁止使用jmx
如之前已经启用,在启动脚本里面(catalina.sh或startenv.sh)删除CATALINA_OPTS变量里面jmxremote相关参数即可。
3.7 禁止使用AJP
配置$CATALINA_BASE/conf/server.xml文件,注释或删除如下部分。
注释前
<Connector port="*" maxThreads="*" enableLookups="false" redirectPort="*" protocol="AJP/**" />
注释后
<!-- <Connector port="*" maxThreads="*" enableLookups="false" redirectPort="*" protocol="AJP/**" /> -->
3.8 目录权限
默认情况下,tomcat启动用户对WEB目录下所有文件及子目录应无写权限。
假设web目录是/home/q/www/xx.qunar.com/webapps,正确的权限设置应该是:
chown -R root:root /home/q/www/xx.qunar.com/webapps && chmod -R 0755 /home/q/www/xx.qunar.com/webapps
即属主是root,权限是0755,子目录权限跟父目录完全一样。
日志文件及cache文件应放在WEB目录之外,具体请参见TC发布的标准:http://wiki.corp.qunar.com/pages/viewpage.action?pageId=11239369
3.9 可写目录禁止执行
如tomcat需支持上传功能,或因其它原因需要对WEB目录有写权限,那么应该限制这些可写目录禁止执行jsp脚本。上传功能在代码实现中,通常会存在各种各样的安全漏洞,导致上传限制被绕过,被攻击者上传jsp文件进而获取web shell。设置可写目录禁止执行jsp,是一道非常重要的防线!注意:这里指的不是去除文件系统rwx权限中的x,文件系统权限中的x可以保留,无危害。
appdir路径有几种可能:
(1) 默认位置
appdir="$CATALINA_BASE/webapps/ROOT"
(2) 默认位置下指定了appname
appdir="$CATALINA_BASE/webapps/$appname"
(3)通过docBase参数指定的路径
appdir="$docBase"
以下是通过UrlRewriteFilter模块来限制的示例配置,如果WEB-INF及相关目录不存在,创建一个即可。
3.9.1 部署jar
从http://tuckey.org/urlrewrite/获取最新版本的urlrewrite jar包,把"urlrewrite-x.x.x.jar"拷贝到"$appdir/WEB-INF/lib"目录下
3.9.2 修改web.xml加载filter
在"$appdir/WEB-INF/web.xml"增加如下配置项
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3.9.3 设置规则禁止上传目录执行jsp
新建配置文件"$appdir/WEB-INF/urlrewrite.xml",假设/upload/和/images/logo/目录需要设置为禁止执行jsp,配置如下:
<?xml version="1.0" encoding="utf-8"?> <urlrewrite> <rule> <from>.*/[\.]*/.*\.jsp$</from> <to>/deny.html</to> </rule> <rule> <from>^/upload/.*\.jsp$</from> <to>/deny.html</to> </rule> <rule> <from>^/images/logo/.*\.jsp$</from> <to>/deny.html</to> </rule> </urlrewrite>
第1条rule用于拦截/重写类似这样的非法请求,这条必不可少,否则其它规则会被绕过!
http://host//shell.jsp http://host/dir/../shell.jsp http://host/./shell.jsp
第2条rule用于拦截/重写类似这样的非法请求
http://host/upload/shell.jsp http://host/upload/dir/shell.jsp
第3条rule用于拦截/重写类似这样的非法请求
http://host/images/logo/shell.jsp http://host/images/logo/dir/shell.jsp
如果有其它目录需要禁止执行jsp,参照第2条和第3条进行配置即可。
如果根目录及子目录都禁止执行jsp,配置为
<rule> <from>^/.*\.jsp$</from> <to>/deny.html</to> </rule>
设置完成并重启tomcat后,请用curl(如果用浏览器,某些特殊的请求会被浏览器净化,达不到测试目的)来验证设置是否生效:
curl -i http://host/upload/shell.jsp curl -i http://host/upload/dir/../shell.jsp
具体的URL地址请做相应替换
3.9.4 可写目录的权限设置
假设web服务启动帐号为tomcat,可写目录是/homr/q/xxx.qunar.com/webapps/upload,正确的权限设置应该是:
chown -R tomcat:tomcat /homr/q/xxx.qunar.com/webapps/upload && chmod -R 0755 /homr/q/xxx.qunar.com/webapps/upload
即可写目录的属主应该为web启动帐号,权限应该为0755,子目录的权限应该跟父目录完全一致。