既无权访问非必须的文件,又不能执行非必须的程序
威胁等级: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> 40 0 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 1 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 2 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 3 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 4 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 5 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 6 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 7 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 41 3 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 41 4 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 50 0 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 50 1 < /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> 40 0 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 1 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 2 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 3 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 4 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 5 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 6 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 40 7 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 41 3 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 41 4 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 50 0 < /error-code>
< location> /error.htm< /location>
< /error-page>
< error-page>
< error-code> 50 1 < /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的默认值即是如此,只需要检查确认未人工修改过即可。