X.d 笔记

小Web,大世界

0%

Tomcat安全基础

说完了Apache的,再说下Tomcat的,思想和Apache差不多。

一:软件版本

Jdk 版本,Tomcat 版本,这个很重要,据悉6.0.x有些Bug连最新的版本也没fixed掉。由于目前tomcat8还没有稳定版,比较先进的是tomcat7,如想使用websocket的功能,需要安装jdk7或以上版本做为运行环境。Tomcat版本的补丁安全报告见:http://tomcat.apache.org/security.html

另外,不管是 Apache 还是 Tomcat ,系统版本也很重要,如有漏洞安全问题需及时更新补丁或其它对策。

二:用户权限

运行 Tomcat 的用户不能有太大的权限,但 Tomcat 没有 Apache 一样的配置项指定运行的用户组,所以需要建立一个应用用户运来安装与运行 Tomcat。不能使用 root 用户到安装(解压)与启动(startup.sh) Tomcat。

group add tomcatgroup
useradd -g tomcatgroup tomcat -p tomcat

建立 tomcat 用户成功后,切换到 tomcat 用户后,再进行安装(无需编译,解压即可)与启动。

注意的是,挂在 Tomcat 的 Java 应用里面的代码也要注意,不要使用 root 用户才能访问的资源。

三:配置或删除管理员,删除无用文件

我忘了是哪位高手说过这样的话,引用一下(个人记忆,非原文)

使计算机绝对安全的办法:不要拥有计算机 不要打开计算机 不要使用计算机

当然是废话一句。怎么不用嘛,不过 Tomcat 自带一套管理系统,如果不用的话,可以删掉,当然,如果需要,就要改密码了,改个强点的口令,在 ./conf/tomcat-user.xml 上修改口令

<user name="admin" password="xxxxxxx" roles="admin,manager" />

如果是删除管理员,则可将管理平台一并删掉。即 webapps下面的 admin/manager 等。也可以修改 server.xml 里面修改 appbase。

四:禁用应用程序自动部署功能

默认情况下,是打开了的,自动部署war包,导致恶意或未经验证的程序部署到服务器上,一般是要禁用的。
修改 server.xml

autoDeploy="false"
deployOnStartUp="false"(如果没有这项,需要手动添加在Host元素上)

五:禁用不安全方法

如无必要,应该只保留 GET/POST 方法,禁用掉 PUT/DELETE 等方法

  1. 编辑 conf/web.xml 文件搜 readonly,若没有,则不需配置(本身默认为true)
<init-param>
<param-name>readyonly</param-name>
<param-value>true</param-value>
</init-param>
  1. 编辑conf/server.xml,配置allowTrace为false
<Connector port="8080"  allowTrace="false">
  1. 编辑conf/web.xml,增加以下内容
<security-constraint>
<web-resource-collection>
<url-partten>/*</url-partten>
<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>
</sercuity-constraint>

六:web.xml安全小集合

由于 Tomcat 自身默认配置还是比较安全,一般不用再改,有些版本默认开了,这里拿出主要的,可以对比一下。

<!-- WebDav 默认支持功能,一般默认没配置,也不需要配置,如果默认有配置,注释或删掉之-->
<servlet>
<servlet-name>webdav</servlet-name>
<servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
</servlet>
<!-- 报错页面,可根据实际情况配置或在应用本身里面的web.xml里面配置 -->
<error-page>
<error-code>404</error-code>
<location>404.html</location>
</error-page>
<!-- 列表目录,一般版本默认是关的,要确认一下 -->
<init-param>
<param-name>listings</param-name>
<param-value>false</param-vale>
</init-param>
<!-- session超时时间,默认30分钟 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-- 搜SSI与CGI,默认都为注释状态,以下为其中一例 -->
<filter-name>ssi</filter-name>
<filter-class>org.apache.catalina.ssi.SSIFilter</filter-class>

七:server.xml安全小集

安装完成tomcat后,主要的配置都在conf/server.xml里面,这里简单拿出一些配置项。

<!-- 更改监听shutdown的端口与口令,不要用默认的,以免被攻击 -->
<Server port="9527" shutdown="GUNBITOMACT">
<!-- 限制请求体大小,避免溢出 -->
<Connector maxportsize="1024">
<!-- 配置线程大小超时时间,避免线程不释放 -->
<Connector connectionTimeout="30000" maxThreads="800" minSpareThreads="100" maxSpareThreads="500" >
<!-- 禁用symbolic links 搜server.xml,context.xml 每个context节点都不能有allowLinking属性-->
<context allowLinking="不能有这个属性,搜到了就干掉">
<!-- 关闭crosscontext功能 -->
<context crossContext="false">
<!-- context.xml里面设置HTTPONLY为true,此功能设置后javascript不能读取Cookie如有业务依赖不要设置 -->
<context useHttpOnly="true">
<!-- 删掉不用的contector,默认会配置http和ajp13两个contector如果其中一个没用则删掉之 -->
<Connector protocol="http">
<Connector protocol="ajp13">
<!-- 禁用X-prowered-By 在每个connector中加入xproweredBy=false -->
<Connector xproweredBy="false">
<!-- 禁止以特权方式运行应用(context.xml里面设置) -->
<context privileged="false">

八:其它安全小集

  1. 关闭 facade 回收重利用功能:会话回收重利用如果设置为 true,则请请求不生成新的 facade 而使用旧的 facade,造成信息泄露。
    修改bin/catalina.sh
    -Dorg.apache.catalina.connector.RECYLE_FACADES=false
  2. 隐藏tomcat服务器,版本号信息(需要在jar包中修改)
cd tomcat/lib
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
vi org/apache/catalina/util/ServerInfo.properties
#VI START
server.info = webservername
server.number = 3.0
server.built = oct 10 2020 12:12:12
#VI END :wq
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
  1. 禁用额外的路径分隔符号
    修改bin/catalina.sh,保证以下两项为falsh,或是没有这两项
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSHASH=false
-Dorg.apache.tomcat.utilbuf.UDecoder.ALLOW_ENCODED_SHASH=false
  1. 禁用自定义头
    如果允许用户使用自定义头,导致XSS攻击,修改bin/catalina.sh,设置下项为false,或是没有这一项
-Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=false