Apache Tomcat加固和安全指南
一个使用最佳实践加固和保护Apache Tomcat服务器的实用指南。
Tomcat是最受欢迎的Servlet和JSP容器服务器之一。以下是一些高流量网站使用它:
- LinkedIn.com
- Dailymail.co.uk
- Comcast.net
- Wallmart.com
- Reuters.com
- Meetup.com
- Webs.com
下面的图表显示了Tomcat在Java应用服务器中的市场地位。
从技术上讲,你可以使用Tomcat作为前端服务器直接提供网站请求。然而,在生产环境中,你可能想要使用一些像Apache、Nginx这样的Web服务器作为前端将请求路由到Tomcat。
使用Web服务器处理请求会带来性能和安全性方面的好处。如果你正在使用Apache HTTP作为前端Web服务器,那么你必须考虑securing that as well。
默认的Tomcat配置可能会暴露敏感信息,这有助于黑客为对应用程序进行攻击做准备。
以下内容在Tomcat 7.x、UNIX环境上经过测试。
受众
这篇文章适用于中间件管理员、应用程序支持、系统分析师或任何希望学习Tomcat加固和安全性的人。
必须对Tomcat和UNIX command有良好的了解。
注意事项
我们需要一些工具来检查HTTP头进行验证。你可以通过以下两种方式进行。
如果是测试面向互联网的应用程序,则可以使用以下HTTP头工具进行验证。
对于内部网络应用程序,你可以使用Google Chrome、Firefox开发者工具。
作为最佳实践,你必须备份你要修改的任何文件。
在本指南中,我们将Tomcat安装文件夹称为$tomcat。
让我们开始进行加固和安全性程序。
移除服务器横幅
从HTTP头中移除服务器横幅是加固的第一步之一。
服务器横幅会暴露出你正在使用的产品和版本,从而导致信息泄露的漏洞。
默认情况下,由Tomcat提供的页面将显示如下。
让我们从Server头中隐藏产品和版本详细信息。
- 进入$tomcat/conf文件夹
- 使用vi编辑server.xml
- 在
Connector port
中添加以下内容
Server =” “
例如:
- 保存文件并重新启动Tomcat。现在,当你访问应用程序时,你应该在Server头中看到一个空值。
使用安全管理器启动Tomcat
安全管理器可以保护你免受运行在浏览器中的不受信任的小程序的攻击。
使用安全管理器启动Tomcat要比不使用安全管理器更好。Tomcat在Tomcat Security Manager中有优秀的文档。
好处是你不需要更改任何配置文件。只需要以–security
参数启动tomcat即可。
[root@yaoweibin 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@yaoweibin bin]#
启用SSL/TLS
通过HTTPS提供网络请求是保护客户端和Tomcat之间数据的重要手段。为了使您的Web应用程序通过HTTPS访问,您需要实现SSL证书。
假设您已经准备好具有证书的密钥库,您可以在server.
xml文件的Connector port
部分中添加以下行。
SSLEnabled="true" scheme="https" keystoreFile="ssl/bloggerflare.jks" keystorePass="chandan" clientAuth="false" sslProtocol="TLS"
将密钥库文件名和密码更改为您自己的。
如果您需要有关密钥库和CSR过程的帮助,请参考this guide。
强制使用HTTPS
只有在启用SSL时才适用。否则,它将破坏应用程序。
一旦您启用了SSL,最好将所有HTTP请求重定向到HTTPS,以便用户与Tomcat应用程序服务器之间进行安全通信。
- 进入$tomcat/conf文件夹
- 使用
vi
修改web.xml
- 在
语法之前添加以下内容
Protected Context
/*
CONFIDENTIAL
- 保存文件并重新启动Tomcat
向Cookie添加安全和HttpOnly标志
如果没有安全的cookie,可能会窃取或篡改Web应用程序会话和cookie。这是在响应头中注入的标志。
通过在web.xml文件的session-config
部分添加下面的行来实现。
true
true
配置截图:
保存文件并重新启动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文件夹下
[root@yaoweibin 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@yaoweibin webapps]#
更改关闭端口和命令
默认情况下,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中修改以下内容
8005 – 更改为其他未使用的端口
SHUTDOWN – 更改为复杂的内容
例如-
替换默认的404、403、500页面
默认的未找到、禁止访问、服务器错误页面会暴露版本详细信息。
让我们来看一下默认的404页面。
为了减轻风险,你可以首先创建一个通用的错误页面,并配置web.xml将其重定向到通用错误页面。
- 进入$tomcat/webapps/$application
- 使用
vi
编辑器创建一个error.jsp文件
错误页面 这是一个错误!
- 进入$tomcat/conf文件夹
- 在web.xml文件中添加以下内容。确保在
</web-app>
语法之前添加
404 /error.jsp 403 /error.jsp 500 /error.jsp
- 重新启动tomcat服务器进行测试
好多了!
你也可以为java.lang.Exception
做同样的操作。这将有助于在出现任何Java lang异常时不暴露Tomcat版本信息。
只需在web.xml
中添加以下内容,然后重新启动tomcat服务器。
java.lang.Exception /error.jsp
希望上述指南能给你保护Tomcat的思路。如果你想了解更多关于Tomcat管理的信息,请查看这个online course。
同时,学习如何在这里configure WAS to stop asking for password during shutdown。