Apache Tomcat 强化和安全指南
已发表: 2015-02-14使用最佳实践强化和保护 Apache Tomcat 服务器的实用指南。
Tomcat 是最流行的 Servlet 和 JSP 容器服务器之一。 它被以下一些高流量网站使用:
- LinkedIn.com
- Dailymail.co.uk
- 康卡斯特网
- 沃尔玛网
- 路透社
- Meetup.com
- 网站
下图展示了Tomcat在Java应用服务器中的市场地位。

从技术上讲,您可以使用 Tomcat 作为前端服务器来直接服务站点请求。 但是,在生产环境中,您可能希望使用一些 Web 服务器(如 Apache、Nginx)作为前端来将请求路由到 Tomcat。
使用 Web 服务器处理请求可以带来性能和安全优势。 如果您使用 Apache HTTP 作为前端 Web 服务器,那么您还必须考虑保护它。
拥有默认的 Tomcat 配置可能会暴露敏感信息,这有助于黑客为攻击应用程序做好准备。
以下是在 Tomcat 7.x、UNIX 环境下测试的。
观众
这是为中间件管理员、应用程序支持、系统分析师或任何工作或渴望学习 Tomcat 强化和安全的人设计的。
必须具备良好的 Tomcat 和 UNIX 命令知识。
笔记
我们需要一些工具来检查 HTTP 标头以进行验证。 有两种方法可以做到这一点。
如果测试面向 Internet 的应用程序,那么您可以使用以下 HTTP 标头工具来验证实现。
- HTTP 标头检查器
- 黑客目标
对于Intranet 应用程序,您可以使用 Google Chrome、Firefox 开发工具。
作为最佳实践,您必须对要修改的任何文件进行备份。
在本指南中,我们将 Tomcat 安装文件夹称为$tomcat 。
让我们来看看硬化和固定程序。
删除服务器横幅
从 HTTP 标头中删除服务器标语是强化的首要任务之一。
使用服务器横幅会暴露您正在使用的产品和版本,并导致信息泄露漏洞。
默认情况下,由 Tomcat 提供的页面将显示如下。

让我们从 Server 标头中隐藏产品和版本详细信息。
- 转到 $tomcat/conf 文件夹
- 使用 vi 修改 server.xml
- 将以下内容添加到
Connector port
Server =” “
前任: -
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" Server =" " redirectPort="8443" />
- 保存文件并重新启动 Tomcat。 现在,当您访问应用程序时,您应该会看到 Server 标头的空白值。

使用安全管理器启动 Tomcat
安全管理器保护您免受浏览器中运行的不受信任的小程序的侵害。
使用安全管理器运行 Tomcat 比不使用安全管理器要好。 Tomcat 有关于 Tomcat 安全管理器的优秀文档。
这样做的好处是您不需要更改任何配置文件。 这只是您执行startup.sh
文件的方式。
你所要做的就是用–security
参数启动tomcat。
[root@geekflare bin]# ./startup.sh -security Using CATALINA_BASE: /opt/tomcat Using CATALINA_HOME: /opt/tomcat Using CATALINA_TMPDIR: /opt/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar Using Security Manager Tomcat started. [root@geekflare bin]#
启用 SSL/TLS
通过 HTTPS 提供 Web 请求对于保护客户端和 Tomcat 之间的数据至关重要。 为了使您的 Web 应用程序可以通过 HTTPS 访问,您需要实现 SSL 证书。
假设您已经准备好带有证书的密钥库,您可以在server.
Connector port
部分下的 xml 文件。
SSLEnabled="true" scheme="https" keystoreFile="ssl/bloggerflare.jks" keystorePass="chandan" clientAuth="false" sslProtocol="TLS"
使用您的更改密钥库文件名和密码。
如果您需要有关密钥库和 CSR 流程的帮助,请参阅本指南。
强制 HTTPS
这仅在您启用 SSL 时适用。 如果没有,它将破坏应用程序。
启用 SSL 后,最好强制将所有 HTTP 请求重定向到 HTTPS,以确保用户与 Tomcat 应用程序服务器之间的通信安全。
- 转到 $tomcat/conf 文件夹
- 使用
vi
修改web.xml
- 在
</web-app>
语法之前添加以下内容
<security-constraint> <web-resource-collection> <web-resource-name>Protected Context</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
- 保存文件并重启Tomcat
将 Secure & HttpOnly 标志添加到 Cookie
在没有安全 cookie 的情况下,可能会窃取或操纵 Web 应用程序会话和 cookie。 这是一个注入响应头的标志。

