《Apache Tomcat 7.x安全加固指南》要點:
本文介紹了Apache Tomcat 7.x安全加固指南,希望對您有用。如果有疑問,可以聯系我們。
版本:1.00
日期:2014-1-11
分類:公開
作者:Matthias Luft、Florian Grunow、Hendrik Schmidt
由于官方尚未發布Tomcat 7的強化指南,ERNW便總結了相關的設置,并制作出本文中列出的清單.盡管有大量的設置可以被應用,但本文旨在提供一些加固辦法的基礎.可能對操作系統功能造成嚴重影響的并且需要進行進一步大量測試的設置并未列在該清單中,或者被標記為可選.
我們用“強制”或“可選”標記了此清單中的每個保舉設置,用以清楚的表達從我們的角度來看哪個設置是必須的(強制)或者是應該的(可選).“可選”也意味著我們保舉你應用此設置,但這可能會影響系統的必需功能.
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小節)
可選
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”頁面
以下設置一般適用于基于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.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.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.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.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應用法式提高權限.
以下列出了不能更改的默認設置,默認情況下這些設置被認為是平安的:
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學院為您提供專業教程。