码迷,mamicode.com
首页 > 其他好文 > 详细

tomcat安全

时间:2020-09-17 23:10:39      阅读:29      评论:0      收藏:0      [点我收藏+]

标签:lte   数据   独立   web   监控   cal   use   connect   log   

安装部署

1、安装包应该从官网下载,确保发布的安全性。下载后使用md5/PGP校验完整性。这里使用sha512sum验证,因为gpg那个没找到.asc文件下载地址

[root@iZzm446eh1ux98Z packages]# curl https://downloads.apache.org/tomcat/tomcat-8/v8.5.57/bin/apache-tomcat-8.5.57.tar.gz.sha512
720de36bb3e40a4c67bdf0137b12ae0fd733aef772d81a4b8dab00f29924ddd17ecb2a7217b9551fc0ca51bd81d1da13ad63b6694c445e5c0e42dfa7f279ede1 *apache-tomcat-8.5.57.tar.gz


[root@iZzm446eh1ux98Z packages]# sha512sum apache-tomcat-8.5.57.tar.gz
720de36bb3e40a4c67bdf0137b12ae0fd733aef772d81a4b8dab00f29924ddd17ecb2a7217b9551fc0ca51bd81d1da13ad63b6694c445e5c0e42dfa7f279ede1  apache-tomcat-8.5.57.tar.gz

2、tomcat安装后会自带几个web应用,这些应用会产生安全风险,应该尽可能的移除不必要的。对于doc、examples、ROOT可以直接移除。host-manager和manager用于管理和监控tomcat的,如果使用第三方工具管理tomcat的话,这两个可以直接移除。

8.5版本之前,这两个应用都是需要手动开启本地访问的。而8.5版本之后,已经是配置好的了

[root@iZzm446eh1ux98Z META-INF]# vim webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\
.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
[root@iZzm446eh1ux98Z webapps]# vim manager/META-INF/context.xml 
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\
.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

host-manager和manager只有在conf/tomcat-users.xml中添加了用户信息才可以正常访问,但是为了避免被攻击,还应该设置足够健壮的密码。还需要确保conf/server.xml中配置了org.apache.catalina.realm.LockOutRealm,防止攻击者进行暴力破解

3、避免使用root用户启动Tomcat,应该单独为Tomcat服务器建立一个用户,授予运行服务器所需的最小权限。比如Tomcat用户不能登录系统。

[root@iZzm446eh1ux98Z webapps]# useradd -s /sbin/nologin -M tomcat

[root@iZzm446eh1ux98Z webapps]# chown -R tomcat.tomcat /opt/softwares/apache-tomcat-8.5.57/

server.xml配置

1、移除不必要的组件

(a)默认情况下server.xml中配置了一个HTTP链接器(8080)和一个AJP链接器(8009),实际中只需要一个链接器即可。如果Tomcat独立启动,不存在前置的web服务器,那么可以只保留HTTP而删除AJP,反之则删除HTTP链接器而保留AJP。不过,一般情况下前端web应用都是Nginx,所以都是删除AJP的,因为Nginx不支持AJP。

(b)如果不使用host-manager和manager管理Tomcat,可以将<Engine>下的<Realm>以及名为"UserDatabase"的Resource删除

[root@iZzm446eh1ux98Z webapps]# vim /opt/softwares/apache-tomcat-8.5.57/conf/server.xml
        <!--Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase" /-->

(c)如果精通Tomcat配置,可以将附带的注释删除。不过我没删,因为不精通。可以安装后先备份一个,然后删除自带注释

2、配置更改

2.1  关闭shutdown端口

默认配置shutdown的端口为8005,指令为"SHUTDOWN"。也就是说只要向服务器的8005端口发送SHUTDOWN字符串,tomcat会自动关闭。由于默认情况下8005监听的是localhost,只有本机发送的指令才能接收到,但是如果服务器被入侵的话,依然可以关闭Tomact。所以应该关闭。

tomcat禁用8005端口的时候报错 "SEVERE: No shutdown port configured. Shut down server through OS signal. Server not shut down.",报错原因是因为:

禁用关闭命令端口在tomcat以windows服务或linux等系统的jsvc方式启动时可以生效,在标准shell脚本启动的方式下不会生效,这将阻止shutdown和catalina脚本停止tomcat

 

jsvc方式启动tomcat可以参考:https://www.cnblogs.com/zh-dream/p/13605029.html

 

2.2  Tomcat链接器的重要安全属性应当关注,如下表所示:

属性 描述 默认值
address 该属性用于控制连接器监听的IP地址,默认情况下连接器监听服务器配置的所有IP地址  
allowTrace 是否开启HTTP的trace方法,多用于DEBUG,在默写浏览器可能会导致安全问题,默认禁用  
maxPostSize

