Tomcat服务安全加固和优化

2023-10-30

转载来源 : https://help.aliyun.com/knowledge_detail/37421.html?spm=a2c4g.11186623.4.5.4ad6510eY2UhOS

介绍

tomcat服务默认启用了管理后台功能,使用该后台可直接上传 war 文件包对站点进行部署和管理。由于运维人员的疏忽,可能导致管理后台存在空口令或者弱口令的漏洞,使得黑客或者不法分子可以利用该漏洞直接上传 Webshell 脚本导致服务器沦陷。

安全加固方案

由于此类型漏洞可能对业务系统造成比较严重的危害,建议您针对 Tomcat 管理后台进行以下安全加固配置。
1. 网络访问控制
如果您的业务不需要使用 Tomcat 管理后台管理业务代码,建议您使用功能对管理后台 URL 地址进行拦截,或直接将 Tomcat 部署目录中 webapps 文件夹中的 manager、host-manager 文件夹全部删除,并注释 Tomcat 目录中 conf 文件夹中的 tomcat-users.xml 文件中的所有代码。

如果您的业务系统确实需要使用 Tomcat 管理后台进行业务代码的发布和管理,建议为 Tomcat 管理后台配置强口令,并修改默认 admin 用户,且密码长度不低于10位,必须包含大写字母、特殊符号、数字组合。

2. 开启 Tomcat 的访问日志
修改 conf/server.xml 文件,将下列代码取消注释:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"   
prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>

启用访问日志功能,重启 Tomcat 服务后,在 tomcat_home/logs 文件夹中就可以看到访问日志。

3. Tomcat 默认帐号安全
修改 Tomcat 安装目录 conf 下的 tomcat-user.xml 文件,重新设置复杂口令并保存文件。重启 Tomcat 服务后,新口令即生效。

4. 修改默认访问端口
修改 conf/server.xml 文件把默认的 8080 访问端口改成其它端口。

5. 重定向错误页面
修改访问 Tomcat 错误页面的返回信息,在 webapps\manger 目录中创建相应的401.html、404.htm、500.htm 文件,然后在 conf/web.xml 文件的最后一行之前添加下列代码:

  <error-page>      
                             <error-code>401</error-code>              
                             <location>/401.htm</location>          
                     </error-page>          
                     <error-page>    
                             <error-code>404</error-code>        
                             <location>/404.htm</location>          
                     </error-page>  
                     <error-page>    
                             <error-code>500</error-code>  
                             <location>/500.htm</location>      
                      </error-page>

6. 禁止列出目录
防止直接访问目录时由于找不到默认页面,而列出目录下的文件的情况。

在 web.xml 文件中,将listings改成false。

7. 删除文档和示例程序
删除 webapps 目录下的 docs、examples、manager、ROOT、host-manager 文件夹。

加固二

Apache Tomcat文件包含漏洞紧急修复

Tomcat 漏洞介绍

tomcat有漏洞, 需要升级到9.0.31

https://cert.360.cn/warning/detail?id=849be16c6d2dd909ff56eee7e26aeefe

2020年02月20日, 360CERT 监测发现 国家信息安全漏洞共享平台(CNVD) 收录了 CNVD-2020-10487 Apache Tomcat文件包含漏洞

Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。

CNVD-2020-10487是文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件、源代码等。

修复建议

更新到如下Tomcat 版本
在这里插入图片描述
Apache Tomcat 6 已经停止维护,请升级到最新受支持的 Tomcat 版本以免遭受漏洞影响。

请广大用户时刻关注 Apache Tomcat® - Welcome! 获取最新的 Tomcat Release版本,以及 apache/tomcat: Apache Tomcat 获取最新的 git 版本。

360安全大脑-Quake网络空间测绘系统通过对全网资产测绘,发现 Apache Tomcat 在国内存在大范围的使用情况。具体分布如下图所示。
Apache Tomcat 6 已经停止维护,请升级到最新受支持的 Tomcat 版本以免遭受漏洞影响。

