vlambda博客
学习文章列表

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

Chapter 5. Securing Tomcat 7

互联网在 21 世纪掀起了一场革命;它为我们提供了在几秒钟内收集信息的能力,而以前收集信息需要几个月的时间。这也引发了对信息隐私的安全担忧,并提出了通过 Internet 保护信息的要求。

每天,新技术都在不断涌现,以改善应用程序的 Internet 使用。随着市场上的这些技术,黑客和其他社区访问安全信息成为一项棘手的工作。

在本章中,我们将讨论以下主题:

  • Tomcat 安全权限

  • 卡塔利娜房产

  • Tomcat 7 上的 SSL 实现

Tomcat Manager

安全性是 IT 公司的主要关注点,因此每个公司都创建了一个单独的 IT 安全管理部门。他们的主要职责是确保网络、Web 和操作系统基础设施方面没有漏洞。

我们应该从 Tomcat 网站或任何安全的已知主机下载 Tomcat。如果我们从未知来源下载恶意软件,Tomcat 就有可能附带恶意软件。下载完成后,使用 MD5/PGP 验证 Tomcat 的完整性。对于 Linux,MD5 可以通过 Open Specification for Pretty Good Privacy (OpenPGP< /strong>)。这是生产系统过程中必须的。

Tomcat Manager


安全性是 IT 公司的主要关注点,因此每个公司都创建了一个单独的 IT 安全管理部门。他们的主要职责是确保网络、Web 和操作系统基础设施方面没有漏洞。

我们应该从 Tomcat 网站或任何安全的已知主机下载 Tomcat。如果我们从未知来源下载恶意软件,Tomcat 就有可能附带恶意软件。下载完成后,使用 MD5/PGP 验证 Tomcat 的完整性。对于 Linux,MD5 可以通过 Open Specification for Pretty Good Privacy (OpenPGP< /strong>)。这是生产系统过程中必须的。

Tomcat security permissions


Apache Tomcat 带有良好的安全启用选项,但每个环境都有自己的安全要求,具体取决于应用程序的使用情况。例如,银行网站需要高度的安全性,而基于用户的应用程序则需要很少的安全性。

在 Tomcat 7 中,默认权限配置在 TOMCAT_HOME/Conf 目录中。安全性是构成系统的四个文件的集体努力。让我们讨论每个文件及其功能。

catalina.properties

该文件包含包的访问、包定义、通用加载器、共享加载器以及JAR文件列表等相关信息,这些信息在Tomcat启动时不需要扫描。它有助于提高性能,因为将太多 JAR 文件添加到跳过列表会提高内存消耗。如果要添加任何常见的 JAR,则必须在 catalina.properties 下定义它。

在生产环境中,一些库 JAR 在许多 Tomcat 实例之间共享,在这种情况下,我们可以使用 shared loader 参数。默认情况下,Tomcat 7 策略附带以下软件包以增强安全性。我们可以根据应用程序的要求和使用类型自定义策略。以下是 catalina.properties 中使用的关键语法:

