Apache Tomcat 7.x安全加固指南
《Apache Tomcat 7.x安全加固指南》要点: 版本:1.00 日期:2014-1-11 分类:公开 作者:Matthias Luft、Florian Grunow、Hendrik Schmidt 1 引言由于官方尚未发布Tomcat 7的强化指南,ERNW便总结了相关的设置,并制作出本文中列出的清单.尽管有大量的设置可以被应用,但本文旨在提供一些加固办法的基础.可能对操作系统功能造成严重影响的并且需要进行进一步大量测试的设置并未列在该清单中,或者被标记为可选. 我们用“强制”或“可选”标记了此清单中的每个保举设置,用以清楚的表达从我们的角度来看哪个设置是必须的(强制)或者是应该的(可选).“可选”也意味着我们保举你应用此设置,但这可能会影响系统的必需功能. 2 操作与系统平安2.1 补丁与漏洞管理 强制: 必须及时安装与平安相关的Tomcat更新: ? 必需在10天内安装高危或重要优先级的更新和补丁. ? 必需在发布后30天内安装中等优先级的更新和补丁. ? 必需在发布后90天内安装低优先级更新. 有关补丁的可用性和严重性的信息,请参见http://tomcat.apache.org/lists.html#tomcat-announce. 更新可能会影响功效.关于核心/业务方面的Tomcat的更新可能带来的副作用,请查看http://tomcat.apache.org/lists.html#tomcat-announce. 2.2 Tomcat服务的最小权限 强制: 在系统上以低权限运行Tomcat应用程序.创建一个专门的 Tomcat服务用户,该用户只能拥有一组最小权限(例如不允许远程登录).必需检查以最小特权用户身份使用操作系统资源库安装程序的行为,以确保Tomcat不以root /管理员身份运行.必需在配置启动机制的操作系统层级上确保这一点(例如Microsoft Windows上的Windows服务或Unix上的rc脚本): 图一:Windows服务配置 关于平安的服务配置,请参考ERNW Windows加固指南 图二:FreeBSD rc剧本 具体配置与Unix系统和Tomcat版本有关.例如FreeBSD上的Tomcat 7已经不支持配置rc.conf中的用户帐户,因此用户名被硬编码在启动脚本中—这是不保举的.在FreeBSD上,web和应用服务器应该是以www用户身份运行,可参考http://www.freebsd.org/doc/en/books/porters-handbook/using-php.html#WEB-APPS. 以低权限用户身份运行Tomcat可能会影响Tomcat的某些功能.例如,特权端口不可被设置为监听端口.为了办理该问题,可以在系统上使用本地HTTP代理(例如使用Apache的mod_jk模块)或者定义包转发规则,使得进入流量被转发到Tomcat监听的非特权端口. 2.3 限制拜访Tomcat文件夹 可选: Tomcat文件夹只能由tomcat用户本身拜访,尤其是对于目录${tomcat_home}/conf /和${tomcat_home}/webapps. 当不必要通过应用程序服务器自动部署时,标准配置就是将所有Tomcat文件的所有者设置为root,并且所属群组设置为Tomcat.然后用chmod 740仅允许root用户编辑文件并允许Tomcat用户读取文件.例外是,临时和工作目录的所有者应该是Tomcat用户而不是root用户. 该设置会影响自动部署.(参见第8.5小节) 3 治理界面可选 Tomcat的主要管理界面被称为Manager应用程序.尽管保护该应用程序对于Tomcat服务器的平安至关重要,但是该应用程序在许多环境中被发现是非常的暴露的(例如,没有部署网络级限制以及使用弱/默认登录信息).如果可能的话,管理性质的任务应该是在操作系统级别执行(例如使用RDP或SSH),并且避免使用Manager应用程序(另见第8.3小节).如果无法做到,下面小节描述的设置(或许还要考虑跳板机)应该与平安认证机制(另请参见第4小节)和加密传输(参见第6.3小节)结合使用. 3.1 网络层限制 如果要使用Manager应用程序,应该只允许从授权的IP地址拜访其管理界面. 这可以通过在CATALINA_HOME/webapps/manager/META-INF/context.xml文件中的做以下设置来实现.以下设置只允许从本地主机和特定IP地址或IP地址段拜访管理界面: allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1|172.16.16.d{1,3} "/> 也可使用主机名: className="org.apache.catalina.valves.RemoteHostValve" allow=".*.admins.domain.com" /> allow和deny都支持正则表达式(使用java.util.regex) 3.2 最小原则授权 强制: 根据给定的任务,只能赋予相应角色的权限给用户.角色如下,而且要记得只赋予最小权限: ? manager-gui:可以拜访web界面 ? manager-status:只可以拜访“Server Status”页面 ? manager-script: 可以剧本文本界面和“Server Status”页面 ? manager-jmx:可以拜访JMX代理界面和“Server Status”页面 4 认证以下设置一般适用于基于Tomcat的身份验证.但是在大多数环境中,主要是针对Manager应用法式,因此以它来做例子.如果部署的应用法式使用基于Tomcat的认证,那么该应用法式也适用这些设置. 4.1 平安认证 可选: 如果要使用Manager应用法式,则还应该附加额外的身份认证机制.认证机制优先级如下: 1 LDAPS或客户端证书 2 当地(基于消息摘要) 另外,认证过程和与Manager应用程序的通信必须使用SSL来掩护(见下文). 强制: 对于当地和基于证书的身份验证,必须部署账户锁定机制(对于集中式认证,目录服务也要做相应配置).为防止暴力破解,使用的认证域必须放在做了如下配置的锁定域中: 编纂CATALINA_HOME/conf/server.xml文件,并添加配置如下的锁定域: className="org.apache.catalina.realm.LockOutRealm" failureCount="5" lockOutTime="30"> AUTHENTICATION REALM --> 4.2 禁用域 强制: 有几个域不适合用作生产用途,这些域必需被禁用. 打开文件CATALINA_HOME/conf/server.xml,搜索MemoryRealm并禁用之.JDBCRealm也必需被禁用,改用DataSourceRealm.使用大规模安装时,请勿使用UserDatabaseRealm并也将其禁用. 5 会话处置5.1 会话超时 强制 : 所有的web应用程序的会话超时必需设置为20分钟. 可通过编纂CATALINA_HOME/conf/web.xml文件并做以下配置来实现: 20 5.2 HttpOnly标志 强制: Tomcat 7对会话cookie自动启用HttpOnly cookie标志,查看配置以确保该选项为被禁用. 要启用HttpOnly,必需在CATALINA_BASE/conf/context.xml中做如下设置,使之全局应用于所有应用程序: useHttpOnly='true' .../> 在需要通过JavaScript拜访会话cookie的情况下,使用HttpOnly可能会影响应用程序功能.如果应用程序需要通过JavaScript拜访HttpOnly cookie,可以在METAINF/context.xml中一个单独的Context中定义一个异常. 5.3 CSRF防护 强制: 为保护应用程序,必须启用Tomcat的跨站哀求伪造防护.Tomcat 7提供了基本的CSRF防护.可以在CATALINA_BASE/conf/web.xml中配置一个全局过滤器.该过滤器可以被每个使用WEB-INF/web.xml文件的应用程序覆盖. 必需做以下设置: CSRFPreventionFilter /* 有关详细阐明和其他选项,请参阅Tomcat手册:http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CSRF_Prevention_Filter. 使用CSRF防护可能会影响程序功能,必须要牢记这一点,尤其是在应用程序大量使用异步哀求的情况下. 6 网络平安6.1 限制监听网络接口 强制: 不要让连接器(connector)监听服务器上所有可用的网络接口和IP地址,而要让连接器监听指定的网络接口和IP地址. 编纂CATALINA_HOME/conf/server.xml,查看每个Connector并指定正确的IP地址: address="LISTEN_IP_ADDRESS"… 这样可以防止应用程序不测地运行在某个开放的网络接口上. 6.2 限制允许的网络连接 强制: 只开放必需要的Tomcat端口.默认TCP端口是8080和8443.确保在Tomcat和可安装在系统上的现有的包过滤器中正确配置这些端口. 打开CATALINA_HOME/conf/server.xml文件,查看每个Connector的端口配置.移除不必要的端和Connector. 6.3 加密网络连接 强制: 为了保护敏感的应用程序(比如Manager应用程序),必须使用并配置SSL(对于处理敏感数据或提供登录功能的应用程序也是必需的).第一步是创建可信的证书,以避免证书警告,并向终端用户提供一种验证可信连接的办法. 第二步是创建一个证书密钥库(keystore),其中包含CA、服务器证书和相应的私钥.密钥库的密码应按照之前的“保障密码平安”小节中建议来创建. 要启用SSL支持,可以使用以下配置(实际配置取决于给定的平台和要求),并且必需放在CATALINA_HOME/conf/server.xml中: protocol="org.apache.coyote.http11.Http11Protocol" port="8443" scheme="https" secure="true" SSLEnabled="true" sslProtocol="TLS" keystoreFile="path to keystore file" keystorePass="keystore password"/> 通过添加以下暗码套件(cipher suite)至SSL Connector来指定可用的SSL加密方式: ciphers="SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA" … 为了使托管在Tomcat上的所有web应用程序强制使用HTTPS,必须在每个CATALINA_HOME/webapps/$WEBAPP/WEB-INF/web.xml文件里每个security-constraint标签关闭(标签)之前包括以下内容: CONFIDENTIAL 7 Java Runtime7.1 Java SecurityManager 可选: 可用Java SecurityManager限制单个应用程序的功能.$CATALINA_HOME/conf/catalina.policy文件包含了Java SecurityManager使用的平安策略的配置.一旦配置了catalina.policy文件,便可以使用SecurityManager和--security选项启动Tomcat.想了解全面的配置介绍,请参阅官方的Tomcat SecurityManager教程:http://tomcat.apache.org/tomcat-7.0-doc/security-manager-howto.html 因为基本上所有的权限类型(比如拜访单个文件和目录或Java包)都应该根据每个应用程序进行单独配置,所以这会大大增加操作成本.另外,限制过于严格的策略文件会影响应用程序的功能. 7.2 拜访Java包 可选: Tomcat可限制对某些Java包的访问.如果检测到受限制的包被访问,将抛出平安异常. 对Java包做拜访限制,打开$CATALINA_BASE/conf/catalina.properties文件并添加不允许拜访的包至package.access列表. 分析Java import可以列出哪些应用程序必要哪些包.在Unix系统上,可以使用以下例子来实现: grep –R import ${tomcat_home}/webapps/WEBAPP 8 通用设置8.1 确保默认设置的平安 强制: 检查几个默认值以防出现潜在的漏洞.参考第9小节列出的不能变动的默认配置. 8.2 确保关闭(shutdown)端口的平安 强制 : 如果必须要开启使用本地Tomcat系统上的网络端口关闭Tomcat的功能,必须使用难以被猜解出的强暗码. 编辑CATALINA_HOME/conf/server.xml文件并设置关闭暗码: shutdown="NonDeterministicWordSoShutdownPWisNotEasyToGuess"> 如果不需要该功能,必需要将其停用,设置如下: port="-1" shutdown="SHUTDOWN"> 当地管理脚本可将服务器关闭,即使在关闭端口被禁用的情况下. 8.3 移除默认应用法式 强制 : Tomcat可能自带一些默认的web应用程序.如果不是必定需要,必须将它们移除. 移除${tomcat_home}/webapps中所有的默认的web应用程序.必需要移除的应用程序有:ROOT、Documentation、Examples、Host Manager和Manager. Manager应用程序提供管理性质的功能,比如部署应用程序和检索日志信息.这些功能应该使用本地服务器上的命令行来运行.但是,如果这个应用程序是绝对需要的,那它必须用SSL掩护起来. 8.4 自定义差错页面 可选 : 由于默认的错误页面会泄露一些内部信息(比如版本号和堆栈轨迹),所以应该用包含一般错误信息(比如处理您的哀求时出错了)的自定义错误页面取而代之. 每个web应用程序的web.xml文件里应包括以下配置,该文件位于CATALINA_HOME/webapps/$WEB_APP/WEB-INF: 500 /errorpages/error.html java.lang.Throwable /errorpages/error.html 此外,如果Manager应用程序没被移除,必需手动将位于CATALINA_HOME/webapps/manager/WEB-INF/jsp/的错误页面里的“Tomcat 7“版本信息移除. 8.5 禁用自动部署 强制: Tomcat允许在Tomcat运行时自动部署应用程序.这个功能必需被禁用,因为它可能允许部署恶意或未经测试的应用程序. 自动部署由autoDeploy和deployOnStartup属性控制.如果两者是false,只有在server.xml中定义的Context将被部署,并且任何更改都必要重启Tomcat.要禁用自动部署,请在$CATALINA_HOME/conf/server.xml文件中做以下配置: autoDeploy=”false” deployOnStartup=”false” 在托管环境中Web应用法式可能不受信任,也可以设置deployXML属性为false来忽略context.xml,以防给该web应用法式提高权限. 9 附录:默认设置以下列出了不能更改的默认设置,默认情况下这些设置被认为是平安的: server.xml中每个Connector的allowTrace的值要么为空或要么被设为false. 在所有的context.xml文件中,将privileged属性设置为false,除非像Manager应用程序那样必要权限: ? 确保crossContext值为空或被设为false.crossContext值为true可能会导致允许恶意应用程序向受限应用程序发送哀求. ? 确保allowLinking值为空或被设为false.allowLinking值为true可能会导致目录遍历和源代码泄露漏洞的发生. ? 制止对默认的servlet的写入. ? 在web.xml文件中设置DefaultServlet的read-only为true.如果该值是false,将会允许客户端删除或修改服务器上的静态资源并上传新的资源.一般在没有认证的情况下不该该修改该值. 禁用显示列表 ? 设置DefaultServlet的listings为false.这不仅仅是因为允许显示目录列表被认为是不平安的,而且还因为生成具有数千个文件的目录列表会消耗大量的CPU资源,相当于被DDoS攻击. 当RECYCLE_FACADES选项设置为true时,Tomcat会回收哀求间会话外观(session facade).这将导致哀求间的信息泄漏.默认情况下,此参数未被设置.确保使用的启动脚本不包含以下内容: ? -Dorg.apache.catalina.connector.RECYCLE_FACADES = false 允许在Tomcat上指定不同的路径分隔符,可能会允许攻击者拜访应用程序,该行为本该被代理程序(比如mod_proxy)阻止.默认情况下,此参数未被设置. ? 确保正在使用的启动脚本不包括以下内容: ? -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH = FALSE ? -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = FALSE 允许指定自定义header状态消息,使攻击者也能够插入header.这可能会导致XSS漏洞的发生.默认情况下,此参数未被设置. ? 确保使用的启动脚本不包括以下内容: ? -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = false ? -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = FALSE 允许自定义header状态消息,使攻击者也能够插header.这可能会导致XSS漏洞的发生.默认情况下,此参数未被设置. ? 确保使用的启动脚本不包括以下内容: ? -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = false 本文由看雪翻译小组 SpearMint 编译,起源payatu@Rashid Feroze 转载请注明来自看雪社区 欢迎参与《Apache Tomcat 7.x安全加固指南》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |