Tomcat安全加固

配置用户最小权限

Tomcat启动用户权限必须为非root权限、尽量降低tomcat启动用户的目录访问权限。

useradd -M -s /bin/false tomcat
chown -R tomcat.tomcat /usr/local/src/apache-tomcat-6.0.37
su – tomcat -c "/usr/local/src/apache-tomcat-6.0.37/bin/catalina.sh start"

 

开启 Tomcat 的访问日志

修改 conf/server.xml 文件,将下列代码取消注释:

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

或者

<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" />

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

 

Tomcat 默认帐号安全

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

通常 Tomcat 后台管理的 URL 地址为 http://iP:8080/manager/html/ , 如下图所示:

黑客通过猜解到的口令登录 Tomcat 管理后台后,可以上传 Webshell 脚本导致服务器被入侵。

由于此类型漏洞可能对业务系统造成比较严重的危害,建议针对 Tomcat 管理后台进行以下安全加固配置。

  • 如果业务不需要使用 Tomcat 管理后台管理业务代码,建议使用安全组防火墙功能对管理后台 URL 地址进 行拦截,或直接将 Tomcat 部署目录中 webapps 文件夹中的 manager、host-manager 文件夹全部删除,并注释 Tomcat 目录中 conf 文件夹中的 tomcat-users.xml 文件中的所有代码。
  • 如果业务系统确实需要使用 Tomcat 管理后台进行业务代码的发布和管理,建议为 Tomcat 管理后台配置强口令,并修改默认 admin 用户,且密码长度不低于10位,必须包含大写字母、特殊符号、数字组合。具体来说:修改 Tomcat 安装目录 conf 下的 tomcat-user.xml 文件,重新设置复杂口令并保存文件。重启 Tomcat 服务后,新口令即生效。

 

修改默认访问端口,关闭banner

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

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
enableLookups="false" redirectPort="8443" server="Application Server" />

 

重定向错误页面

修改访问 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>

 

禁止列出目录

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

<param-name>listings</param-name>
<param-value>false</param-value>

 

删除文档和示例程序

删除 webapps 目录下的 docs、examples、manager、ROOT、host-manager 文件夹。

 

不安全的HTTP方法

编辑tomcat配置文件/conf/web.xml文件,查看是否禁用PUT、DELETE等危险的HTTP 方法,查看org.apache.catalina.servlets.DefaultServlet是否存在如下配置:

<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>

如果存在,则将false修改为true。readonly参数默认是true,即不允许delete和put操作。
删除 webapps 目录下的 docs、examples、manager、ROOT、host-manager 文件夹。

 

HTTP加密协议

使用HTTPS协议登录tomcat服务器管理页面。

(1)用JDK自带的keytool工具生成一个证书:

$JAVA_HOME/bin/keytool -genkey –alias tomcat –keyalg RSA -keystore /path/to/my/keystore

其中目录:/path/to/my需要用户自行创建。

(2)改tomcat安装目录下/conf/server.xml配置文件,更改为使用HTTPS方式,增加如下行:

<Connector classname="org.apache.catalina.http.HttpConnector"
port="8443" protocol="HTTP/1.1" minProcessors="5"
SSLEnabled="true"
maxprocessors="100"
enableLookups="true" acceptCount="10" debug="0"
scheme="https"
Factory_classname="org.apache.catalina.SSLServerSocketFactory"
secure="true"
clientAuth="false"
keystoreFile="/path/to/my/keystore"
keystorePass="123qwe"
sslProtocol="TLS"/>

其中keystorePass的值为生成keystore时输入的密码。
(3)重新启动tomcat服务。

 

升级到最新稳定版

1) 出于稳定性考虑,不建议进行跨版本升级,如果之前是6.0系列版本,最好还是使用该系列的最新版本。

2) 在统计目录部署最新的Tomcat,将conf目录下的文件和webapp复制过来,之后修改server.xml,修改监听端口进行测试,无误后关闭Tomcat并改回端口。接下来就可以在发布的时候停止旧的 Tomcat并开启新的Tomcat,至此升级完毕。

 

Change the Website Icon

添加 64*64 的LOGO到 /webapps/ROOT/favicon.ico

 

禁止自动部署 (在运行的Tomcat热部署war包)

将host节点的autoDeploy属性设置为“false” 如果存在deployOnStartup属性,也将其更改为“false”

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false">

 

Shutdown Port and Command

通过telnet连接到8005端口发送SHUTDOWN指令关闭tomcat服务器。
推荐加固方式:

<Server port="18005" shutdown="stop">

另一种方法: 还可以设置port属性为 -1,关闭 shutdown port

<Server port="-1" shutdown="SHUTDOWN">

关闭后,bin/shutdown.sh 就失效了,提示SEVERE: No shutdown port configured. Shut down server through OS signal. Server not shut down.

我们还可以修改指令,将SHUTDOWN换成一个不容易猜测到的字符串。

 

如未使用 Tomcat AJP 协议:

如未使用 Tomcat AJP 协议,可以直接将 Tomcat 升级到 9.0.31、8.5.51 或 7.0.100 版本进行漏洞修复。如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭 AJPConnector,或将其监听地址改为仅监听本机 localhost。

具体操作:

1)编辑/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)保存后需重新启动,规则方可生效。

 

禁止显示异常调试信息

当请求处理期间发生运行时错误时,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,定义自定义错误信息。

 

屏蔽版本

在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=Jul 5 2022 11:42:42 UTC
server.info=Apache Tomcat
server.number=0.0.0.0
server.built=Jul 5 2022 11:42:42 UTC

 

修改Cookies安全性

设置成httpOnly=true,修改默认cookie名称
修改conf目录下的context.xml文件

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

 

通过配置,限定访问的IP来源

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.10">
    <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="www.test.com,*.test.com">
</Host>

 

其他

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="20000" disableUploadTimeout="true"/>

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

版权声明:
作者:筱鑫
链接:https://blog.cmkjiot.com/archives/62
来源:IBLOG
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