FROM URL参数转换处理的POST请求的最大字节数,负值或小于0,表示不做限制

注意:tomcat7.0.63之前是0或负值才表示不作限制,否则post请求失败

由于转换参数在请求处理过程中会被缓存,因此设置合适的上限有助于减少DOS攻击

2MB
maxSavePostSize

FROM或者CLIENT-CERT认证时,保存或者缓冲的POST请求最大字节数。

由于参数在认证过程中会被缓存,因此设置合适的上限有助于减少DOS攻击

2MB
maxParameterCount 自动转换的参数(GET和Post之和)最大个数,超出该值时将被忽略。负值,不做限制,需要根据实际情况进行设置
注意:FailedRequestFilter过滤器可用于拒绝超出该限制的请求
10000
xpoweredBy 设置为true,tomcat会为响应添加X-Powered-By头信息,这会使攻击者很容易识别服务器类型及版本并据此发送针对性攻击。 false
server

控制"Server"HTTP头内容,默认为"Apache-Coyoto/1.1"。

攻击者很容易据此识别服务器类型并发动针对性攻击,建议在生成环境改成其他值

 

 

 

默认情况下,server.xml只配置了名为localhost的Host,并且是自动部署的,web应用目录为$CATALINA_BASE/webapps。所以webapps目录下的目录或者WAR包俊辉在Tomcat启动时自动部署,包括被植入的恶意应用。有两种解决办法:

a、修改web应用的部署目录为其他路径,使攻击者找不到正确的部署目录

b、禁用自动部署,将Host的autoDeploy和deployOnStartup属性设置为false,这时只有在<Host>下配置的<Context>子元素才会被部署,而且变更web应用的类文件时,需要手动重启服务。除此之外,可以将Host的deployXML设置为false,此时Tomcat将忽略web应用META-INF目录下的context.xml

2.3  <Context>元素的属性也和服务器安全密切相关:

属性 描述 默认值
crossContext 用于控制是否可以访问其他Contex资源,除非是可信任的web应用,否则不要开启 false
privileged 用于控制是否可以使用容器提供的Servlet,除非是可信任的web应用,否则不要开启 false
allowLinking 是否允许使用符号链接,如果在大小写敏感的操作系统开启该属性将会导致禁用一些安全措施,且允许直接访问WEB-INF目录 false
sessionCookiePathUsesTrailingSlash

用于解决IE、Safari、Edge等浏览器的BUG,防止当多个应用共享通用的路径前缀时,会话Cookie跨应用暴露。

开启该属性时,会存在Servlet映射路径为/*的情况。最好的方式是避免供应用共享路径前缀

false

2.4  错误页的处理

web应用异常有ErrorReportValve处理,这会输出Tomcat版本信息,还会将异常栈显示给用户,导致泄漏系统信息。在生产环境中,应该尽量避免。

首先,可以在web.xml中添加<error-page>,定制化错误页面,也可以提高客户体验。也可以定制化ErrorReportValve(将属性showServerInfo设置为false隐藏服务器的信息,将属性showReport设置false隐藏异常栈信息

2.5 其他影响安全的属性

属性 影响 默认值
org.apache.catalina.connector.RECYCLE_FACADES

控制每次请求是否重建Connector外观类,

设置为true时,每次请求都会重建外观类和请求参数映射;

设置为false,tomcat会复用外观类和请求参数映射,这样会增加由于系统缺陷导致将错误数据继续向后续请求传递

false
org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH 允许请求URL的非标准转换,解决URL中包含%5C的问题 false
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH

允许请求URL的非标准转换,解决URL中包含%2F的问题

如果这两个参数使用,攻击者可能会绕过前置代理增加的安全约束,导致安全问题

false
org.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_ERITER

用于控制GET请求响应是否强制编码,不指定时默认为(ISO-8859-1)

许多浏览器在响应使用默认编码会违反RFC2616,尝试猜测响应编码,这时虽然兼容了,但是会导致安全风险(XSS)

true,强制编码

 

对于DefaultServlet,需要设置readonly为true,否则将允许客户端删除或修改服务器上的静态资源以及上传新的资源。listings参数也需要设置为false,如果设置为true,可能会泄漏应用目录信息,而且容易导致DOS攻击(尤其目录非常多时,会显著增加CPU使用率)。

showServerInfo参数设置为false,避免listings目录时输出Tomcat版本信息

[root@iZzm446eh1ux98Z apache-tomcat-8.5.57]# vim conf/web.xml

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>showServerInfo</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>readonly</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

 

tomcat安全

标签:lte   数据   独立   web   监控   cal   use   connect   log   

原文地址:https://www.cnblogs.com/zh-dream/p/13624136.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!