Apache Tomcat 强化和安全指南

提升 Apache Tomcat 服务器安全性的实用指南

Tomcat 是一个非常受欢迎的 Servlet 和 JSP 容器服务器。许多高流量的网站都在使用它,例如:

  • LinkedIn.com
  • Dailymail.co.uk
  • Comcast.net
  • Walmart.com
  • Reuters.com
  • Meetup.com
  • 许多其他网站

下图展示了 Tomcat 在 Java 应用服务器市场中的地位:

数据来源:Plumbr

从技术角度来说,Tomcat 可以作为前端服务器直接处理网站请求。然而,在生产环境中,通常会使用 Web 服务器(例如 Apache 或 Nginx)作为前端来将请求路由到 Tomcat。

使用 Web 服务器处理请求能够带来性能和安全上的优势。如果采用 Apache HTTP 作为前端 Web 服务器,那么也需要考虑如何保护它。

使用默认的 Tomcat 配置可能会暴露敏感信息,这会帮助攻击者为攻击应用程序做准备。

以下指南基于 Tomcat 7.x 版本,并在 UNIX 环境下进行了测试。

适用人群

本指南适用于中间件管理员、应用程序支持人员、系统分析师,以及任何希望学习如何加强和保护 Tomcat 安全的人员。

您需要具备良好的 Tomcat 和 UNIX 命令知识。

注意事项

我们需要一些工具来检查 HTTP 标头以进行验证。有两种方法可以实现这一点:

如果测试面向互联网的应用程序,可以使用 HTTP 标头工具来验证配置。

对于内网应用程序,可以使用 Google Chrome 或 Firefox 的开发者工具。

作为最佳实践,在修改任何文件之前,务必进行备份。

在本指南中,我们将 Tomcat 的安装目录称为 $tomcat。

接下来,我们将探讨如何进行安全加固。

移除服务器标语

从 HTTP 标头中删除服务器标语是安全加固的首要任务之一。

服务器标语会暴露您正在使用的产品和版本,从而导致信息泄露。

默认情况下,Tomcat 提供的页面会显示如下信息:

接下来,我们将隐藏 Server 标头中的产品和版本信息:

  • 进入 $tomcat/conf 目录。
  • 使用 vi 编辑器修改 server.xml 文件。
  • 在连接器端口部分添加以下内容:
Server =" "

例如:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
Server =" "
redirectPort="8443" />
  • 保存文件并重启 Tomcat。现在,访问应用程序时,您应该会看到 Server 标头的值为空白。

使用安全管理器启动 Tomcat

安全管理器可以保护您免受浏览器中运行的不受信任的小程序的侵害。

使用安全管理器运行 Tomcat 比不使用安全管理器要更安全。Tomcat 官方文档有详细的Tomcat 安全管理器说明。

这样做的好处是不需要更改任何配置文件,只需要修改启动 Tomcat 的方式即可。

只需使用 –security 参数启动 Tomcat 即可:

[[email protected] 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.
[[email protected] bin]#

启用 SSL/TLS

通过 HTTPS 提供 Web 请求对于保护客户端和 Tomcat 之间的数据至关重要。为了让您的 Web 应用程序可以通过 HTTPS 访问,您需要部署 SSL 证书。

假设您已经有了带有证书的密钥库,您可以在 server.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。

为 Cookie 添加 Secure & HttpOnly 标志

在没有安全 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 – 默认欢迎页面
  • docs – Tomcat 文档
  • examples – 用于演示的 JSP 和 servlet
  • manager, host-manager – Tomcat 管理程序

这些应用程序位于 $tomcat/webapps 目录下:

[[email protected] 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
[[email protected] 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、403 和 500 错误页面会泄露服务器的版本信息。

让我们看一下默认的 404 页面:

为了缓解这个问题,您可以首先创建一个通用的错误页面,并配置 web.xml 文件以将其重定向到该通用错误页面。

  • 进入 $tomcat/webapps/$application 目录。
  • 使用 vi 编辑器创建一个名为 error.jsp 的文件。
<html>
<head>
<title>Error Page</title>
</head>
<body> That's an error! </body>
</html>
  • 进入 $tomcat/conf 目录。
  • 在 web.xml 文件中添加以下内容,确保在 </web-app> 标签之前添加:
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
  • 重启 Tomcat 服务器并进行测试。

看起来好多了!

您也可以对 java.lang.Exception 执行相同的操作。这样,如果有任何 java lang 异常,将有助于隐藏 Tomcat 的版本信息。

只需在 web.xml 中添加以下内容并重启 Tomcat 服务器:

<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>

希望上述指南能为您提供保护 Tomcat 的思路。如果您想了解有关 Tomcat 管理的更多信息,请查看此在线课程
此外,您还可以在这里了解如何配置 WAS,使其在关闭时不再要求密码。