既无权访问非必须的文件,又不能执行非必须的程序
威胁等级:High
规则描述
缺省情况下,Java运行时根据运行它的用户授予安全权限。当Tomcat以系统管理员身份或作为系统服务运行时,Java运行时取得了系统用户或系统管理员所具有的全部权限。这样一来,Java运行时就取得了所有文件夹中所有文件的全部权限。并且Servlets(JSP在运行过程中要转换成Servlets)取得了同样的权限。所以Java代码可以调用Java SDK中的文件API列出文件夹中的全部文件,删除任何文件,最大的危险在于以系统权限运行一个程序。
审计描述
执行命令:ps -ef | grep -v grep | grep tomcat,查看第一项user是不是root
检测用例信息
检查运行tomcat的用户是否合法
非root
root /usr/bin/java -Djava.util.logging.config.file=/app/lsyj/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /lib:/app/lsyj/tomcat/bin/bootstrap.jar:/app/lsyj/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/app/lsyj/tomcat -Dcatalina.home=/app/lsyj/tomcat -Djava.io.tmpdir=/app/lsyj/tomcat/temp org.apache.catalina.startup.Bootstrap start
修改建议
当安装账户为超级管理员时:
1.专门为Tomcat建立一个单独的用户和用户组。
为用户设置密码:
passwd tomcatuser
此处系统会提示你输入新密码,请自行输入。密码要符合强口令要求(密码至少8位长,至少包含大写字母、小写字母、数字和特殊字符中的两种)。
注:tomcatgroup 和 tomcatuser 为组名和用户名,用户可根据需要自行修改。
/home/tomcat 为用户登录时默认路径(家目录),用户可根据需要自行修改。
2.设置权限:更改Tomcat安装目录属主为tomcatuser用户;为tomcatuser用户添加应用程序(例如webapps,或者被单独放置在tomcat安装目录之外的应用目录)目录的只读权限;如果某些应用程序需要写权限,请单独为其配置tomcatuser的写权限。
3.以tomcatuser用户登录后启动Tomcat服务器。
当安装帐户为普通用户时:
1.在安装之前就建立一个单独的用户和用户组:
2.使用新建立的tomcatuser安装Tomcat之后,不要再使用tomcatuser用户启动运行或安装其他程序;如果产品的web应用被放置在Tomcat安装目录之外,请为tomcatuser添加该目录的只读权限;如果某些应用程序需要写权限,请单独为其配置tomcatuser的写权限。
删除安装过程文件、缺省安装的管理帮助文件及用户测试类的非必需文件
威胁等级:Medium
规则描述
默认的示例或测试应用容易被远程访问或执行,给系统带来相当的危害。
审计描述
检查以下目录是否存在非必需的管理应用和帮助应用:
$tomcat\webapps\*,
Tomcat6之前的版本的版本还需要检查以下目录:
$tomcat\server\webapps\*,
检查系统示例程序和网页:
$tomcat\webapps\examples
检测用例信息
检查不存在安装过程文件、管理帮助文件及用户测试类文件
不存在下列文件:webapps/js-examples, webapps/servlet-example, webapps/webdav, webapps/tomcat-docs, webapps/balancer, webapps/ROOT/admin, webapps/examples, server/webapps/host-manager, server/webapps/manager, conf/Catalina/localhost/host-manager.xml, conf/Catalina/localhost/manager.xml
/app/lsyj/tomcat/webapps/examples
修改建议
1. 删除安装过程文件: //安装后删除
apache-tomcat-6.0.20.* //以6.0.20版本为例
2. 删除非必需的管理应用和帮助应用:
$tomcat\webapps\* //删除webapps目录下产品应用自身和ROOT以外的目录和文件(保留ROOT目录及其文件,以便存放出错提示页面)。
Tomcat6之前的版本的版本还需要删除以下目录:
$tomcat\server\webapps\*
3. 删除系统示例程序和网页:
$tomcat\webapps\examples //安装时可以选择不安装这部分
4. 删除用户测试类的非必需文件。
禁用应用程序自动部署功能
威胁等级:High
规则描述
默认情况下,tomcat启动时,会自动部署$appBase下面的所有应用。例如,当$appBase的值为webapps时,那么任意一个应用,只要被放进webapps目录下,在tomcat启动时,都会被发布。这有可能导致恶意或者未经测试的应用程序被自动部署在服务器上。因此,这里必须禁用掉Tomcat的自动部署功能。
审计描述
检查配置文件$tomcat/conf/server.xml,Host是否将autoDeploy和deployOnStartup属性设置为false。
检测用例信息
Host节点属性autoDeploy设置为false
autoDeploy=false
autoDeploy=true
Host节点属性deployOnStartup设置为false
deployOnStartup=false
修改建议
修改配置文件$tomcat/conf/server.xml如下:
autoDeploy="false" //自动部署
deployOnStartup="false" //在启动时自动部署
不使用不安全的Realms
威胁等级:Low
规则描述
Tomcat提供多种Realm来保存Web应用程序认证用户所使用的账号密码。若产品需要使用Realm配置,要避免使用JDBCRealm、UserDatabaseRealm、JAASRealm和MemoryRealm。原因如下:
MemoryRealm从tomcat-userx.xml中加载数据,数据变化时,需要重启Tomcat,不适用产品;
JDBCRealm在用户认证鉴权时总是使用单线程工作,不适用产品;建议使用DataSourceRealm;
JAASRealm使用较少,相对其他Realm,代码较不成熟;
UserDatabaseRealm不适合大规模系统,只适合小型系统(若少量用户认证场景,可以使用此Realm)。
审计描述
执行下列命令:
检测用例信息
检查UserDatabaseRealm是否禁止
禁用UserDatabaseRealm
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
修改建议
执行下面的语句检查不安全的Realm是否被使用:
。如果存在,删除相关配置。
使用LockOut Realms
威胁等级:Low
规则描述
若产品需要使用Realm配置,可以使用LockOut Realm对用户认证功能进行加固。如果用户多次登录失败,LockOut Realm在标准Realm的基础上提供了锁定用户的能力。
审计描述
执行命令:grep 'LockOutRealm' $TOMCAT_HOME/conf/server.xml检查是否存在LockOutRealm配置,执行命令:grep 'failureCount' $TOMCAT_HOME/conf/server.xml检查是否存在failureCount配置。
检测用例信息
检查是否配置LockOut Realms
<Server>
...
<Realm ... className="org.apache.catalina.realm.LockOutRealm" failureCount="3"(1-5) ... >
</Realm>
...
</Server>
<Server>
...
<Realm ... className="org.apache.catalina.realm.LockOutRealm" ... >
</Realm>
<Realm ... className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" ... >
</Realm>
...
</Server>
修改建议
在Tomcat已经配置Realm的情况下,在$TOMCAT_HOME/conf/server.xml文件中增加LockOutRealm的配置:
<Realm className="org.apache.catalina.realm.LockOutRealm" failureCount="3" lockOutTime="600" cacheSize="1000" cacheRemovalWarningTime="3600">
<Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName=... />
</Realm>
备注: 产品不使用Realm时,无需加固此项配置。
禁用不必要的http方法,DELETE、PUT、TRACE、HEAD、OPTIONS等
威胁等级:High
规则描述
Tomcat服务器提供默认http方法包括GET、HEAD、POST、PUT、DELETE、OPTIONS。在这些方法中,PUT、DELETE方法很少被使用到,并且极易被利用来进行攻击
审计描述
1.在$tomcat/conf/web.xml检查readonly参数的值是否为true,缺省值为true;
2.在$tomcat/conf/server.xml检查allowTrace的值是否为false,缺省值为false;
3.检查$tomcat/conf/web.xml文件的<web-app>节点中是否配置了<web-resource-collection>节点,<http-method>节点是否为OPTIONS HEAD PUT DELETE TRACE。
检测用例信息
web-resource-collection节点必须包含的方法
OPTIONS HEAD PUT DELETE TRACE
修改建议
1.禁用DELETE和PUT的方法:
在$tomcat/conf/web.xml检查readonly参数的值是否为true:
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
备注,如果不存在readonly参数,则不用配置,因为该参数的默认值为true;如果配置了该参数,则需要确保参数值为true。
2.禁用Trace的方法:在$tomcat/conf/server.xml禁用trace方法,即配置allowTrace为false:
<Connector port="80" maxThreads="150" connectionTimeout="20000" redirectPort="8443" allowTrace="false"/>
备注:如果不存在allowTrace参数,则不用配置,因为该参数的默认值为false;如果配置了该参数,需要确保参数值为false。
3.在$tomcat/conf/web.xml文件的<web-app>节中增加以下内容:
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
<http-method>OPTIONS</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
</security-constraint>
说明:这里的<url-pattern>/*</url-pattern>和策略可以根据实际业务来进行配置。
备注:web-resource-collection节点必须包含的方法:OPTIONS HEAD PUT DELETE TRACE。如果确实是业务需要使用,则不强制要求。
定制Tomcat出错信息
威胁等级:Medium
规则描述
Tomcat发生服务器端出错时(例如:Tomcat在找不到网页时,会报404错误),错误页面上会附带当前服务器版本号,还可能泄露其他服务器端信息。黑客可以通过版本号,查询当前Tomcat服务器的默认配置信息,以及该版本的安全漏洞。
审计描述
检查配置文件$tomcat/conf/web.xml的倒数第二行(即</web-app>之前的那一行)是否有如下内容:
<error-page>
<error-code>400</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>401</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>402</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>405</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>406</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>407</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>413</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>414</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>501</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.htm</location>
</error-page>
检测用例信息
检查Tomcat是否定制出错信息
<web-app>
<error-page>
<location>*</location>
</error-page>...
</web-app>
error-page is not configured
修改建议
在配置文件$tomcat/conf/web.xml的倒数第二行(即</web-app>之前的那一行)添加如下内容:
<error-page>
<error-code>400</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>401</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>402</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>405</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>406</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>407</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>413</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>414</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<error-code>501</error-code>
<location>/error.htm</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.htm</location>
</error-page>
备注:
error.htm文件要拷贝到各web应用的根目录,可以在error.htm文件中自定义出错提示信息,error.htm的大小必须大于512个字节,否则IE会自动调用自己的友好提示界面。特别提醒,禁止给响应码302配置错误页面,否则所有重定向都将指向该错误页面。<location>的配置值是自定义错误页面相对于当前Web应用的根目录的路径,需要根据自定义错误页面的实际路径配置。
使用Eclipse集成Tomcat后,如果指定了错误页面,会看不到异常抛出,无法定位错误。可以在开发阶段先注释掉此段,在发布时再取消注释。
更改Tomcat服务器默认shutdown端口号和命令
威胁等级:High
规则描述
Tomcat服务器提供默认shutdown端口(8005)和命令(SHUTDOWN),很容易被黑客捕获利用关闭服务器,进而威胁到服务器和应用等。
审计描述
检查$tomcat/conf/server.xml文件的port值是否为8005,shutdown的值是否为大于12位的任意字符串。如果将port值改成-1表示不使用shutdown端口,结果为通过。
检测用例信息
检查shutdown命令是否满足复杂度要求
shutdown命令满足复杂度要求
SHUTDOWN
修改建议
1.使用shutdown.sh关闭tomcat。
2.修改$tomcat/conf/server.xml文件,更改默认端口和shutdown命令为其他大于8位的任意字符串,例如:
<Server port="2324" shutdown="Rea!!yC0mplexW0rd">//这里shutdown命令建议12个字符,包含大小写字母、数字和特殊字符。
3.使用startup.sh启动tomcat。
备注:默认的8005端口为Tomcat的shutdown端口,在linux下如果改成-1表示不使用shutdown端口。
限制http请求的消息主体和消息头的大小
威胁等级:Medium
规则描述
此指令给了服务器管理员更大的可控性,以控制客户端不正常的请求行为。
审计描述
检查配置文件$tomcat/conf/server.xml中是否有如下内容:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" maxPostSize="10240" maxHttpHeaderSize="8192"/>
检测用例信息
检查是否限制http请求的消息主体和消息头的大小
<Server>
...
<Connector ... protocol="HTTP/1.1" maxPostSize="10240" ... maxHttpHeaderSize="8192"... />
...
</Server>
<Server>
...
<Connector ... maxThreads="400" protocol="HTTP/1.1" prestartminSpareThreads="true" redirectPort="8443" maxPostSize="-1" minSpareThreads="100" acceptCount="5000" connectionTimeout="80000" port="8083" ... >
</Connector>
...
</Server>
修改建议
在配置文件$tomcat/conf/server.xml中的每个Connector的“maxPostSize”属性为10240,“maxHttpHeaderSize”属性为8192:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" maxPostSize="10240" maxHttpHeaderSize="8192"/>
备注:推荐请求体大小限制为10240bytes,消息头的大小限制为8192bytes,如果产品有特殊需求,可以进行相应调整。
可执行文件只能由Tomcat属主用户修改(700)
威胁等级:High
规则描述
如果允许非属主用户对由属主执行或读写的文件有写权限,则会危及系统。比如,别人有可能会覆盖可执行文件或脚本,那么下一次启动时,就会执行恶意代码。
审计描述
执行命令find -L $tomcat/bin -name "*.sh" \( ! -user TOMCAT_USER -o ! -group TOMCAT_GROUP -o -perm /g=rwx,o=rwx \) -ls 2>/dev/null和find -L $tomcat/bin -type f ! -name "*.sh" \( ! -user TOMCAT_USER -o ! -group TOMCAT_GROUP -o -perm /u=x,g=rwx,o=rwx \) -ls 2>/dev/null,不存在不符合要求的文件。
检测用例信息
可执行sh文件权限不超过700
700或更严格
/app/lsyj/tomcat/bin/catalina.sh 750\n/app/lsyj/tomcat/bin/ciphers.sh 750\n/app/lsyj/tomcat/bin/configtest.sh 750\n/app/lsyj/tomcat/bin/daemon.sh 750\n/app/lsyj/tomcat/bin/digest.sh 750\n/app/lsyj/tomcat/bin/setclasspath.sh 750\n/app/lsyj/tomcat/bin/setenv.sh 644\n/app/lsyj/tomcat/bin/shutdown.sh 750\n/app/lsyj/tomcat/bin/startup.sh 750\n/app/lsyj/tomcat/bin/tool-wrapper.sh 750\n/app/lsyj/tomcat/bin/version.sh 750
非可执行sh文件权限不超过600
600或更严格
/app/lsyj/tomcat/bin/CATALINA_PID 640\n/app/lsyj/tomcat/bin/SESSIONS.ser 640\n/app/lsyj/tomcat/bin/bootstrap.jar 640\n/app/lsyj/tomcat/bin/catalina-tasks.xml 640\n/app/lsyj/tomcat/bin/catalina.bat 640\n/app/lsyj/tomcat/bin/ciphers.bat 640\n/app/lsyj/tomcat/bin/commons-daemon-native.tar.gz 640\n/app/lsyj/tomcat/bin/commons-daemon.jar 640\n/app/lsyj/tomcat/bin/configtest.bat 640\n/app/lsyj/tomcat/bin/digest.bat 640\n/app/lsyj/tomcat/bin/hs_err_pid10193.log 640\n/app/lsyj/tomcat/bin/hs_err_pid18047.log 640\n/app/lsyj/tomcat/bin/hs_err_pid20304.log 640\n/app/lsyj/tomcat/bin/hs_err_pid29402.log 640\n/app/lsyj/tomcat/bin/hs_err_pid31807.log 640\n/app/lsyj/tomcat/bin/hs_err_pid5947.log 640\n/app/lsyj/tomcat/bin/hs_err_pid9002.log 640\n/app/lsyj/tomcat/bin/jmx_prometheus_javaagent-0.14.0.jar 644\n/app/lsyj/tomcat/bin/jmx_tomcat_exporter.yml 644\n/app/lsyj/tomcat/bin/jmx_tomcat_exporter.yml.bak 644\n/app/lsyj/tomcat/bin/nullindex.html 640\n/app/lsyj/tomcat/bin/setclasspath.bat 640\n/app/lsyj/tomcat/bin/shutdown.bat 640\n/app/lsyj/tomcat/bin/startup.bat 640\n/app/lsyj/tomcat/bin/tomcat-juli.jar 640\n/app/lsyj/tomcat/bin/tomcat-native.tar.gz 640\n/app/lsyj/tomcat/bin/tool-wrapper.bat 640\n/app/lsyj/tomcat/bin/version.bat 640
修改建议
设置可执行文件的权限,例如bin目录下的执行文件,使用Tomcat属主用户执行下列命令:
备注:如果Tomcat是独立安装部署的,并和其他容器之间存在相互调用的关系,那么,可执行文件的权限需要由Tomcat属主用户修改成711。
配置文件只能由Tomcat属主用户修改(600)
威胁等级:High
规则描述
别人有可能会覆盖配置文件,从而获取更高的权限或者更多的信息。
审计描述
检查tomcat配置文件权限,例如conf目录下的配置文件,权限不大于600。
检测用例信息
配置文件只能由Tomcat属主用户修改(600)
0600或更严格
0640 /app/lsyj/tomcat/webapps/manager/META-INF/context.xml
0640 /app/lsyj/tomcat/webapps/manager/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/docs/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/examples/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/host-manager/WEB-INF/web.xml
0644 /app/lsyj/tomcat/webapps/inxedu_web/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/ROOT/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/docs/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/examples/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/host-manager/META-INF/context.xml
0640 /app/lsyj/tomcat/webapps/host-manager/WEB-INF/web.xml
0644 /app/lsyj/tomcat/webapps/inxedu_web/WEB-INF/web.xml
0640 /app/lsyj/tomcat/webapps/ROOT/WEB-INF/web.xml
修改建议
设置配置文件的权限,例如conf目录下的配置文件,使用Tomcat属主用户执行下列命令:
同时,各web应用部署下的web.xml、context.xml、logging.properties文件也要配置成只能由Tomcat属主用户修改且权限是600。
备注:Tomcat6.0.1x版本中,tomcat-user.xml文件的权限无法被修改成700,每次Tomcat启动会自动把tomcat-user.xml文件权限更新为644。tomcat-user.xml是Tomcat控制台的管理员用户信息文件,这里存在被操作系统其他用户读取的威胁,建议不要使用Tomcat控制台。
日志目录只能由Tomcat属主用户修改和执行(700)
威胁等级:High
规则描述
如果日志目录对非属主用户是可写的,别人就有可能用一个指向其他敏感文件的连接来覆盖日志文件,使那个文件被改写为杂乱的数据。如果日志文件本身对非属主用户是可写的,别人就可能伪造日志。
审计描述
检查tomcat日志目录权限,不大于700。
检测用例信息
$tomcat/logs目录权限为700
700或更严格
/app/lsyj/tomcat/logs 0755
修改建议
使用Tomcat属主用户执行下列命令:
临时目录只能由Tomcat属主用户修改和执行(700)
威胁等级:High
规则描述
限制对这些临时目录的访问,可以防止本地用户恶意或无意地影响Tomcat进程的完整性。
审计描述
检查tomcat临时目录权限,不大于700。
检测用例信息
$tomcat/temp目录权限为700
700或更严格
/app/lsyj/tomcat/temp 0750
修改建议
使用Tomcat属主用户执行下列命令:
Web应用目录只能由Tomcat属主、属组用户修改和执行(750)
威胁等级:High
规则描述
限制对这些临时目录的访问,可以防止本地用户恶意或无意地影响Web应用程序的完整性。
审计描述
检查tomcat所有web应用目录权限,不大于750。
检测用例信息
$tomcat/webapps目录权限为750
750或更严格
/app/lsyj/tomcat/webapps/inxedu_web 0755
修改建议
使用Tomcat属主用户执行下列命令:
注意:Web应用目录下的各文件和目录也只能由Tomcat属主、属组用户修改
只对管理员等少数用户开放的web服务,建议采用IP或IP段控制访问
威胁等级:Low
规则描述
减少对外暴露的风险。
审计描述
检查$tomcat/conf/context.xml配置文件是否配置如下内容:
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow="*.mycompany.com,www.yourcompany.com" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.5.*" />,检查是否存在RemoteAddrValve
检测用例信息
检查是否限制web服务
org.apache.catalina.valves.RemoteAddrValve
修改建议
修改$tomcat/conf/context.xml配置文件如下:
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow="*.mycompany.com,www.yourcompany.com" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.5.*" />
备注:其中,RemoteHostValve过滤的是主机名,RemoteAddrValve过滤的是IP地址,Tomcat6在多个ip或多个域名之间,可以使用“,”分隔,但是Tomcat7要求必须使用正则表达式,不能再使用逗号分隔。
关闭会话facade回收重利用功能
威胁等级:High
规则描述
RECYCLE_FACADES如果设置为false,则新请求不会创建新的facade而是使用旧的facade,该功能有可能导致请求信息泄露。
审计描述
执行命令:ps -ef | grep -v grep | grep "\-Dcatalina.base=$TOMCAT_BASE\s*" | egrep -i "\-Dorg\.apache\.catalina\.connector\.RECYCLE_FACADES\s*=\s*",检查启动脚本$tomcat/bin/catalina.sh
检测用例信息
检查facade是否关闭
-Dorg.apache.catalina.connector.RECYCLE_FACADES=true
修改建议
在启动脚本$tomcat/bin/catalina.sh中添加如下命令:
CATALINA_OPTS="$CATALINA_OPTS -Dorg.apache.catalina.connector.RECYCLE_FACADES=true",重启服务
备注:该参数仅出现在Tomcat6.0及其之后的版本中,且默认值为false。如果在启动脚本中未发现RECYCLE_FACADES参数,则需要添加。
禁用 X-Powered-By HTTP头并重命名所有Connector的Server 值
威胁等级:High
规则描述
xpoweredBy设置决定了Tomcat是否在X-Powered-By HTTP Header中提供其版本等信息,设置为false可以使攻击者更难获知服务器的安全缺陷。
审计描述
检查$tomcat/conf/server.xml文件中每一个Connector中加上xpoweredBy属性并设置为false,或者保证Connector中没有xpoweredBy;检查HTTP Connector中加上server属性并设置为非空值。
检测用例信息
HTTP Connector节点设置了server属性
<Connector ... server=xxx />
:HTTP Connector node in /app/lsyj/tomcat/conf/server.xml has no server attributes.
修改建议
1.在$tomcat/conf/server.xml文件中每一个Connector中加上xpoweredBy属性并设置为false,或者保证Connector中没有xpoweredBy
<Connector ... xpoweredBy="false"/>
2.在$tomcat/conf/server.xml文件中每一个HTTP Connector中加上server属性并设置为非空值,建议设置为本机IP。
备注:AJP Connector没有server属性。
禁止以特权方式运行应用
威胁等级:High
规则描述
以特权方式运行应用会允许应用加载管理库。
审计描述
检查所有context.xml文件中Context节点是否有privileged属性,如果有则值必须为false。
检测用例信息
所有context.xml文件中 Context节点的privileged属性值为false或者不存在该属性
<Context ... privileged= "false" /> or <Context ...(无privileged属性) />
Webapp localhost/app/lsyj/tomcat/webapps/manager/META-INF/context.xml /app/lsyj/tomcat/webapps/host-manager/META-INF/context.xml : <Context ... privileged= "true" />
修改建议
在所有的context.xml中设置
<Context ... privileged= "false"/>
备注:该参数默认值为false,如果未发现该参数,则不用设置。
Tomcat配置SSL时,需要使用安全的协议TLSV1.2、TLSV1.1
威胁等级:High
规则描述
当Tomcat启用SSL时,需注意防范POODLE漏洞,在配置HTTPS connector时设置sslProtocol=" TLSv1.1, TLSv1.2"(6.0.38之前版本)或sslEnabledProtocols = " TLSv1.1,TLSv1.2"(6.0.38及以后版本),请参考如下实施指导
审计描述
检查$tomcat/conf/server.xml文件中是否有如下内容:
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
sslEnabledProtocols="TLSv1.1,TLSv1.2"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA"
keystoreFile="c:/key.store" keystorePass="ChangeMe@123"/>
检测用例信息
检查Tomcat是否配置了安全的SSL协议
<Server>
...
<Connector ... protocol="HTTP/1.1" secure="true" sslEnabledProtocols="TLSv1.1,TLSv1.2" scheme="https" SSLEnabled="true" ... >
</Connector>
...
</Server>
<Server>
...
<Connector maxThreads="400" protocol="HTTP/1.1" prestartminSpareThreads="true" redirectPort="8443" maxPostSize="-1" minSpareThreads="100" acceptCount="5000" connectionTimeout="80000" port="8083" >
</Connector>
...
</Server>
修改建议
在$tomcat/conf/server.xml中增加如下内容:
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
sslEnabledProtocols="TLSv1.1,TLSv1.2"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA"
keystoreFile="c:/key.store" keystorePass="ChangeMe@123"/>
备注:
1.配置细节可以参考《web应用安全开发规范》的“附件1 Tomcat配置SSL指导.doc”;
2.keystoreFile参数的文件名请使用绝对路径,keystorePass参数上的口令即使用keytool 生成证书时的storepass口令。
3.当前示例中,keystorePass不能明文存储,可以参考《Tomcat中证书库文件口令加密实现指导1.1》或《Tomcat SSL证书密码加密方法2》来实现;
4.上述配置,不同的tomcat版本,其配置项可能有一定差别。
5.请在启用SSL的Connector上配置 scheme="https",保证request.getScheme()返回准确的值。
6.请在启用SSL的Connector上配置 secure="true",保证request.isSecure()返回true。
配置需要强制使用SSL的目录或文件
例如对于/SSL目录下的所有文件和/test/login.jsp需要强制使用SSL,则编辑Tomcat对应web应用目录下的WEB-INF/web.xml,在<web-app>节中加入如下配置:
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL</web-resource-name>
<url-pattern>/SSL/* </url-pattern>
<url-pattern>/test/login.jsp</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
为Tomcat配置Security Lifecycle Listener
威胁等级:Low
规则描述
当Tomcat启动时,Security Lifecycle Listener会执行一些安全检查,若检查失败,该Listener会阻止Tomcat启动。
Security Lifecycle Listener检查内容包含:
1. 检查Tomcat 启动时所使用的账号是否在指定的黑名单中(若未配置黑名单,黑名单中默认值为root);
2. 检查Tomcat启动时umask是否符合配置的最小限制(若未指定,则使用默认值0007)。
审计描述
在$tomcat/conf/server.xml中,检查是否有Security Lifecycle Listener配置
<Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="root,alex,bob" minimumUmask="0007" />
在catalina.sh文件中,检查是否解除了如下注释(该配置仅与umask检查相关):
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
检测用例信息
检查Tomcat是否配置Security Lifecycle Listener
org.apache.catalina.security.SecurityListener
org.apache.catalina.startup.VersionLoggerListener
org.apache.catalina.core.AprLifecycleListener
org.apache.catalina.core.JreMemoryLeakPreventionListener
org.apache.catalina.mbeans.GlobalResourcesLifecycleListener
org.apache.catalina.core.ThreadLocalLeakPreventionListener
修改建议
在$tomcat/conf/server.xml中增加(或者解除注释)Security Lifecycle Listener配置
<Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="root,alex,bob" minimumUmask="0007" />
在catalina.sh文件中,解除如下注释(该配置仅与umask检查相关):
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`",重启服务
备注:
checkedOsUsers根据实际场景配置tomcat启动时检查的账号黑名单,采用“,”分隔,默认值为root;
minimumUmask在window环境下不会执行检查;默认值为0007.
修改tomcat默认端口8080和8443
威胁等级:Low
规则描述
修改服务的默认端口,减少被直接猜测的机会。
审计描述
检查$tomcat/conf/server.xml下所有Connector节点port属性不为8080,redirectPort不为8443。
检测用例信息
server.xml下所有Connector节点redirectPort属性不为8443
redirectPort不为8443
8443
修改建议
修改$tomcat/conf/server.xml下所有Connector节点port属性不为8080,redirectPort不为8443。
删除Tomcat默认管理控制台
威胁等级:Medium
规则描述
默认情况下,Tomcat存在管理控制台,其地址一般为http://[IP]:[Port]/admin。管理台的应用文件,在$tomcat/server/webapps下,有admin和manager两个应用。其用户密码,在$tomcat/conf/tomcat-users.xml中定义。在$tomcat/webapps下的admin.xml和manager.xml文件,定义了可以通过访问/admin和/manager进入控制台的通道。默认情况下,可以轻易的登录tomcat管理台,造成严重安全问题。
本方法适用于完全不需要使用默认控制台及相关功能的应用场景。
审计描述
1、检查$tomcat/webapps下不应该存在admin.xml和manager.xml文件;
2、检查$tomcat/conf/tomcat-users.xml中不应该存在用户和密码;
3、检查$tomcat/server/webapps下不应该存在admin和manager两个应用;
4、检查$tomcat/webapps下不应该存在admin和manager两个应用。
检测用例信息
检查是否删除$tomcat/webapps下的admin和manager两个应用;
$tomcat/webapps下不存在admin和manager
/app/lsyj/tomcat/webapps/manager
修改建议
本方法适用于完全不需要使用默认控制台及相关功能的应用场景。
1、删除$tomcat/webapps下admin.xml和manager.xml文件;
2、删掉$tomcat/conf/tomcat-users.xml中的用户和密码;
3、删除$tomcat/server/webapps下的admin和manager两个应用;
4、删除$tomcat/webapps下的admin和manager两个应用。
禁用webdav
威胁等级:High
规则描述
WebDAV(Web-based Distributed Authoring and Versioning)是基于 HTTP 1.1 的一个通信协议。它为 HTTP 1.1 添加了一些扩展(就是在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些新的方法),使得应用程序可以直接将文件写到 Web Server 上,并且在写文件时候可以对文件加锁,写完后对文件解锁,还可以支持对文件所做的版本控制。这存在一定的安全问题。Tomcat本身是支持WebDAV的,虽然需要进行配置才可以启用。
审计描述
检查文件$tomcat/conf/web.xml的servlet节点是否存在webdav值
检测用例信息
修改建议
在配置文件$tomcat/conf/web.xml中,确保下面的配置节点不存在或者处于注释状态:
<servlet>
<servlet-name>webdav</servlet-name>
<servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
...
禁用Symbolic links
威胁等级:High
规则描述
Symbolic links是用来解决不同的web应用程序之间共享文件的一种方式。这会造成应用之间的相互影响,一个应用的安全漏洞,有可能影响到所有关联的应用,因此,这种方式在安全方面存在极大隐患。
审计描述
1.检查配置文件$tomcat/conf/server.xml的每个context节点是否存在allowLinking属性。
2.检查配置文件$tomcat/conf/context.xml的每个context节点是否存在allowLinking属性。
备注:在每个web应用的META-INF下检查是否存在context.xml文件,如果存在,请检查并确保每个Context节点都没有allowLinking属性。
检测用例信息
修改建议
1.在配置文件$tomcat/conf/server.xml中,确保每个Context节点都没有allowLinking属性。
2.在配置文件$tomcat/conf/context.xml中,确保每个context节点都没有allowLinking属性。
3.在每个web应用的META-INF下检查是否存在context.xml文件,如果存在,请检查并确保每个Context节点都没有allowLinking属性。
禁止配置Tomcat的网络连接超时时间为0或-1
威胁等级:High
规则描述
connectionTimeout为网络连接超时时间毫秒数,当配置为0或-1时,表示永不超时,在受到DOS攻击时,很快就会导致最大连接数被完全占用,进而导致Tomcat服务器无法访问。因此这里禁止配置connectionTimeout为0和-1,通常推荐的超时时间为20s和30s。特殊情况下,请根据具体性能需求进行调优。
审计描述
检查配置文件$tomcat/conf/server.xml中的每个Connector的connectionTimeout属性是否被置为0或者-1。
检测用例信息
修改建议
在配置文件$tomcat/conf/server.xml中的每个Connector的connectionTimeout属性为20000:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" maxPostSize="10240" redirectPort="8443" />
备注:如果产品有特殊性能需求,可以进行相应调整。
Tomcat根目录只能由Tomcat属主用户修改(755),Tomcat根目录的所有父级目录的修改权限不能赋予除超级管理员用户和Tomcat属主的其他普通用户
威胁等级:High
规则描述
不仅文件本身,tomcat根目录必须只能由属主来改写,Tomcat根目录的所有父级目录的修改权限不能赋予除超级管理员用户和Tomcat属主的其他普通用户。
审计描述
执行命令find -L $tomcat -prune \( ! -user $tomcatuser -o ! -group $tomcatgroup -o -perm /g=w,o=w \) -ls 2>/dev/null,检查是Tomcat根目录权限是否合规。
检测用例信息
修改建议
如果要配置Tomcat根目录为/home/tomcat,首先要确认/、/home目录只能由root修改,/home/tomcat目录只有root和Tomcat属主用户才有修改权限,其他用户不能具备这些目录的修改权限,其次要使用Tomcat属主用户执行下列命令:
备注:这里要求的权限如755是最大权限,如果业务不需要这么大的权限可以根据业务需求适当放小,下同。
禁用SSI和CGI功能
威胁等级:High
规则描述
SSI指令可以用于执行Tomcat JVM外部的程序,CGI脚本可以用于执行Tomcat的java虚拟机外部的程序,所以这是极度危险的。
审计描述
确认配置文件$tomcat/conf/web.xml中,<servlet>标签下的SSI和CGI配置均处于xml注释状态。
检测用例信息
修改建议
Tomcat默认不支持SSI和CGI,修改配置文件$tomcat/conf/web.xml,<servlet>标签下的SSI和CGI配置均处于xml注释状态。
关闭crossContext功能
威胁等级:High
规则描述
当crossContext设置为true时,系统允许ServletContext.getContext调度另一个应用程序,这使得crossContext有创造恶意应用的可能,因此必须限制该功能。
审计描述
检查所有context.xml文件中,确认crossContext属性为false。
检测用例信息
修改建议
在所有的context.xml文件中,确认crossContext属性为false:
<Context ... crossContext= "false" />
或
<Context ... crossContext= "false" >
...
</Context>
备注:未在context.xml文件中发现该属性时可以不用添加,其默认值为false。
启用context.xml文件的useHttpOnly参数,防止会话cookie被客户端脚本访问
威胁等级:High
规则描述
设置cookie为HttpOnly,可以阻止客户端脚本访问(包括读取和修改)cookie,当支持HttpOnly的客户端浏览器(当前主流的浏览器都支持)检测到Cookie包括了HttpOnly标志时,浏览器返回空字符串给企图读取该cookie的脚本,这样cookie中的任何信息暴露给黑客或者恶意网站的几率将会大大降低。早期需要通过服务端代码设置cookie的HttpOnly属性值为true,Tomcat在Tomcat 6.0.19和Tomcat 5.5.28的版本提供新的功能:只需要配置context.xml文件的useHttpOnly参数,即可实现对会话cookie设置HttpOnly属性,从而保护会话cookie不被客户端脚本访问。
审计描述
检查$tomcat/conf/context.xml文件中,确认useHttpOnly属性为非 false。
检测用例信息
修改建议
在$tomcat/conf/context.xml中设置context的参数useHttpOnly的值为true,例如:
<Context useHttpOnly="true">
备注:useHttpOnly参数适用于Tomcat 6.0.x的版本;Tomcat7不需要设置,因为Tomcat7默认设置useHttpOnly参数值为true。
如果不使用的AJP 1.3 Connector,必须删除,如果使用,则修改默认端口8009为其他端口
威胁等级:Low
规则描述
对于不使用的Connector应该删除,否则会带来安全隐患,Tomcat默认情况下提供AJP 1.3 Connector,负责和其他的HTTP服务器建立连接(例如:Apache和Tomcat组合使用,客户请求通过Apache过滤转发到tomcat服务器,对于一些静态页面的请求,包括请求的Html文件,静态页面或者动态页面中的图片都直接由Apache处理,采用另外一种说法就是,对于用户发出的对动态页面的请求,如jsp、servlet,由Apache转发给Tomcat处理,可以有效提高服务器性能。),如果确认不使用AJP 1.3 Connector,则必须删除。
审计描述
检查$tomcat/conf/server.xml文件中,不使用AJP 1.3 Connector,如果使用则修改其默认端口为其他端口。
检测用例信息
修改建议
删除$tomcat/conf/server.xml中不用的AJP 1.3 Connector;注释或删除$tomcat/conf/server.xml文件中的如下内容:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
备注:如果使用AJP Connector,应该修改默认的8009端口为其他端口,如3039。
禁用额外的路径分隔符
威胁等级:High
规则描述
允许额外路径分隔符会导致黑客访问原本不可见的应用或区域。
审计描述
检查$tomcat/bin/catalina.sh文件中是否存在如下参数:
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=false
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=false
如果存在,则值必须为false。
检测用例信息
修改建议
在启动脚本$tomcat/bin/catalina.sh的配置行JAVA_OPTS="$JAVA_OPTS ..."中添加如下命令:
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=false -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=false,即JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=false -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=false",重启服务
备注:这两个参数默认值为false。如果在启动脚本中未发现这两个参数,则不用添加。
禁用自定义头状态信息
威胁等级:High
规则描述
允许将用户提供的数据放入头中可能导致XSS攻击。
审计描述
检查$tomcat/bin/catalina.sh文件中是否存在 -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER 字段,如果有则值必须为false
检测用例信息
修改建议
在启动脚本$tomcat/bin/catalina.sh的配置行JAVA_OPTS="$JAVA_OPTS ..."中添加如下命令:
-Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=false,即JAVA_OPTS="$JAVA_OPTS -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=false",重启服务
备注:该参数默认值为false。如果在启动脚本中未发现该参数,则不用添加。
不解析日志阀上的主机
威胁等级:Low
规则描述
如果将日志阀里面的resolveHosts设置为true,那么在记录信息之前会先进行DNS查询,增加额外资源消耗。
审计描述
检查所有context.xml文件和$tomcat/conf/server.xml中Valve节点是否有resolveHosts属性,如果有则值必须为false。
检测用例信息
修改建议
在所有有Valve节的context.xml和server.xml中设置:
<Valve ... resolveHosts="false"/>
备注:该参数默认值为false,如果Valve节中未发现该参数,则不用设置。
业务运行时限制对敏感包的访问
威胁等级:Medium
规则描述
在服务器中有一些受限访问的包或未知包,这些包可能是恶意软件或者会影响应用程序,需要防止Web应用程序访问这些包。
审计描述
在$tomcat/conf/catalina.properties中添加:
package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper
备注:Tomcat的默认值即是如此,只需要检查确认未人工修改过即可。
检测用例信息
修改建议
在$tomcat/conf/catalina.properties中添加
package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper
备注:Tomcat的默认值即是如此,只需要检查确认未人工修改过即可。