package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache. tomcat.,org.apache.jasper.
package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote., org.apache.tomcat.,org.apache.jasper
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar, ${catalina.home}/lib,${catalina.home}/lib/*.jar
tomcat.util.scan.DefaultJarScanner.jarsToSkip= \bootstrap.jar,commons-daemon.jar,tomcat-juli.jar, \annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar, \catalina.jar,catalina-ant.jar,catalina-ha.jar, catalina-tribes.jar,\jasper.jar,jasper-el.jar,ecj-*.jar, \tomcat-api.jar,tomcat-util.jar,tomcat-coyote.jar, tomcat-dbcp.jar,\tomcat-i18n-en.jar,tomcat-i18n-es.jar, tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,\ commons-beanutils*.jar,commons-collections*.jar,commons-dbcp*.jar, \commons-digester*.jar,commons-fileupload*.jar,commons-logging*.jar, \commons-pool*.jar,\ant.jar,jmx.jar,jmx- tools.jar,\xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar, \dnsns.jar,ldapsec.jar,localedata.jar,sunjce_provider.jar,
sunpkcs11.jar,tools.jar,\apple_provider.jar,AppleScriptEngine.jar, CoreAudio.jar,dns_sd.jar,\j3daudio.jar,j3dcore.jar,j3dutils.jar, jai_core.jar,jai_codec.jar,\mlibwrapper_jai.jar,MRJToolkit.jar, vecmath.jar

catalina.policy

此文件包含运行时使用的 Tomcat 权限详细信息及其部署的应用程序。如果您想从不同目录访问任何系统参数,例如操作系统详细信息、Tomcat 内部代码或 Web 应用程序代码,您可以在此处定义权限。在 Tomcat 7 上基本上可以实现三种权限。下图显示了 Catalina 的不同类型的策略:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

System Code permissions

此策略允许您访问 Java 库,该库需要在运行时由 Tomcat 实例进行验证。以下代码显示为 Java 库授予完全访问权限:

grant codeBase "file:${java.home}/lib/-" {permission java.security.AllPermission;

Note

您可以在 Catalina 中实施更多策略选项,例如系统代码、Catalina 代码和 Web 应用程序权限。

以下几点描述了我们可以在 Tomcat 7 中添加的不同自定义策略:

  • 对 Web 应用程序的文档根目录的读/写访问 (R/W)。

  • 用户对 Web 应用程序目录的读取、写入和删除访问权限。以下屏幕截图显示了不同的选项:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

Catalina Code permissions (Tomcat core permission)

本节包含访问代码的 Tomcat 内部文件权限。它有助于控制 Tomcat 的内部功能。以下策略表明 Catalina/lib 已授予所有权限:

grant codeBase "file:${catalina.home}/lib/-" {permission java.security.AllPermission;

这意味着 Tomcat 拥有访问 lib 文件夹的所有权限。

Note

先前的权限用于 servlet API 及其类加载器,它们在不同的代码之间共享。

以下屏幕截图显示了 Catalina 代码权限:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

Web application permissions

本节包含参考应用程序资源利用率的策略,例如 JVM、JNDI 等。如果启用以下代码,则可以从代码根目录访问Tomcat类:

// grant codeBase "file:${catalina.base}/webapps/examples/ WEB-INF/classes/-" {// };

以下屏幕截图显示了 Web 应用程序权限:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

Note

此策略将从 Web 应用程序的根目录运行。如果要从外部访问它,则需要自定义应用程序。

tomcat-users.xml

此文件包含 Tomcat 的角色和安全密码。

以下屏幕截图显示了 Tomcat 7 的不同角色、用户和密码:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

server.xml

这是Tomcat的主要配置文件,主要包含 Connector port配置。

以下屏幕截图显示了连接器配置,其中 Tomcat 7 在 8080 上运行,超时设置为 20000:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

Enabling Tomcat Manager


默认情况下,Tomcat 管理器在 Tomcat 7 中是禁用的。它是一个非常强大的工具,但如果它落入坏人之手,那么它会给系统管理员或应用程序管理员带来问题。因此,启用具有适当安全性的 Tomcat 管理器非常重要。

How to enable the Tomcat Manager

为了启用 Manager,我们必须编辑 tomcat-users.xml,它位于 TOMCAT_HOME/conf 中。你会看到Tomcat用户被注释掉了,如下图所示:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

取消注释用户并保存文件,然后重新加载 Apache Tomcat 7,如以下屏幕截图所示:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

Note

如果您在生产环境中启用 Tomcat Manager,请确保它只能从内部环境访问,而不能从 DMZ 访问。

Securing Tomcat 7 for production


在本主题中,我们将讨论用于保护 Tomcat 7 的最佳实践。保护 Tomcat 不仅仅意味着 Tomcat,它包括 Tomcat 配置和其他基础设施配置。我们先从 Tomcat 配置开始。

Tomcat settings

保护 Tomcat 7 的方法有多种,具体取决于应用程序的要求和 IT 组织使用的安全策略。

Note

每个组织都有自己的安全策略,IT 管理员在实施 Tomcat 中的安全性时会遵循这些策略。

在 Tomcat 7 中,有不同的配置,需要更改或启用这些配置以保护 Tomcat 的外部环境。让我们讨论一下每种配置及其在实时环境中的用法。

Connector Port

默认情况下,Tomcat 7 使用 HTTP 协议在端口 8080 上运行。众所周知,默认端口,黑客更容易攻击该端口并陷阱服务器。因此,始终建议更改连接器端口以及在 8009 上运行的 AJP 端口,以保护 Tomcat。

Note

连接器在 conf 目录的 server.xml 中配置。

<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

我们可以通过查看 Windows 和 Linux 中的 services 文件来检查不同服务使用的端口。下表详细介绍了 Windows 和 Linux 中 services 文件的位置。此信息对于避免两个服务之间的端口冲突非常有用。

以下屏幕截图显示了各种应用程序使用的不同端口:

操作系统

services 文件的位置

Linux

/etc/services

视窗

C:\Windows\System32\drivers\etc

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

The network administrator is responsible for allocating new ports and updating assigned ports in the previous code, which will be in effect after the recycle.

Slimming of Tomcat application

Tomcat 7 附带了许多内置于软件包中的应用程序和示例。始终建议删除不使用的应用程序包。以下是删除包的优点:

  • 减少 JVM 内存利用率

  • 任何漏洞的机会都会减少,因为不需要的应用程序(库/JAR)不可用

  • 更容易维护应用程序

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

您可以删除任意数量的应用程序,如果 Tomcat 管理器不使用,也可以删除它。

Disable hot deployment

热部署或自动部署是将代码自动部署到应用程序而不回收服务的过程。要禁用热部署,您必须为以下参数编辑 server.xml

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

autoDeploy 更改为 false

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

进行更改后,应用程序将仅在回收后部署到 Web 服务器。

Non-Tomcat settings

在上一节中, Tomcat 设置,我们已经讨论了 Tomcat 级别的配置来实现 Tomcat 7 的安全策略。在实时环境中,使用新的和最新的技术,这些设置不足以应对安全威胁。为了使系统更安全,我们必须保护我们的基础设施。让我们讨论一些保护 Web 基础架构的最佳实践。

Service as a separate user

我们不应该以 root 用户身份运行 Tomcat。相反,创建一个新用户并授予该用户运行 Tomcat 服务器的权限。配置文件也应该有root和用户组的权限,其他目录如 logs,应该有这个用户/组的读/写权限。

Firewall

如果 Tomcat 不是前端应用程序,则应该在内部区域中配置它,并且只有连接器端口(AJP 端口)应该从外部 DMZ 服务器打开。如果在任何情况下,Tomcat 是在前端应用程序中配置的,那么数据库服务器应该放置在具有完全防火墙限制的内部区域中。为了创建强大的防火墙,我们可以使用系统防火墙在操作系统级别启用或禁用端口。您还可以验证防火墙规则是否放置正确。

在 Windows 中,我们可以通过 netsh 命令验证防火墙设置,方式如下:

netsh firewall show state

前面的命令显示防火墙规则的当前状态。

netsh firewall show config

前面的命令显示了防火墙的运行模式状态。以下屏幕截图显示了前两个命令的输出:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

为了添加或删除任何防火墙策略,我们可以运行以下命令:

netsh firewall set opmode enable

前面的命令允许我们编辑配置规则。

以下命令在子网上添加 TCP 端口 8085。因此,此端口可在系统外部访问。

netsh firewall add portopening TCP 8085 HTTP enable subnet

在 Linux 中,我们可以使用 iptables 命令以如下方式验证防火墙设置:

[root@localhost etc]# iptables -L

以下屏幕截图显示了 Linux 环境的防火墙规则。目前,没有定义防火墙规则:

读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

如果我们必须编辑防火墙规则,则需要执行以下命令:

iptables -A INPUT -s 0/0 -i eth0 -d 192.168.1.2 -p TCP -j ACCEPT

前面的命令定义了防火墙规则,它通过 TCP 协议接受从任何地方到目标 192.168.1.2 的所有请求。

Note

有关 DMZ 的更多信息,请访问 http://en.wikipedia.org/wiki /非军事区

Password

我们不应该对应用程序或配置级别使用任何纯文本密码,并且始终使用使用 MD5 或散列算法的加密密码。为了在 Tomcat 中启用加密密码,我们必须遵循一系列步骤。

让我们简要讨论每个步骤,并为 Tomcat 管理器实施密码加密策略。

  1. 1. 我们要在 server.xml Realm部分定义密码加密算法,如下代码行:

    <Realm className= "org.apache.catalina.realm.MemoryRealm"digest="MD5" />
    
    读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

    Note

    我们可以根据操作系统的需求来定义算法,比如SHA、RSA、MD5等等。

  2. 2. 现在进入 tomcat_home/bin并运行以下命令,它将生成加密算法,如下图所示:

    [root@localhost bin]# ./digest.sh -a MD5 secret
    
    读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全
    • 前面的命令可以描述为./digest.sh = script,生成Tomcat realm-a = 使用的算法,目前我们使用的是 MD5 算法。

  3. 3. 复制 MD5 字符串并将 tomcat_user.xml 中的 密码 文本替换为以下代码行:

    <user name="admin" password="5ebe2294ecd0e0f08eab7690d2a6ee69 " roles="manager-gui" />
    
  4. 4. 重新加载Tomcat服务并使用密码登录Tomcat Manager。

    Note

    此处密码不会更改,我们只是更改了存储密码的方法。

SSL configuration on Tomcat 7


Secure Socket Layer (SSL) 是另一种保护数据的方式沟通。它是一种加密协议,其中数据通过安全通道传输。服务器向客户端浏览器发送一个安全密钥,客户端浏览器对其进行解密,然后在服务器和客户端之间进行握手,或者我们可以说这是安全层上的双向握手。

Tomcat 什么时候需要 SSL?

如果您使用 Tomcat 作为前端服务器,SSL 会更有效。如果您使用的是 Apache 或 IIS,则建议在 Apache 或 IIS 服务器上安装 SSL。

Types of SSL certificates

在继续安装 SSL 之前,我们先讨论一下 SSL 证书的两种类型,解释如下:

  • 自签名证书: 此证书用于托管在内部环境中的应用程序的测试目的,无需验证,仅在此数据传输将是安全的。

  • 签名证书: 此证书主要用于需要身份验证且数据应通过安全通道传输的实时外部环境。对于这种证书,我们有各种第三方生成签名证书并将其发送给我们。

Process of installing SSL

安装 SSL 的过程因每个服务器而异,但每个服务器都有某些参数是通用的,用于生成证书签名请求企业社会责任)。生成 CSR 的方法可能会有所不同,但生成 CSR 所需的信息保持不变。下表提供了 CSR 模板:

企业社会责任属性

需要生成哪些 CSR 的域信息

通用名称

定义域名

组织

机构名称

部门

机构部门名称

城市

该组织所在的城市

状态

该组织所在的州

国家

该组织所在的国家

密钥大小

2048(加密位)

Note

通用名称:它是需要为其生成 CSR 的主机名。

密钥大小:它是加密密钥的大小。

让我们在 Tomcat 7 上实时实现 SSL 证书的安装。我们将通过执行以下步骤在 Tomcat 7 中为 host tomcat7packtpub.com 安装 SSL 证书:

  1. 1. 为 tomcat7packtpub.com 创建一个 CSR 模板。

    企业社会责任属性

    需要生成哪些 CSR 的域信息

    通用名称

    tomcat7packtpub.com

    组织

    tomcat7packtpub.com

    部门

    雄猫

    城市

    海德

    状态

    美联社

    国家

    密钥大小

    2048

  2. 2. 我们需要为主机 tomcat7packtpub.com创建CSR。为了创建 CSR,我们需要运行 JAVA_HOME/bin 中的 keytool。以下命令将捕获 CSR 的参数:

    Note

    默认情况下, keytool 将从 JAVA_HOME/bin 执行。但是如果我们设置了 Java 路径,那么您可以从任何地方运行它。

    [root@localhost conf] # keytool -genkey -alias tomcat7 -keyalg RSA -keysize 2048 -keystore tomcat.jks
    
    读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全
  3. 3. 使用以下命令生成 CSR 格式的证书。它将询问密码并将其发送给相应的供应商以创建签名证书。

    [root@localhost conf]# keytool -certreq -alias tomcat7 -file csr. txt - keystore tomcat.jks
    Enter keystore password:
    
  4. 4. 将证书导入以下 Tomcat 密钥库。复制 TOMCAT_HOME/conf中的 tomcat7.jks

    [root@localhost conf] # keytool -import -trustcacerts -alias tomcat7 -file tomcat7packtpub.com.pb7 tomcat7.jks
    

一旦您签署了现在创建的证书,就该更改 Tomcat 配置了。

  1. 1. 打开 server.xml 并更改设置,如以下代码片段所示:

    <Connector port="443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" SSLEnabled="true" clientAuth="false" sslProtocol="TLS" keyAlias="server" keystoreFile="tomcat7.jks" keypass="changeit" />
    
  2. 2. 保存 server.xml并重启Tomcat服务。

  3. 3. 安装完成后,下一步是验证 SSL。您可以使用 URL https://yoursitename https://localhost:8443 访问应用程序。在这里,我们没有创建签名证书,因为它是一项付费服务​​,但我们可以使用 www.gmail。 com 为例,它也使用 SSL。点击 URL,页面加载后,您将看到 SSL 图标。点击查看证书详情,如下截图:

    读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全
  4. 4、点击Details,说明你的证书安装成功,如下图:

    读书笔记《apache-tomcat-7-essentials》保护Tomcat 7的安全

Summary


在本章中,我们讨论了 Tomcat 7 的各种策略及其功能,例如 Catalina 策略和系统级策略。我们还讨论了启用安全性的不同措施及其好处,例如 SSL、实时行业中用于通过更改配置来保护生产环境中的 Tomcat 7 的最佳实践,以及 SSL 实施。

在下一章中,我们将参考 Tomcat 及其组件和解决方案来讨论各种实时问题。