Tomcat安全配置规范
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。为避免Tomcat配置导致网络安全风险,现总结以下网络安全配置:
第一章 Tomcat启动安全配置
1.1 屏蔽tomcat默认管理控制台和管理账号密码
安全基线项目名称:Tomcat管理控制台及帐号管理安全基线要求项
安全基线项说明:
避免tomcat管理控制台对外开放,完全禁用对manager应用程序的访问,删除tomcat-users.xml禁止管理控制账号。如果有需要开启manager应用程序的访问,应该限制访问的IP地址为内部可信的地址,管理控制账号应按照用户角色配置,避免不同用户间共享账号。
安全配置步骤:
1、删除tomcat管理控制台和用户配置文件,参考如下配置操作
删除 tomcat/conf/tomcat-users.xml 配置文件用户与密码。
删除 tomcat/webapps/ 下manager和host-manager两个应用目录。
2. 如果需要保留tomcat管理控制台,则按如下操作:
(1)重命名tomcat管理控制台的目录,manager重命名<new_manager>,并且限制登陆内部IP地址,默认本机可访问:
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
(2)tomcat-users.xml中配置用户名和对密码进行摘要的密文密码以及角色信息。
Realm标签可以放在Engine、Host或Context标签内部,用于提供用户认证信息。其中,密码可以使用明文或摘要式密码的形式
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"
digest="MD5"> </Realm>
1.2 删除tomcat不使用的样例文件和doc文件
安全基线项目名称:删除Tomcat冗余文件安全基线要求项
安全基线项说明:
删除Tomcat运行不需要的doc文件和样例文件等文件,这些文件对tomcat运行没有作用,增加了安全风险,使用tomcat应该删除这些冗余文件。
安全配置步骤:
1、可以直接删除下列Tomcat冗余目录及文件
删除 tomcat/webapp/doc/* 目录及该目录下的文件,该目录下是tomcat操作介绍文档。
删除 tomcat/webapp/examples/* 目录及该目录下的文件,该目录下是tomcat的程序样例文档。
删除 tomcat/webapp/ROOT/* 目录及该目录下的文件,ROOT是默认根目录,即访问 localhost:8080/,包含有关WEB的通用访问配置等。
2、可根据情况删除下来Tomcat冗余目录及文件,
根据规则1.1需要判断是否删除 tomcat/webapps/ 下manager和host-manager两个应用目录。host-manager和manager删除后会有日志告警,要消除,需要做如下操作:
tomcat/conf/logging.properties中删除部分配置:
- handlers删除两项:
3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, |
- 下面该两项相关的也都删掉(注掉即可):
# 3manager.org.apache.juli.AsyncFileHandler.level = FINE # 3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs # 3manager.org.apache.juli.AsyncFileHandler.prefix = manager. # 3manager.org.apache.juli.AsyncFileHandler.maxDays = 90 # 3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8 # 4host-manager.org.apache.juli.AsyncFileHandler.level = FINE # 4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs # 4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager. # 4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 90 # 4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8 |
1.3 禁用tomcat的SSI和CGI功能
安全基线项目名称:禁用SSI和CGI不安全配置基线要求项
安全基线项说明:
SSI全称(Server Side Includes)是在HTML静态页面中使用的指令,当页面在服务端执行的时候是可以进行服务端解析的。在Tomcat里面实现SSI支持使用的是一个Servlet和一个Filter。CGI(通用网关接口)定义了一种 Web 服务器与外部内容生成程序的交互方式,这里所说的外部内容生成程序通常被称为 CGI 程序或 CGI 脚本。CGI 支持是通过 servlet 类 org.apache.catalina.servlets.CGIServlet 来实现的,一般对应的URL配置是“/cgi-bin/*”。Tomcat默认是不启用SSI和CGI。因为 SSI 和 CGI 都可以用于执行 Tomcat JVM 外部的程序,可以绕过 catalina.policy 中配置的安全策略,存在安全风险。
安全配置步骤:
Apache Tomcat版本9.0.x中禁用了SSI配置、CGI Servlet和enableCmdLineArguments选项。如果启用这些功能,存在运行外部程序的安全风险。
注释web.xml中的SSL配置:
<!-- NOTE: An SSI Filter is also available as an alternative SSI <servlet> <servlet-name>ssi</servlet-name> <servlet-class> org.apache.catalina.ssi.SSIServlet </servlet-class> <init-param> <param-name>buffered</param-name> <param-value>1</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>expires</param-name> <param-value>666</param-value> </init-param> <init-param> <param-name>isVirtualWebappRelative</param-name> <param-value>0</param-value> </init-param> <load-on-startup>4</load-on-startup> </servlet> --> |
注释web.xml中的CGI配置:
<!-- <servlet> <servlet-name>cgi</servlet-name> <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>cgiPathPrefix</param-name> <param-value>WEB-INF/cgi</param-value> </init-param> <load-on-startup>5</load-on-startup> </servlet> --> |
1.4 tomcat的shutdown端口和Connector端口安全配置
Tomcat提供一个默认监听端口8005,通过本地TCP/IP连接到该端口,发送shutdown请求命令,从而终止tomcat进程。如果黑客知道这个端口开启,很容易被用来关闭服务。Connector默认配置端口8080是http请求监听端口,8443默认是https请求监听端口,使用这些默认端口,很容易成为黑客的攻击对象,增加被攻击的风险。
- 关闭或修改shutdown默认端口号并设置强密码
如果启用shutdown,修改tomcat/conf/server.xml中的shutdown端口为非默认值,并设置,例如<Server port="8005" shutdown="SHUTDOWN">修改为<Server port="8123" shutdown="SHUTDOWN-Command">
<Server port="8123" shutdown="SHUTDOWN-Command"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> …… |
<Server port="8123" shutdown="SHUTDOWN-Command">配置表示将服务器的端口号设置为8123,并设置关闭服务器的命令为"SHUTDOWN-Command",该命令应该满足强密码原则。
禁用关闭功能:设置 port 属性为 -1,关闭shutdown port。
- 修改Connector默认端口号
修改tomcat/conf/server.xml中的所有<connector>标签中端口配置为非默认值,对于每个找到的<connector>标签,将端口号修改为您想要的新值。例如,将<Connector port="8080">更改为<Connector port="8081">:
# port默认为8080,修改为8081 # redirectPort默认为8443,修改为9443 <Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol connectionTimeout="20000" redirectPort="9443" /> <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" maxParameterCount="1000" /> |
1.5 以安全管理模式运行Tomcat
安全基线项目名称:以安全管理模式运行tomcat要求项
安全基线项说明:
通过-security参数启动tomcat,则tomcat以安全管理模式运行,会自动加载tomcat/conf/Catalina.policy安全策略文件,服务可以根据需要对tomcat应用程序读取系统环境变量和执行敏感操作等进行授权。
除此之外,为了进一步增加安全性,建议使用专用用户(如tomcat或nobody用户)来启动Tomcat,并对Tomcat安装目录下的所有文件的属主和属组都设置为指定用户
安全配置步骤:
- 修改policy安全策略文件,增加需要的安全策略:
java.io.FilePermission - 控制对文件和目录的读/写/执行访问 java.net.SocketPermission - 控制网络套接字的使用 java.net.NetPermission - 控制多播网络连接的使用 java.lang.reflect.ReflectPermission - 控制使用反射来进行类内省 java.security.SecurityPermission - 控制对安全方法的访问 |
- 通过-security参数启动tomcat:
Linux环境:
> tomat_home/bin/start.sh -security
> tomat_home/bin/startup.sh -security
Windows环境:
> %tomat_home%\bin\catalina.bat start -security
> %tomat_home%\bin\ startup.bat -security
1.6 配置安全检查Security Lifestyle Listener
安全基线项目名称:配置Security Lifestyle Listener要求项
安全基线项说明:
SecurityListener监听器,在启动tomcat时做一些安全检查,如过检查不通过则会停止tomcat启动,tomcat默认是不启用SecurityListener,需要去除该注释,通过配置 org.apache.catalina.security.SecurityListener,您可以实现自定义的安全策略。例如,您可以定义哪些用户可以访问特定的 web 应用程序,或者限制对某些 URL 资源的访问。
安全配置步骤:
在 Tomcat 的配置文件(例如 server.xml)中,您可以通过添加以下属性来配置 org.apache.catalina.security.SecurityListener:
<Listener className="org.apache.catalina.security.SecurityListener" securePagesWithPragma="true" browserSecurePages="true" minimumUmask="0007" appContext-root-relative="web-app/security-config.xml"/> |
其中,一些属性说明如下:
className:指定 org.apache.catalina.security.SecurityListener 的完全限定名。
securePagesWithPragma:如果设置为 true,则在每个受保护的页面上使用 Pragma 标头。这可以防止某些浏览器重定向到不受保护的页面。
browserSecurePages:如果设置为 true,则要求每个浏览器必须通过 SSL 进行通信。
minimumUmask:检查umask是否符合指定的最小限制(若未指定,则默认是0007)
appContext-root-relative:指定一个相对于应用程序上下文根目录的 XML 配置文件路径。该文件包含有关安全限制的详细信息。
1.7 配置STRICT_SERVLET_COMPLIANCE
安全基线项目名称:配置Security Lifestyle Listener要求项
安全基线项说明:
将STRICT_SERVLET_COMPLIANCE配置为true是Apache Tomcat的一个选项,用于更严格地遵循Servlet规范。当设置为true时,Tomcat将按照Servlet规范的要求执行某些操作,包括处理请求和生成响应。
将STRICT_SERVLET_COMPLIANCE设置为true可能会导致Tomcat在处理请求时的一些行为变化,包括但不限于以下几点:
- 对于GET请求,Tomcat将遵循Servlet规范中关于处理GET请求的规则,包括处理URL中的查询参数和路径参数。
- 对于POST请求,Tomcat将遵循Servlet规范中关于处理POST请求的规则,包括解析请求体中的表单数据和多部分表单数据。
- 在生成响应时,Tomcat将遵循Servlet规范中关于设置响应头、响应状态码和响应体的规则。
安全配置步骤:
- 方法一要设置STRICT_SERVLET_COMPLIANCE为true,您可以在Tomcat的配置文件(通常是xml或server.xml)中添加以下配置:
xml<Context ...> |
请注意,具体的配置位置可能因Tomcat版本而异。此外,确保在重新启动Tomcat之前进行配置更改。
- 方法二在启动脚本中增加STRICT_SERVLET_COMPLIANCE设置,例如Linux环境在sh脚本中启动tomcat之前增加:
CATALINA_OPTS=“$CATALINA_OPTS -Dorg.apache.catalina. STRICT_SERVLET_COMPLIANCE=true”
CATALINA_OPTS是Tomcat中用于设置Java运行时选项的变量
1.8 配置内存泄露监听器JreMemoryLeakPreventionListener
安全基线项目名称:配置JreMemoryLeakPreventionListener监听器要求项
安全基线项说明:
JreMemoryLeakPreventionListener的作用是在Tomcat初始化时使用系统类加载器预先加载一些JRE的类和设置URLConnection缓存禁用属性,以避免线程上下文类加载器是Tomcat自定义的WebappClassLoader时,加载JRE导致的内存泄漏和URLConnection缓存导致的锁文件问题
安全配置步骤:
JreMemoryLeakPreventionListener的配置是在Tomcat的配置文件(例如server.xml)中进行的,配置方法如下:
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> |
只需在相应的<Listener>标签中添加className属性,并将属性值设置为org.apache.catalina.core.JreMemoryLeakPreventionListener 即可。
第二章 日志与文件目录配置操作
2.1 确保tomcat日志配置正确
安全基线项目名称:Tomcat审核登录安全基线要求项
安全基线项说明:
Tomcat的AccessLogValve用于创建日志文件,格式与标准的web服务器日志文件相同,设备应配置日志功能,对用户登录进行记录,记录内容包括用户登录使用的账号,登录是否成功,登录时间,以及远程登录时,用户使用的IP地址。
安全配置步骤:
编辑server.xml配置文件,在<HOST>标签中增加记录日志功能,将以下内容为tomcat9的默认配置:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> |
AccessLogValve可以配置的属性有:
className:必须被设置成org.apache.catalina.valves.AccessLogValve。
directory:存放日志文件的目录,可以是相对路径或者绝对路径,在tomcat下面有个logs文件夹,那里面是专门放置日志文件的,也可以修改为其他路径。确保该目录及文件只能由tomcat用户读写和执行。
prefix:日志文件前缀。
suffix:日志文件后缀。
pattern:日志输出模式,common方式时,将记录访问源IP、本地服务器IP、记录日志服务器IP、访问方式、发送字节数、本地接收端口、访问URL地址等相关信息在日志文件中。日志记录的模式为"%h %l %u %t "%r" %s %b",这是记录远程主机、远程用户、用户代理、请求方法、请求成功以及字节发送量等信息。
fileDateFormat:用来格式化日期,例如:"yyyy-MM-dd"。
resolveHosts:是否将IP地址解析为主机名。
2.2 tomcat日志配置文件处理器和日志级别
安全基线项目名称:Tomcat日志配置文件处理器和日志级别不低于FINE要求项
安全基线项说明:
Tomcat的conf目录下有一个logging.properties文件用于配置日志处理器(handler)、日志打印级别和设置控制台。logging.properties配置属性如下:
handlers:定义日志处理器。
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level:设置日志级别。
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers:指定日志处理器。
java.util.logging.ConsoleHandler.level:设置控制台
安全配置步骤
在logging.properties配置日志处理器(handler),常用日志处理器有ConsoleHandler为控制台日志处理器,FileHandler为文件日志处理器,以下AsyncFileHandler用于异步地将日志信息写入文件。:
handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler |
指定日志处理器的不同的日志级别,级别不低于FINE:
1catalina.org.apache.juli.AsyncFileHandler.level = FINE 1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. 1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90 1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8 |
以下\Tomcat的日志等级从低到高依次为:SEVERE(最高级别)> WARNING > INFO > CONFIG > FINE > FINER(精心)> FINEST(所有内容,最低级别):
FINEST:表示最详细的日志输出,包括debug日志信息。
FINER:详细信息,通常只在诊断问题时使用。
FINE:详细信息,通常只在诊断问题时使用。
CONFIG:配置信息。
INFO:信息性消息,如启动和关闭事件。
WARNING:警告信息,如未找到文件或请求处理过程中出现异常。
SEVERE:严重错误信息,如系统无法启动或关闭
2.3 设置tomcat合理的文件目录权限
安全基线项目名称:设置tomcat文件目录合理的权限要求项
安全基线项说明:
Tomcat相关目录及文件权限建议项如下,应用可以根据需要进行设置:
文件目录 | 目录权限 | 文件权限 | 描述 |
tomcat/conf | 700 | 600 | Conf目录下配置文件只有tomcat用户可以修改 |
tomcat/bin | 700 | *.sh:500 | bin目录下的sh执行文件权限为500 |
其他:600 | Bin目录下其他非可执行文件权限为600 | ||
tomcat/work | 700 | 700 | 存放tomcat运行时的编译后文件 |
tomcat/temp | 700 | 700 | 临时目录权限700 |
tomcat/logs | 700 | *.log:600 | 正在写入的日志文件600 |
其他:400 | 转储的日志文件为400 | ||
tomcat/webapps | 550 | 440 | 程序文件只需要只读权限 |
第三章 认证与协议安全配置
3.1 禁用WebDAV协议功能
安全基线项目名称:禁止Tomcat开启WebDAV功能
安全基线项说明:协议功能安全基线要求项
WebDAV是一种基于HTTP协议的通信协议,用于在网络上进行文档管理和版本控制,Tomcat默认是支持WebDAV的,且默认为禁用状态,可以开启Tomcat的webdav作为文件存储服务器。如果WebDAV配置不当,攻击者就有可以匿名对网站内容进行修改、删除及上传任意文件等操作,这可能会导致攻击者完全控制目标WEB服务器。
安全配置步骤:
搜索web.xml中是否有webdav的servlet配置,如果有则删除配置:
<web-app> ... <servlet> <servlet-name>webdav</servlet-name> <servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class> <init-param> <param-name>mount</param-name> <param-value>/webdav</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ... </web-app> |
上述代码将创建一个名为webdav的Servlet,并将其映射到路径/webdav,启动tomcat可以通过访问http://localhost:{port}/webdav来访问Tomcat的WebDAV服务了。
3.2 信息传输的connector配置安全
安全基线项目名称:信息传输的connector配置安全要求
安全基线项说明:
https协议提供身份认证、数据加密和完整性保护等安全特性,在Connector元素中配置SSL连接是否开启,使用什么协议,连接的证书,线程配置等都要符合最佳实践。
安全配置步骤:
- 要配置Apache Tomcat的Connector以启用SSL,执行以下步骤:
(1)获取SSL证书:您需要获取有效的SSL证书。您可以从受信任的证书颁发机构(CA)购买SSL证书,或者您也可以使用自签名证书进行测试目的。例如使用JDK自带的keytool工具生成一个证书
JAVA_HOME/bin/keytool -genkey –alias tomcat –keyalg RSA
-keystore /path/to/my/keystore
(2)配置SSL证书:将SSL证书添加到Tomcat的配置文件中。默认情况下,Tomcat在conf目录下的server.xml文件中配置Connector。
在server.xml文件中找到Connector配置部分,然后添加以下属性到要启用SSL的Connector中:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="/path/to/keystore" keystorePass="keystore_password" clientAuth="false" sslProtocol="TLS"/> |
在上面的配置中,您需要将/path/to/keystore替换为您实际的密钥库文件路径,并将keystore_password替换为密钥库文件的密码。添加SSLEnabled属性并设置为"true",表示启用SSL连接。
(3)配置密钥库和证书:如果您使用自签名证书或自定义证书,您还需要配置Tomcat使用正确的密钥库和证书。您可以将它们添加到Tomcat的conf目录下的server.xml文件中。
(4)配置正确scheme和secure,scheme属性用于设置协议的名称,在request.getScheme()时返回。默认值为"http",如果设置为"https",则表示该连接是SSL连接。secure属性用于指示是否调用request.isSecure()返回true。如果设置为true,表示该连接是SSL连接,需要使用安全认证。默认值为false。如果同时设置了scheme和secure属性,那么只有secure属性生效,因为secure属性是用于指示连接是否安全的标志。
- 配置SSLHostConfig的SSL连接为安全协议:
在<SSLHostConfig>元素中指定安全协议protocols:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="100" compression="on" scheme="https" SSLEnabled="true" secure="true" defaultSSLHostConfigName="test.test"> <SSLHostConfig hostName="test.test" protocols="TLSv1.2, TLSv1.3"> <Certificate certificateFile="conf/cert.pem" certificateKeyFile="conf/privkey.pem" certificateChainFile="conf/chain.pem"/> </SSLHostConfig> </Connector> |
在这个样例中,SSLHostConfig被用来配置一个名为test.test的主机,使用TLSv1.2, TLSv1.3协议。
- 配置安全的加密套件
通过在<Connector>元素中添加cipherSuite属性,您可以指定Tomcat使用的加密套件。请确保您选择的加密套件与您的应用程序和服务器环境兼容。要配置Apache Tomcat以使用加密套件(cipher suite),您需要修改Tomcat的SSL配置文件。以下是一种常见的方法来配置Tomcat以使用特定的加密套件。
(1)找到<Connector>元素:在server.xml文件中,找到<Connector>元素,它定义了Tomcat的连接器配置。
(2)添加cipherSuite属性:在<Connector>元素中添加一个cipherSuite属性,并指定您想要使用的加密套件的名称。例如,要使用TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256加密套件,您可以这样设置:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="/path/to/keystore" keystorePass="keystore_password" clientAuth="false" sslProtocol="TLS" cipherSuite="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"/> |
请注意,您需要根据您的具体情况修改密钥库文件路径和密码,密码为加密口令(keystoreFile和keystorePass)。 (3).保存并关闭文件:保存对server.xml文件的更改,并关闭该文件。
以上步骤是https连接的安全配置要求。在实际部署中,您还需要考虑其他安全性设置,例如禁用SSL版本较旧的协议,确保遵循最佳实践。
3.3禁止使用不安全的Realms
安全基线项目名称:realms配置认证安全要求
安全基线项说明:
realms是Tomcat中用于提供安全认证的组件,它可以与各种数据源(如关系型数据库、LDAP目录服务器等)集成,以提供用户信息。Tomcat中不安全的realms主要包括以下几种:
MemoryRealm:从tomcat-user.xml中加载数据,数据变化时,需要重启Tomcat,不适用产品。
JDBCRealm:在用户认证鉴权时总是使用单线程工作,不适用产品。
UserDatabaseRealm:不适合大规模系统,只适合小型系统(若少量用户认证场景,可以使用此Realm)。
此外,不安全的realms还有JAASRealm等。在产品使用中,要避免使用不安全的realms,选择安全的Realm,如DataSourceRealm。
安全配置步骤:
以数据源域DataSourceRealm安全配置为例:
DataSource域和JDBCRealm 域的两者的不同是访问数据库的方式不一样:DataSourceRealm通过JNDI DataSource 来访问数据库;而JDBCRealm通过JDBC 驱动程序来访问数据库。DataSource域配置步骤︰
数据源的配置数据源的配置涉及修改server.xml文件。创建一个名为 jdbc/MyDB 的 DataSource,需要在server.xml中<GlobalNamingResources>元素下加入<Resource>元素:
<GlobalNamingResources> <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource" driverClassName="org.h2.Driver" url="jdbc:h2:tcp://localhost/&#126;/test" username="sa" password="sa" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/> </GlobalNamingResources> |
DataSourceRealm是Apache Tomcat服务器中的一个重要组件,它用于通过JNDI数据源进行身份验证和授权。以下是DataSourceRealm配置的样例:
<Realm className="org.apache.catalina.realm.DataSourceRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mydatabase" userTable="users" userNameCol="username" userCredCol="password" globalUsersOnly="true"/> |
配置属性介绍:
className:指定使用org.apache.catalina.realm.DataSourceRealm类。
driverName:指定JDBC驱动程序的名称。
connectionURL:指定连接数据库的URL。
userTable:指定存储用户信息的数据库表名称。
userNameCol:指定用户名所在的列名。
userCredCol:指定用户密码所在的列名
第4章 设备其他配置操作
4.1 会话管理安全配置
安全基线项目名称:会话管理安全配置要求项
安全基线项说明:
omcat中的会话管理是Web应用程序中一个重要的部分。会话配置主要是配置会话超时时间、是否启用会话跟踪以及会话数据存储方式等。
安全配置步骤参考:
- 配置会话超时时间:
在Tomcat中,会话超时时间可以通过<session-config>元素进行配置。在Web应用程序的web.xml文件中,添加以下内容:
<session-config> <session-timeout>10</session-timeout> </session-config> |
上述配置将会话超时时间设置为10分钟,一般会话超时设置该值,可以避免资源长时间占用。当会话超时后,用户的会话数据将被清除。
- 禁用会话跟踪:
在Tomcat中,会话跟踪可以通过<track-states>元素进行配置。在Web应用程序的web.xml文件中,添加以下内容:
<track-states> <track-state private="false"/> </track-states> |
上述配置将启用会话跟踪。如果将private属性设置为true,则将会话状态信息存储在单独的会话数据文件中,以保护敏感数据。
4.2 配置CorsFilter限制跨域访问
安全基线项目名称:配置CorsFilter限制跨域访问要求项
安全基线项说明
Tomcat上配置跨域资源共享(CORS),跨域资源共享(CORS)是一种允许当前域的资源被其他域的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy),浏览器会禁止这种跨域请求。
安全配置步骤参考:
(1)在web.xml中的<filter>标签中添加以下内容,其中<filter-name>是您为CORS过滤器选择的名称,<filter-class>是CORS过滤器的完全限定类名:
<filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> </filter> |
(2)在<filter-mapping>标签中,将<filter-name>与您想要进行CORS配置的URL模式进行映射。例如,如果您希望所有请求都受到CORS过滤,可以添加以下内容:
<filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
如果您只想为特定的URL模式添加CORS支持,可以更改<url-pattern>的值为您想要的URL模式。
(3)在<filter>标签中添加以下属性,这些属性定义了CORS的配置选项:
<init-param> <param-name>cors.allowed.origins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET,POST,PUT,DELETE,OPTIONS</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</param-name> <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> </init-param> <init-param> <param-name>cors.support.credentials</param-name> <param-value>true</param-value> </init-param> |
这些参数分别定义了CORS允许的来源、方法、请求头和暴露的响应头,以及是否支持凭据(例如,cookies)。您可以根据您的需求修改这些参数的值。
4.3 配置错误页面重定向
安全基线项目名称:Tomcat错误页面安全基线要求项
安全基线项说明:
Tomcat错误页面重定向,默认错误页面会泄露服务器相关信息,增加被攻击的风险。
安全配置步骤参考:
- 在xml文件中找到<error-page>元素。在这个元素内,你可以配置不同的HTTP状态码或异常的错误页面,例如404配置:
<error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> …………… <error-page> <exception-type>java.lang.Exception</exception-type> <location>/ error.html</location> </error-page> |
在这个例子中,当发生404错误时,Tomcat将会重定向到/error/404.html页面。
同样,你可以配置其他HTTP状态码或异常的错误页面。例如,对于500错误:
<error-page> <error-code>500</error-code> <location>/error/500.html</location> </error-page> |
(2)使用ErrorReportValve来定制出错信息
为隐藏详细的错误报告和服务器信息,需使用ErrorReportValve来定制出错信息,例如在<Host>标签中添加<Valve>标签,并将className属性设置为org.apache.catalina.valves.ErrorReportValve,将showReport和showServerInfo属性设置为false,并且配置状态码对应的错误页面,errorCode.0为没有配置错误页面的状态码默认指定的错误页面。这样可以隐藏详细的错误报告和服务器信息:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.ErrorReportValve" errorCode.404=”webapps/ROOT/404.html” errorCode.0=”webapps/ROOT/errordefault.html” showReport="false" showServerInfo="false"/> ... </Host> |
如果你想要进一步定制错误报告,你可以创建一个自定义的Valve类并继承ErrorReportValve类,然后在其中重写需要定制的方法。这个自定义的Valve类需要添加到Tomcat的类路径中,以便Tomcat可以找到并使用它。
4.4 禁止开启程序自动部署功能
安全基线项目名称:Tomcat禁止开启程序自动部署功能要求项
安全基线项说明:
Tomcat允许在运行时自动部署应用程序,这个功能必须被禁用,因为它可能允许部署恶意或未经测试的应用程序。
安全配置步骤参考:
禁用自动部署的方法是在$CATALINA_HOME/conf/server.xml文件中做以下配置:
autoDeploy="false"
deployOnStartup="false"
在托管环境中Web应用程序可能不受信任,也可以设置deployXML属性为false来忽略context.xml,以防给该web应用程序提高权限。
4.5 请求头安全配置
安全基线项目名称:Tomcat请求头安全配置要求项
安全基线项说明:
Tomcat配置HTTPS安全头,不同的安全头有不同的安全加固作用,避免出现安全风险,例如X-XSS-Protection是HTTP响应头的一种,用于启动浏览器的反射型跨站脚本(XSS)过滤器。安全头分为安全请求头和响应头,主要是确保用户信息安全,防御恶意请求攻击,提高网站的可信度。
常见安全头:
[X-FRAME-OPTIONS]
这个header主要用来配置哪些网站可以通过frame来加载资源。它主要是用来防止UI redressing 补偿样式攻击。
Tomcat默认值:
sameorigin&nbsp;
[X-Content-Type-Options]
这个header主要用来防止在IE9、chrome和safari中的MIME类型混淆攻击。
Tomcat默认值:
nosniff
[X-XSS-Protection]
这个header主要是用来防止浏览器中的反射性xss。
OpenAS Tomcat默认值:
1; mode=block&nbsp;
[Content-Security-Policy]
这个header主要是用来定义页面可以加载哪些资源,减少XSS的发生。
Tomcat默认值:
script-src 'self'; default-src 'self'
[X-Download-Options]
这个header主要是用来判定IE浏览器是否允许直接打开下载的文件。
Tomcat默认值:
noopen
[Strict-Transport-Security]
这个header主要的作用是强制客户端(如浏览器)使用HTTPS与服务器创建链接,以减少会话劫持的风险。
Tomcat默认值:
max-age=31536000; includeSubdomains
4.6 目录列表访问限制
安全基线项目名称:Tomcat目录列表安全基线要求项
安全基线项说明
Tomcat默认是禁止目录列表显示的,如果配置了目录列表显示,建议禁止tomcat列表显示文件。
安全配置步骤参考:
编辑tomcat/conf/web.xml配置文件,通过设置元素的来为特定的Servlet设置这样的配置:
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.yourdomain.YourServletClass</servlet-class> <list-children>false</list-children> <!-- 这里设置禁止列表显示 --> </servlet> |
把true改成false,在这个配置中,我们添加了一个false元素,它将会禁止这个Servlet显示子目录的列表。
参考:https://www.jianshu.com/p/bc457e283aee