请广大用户时刻关注 Apache Tomcat® - Welcome! 获取最新的 Tomcat Release版本,以及 apache/tomcat: Apache Tomcat 获取最新的 git 版本。

360安全大脑-Quake网络空间测绘系统通过对全网资产测绘,发现 Apache Tomcat 在国内存在大范围的使用情况。具体分布如下图所示。
在这里插入图片描述

升级方案

1. 继承springboot为parent的

pom添加properties

<tomcat.version>9.0.31</tomcat.version>

验证: 启动后日志为:

2020-02-21 11:46:34.797  INFO 22968 ---[ restartedMain]org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [ApacheTomcat/9.0.31]

2. dependency bom引入的

通常我们不会直接继承 spring-boot-starter-parent, 而是通过如下方式引入bom

 
<dependency>
    
<!-- Import dependency management from Spring Boot -->
    
    <groupId>org.springframework.boot</groupId>    
    <artifactId>spring-boot-dependencies</artifactId>    
    <version>${springboot.version}
    </version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

直接声明tomcat依赖:

<dependency>        
<groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-annotations-api</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jdbc</artifactId>
        <version>${tomcat.version}</version>    
</dependency>    
<dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jsp-api</artifactId>
        <version>${tomcat.version}</version>   
</dependency>    
<dependency>        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>${tomcat.version}</version>    
 </dependency>    
<dependency>        
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-el</artifactId>       
        <version>${tomcat.version}</version>    
</dependency>   
<dependency>        
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>${tomcat.version}</version>
    
</dependency>
<dependency>        
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-websocket</artifactId>
        <version>${tomcat.version}</version>   
</dependency>

不更新版本的情况下,使用下面的操作

如未使用 Tomcat AJP 协议:

如未使用 Tomcat AJP 协议,可以直接将 Tomcat 升级到 9.0.31、8.5.51 或 7.0.100 版本进行漏洞修复。

如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭 AJPConnector,或将其监听地址改为仅监听本机 localhost。

具体操作:

(1)编辑 <CATALINA_BASE>/conf/server.xml,找到如下行(<CATALINA_BASE> 为 Tomcat 的工作目录):

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
(2)将此行注释掉(也可删掉该行):

<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->
(3)保存后需重新启动,规则方可生效。

tomcat防护

1.禁止自动部署

配置自动部署,容易被部署恶意或未经测试的应用程序,应将其禁用

修改Tomcat 根目录下的配置文件conf/server.xml,将host节点的autoDeploy属性设置为“false”,如果host的deployOnStartup属性(如没有deployOnStartup配置可以忽略)为“true”,则也将其更改为“false”

2.tomcat目录权限检测

在运行Tomcat服务时,避免使用root用户运行,tomcat目录(catalina.home、 catalina.base目录)所有者应改为非root的运行用户

使用chown -R <Tomcat启动用户所属组>:<Tomcat启动用户> <Tomcat目录>修改tomcat目录文件所有者,如chown -R tomcat:tomcat /usr/local/tomcat

3.Tomcat进程运行权限检测

在运行Internet服务时,最好尽可能避免使用root用户运行,降低攻击者拿到服务器控制权限的机会。

创建低权限的账号运行Tomcat

4.禁止显示异常调试信息

当请求处理期间发生运行时错误时,ApacheTomcat将向请求者显示调试信息。建议不要向请求者提供此类调试信息

在Tomcat根目录下的conf/web.xml文件里面的web-app添加子节点:<error-page><exception-type>java.lang.Throwable</exception-type><location>/error.jsp</location></error-page>,在webapps目录下创建error.jsp,定义自定义错误信息

5.开启日志记录

Tomcat需要保存输出日志,以便于排除错误和发生安全事件时,进行分析和定位

1、修改Tomcat根目录下的conf/server.xml文件。
2、取消Host节点下Valve节点的注释(如没有则添加)<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
3、重新启动Tomcat