这是通过在 web.xml 文件的session-config
部分的行下方添加来完成的
<cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config>
配置截图:

保存文件并重新启动 Tomcat 以检查 HTTP 响应标头。
从非特权帐户运行 Tomcat
最好为 Tomcat 使用单独的非特权用户。 这里的想法是保护其他运行的服务,以防任何帐户受到损害。
- 创建一个 UNIX 用户,比如说 tomcat
useradd tomcat
- 如果正在运行,请停止 Tomcat
- 将 $tomcat 所有权更改为用户 tomcat
chown -R tomcat:tomcat tomcat/
启动 Tomcat 并确保它以 tomcat 用户运行
删除默认/不需要的应用程序
默认情况下,Tomcat 附带以下 Web 应用程序,在生产环境中可能需要也可能不需要。
您可以删除它们以保持干净并避免 Tomcat 默认应用程序的任何已知安全风险。
- ROOT - 默认欢迎页面
- 文档 – Tomcat 文档
- 示例 – 用于演示的 JSP 和 servlet
- Manager, host-manager – Tomcat 管理
它们位于 $tomcat/webapps 文件夹下
[root@geekflare webapps]# ls -lt drwxr-xr-x 14 tomcat tomcat 4096 Sep 29 15:26 docs drwxr-xr-x 7 tomcat tomcat 4096 Sep 29 15:26 examples drwxr-xr-x 5 tomcat tomcat 4096 Sep 29 15:26 host-manager drwxr-xr-x 5 tomcat tomcat 4096 Sep 29 15:26 manager drwxr-xr-x 3 tomcat tomcat 4096 Sep 29 15:26 ROOT [root@geekflare webapps]#
更改 SHUTDOWN 端口和命令
默认情况下,tomcat 配置为在 8005 端口上关闭。
你知道你可以通过远程登录到 IP: 端口并发出 SHUTDOWN 命令来关闭 tomcat 实例吗?
Chandans # telnet localhost 8005 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. SHUTDOWN Connection closed by foreign host. Chandans #
危险的!
您会看到,使用默认配置会导致高安全风险。
建议将 tomcat 关闭端口和默认命令更改为不可预测的内容。
- 在 server.xml 中修改以下内容
<Server port="8005" shutdown="SHUTDOWN">
8005 - 更改为其他一些未使用的端口
SHUTDOWN - 改变一些复杂的东西
前任-
<Server port="8867" shutdown="NOTGONNAGUESS">
替换默认的 404、403、500 页面
具有未找到、禁止、服务器错误的默认页面会公开版本详细信息。
让我们看一下默认的 404 页面。

为了缓解,您可以先创建一个一般错误页面,然后配置 web.xml 以重定向到一般错误页面。
- 转到 $tomcat/webapps/$application
- 使用
vi
编辑器创建 error.jsp 文件
<html> <头部> <title>错误页面</title> </head> <body> 这是一个错误! </正文> </html>
- 转到 $tomcat/conf 文件夹
- 在 web.xml 文件中添加以下内容。 确保在
</web-app>
语法之前添加
<错误页面> <错误代码>404</错误代码> <location>/error.jsp</location> </错误页面> <错误页面> <错误代码>403</错误代码> <location>/error.jsp</location> </错误页面> <错误页面> <错误代码>500</错误代码> <location>/error.jsp</location> </错误页面>
- 重启tomcat服务器测试一下

好多了!
您也可以对java.lang.Exception
执行此操作。 如果有任何 java lang 异常,这将有助于不公开 tomcat 版本信息。
只需在web.xml
中添加以下内容并重新启动 tomcat 服务器。
<错误页面> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </错误页面>
我希望上面的指南能给你一个保护 Tomcat 的想法。 如果您想了解有关 Tomcat 管理的更多信息,请查看此在线课程。
此外,在此处了解如何配置 WAS 以在关机期间停止询问密码。