前言
隨着公司內部使用Tomcat作爲web應用服務器的規模越來越大,爲保證Tomcat的配置安全,防止信息泄露,惡性***以及配置的安全規範,特制定此Tomcat安全配置規範。注意: 本文章從別處轉載,並做了補充
1. Tomcat安裝規範
注:所有線上運行tomcat必須嚴格安裝本標準執行。
1.1 tomcat用戶設置
[tomcat@tuan-node1 ~]# useradd -d /tomcat -u 501 tomcat
[tomcat@tuan-node1 ~]# passwd tomcat
[tomcat@tuan-node1 ~]# su - tomcat
[tomcat@tuan-node1 ~]$ id tomcat
uid=501(tomcat) gid=501(tomcat) groups=501(tomcat)
[tomcat@tuan-node1 ~]$ pwd
/tomcat
1.2 tomcat安裝
[tomcat@tuan-node1 ~]$ wget ftp://10.6.9.111/soft/apache-tomcat-6.0.35.tgz
[tomcat@tuan-node1 ~]$ wget ftp://10.6.9.111/soft/apache-tomcat-6.0.35.tgz.md5
[tomcat@tuan-node1 ~]$ md5sum -c apache-tomcat-6.0.35.tgz.md5
apache-tomcat-6.0.35.tar.gz: OK
[tomcat@tuan-node1 ~]$ wget ftp://10.6.9.111/soft/jdk1.6.0_22.tgz
[tomcat@tuan-node1 ~]$ wget ftp://10.6.9.111/soft/jdk1.6.0_22.tgz.md5
[tomcat@tuan-node1 ~]$ md5sum -c jdk1.6.0_22.tgz.md5
jdk1.6.0_22.tgz: OK
[tomcat@tuan-node1 ~]$ tar xzf apache-tomcat-6.0.35.tgz
[tomcat@tuan-node1 ~]$ tar xzf jdk1.6.0_22.tgz
1.3 tomcat配置
[tomcat@tuan-node1 ~]$ vim .bash_profile 增加以下內容:
export JAVA_HOME=/tomcat/jdk1.6.0_22
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/tomcat/apache-tomcat-6.0.35
[tomcat@tuan-node1 ~]$source .bash_profile
[tomcat@tuan-node1 ~]$ java -version
java version "1.6.0_26"
Java(TM) SE RuntimeEnvironment(build 1.6.0_26-b03)
JavaHotSpot(TM)64-BitServer VM (build 20.1-b02, mixed mode)
1.4 應用程序配置
[tomcat@tuan-node1 ~]$ mkdir webapps
將應用程序放置在/tomcat/目錄下。建立相應的目錄如團購wmw_tuan,靜態化wmw_static,並修改server.xml,對應好目錄即可。
1.5 啓動Tomcat:
[tomcat@tuan-node1 ~]$ /tomcat/apache-tomcat-6.0.35/bin/startup.sh
Using CATALINA_BASE: /tomcat/apache-tomcat-6.0.35
Using CATALINA_HOME: /tomcat/apache-tomcat-6.0.35
Using CATALINA_TMPDIR:/tomcat/apache-tomcat-6.0.35/temp
Using JRE_HOME: /tomcat/jdk1.6.0_22
Using CLASSPATH: /tomcat/apache-tomcat-6.0.35/bin/bootstrap.jar
2 . 安全設置規範
2.1 telnet管理端口保護(強制)
類別 | 配置內容及說明 | 標準配置 | 備註 |
telnet管理端口保護 | 1.修改默認的8005管理端口爲不易猜測的端口(大於1024); 2.修改SHUTDOWN指令爲其他字符串; | <Server port="8527" shutdown="dangerous"> | 1.以上配置項的配置內容只是建議配置,可以按照服務實際情況進行合理配置,但要求端口配置在8000~8999之間; |
2.2 ajp連接端口保護(推薦)
類別 | 配置內容及說明 | 標準配置 | 備註 |
Ajp 連接端口保護 | 1.修改默認的ajp 8009端口爲不易衝突的大於1024端口; 2.通過iptables規則限制ajp端口訪問的權限僅爲線上機器; | <Connector port="8528" protocol="AJP/1.3" /> | 以上配置項的配置內容僅爲建議配置,請按照服務實際情況進行合理配置,但要求端口配置在8000~8999之間;; 保護此端口的目的在於防止線下的測試流量被mod_jk轉發至線上tomcat服務器; |
2.3 禁用管理端(強制)
類別 | 配置內容及說明 | 標準配置 | 備註 |
禁用管理端 | 1. 刪除默認的{Tomcat安裝目錄}/conf/tomcat-users.xml文件,重啓tomcat後將會自動生成新的文件; 2. 刪除{Tomcat安裝目錄}/webapps下默認的所有目錄和文件; 3.將tomcat 應用根目錄配置爲tomcat安裝目錄以外的目錄; | <Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/> | 對於前段web模塊,Tomcat管理端屬於tomcat的高危安全隱患,一旦被攻破,***通過上傳web shell的方式將會直接取得服務器的控制權,後果極其嚴重; |
2.4 降權啓動(強制)
類別 | 配置內容及說明 | 標準配置 | 備註 |
降權啓動 | 1.tomcat啓動用戶權限必須爲非root權限,儘量降低tomcat啓動用戶的目錄訪問權限; 2.如需直接對外使用80端口,可通過普通賬號啓動後,配置iptables規則進行轉發; | - | 避免一旦tomcat 服務被***,***直接獲取高級用戶權限危害整個server的安全; |
2.5 文件列表訪問控制(強制)
類別 | 配置內容及說明 | 標準配置 | 備註 |
文件列表訪問控制 | 1.conf/web.xml文件中default部分listings的配置必須爲false; | <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> | false爲不列出目錄文件,true爲允許列出,默認爲false; |
2.6 版本信息隱藏(強制)
類別 | 配置內容及說明 | 標準配置 | 備註 |
版本信息隱藏 | 1.修改conf/web.xml,重定向403、404以及500等錯誤到指定的錯誤頁面; 2.也可以通過修改應用程序目錄下的WEB-INF/web.xml下的配置進行錯誤頁面的重定向; | <error-page> <error-code>403</error-code> <location>/forbidden.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/notfound.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/systembusy.jsp</location> </error-page> | 在配置中對一些常見錯誤進行重定向,避免當出現錯誤時tomcat默認顯示的錯誤頁面暴露服務器和版本信息; 必須確保程序根目錄下的錯誤頁面已經存在; |
注意: 此外的錯誤頁面定義,每個項目工程目錄下都要各自建立自己的相應的錯誤頁面。
2.7 Server header重寫(推薦)
類別 | 配置內容及說明 | 標準配置 | 備註 |
Server header重寫 | 在HTTP Connector配置中加入server的配置; | server="webserver" | 當tomcat HTTP端口直接提供web服務時此配置生效,加入此配置,將會替換http 響應Server header部分的默認配置,默認是Apache-Coyote/1.1 |
2.8 訪問限制(可選)
類別 | 配置內容及說明 | 標準配置或操作 | 備註 |
訪問限制 | 通過配置,限定訪問的ip來源 | <Context path="" docBase="/home/work/tomcat" debug="0" reloadable="false" crossContext="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="61.148.18.138,61.135.165.*" deny="*.*.*.*"/> </Context> | 通過配置信任ip的白名單,拒絕非白名單ip的訪問,此配置主要是針對高保密級別的系統,一般產品線不需要; |
注意:Tomcat6和Tomcat8此處的區別,下面是tomcat8的寫法
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.234\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>
允許本地迴環地址及192.168.234.0網段訪問
2.9 起停腳本權限回收(推薦)
類別 | 配置內容及說明 | 標準配置或操作 | 備註 |
起停腳本權限回收 | 去除其他用戶對Tomcat的bin目錄下shutdown.sh、startup.sh、catalina.sh的可執行權限; | chmod -R 744 tomcat/bin/* | 防止其他用戶有起停線上Tomcat的權限; |
2.10 訪問日誌格式規範(推薦)
類別 | 配置內容及說明 | 標準配置或操作 | 備註 |
訪問日誌格式規範 | 開啓Tomcat默認訪問日誌中的Referer和User-Agent記錄 | <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%{X-Forwarded-For}i %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/> | 開啓Referer和User-Agent是爲了一旦出現安全問題能夠更好的根據日誌進行問題排查; X-Forwarded-For用於nginx作爲反向代理服務器時,獲取客戶端真實的IP |
2.11 屏蔽DNS查詢
enableLookups:調用request、getRemoteHost()執行DNS查詢,以返回遠程主機的主機名,如果設置爲false,則直接返回IP地址。
<Connector enableLookups="false"/>
2.12 壓縮管理
tomcat作爲一個應用服務器,也是支持 gzip 壓縮功能的。我們可以在 server.xml 配置文件中的 Connector
節點中配置如下參數,來實現對指定資源類型進行壓縮。 前端使用nginx作爲反向代理,一般不需要啓用tomcat壓縮功能。
compression=
"on"
#
打開壓縮功能
compressionMinSize=
"50"
#
啓用壓縮的輸出內容大小,默認爲2KB
noCompressionUserAgents=
"gozilla, traviata"
# 對於以下的瀏覽器,不啓用壓縮
compressableMimeType=
"text/html,text/xml,text/javascript,text/css,text/plain"
#
哪些資源類型需要壓縮
3. 附錄:建議配置及標準執行方案
3.1 配置部分(${ CATALINA_HOME }conf/server.xml)
<Server port="8527" shutdown=" dangerous">
<!--Define a non-SSL HTTP/1.1Connector on port 8080-->
<Connector
port="8080" server="webserver"/>
<!--Define an AJP 1.3Connector on port 8528-->
<!--Define an
accesslog -->
<Valve
className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t %r %s %b
%{Referer}i %{User-Agent}i %D" resolveHosts="false"/>
<Connector port="8528" protocol="AJP/1.3"/>
<Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/>
3.2 配置部分(${ CATALINA_HOME }conf/web.xml或者WEB-INF/web.xml)
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>
3.3 刪除如下tomcat的默認目錄和默認文件
tomcat/webapps/*
tomcat/conf/tomcat-user.xml
3.4 去除其他用戶對tomcat 起停腳本的執行權限
chmod 744 –R tomcat/bin/*