6.禁止Tomcat显示目录文件列表

Tomcat允许显示目录文件列表会引发目录遍历漏洞

修改Tomcat 跟目录下的配置文件conf/web.xml,将listings的值设置为false。 <param-name>listings</param-name> <param-value>false</param-value>

7.删除项目无关文件和目录

Tomcat安装提供了示例应用程序、文档和其他可能不用于生产程序及目录,存在极大安全风险,建议移除

请删除Tomcat示例程序和目录、管理控制台等,即从Tomcat根目录的webapps目录,移出或删除docs、examples、host-manager、manager目录。

8.避免为tomcat配置manager-gui弱口令

tomcat-manger是Tomcat提供的web应用热部署功能,该功能具有较高权限,会直接控制Tomcat应用,应尽量避免使用此功能。如有特殊需求,请务必确保为该功能配置了强口令

编辑Tomcat根目录下的配置文件conf/tomcat-user.xml,修改user节点的password属性值为复杂密码, 密码应符合复杂性要求:

1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(09)
非字母字符(例如 !、$、#、%、@、^&)
3、避免使用已公开的弱密码,如:abcd.1234 、admin@123

9.限制服务器平台信息泄漏

限制服务器平台信息泄漏会使攻击者更难确定哪些漏洞会影响服务器平台。

1、进入Tomcat安装主目录的lib目录下,比如 cd /usr/local/tomcat7/lib 
2、执行:jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties,修改文件ServerInfo.properties中的server.info和server.number的值,如分别改为:Apache/11.0.9211.0.92.0 
3、执行:jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties 
4、重启Tomcat服务

Tomcat使用总结

屏蔽版本
关闭shutdown端口
禁用管理界面
自定义错误页面
AJP协议
修改Cookies安全性
Tomcat安全规范
Tomcat性能优化
Linux 修改catalina.sh 文件
windows修改cataliba.bat文件
其它内容
tomcat项目的部署方式
第一种:项目直接放入 webapps 目录中
第二种:修改 conf/server.xml 文件
第三种 在conf\Catalina\localhost下新增wwwroot.xml
相同IP不同端口部署

1、屏蔽版本

在tomcat的安装目录下的lib目录中找到catalina.jar文件,通过压缩软件打开,找到catalina.jar\org\apache\catalina\util\ServerInfo.properties文件修改里面的内容

server.info=Apache Tomcat/8.5.38
server.number=8.5.38.0
server.built=Feb 5 2019 11:42:42 UTC
server.info=Apache Tomcat
server.number=0.0.0.0
server.built=Feb 5 2009 11:42:42 UTC

2、关闭shutdown端口

Tomcat的配置文件server.xml中有这么一行:

通过telnet连接到8005端口发送SHUTDOWN指令关闭tomcat服务器。

我们可以修改指令,将SHUTDOWN换成一个不容易猜测到的字符串,或者把port的值直接改成-1

3、禁用管理界面

  • Server Status
  • Manager App
  • Host Manager
    在开发环境下我们可以在conf目录下修改tomcat-users.xml文件
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>

生成环境下修改webapps目录下的ROOT文件夹,将它重命名或者制空

4、自定义错误页面

修改在conf目录下面的web.xml的文件,在文件内追加:

<error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
</error-page>

5、AJP协议

定义:WEB服务器通过TCP连接和SERVLET容器连接。为了减少进程生成socket的花费,WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会在分配。换句话说,在连接上,请求不是多元的。这个是连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。

作用:通过AJP协议来通过Apache进行访问的代理。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

所以当我们不需要用Apache做访问代理的话,最好在server.xml文件中将上面那句话给注释掉(减少性能开销)。

如果不想注释掉也至少改成下面这个样子:

<Connector port="8009" protocol="AJP/1.3" address="127.0.0.1" redirectPort="8443" />

禁止将8009端口暴露在外面,造成安全隐患。

6、修改Cookies安全性

设置成httpOnly=true,修改默认cookie名称

修改conf目录下的context.xml文件

<Context useHttpOnly="true" sessionCookieName="yoursessionname">

7、Tomcat安全规范

  • 版本安全

    升级到最新稳定版,出于稳定性考虑,不建议进行跨版本升级。

  • 服务降权

    不使用root用户启动tomcat,使用普通用户启动

  • 端口保护

  • 更改tomcat管理端口8005,此端口有权限关闭tomcat服务,但要求端口配置在8000~8999之间,并更改SHUTDOWN执行的命令

  • 若tomcat都是放在内网的,则针对tomcat服务的监听地址都是内网地址

  • 修改默认的AJP端口,但要求端口配置在8000~8999之间

  • 禁用管理端

  • 删除默认CATALINA_HOME/webapps下载默认的所有目录和文件

  • 将tomcat应用根目录配置为tomcat安装目录以外的目录

  • 隐藏tomcat的版本信息

    针对该信息的显示是由一个jar包控制的,

    该jar包存放在$CATALINA_HOME/lib目录下,名称为 catalina.jar,

    通过 jar xf 命令解压这个 jar 包会得到两个目录 META-INF 和 org ,

    修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo
    字段来实现来更改我们tomcat的版本信息

  • 关闭war自动部署

    默认Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。

<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
  • 屏蔽目录文件自动列出

    编辑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>listings</param-name>
          <param-value>false</param-value> //这里false为不列出,true为充许列出
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  • 多虚拟主机

    强烈建议不要使用 Tomcat 的虚拟主机,推荐每个站点使用一个实例。即,可以启动多个 Tomcat,而不是启动一个 Tomcat
    里面包含多个虚拟主机。 因为
    Tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到所有应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序的隔离和安全

  • 脚本权限回收

    控制CATALINAHOME/bin目录下的start.sh、catalina.sh、shutdown.sh的可执行权限

chmod −R 744 CATALINA_HOME/bin/*
  • 分离 Tomcat 和项目的用户

    为了防止 Tomcat 被植入 web shell 程序后,可以修改项目文件。因此我们要将 Tomcat
    和项目的属主做分离,这样子,即便被搞,他也无法创建和编辑项目文件。

  • server head重写

    server=“Microsoft-IIS/6.5”

<Connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443"
             URIEncoding="UTF-8"
             useBodyEncodingForURI="true"
             server="Microsoft-IIS/6.5" />
  • 通过配置,限定访问的IP来源
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false">
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"  allow="192.168.1.10,192.168.1.30,192.168.2.*" deny=""/>  
 <Valve className="org.apache.catalina.valves.RemoteHostValve"  allow="www.test.com,*.test.com" deny=""/>
</Host>
  • 访问日志格式规范

    开启tomcat默认访问日志中Referer和User-Agent记录

<Valve className="org.apache.catalina.valves.AccessLogValve"
 directory="logs" prefix="localhost_access_log"
   suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b %{Referer}i %{User-Agent}i %D"
   resolveHosts="false" />

8、Tomcat性能优化

  • 禁用AJP协议
  • 将BIO通讯模式修改为NIO通讯模式
<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>

9、Tomcat性能优化

禁用AJP协议

将BIO通讯模式修改为NIO通讯模式

<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>

其它配置项:
在这里插入图片描述

  • 启用外部连接池,来满足高并发已经复用的请求
    executor=“tomcatThreadPool”
<Connector executor="tomcatThreadPool"
             port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
      maxThreads="150" minSpareThreads="4"/>
  • 优化连接器
<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
          connectionTimeout="20000"
          enableLookups="false"
          maxPostSize="10485760"
          URIEncoding="UTF-8" 
          useBodyEncodingForURI="true"
          acceptCount="100"
          acceptorThreadCount="2"
          disableUploadTimeout="true" 
          maxConnections="10000"
          SSLEnabled="false"
  />
  • 在tomcat中设置JVM参数

修改bin/catalina.bat文件设置参数(注释后第一行),增加

 set JAVA_OPTS=-Dfile.encoding=UTF-8 
  -server 
  -Xms1024m 
  -Xmx2048m 
  -XX:NewSize=512m 
  -XX:MaxNewSize=1024m 
  -XX:PermSize=256m 
  -XX:MaxPerPermSize=356m 
  -XX:NewRatio=2 
  -XX:MaxTenuringThreshold=50 
  -XX:+DisableExplicitGC

在这里插入图片描述

10、Linux 修改catalina.sh 文件

修改 /usr/program/tomcat7/bin/catalina.sh 文件,把下面信息添加到文件第一行。

  • 如果服务器只运行一个 Tomcat
  • 机子内存如果是 4G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -Xmn1024m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"

机子内存如果是 8G:

CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4096m -Xmx4096m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
  • 机子内存如果是 16G:

CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms8192m -Xmx8192m -Xmn4096m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"

  • 机子内存如果是 32G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms16384m -Xmx16384m -Xmn8192m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
  • 如果是 8G 开发机
-Xms2048m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=512m

如果是 16G 开发机

-Xms4096m -Xmx4096m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=256m -XX:MaxPermSize=512m

-Dfile.encoding:默认文件编码
-server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的
-Xmx1024m:设置JVM最大可用内存为1024MB
-Xms1024m:设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn1024m:设置JVM新生代大小(JDK1.4之后版本)。一般-Xmn的大小是-Xms的1/2左右,不要设置的过大或过小,过大导致老年代变小,频繁Full GC,过小导致minor GC频繁。如果不设置-Xmn,可以采用-XX:NewRatio=2来设置,也是一样的效果
-XX:NewSize:设置新生代大小
-XX:MaxNewSize:设置最大的新生代大小
-XX:PermSize:设置永久代大小
-XX:MaxPermSize:设置最大永久代大小
-XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5
-XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。需要注意的是,设置了 -XX:MaxTenuringThreshold,并不代表着,对象一定在年轻代存活15次才被晋升进入老年代,它只是一个最大值,事实上,存在一个动态计算机制,计算每次晋入老年代的阈值,取阈值和MaxTenuringThreshold中较小的一个为准。
-XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC

11、Tomcat项目的部署方式

第一种:项目直接放入 webapps 目录中

第二种:修改 conf/server.xml 文件

打开tomcat下conf/server.xml,在标签之间输入项目配置信息

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <GlobalNamingResources>
        <Resource name="UserDatabase" auth="Container"
            type="org.apache.catalina.UserDatabase"
            description="User database that can be updated and saved"
            factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
            pathname="conf/tomcat-users.xml" />
    </GlobalNamingResources>

    <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443"
            URIEncoding="UTF-8"
            useBodyEncodingForURI="true"
            server="Microsoft-IIS/6.5" />

        <Engine name="Catalina" defaultHost="localhost">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
            </Realm>
            <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

                <Context path="/wwwroot" docBase="F:/wwwroot" reloadable="true" />

                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                    prefix="localhost_access_log" suffix=".txt"
                    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>
        </Engine>
    </Service>
</Server>

第三种 在conf\Catalina\localhost下新增wwwroot.xml

里面的内容就一句话:

<Context  docBase="F:/wwwroot" reloadable="true" />

相同IP不同端口部署

在server.xml中多追加一个service

<Service name="web">
    <Connector port="8088"   protocol="HTTP/1.1" maxThreads="700" acceptCount="100"             connectionTimeout="2000" redirectPort="8445" URIEncoding="UTF-8"/>

    <Engine name="web" defaultHost="localhost">
        <Host name="localhost" appBase="webapp1">
            <Context docBase="F:/wwwroot" path="" reloadable="true" />
        </Host>
    </Engine>
</Service>

12、Apache Tomcat 漏洞之 CNVD-2020-10487

漏洞修复方案
**1.版本升级,**截至2020-2-24,官方公布的已修复该漏洞版本包括:

Apache Tomcat 7.0.100
Apache Tomcat 8.5.51
Apache Tomcat 9.0.31

2.关闭AJPConnector:

修改conf/server.xml配置文件的,删除或注释掉这一行,修改后重启tomcat。

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

3.配置AJP协议的secret(此方法只能减少漏洞被利用的可行性,可以配合版本升级使用):

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" address="YOUR_ADDRESS" secret="YOUR_SECRET"/>

建议将 Tomcat 立即升级到 9.0.31、8.5.51 或 7.0.100 版本进行修复,同时为 AJP Connector 配置 secret 来设置 AJP 协议的认证凭证。例如(注意必须将 YOUR_TOMCAT_AJP_SECRET 更改为一个安全性高、无法被轻易猜解的值)

https://www.jianshu.com/p/8bd6419caa1e

https://www.jianshu.com/p/f4c0c0476dae

13、Tomcat修改内存配置

一、配置

Tomcat/conf/server.xml修改配置

<connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
        redirectPort="8443"
        URIEncoding="UTF-8"
        minSpareThreads="25"
        maxSpareThreads="300"
        maxThreads="500"
        acceptCount="500"
        connectionTimeout="30000"
        enableLookups="false"/>

二、参数说明

maxIdleTime:最大空闲时间,超过这个空闲时间,且线程数大于minSpareThreads的,都会被回收,默认值1分钟(60000ms);

minSpareThreads:最小空闲线程数,任何情况都会存活的线程数,即便超过了最大空闲时间,也不会被回收,默认值4;

maxSpareThreads:最大空闲线程数,在最大空闲时间(maxIdleTime)内活跃过,此时空闲,当空闲时间大于maxIdleTime则被回收,小则继续存活,等待被调度,默认值50;

maxThreads:最大线程数,大并发请求时,tomcat能创建来处理请求的最大线程数,超过则放入请求队列中进行排队,默认值为200;

acceptCount:当最大线程数(maxThreads)被使用完时,可以放入请求队列排队个数,超过这个数返回connection refused(请求被拒绝),一般设置和max

Threads一样,不过这个具体需要根据自己的应用实际访问峰值和平均值来权衡,默认值为100;

connectionTimeout:网络连接超时,假设设置为0表示永不超时,这样设置隐患巨大,通常可设置为30000ms,默认60000ms。

Windows Tomcat允许每个进程maxThreads(最大线程数)2000

Linux Tomcat允许每个进程maxThreads(最大线程数)1000
https://www.jianshu.com/p/6dd2ab2f376b

14、tomcat默认日志优化处理

1,针对logging.properties。
修改conf/logging.properties日志配置文件可以屏蔽掉部分的日志信息。

将level级别设置成WARNING就可以大量减少日志的输出,当然也可以设置成OFF,直接禁用掉。

可以直接用下边的内容替换掉原来的文件。如果也是tomcat8的话。

$cat conf/logging.properties
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
 
 
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
 
1catalina.org.apache.juli.AsyncFileHandler.level = OFF
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
 
java.util.logging.ConsoleHandler.level = OFF
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
 
 
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = OFF
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler
 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = OFF
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler
 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = OFF
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler
 
# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE
 
# To see debug messages in TldLocationsCache, uncomment the following line:
#org.apache.jasper.compiler.TldLocationsCache.level = FINE

2,关闭localhost_access_log日志。
修改在tomcat的安装目录conf文件夹下server.xml里配置,将AccessLogValve注释掉。

<!-- Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" / -->

一般这段代码的位置就在配置的底部,注释掉。

3,管理catalina.out。
这个文件是tomcat的启动日志,很多时候可以帮助我们运维,可以留下来。

如果需要关闭,则可以设置bin/catalina.sh文件:

搜索:

if [ -z "$CATALINA_OUT" ] ; then
  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi

可以更改后边的输出路径为/dev/null,让启动日志从此无影无踪。

但是一般不建议关闭这条日志输出,而时间长了之后,这个文件又会非常大,可以通过定时任务的策略进行定期清空处理:

crontab -e
 
#clean the log
0 */4 * * * echo a > /usr/local/tomcat/logs/catalina.out

15、












参考链接 :

Apache Tomcat文件包含漏洞紧急修复 :https://mp.weixin.qq.com/s/tFSE7nUiKL0Hw-OClv560A

Tomcat服务安全加固 : https://help.aliyun.com/knowledge_detail/37421.html?spm=a2c4g.11186623.4.5.4ad6510eY2UhOS

tomcat防护 : https://www.jianshu.com/p/f639408bb639

Tomcat使用总结 :https://mp.weixin.qq.com/s/aW4bAKcJdpKDjxEjvkAnvQ

https://www.jianshu.com/p/9751e07bf1af

tomcat默认日志优化处理 :http://www.eryajf.net/1663.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat服务安全加固和优化 的相关文章

  • Android ViewBinding更新,include得到优化

    前言 之前的ViewBinding对include很不友好 以至于用起来很是难受 到目前优化后不再强制转换FrameLayout布局 使用更加舒适 解决 用之前的例子 直接上代码 这次我们给include的xml加上id
  • 如何终止或杀死进程

    中止进程 一个进程在任务完成之后 将会自动结束 如果要中途中止该进程的话 有两种方法 1 对于在前台运行的程序 直接通过组合键 Ctrl C 来中止 2 对于在后台运行的程序 则需要找到它的进程号 然后使用 kill 命令结束该进程 可以使

随机推荐

  • Java并发编程实战——java内存模型(JMM)和重排序数据依赖性规则

    文章目录 JMM的介绍 内存模型抽象结构 JMM抽象结构模型 重排序的数据依赖性 happens before规则 内存屏障 volatile语义中的内存屏障 final语义中的内存屏障 JMM的介绍 当多个线程访问同一个对象时 如果不用考
  • 自动化测试相关

    bug的风险等级 建议 一般 严重 致命 bug的生命周期 新建 待修复 审核 关闭 注意 bug关闭后可能会再次打开 测试人员关闭一个bug后需要做回归测试 验证次bug是否会引入新的bug 如果没有 则代表该bug彻底关闭 软件测试的流
  • Basic Level 1003 我要通过! (20分)

    题目 答案正确 是自动判题系统给出的最令 人欢喜的回复 本题属于PAT的 答案正确 大派送 只要读入的字符 满足下列 条件 系统就输出 答案正确 否则输出 答案错误 得到 答案正确 的条件是 1 字符 中必须仅有P A T这三种字符 可以包
  • 【已解决】mysqld: File ‘.\杩滅▼浼氳瘖-鐥呯悊绉?slow.log‘ not found (Errcode: 2 - No such file or directory)

    卸载mysql 删除和mysql相关的文件 MySQL踩坑 含泪填完 MySQL踩坑 含泪填完 1 控制面板 删除之前安装失败的mysql对应的版本 2 删除C Program Files x86 MySQL下的文件夹 见下图 3 显示隐藏
  • 懒汉式之并发安全问题

    在高并发场景下的懒汉式创建对象 造成ID重复创建 代码见下图 并发场景下 iDCreator对象并未随类的创建而创建 而是在需要的时候进行创建 导致垃圾回收器可以对其进行回收 从而有可能同一时间戳 前后两次的对象不一致 造成出现两个不同的i
  • redis 主从配置参数详解

    转 https www cnblogs com chenmh p 5121849 html undefined 安装redis 下载redis wget http download redis io releases redis 3 0 7
  • 基于51单片机的温控风扇设计

    作者 何朋伟 19计科一班 宏定义 define uchar unsigned char define uint unsigned int 包含头文件 include
  • Java系统多个JSSE认证

    问题描述 由于项目需要 系统需要多个JSSE认证 登录使用SSL 邮件收取 解决办法 一 对于需要一次JSSE认证来说 可以通过 1 InstallCert工具来安装证书 Copyright 2006 Sun Microsystems In
  • 模型实战(10)之win10下tensorRT部署yolov5算法

    win10下tensorRT部署yolov5算法 针对yolov5的众多版本 目前有几种部署方法 1 tensorrtx 大神针对众多网络模型 包含yolov5众多版本 开源的一个转换工具 部署方式为 onnx gt wts gt engi
  • egret native使用自定义字体

    参考文章白鹭官方链接 除了文章提到的修改内容 还有文章没提到的一些内容如下 1 在egretProperties json文件中添加字库名称 2 添加字库资源 以上是android apk包内改变字体的方法 而移动端浏览器的设置方法则需要另
  • 关于layer.js中layer.confirm弹出框看不到或者不居中问题处理

    在jsp页面body 标签上加上style height 100 就可以解决
  • 在Android中实现Unity3D的背景是透明的 u3d显示在安卓的上一层

    在Unity中 可以通过设置Camera的背景 Camera下的Environment下的Background Type设置为Solid Color Background需要设置黑色透明度0 即ARGB为 0 0 0 0 透明度不为0则无法
  • 安卓应用开发入门:两个 Activity 之间的跳转

    关键知识 Intent Intent 意图 主要实现Activity之间的来回切换和数据传递 Intent是一种轻量级的消息传递机制 这种消息描述了应用中一次操作的动作 动作涉及数据 附加数据 Android系统根据此Intent的描述 负
  • 凭借这份面经,大专的我成功拿到腾讯Android岗offer

    一 简历 网上有很多对程序员简历的一些指导 这里就不重述 大家可以搜下网上其他大神的总结 结合自身情况修改下 我有几点建议 1 尽量不要花哨 程序员和设计师或者产品运营还不一样 我们的简历成功与否决定权还是在技术面试官那 而他们看重的是你的
  • centos6.8下l2tp客户端xl2tpd的安装配置

    环境 DigitalOcean centos6 8作为l2tp客户端 ros6 43 8作为l2tp服务端 1 安装xl2tp和ppp rpm ivh http mirrors yun idc com epel 6 x86 64 epel
  • 你能活过80岁么?9大因素决定人的寿命

    你能活过80岁么 9大因素决定人的寿命 最近 一项世界上历时最长 规模最大的老龄化研究显示 对中年男子而言 寿命能否达到80岁以上 取决于9项指标 即体重 血压 血糖 胆固醇 受教育程度 婚姻状况 是否酗酒 是否吸烟以及是否拥有好的握力 这
  • 测试音质好坏的软件,音响音质的好坏简单的两招测出

    原标题 音响音质的好坏简单的两招测出 怎样判断一个音响好坏 对于略懂略懂的你真的可以判断一个音响的好坏 当没有专业的测试工具也没有精确的仪器时候 应该怎样判断一个音响好坏 然后就买买买 低配置的测试 工具 一杯水 一首无损音质的歌曲 测试低
  • Android实现屏幕旋转方法

    本文实例总结了Android实现屏幕旋转方法 分享给大家供大家参考 具体如下 在介绍之前 我们需要先了解默认情况下android屏幕旋转的机制 默认情况下 当用户手机的重力感应器打开后 旋转屏幕方向 会导致当前activity发生onDes
  • 金融分析与风险管理——投资组合的有效前沿及资本市场线

    金融分析与风险管理 投资组合的有效前沿及资本市场线 1 投资组合的可行集 2 投资组合的有效前沿 3 资本市场线 1 投资组合的可行集 投资组合中的权重变量可以实现投资组合的预期收益率与收益波动率之间的映射关系 在投资组合的理论中 所有可能
  • Tomcat服务安全加固和优化

    转载来源 https help aliyun com knowledge detail 37421 html spm a2c4g 11186623 4 5 4ad6510eY2UhOS 介绍 tomcat服务默认启用了管理后台功能 使用该后