Apache Tomcat 强化和安全指南

已发表: 2015-02-14

使用最佳实践强化和保护 Apache Tomcat 服务器的实用指南。

Tomcat 是最流行的 Servlet 和 JSP 容器服务器之一。 它被以下一些高流量网站使用:

  • LinkedIn.com
  • Dailymail.co.uk
  • 康卡斯特网
  • 沃尔玛网
  • 路透社
  • Meetup.com
  • 网站

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

tomcat-市场份额
资料来源:Plumbr

从技术上讲,您可以使用 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 提供的页面将显示如下。

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-removed-server-header

使用安全管理器启动 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-httponly

保存文件并重新启动 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 页面。

tomcat-default-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服务器测试一下
tomcat 自定义错误

好多了!

您也可以对java.lang.Exception执行此操作。 如果有任何 java lang 异常,这将有助于不公开 tomcat 版本信息。

只需在web.xml中添加以下内容并重新启动 tomcat 服务器。

 <错误页面> 
<exception-type>java.lang.Exception</exception-type> 
<location>/error.jsp</location>
</错误页面>

我希望上面的指南能给你一个保护 Tomcat 的想法。 如果您想了解有关 Tomcat 管理的更多信息,请查看此在线课程。
此外,在此处了解如何配置 WAS 以在关机期间停止询问密码。