鍍金池/ 教程/ Linux/ 安全性注意事項(xiàng)
連接器
JSPs
重寫機(jī)制
CGI
Tomcat Manager
Windows 認(rèn)證
代理支持
虛擬主機(jī)
安全性注意事項(xiàng)
如何在 Maven 中使用 Tomcat 庫
安裝
MBean 描述符
JNDI 資源
類加載機(jī)制
Tomcat Web 應(yīng)用部署
基于 APR 的原生庫
負(fù)載均衡器
安全管理
附加組件
監(jiān)控與管理
Windows 服務(wù)
集群化與會話復(fù)制
高級 IO 機(jī)制
SSI(服務(wù)器端嵌入)
WebSocket 支持
JDBC 數(shù)據(jù)源
日志機(jī)制
默認(rèn) Servlet
SSL/TLS 配置
Tomcat 的 JDBC 連接池
第一個(gè)應(yīng)用
簡介
Realm 配置

安全性注意事項(xiàng)

簡介

對于大多數(shù)用例來說,默認(rèn)配置下的 Tomcat 都是相當(dāng)安全的。有些環(huán)境可能需要更多(或更少)的安全配置。本文統(tǒng)一介紹了一下可能影響安全性的配置選項(xiàng),并適當(dāng)說明了一下修改這些選項(xiàng)所帶來的預(yù)期影響。目的是為了在評價(jià) Tomcat 安裝時(shí),提供一些應(yīng)值得考慮的配置選項(xiàng)。

注意:本章內(nèi)容畢竟有所局限,你還需要對配置文檔進(jìn)行深入研究。在相關(guān)文檔中有更完整的屬性描述。

非 Tomcat 設(shè)置

Tomcat 配置不應(yīng)成為唯一的防線,也應(yīng)該保障系統(tǒng)(操作系統(tǒng)、網(wǎng)絡(luò)及數(shù)據(jù)庫,等等)中的其他組件的安全。

不應(yīng)該以根用戶的身份來運(yùn)行 Tomcat,應(yīng)為 Tomcat 進(jìn)程創(chuàng)建并分配一個(gè)專門的用戶,并為該用戶配置最少且必要的操作系統(tǒng)權(quán)限。比如,不允許使用 Tomcat 用戶實(shí)現(xiàn)遠(yuǎn)程登錄。

文件權(quán)限同樣也應(yīng)適當(dāng)限制。就拿 ASF 中的 Tomcat 實(shí)例為例說明吧(禁止自動(dòng)部署,Web 應(yīng)用被部署為擴(kuò)張的目錄。),標(biāo)準(zhǔn)配置規(guī)定所有的 Tomcat 文件都由根用戶及分組用戶所擁有,擁有者具有讀寫特權(quán),分組只有讀取特權(quán),而 World 則沒有任何特權(quán)。例外之處在于,logs、temp 以及 work 目錄的權(quán)限都由 Tomcat 用戶而不是根用戶所擁有。這意味著即使攻擊者破壞了 Tomcat 進(jìn)程,他們也不能改變 Tomcat 配置,無法部署新應(yīng)用,也無法修改現(xiàn)有應(yīng)用。Tomcat 進(jìn)程使用掩碼 007 來維護(hù)這種權(quán)限許可。

對于網(wǎng)絡(luò)層面,需要使用防火墻來限制進(jìn)站與出站連接,只允許出現(xiàn)那些你希望的連接。

默認(rèn)的 Web 應(yīng)用

概述

Tomcat 安裝時(shí)自帶了一些默認(rèn)啟用的 Web 應(yīng)用。過去一段時(shí)間內(nèi)發(fā)現(xiàn)了不少關(guān)于這些應(yīng)用的漏洞。用不到的應(yīng)用就該刪除,以避免給系統(tǒng)帶來相關(guān)漏洞而產(chǎn)生的安全風(fēng)險(xiǎn)。

ROOT

ROOT 應(yīng)用帶來安全風(fēng)險(xiǎn)的可能性非常小,但它確實(shí)含有正在使用的 Tomcat 的版本號。應(yīng)該從可公開訪問的 Tomcat 實(shí)例中清除 ROOT 應(yīng)用,不是出于安全性原因,而是因?yàn)檫@樣能給用戶提供一個(gè)更適合的默認(rèn)頁面。

Documentation

Documentation 帶來安全風(fēng)險(xiǎn)的可能性非常小,但》它標(biāo)識出了當(dāng)前正使用的 Tomcat 版本。應(yīng)該從可公開訪問的 Tomcat 實(shí)例中清除該應(yīng)用。

Examples

應(yīng)該從安全敏感性安裝中移除 examples 應(yīng)用。雖然 examples 應(yīng)用并不包含任何已知的漏洞,但現(xiàn)已證明,它所包含的一些功能可以被攻擊者利用,特別是一些顯示所有接收內(nèi)容,并且能設(shè)置新 cookie 的 cookie 范例。攻擊者將這些公關(guān)和部署在 Tomcat 實(shí)例中的另一個(gè)應(yīng)用中的漏洞相結(jié)合,就能獲取原本根本不可能得到的信息。

Manager

由于 Manager 應(yīng)用允許遠(yuǎn)程部署 Web 應(yīng)用,所以經(jīng)常被攻擊者利用,因?yàn)閼?yīng)用的密碼普遍強(qiáng)度不夠,而且大多在 Manager 應(yīng)用中啟用了 Tomcat 實(shí)例可公開訪問的功能。Manager 應(yīng)用默認(rèn)是不能訪問的,因?yàn)闆]有配置能夠執(zhí)行這種訪問的用戶。如果啟用 Manager 應(yīng)用,就應(yīng)該遵循 保證管理型應(yīng)用的安全性 一節(jié)中的指導(dǎo)原則。

Host Manager

Host Manager 應(yīng)用能夠創(chuàng)建并管理虛擬主機(jī),包括啟用虛擬主機(jī)的 Manager 應(yīng)用。Host Manager 應(yīng)用默認(rèn)是不能訪問的,因?yàn)闆]有配置能夠執(zhí)行這種訪問的用戶。如果啟用 Host Manager 應(yīng)用,就應(yīng)該遵循 保證管理型應(yīng)用的安全性 一節(jié)中的指導(dǎo)原則。

保證管理型應(yīng)用的安全性

在配置能夠?yàn)?Tomcat 實(shí)例提供管理功能的 Web 應(yīng)用時(shí),需要遵循下列指導(dǎo)原則:

  • 保證任何被允許訪問管理應(yīng)用的用戶的密碼是強(qiáng)密碼。
  • 不要放棄使用 LockOutRealm,它能防止暴力破解者攻擊用戶密碼。
  • /META-INF/context.xml 中的限制訪問 localhost 的RemoteAddrValve 取消注釋。如果需要遠(yuǎn)程訪問,使用該值可限制到特定的 IP 地址。

安全管理器(Security Manager)

啟用安全管理器能讓 Web 應(yīng)用運(yùn)行在沙盒中,從而極大限制 Web 應(yīng)用執(zhí)行惡意行為的能力——比如調(diào)用 System.exit(),在 Web 應(yīng)用根目錄或臨時(shí)目錄外建立網(wǎng)絡(luò)連接或訪問文件系統(tǒng)。但應(yīng)注意的是,有些惡意行為是安全管理器所無法阻止的,比如利用無限循環(huán)產(chǎn)生 CPU 極大開銷。

啟用安全管理器經(jīng)常用來限制潛在影響,比如防止攻擊者通過某種方式危害受信任的 Web 應(yīng)用。安全管理器也可能被用來減少運(yùn)行不受信任的 Web 應(yīng)用(比如在托管環(huán)境中)所帶來的風(fēng)險(xiǎn),但它只能減少這種風(fēng)險(xiǎn),并不能終止不受信任的 Web 應(yīng)用。如果運(yùn)行多個(gè)不受信任的 Web 應(yīng)用,強(qiáng)烈建議將每個(gè)應(yīng)用都部署為獨(dú)立的 Tomcat 實(shí)例(理想情況下還需要部署在獨(dú)立的主機(jī)上),以便盡量減少惡意 Web 應(yīng)用對其他應(yīng)用產(chǎn)生的危害。

Tomcat 已經(jīng)過安全管理器的測試。但大多數(shù) Tomcat 用戶卻沒有運(yùn)行過安全管理器,所以 Tomcat 也沒有相關(guān)的用戶測試過的配置?,F(xiàn)在已經(jīng)(并會繼續(xù))報(bào)告指出了一些關(guān)于運(yùn)行安全管理器時(shí)產(chǎn)生的 Bug。

安全管理器在運(yùn)行時(shí)所暴露出的限制可能在于中斷很多應(yīng)用。所以,在未經(jīng)大量測試前,還是不要使用它為好。理想情況下,安全管理器應(yīng)該在開發(fā)前期使用,因?yàn)閷τ谝粋€(gè)成熟的應(yīng)用來說,啟用安全管理器后,記錄修補(bǔ)問題會極大浪費(fèi)時(shí)間。

啟用安全管理器會改變下列設(shè)置的默認(rèn)值:

  • Host 元素的 deployXML 屬性默認(rèn)值會被改為 false。

server.xml 中的關(guān)鍵配置

1. 綜述

默認(rèn)的 server.xml 包含大量注釋,比如一些被注釋掉的范例組件定義。去掉這些注釋將會使其更容易閱讀和理解。

如果某個(gè)組件類型沒有列出,那么該類型也沒有能夠直接影響安全的相關(guān)設(shè)置。

2. server

port 屬性設(shè)為 -1 能禁用關(guān)閉端口。

如果關(guān)閉端口未被禁用,會為 shutdown 配置一個(gè)強(qiáng)密碼。

3. 偵聽器

如果在 Solaris 上使用 gcc 編譯 APR 生命周期偵聽器,你會發(fā)現(xiàn) APR 生命周期偵聽器并不穩(wěn)定。如果在 Solaris 上使用 APR(或原生)連接器,需要用 Sun Studio 編譯器進(jìn)行編譯。

應(yīng)該啟用并恰當(dāng)?shù)嘏渲?Security 偵聽器。

4. 連接器

默認(rèn)配置了一個(gè) HTTP 和 AJP 連接器。沒有用到的連接器應(yīng)從 server.xml 中清除掉。

address 屬性用來控制連接器在哪個(gè) IP 地址上偵聽連接。默認(rèn),連接器會在所有配置好的 IP 地址上進(jìn)行偵聽。

allowTrace 屬性可啟用能夠利于調(diào)試的 TRACE 請求。由于一些瀏覽器處理 TRACE 請求的方式(將瀏覽器暴露給 XSS 攻擊),所以默認(rèn)是不支持 TRACE 請求的。

maxPostSize 屬性控制解析參數(shù)的 POST 請求的最大尺寸。在整個(gè)請求期間,參數(shù)會被緩存,所以該值默認(rèn)會被限制到 2 MB大小,以減少 DOS 攻擊的風(fēng)險(xiǎn)。

maxSavePostSize 屬性控制在 FORM 和 CLIENT-CERT 驗(yàn)證期間,saving of POST requests。在整個(gè)驗(yàn)證期間(可能會占用好幾分鐘),參數(shù)會被緩存,所以該值默認(rèn)會被限制到 4 KB大小,以減少 DOS 攻擊的風(fēng)險(xiǎn)。

maxParameterCount 屬性控制可解析并存入請求的參數(shù)與值對(GET + POST)的最大數(shù)量。過多的參數(shù)將被忽略。如果想拒絕這樣的請求,配置FailedRequestFilter。

xpoweredBy 屬性控制是否 X-Powered-By HTTP 報(bào)頭會隨每一個(gè)請求發(fā)送。如果發(fā)送,則該報(bào)頭值包含 Servlet 和 JSP 規(guī)范版本號、完整的 Tomcat 版本號(比如 Apache Tomcat/8.0)、JVM Vendor 名稱,以及 JVM 版本號。默認(rèn)禁用該報(bào)頭。該報(bào)頭可以為合法用戶和攻擊者提供有用信息。

server 屬性控制 Server HTTP 報(bào)頭值。對于 Tomcat 4.1.x 到 8.0.x,該報(bào)頭默認(rèn)值為 Apache-Coyote/1.1。該報(bào)頭為合法用戶和攻擊者提供的有用信息是有限的。

SSLEnabled、schemesecure 這三個(gè)屬性可以各自獨(dú)立設(shè)置。這些屬性通常應(yīng)用場景為:當(dāng) Tomcat 位于反向代理后面,并且該代理通過 HTTP 或 HTTPS 連接 Tomcat 時(shí)。通過這些屬性,可查看客戶端與代理間(而不是代理與 Tomcat之間)連接的 SSL 屬性。例如,客戶端可能通過 HTTPS 連接代理,但代理連接 Tomcat 卻是通過 HTTP。如果 Tomcat 有必要區(qū)分從代理處接收的安全與非安全連接,那么代理就必須使用單獨(dú)分開的連接,向 Tomcat 傳遞安全與非安全請求。如果代理使用 AJP,客戶端連接的 SSL 屬性會經(jīng)由 AJP 協(xié)議傳遞,那么就不需要使用單獨(dú)的連接。

sslEnabledProtocols 屬性用來確定所使用的 SSL/TLS 協(xié)議的版本。從 2014 年發(fā)生的 POODLE 攻擊起,SSL 協(xié)議被認(rèn)為是不安全的,單獨(dú) Tomcat 設(shè)置中該屬性的安全設(shè)置為 sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"。

ciphers 屬性控制 SSL 連接所使用的 cipher。默認(rèn)使用 JVM 的缺省 cipher。這往往意味著,可用 cipher 列表將包含弱導(dǎo)出級 cipher。安全環(huán)境通常需要配置更受限的 cipher 集合。該屬性可以利用 OpenSSL 語法格式來包括/排除 cipher 套件。截止 2014 年 11 月 19 日,對于單獨(dú) Tomcat 8 與 Java 8,可使用 sslEnabledProtocols 屬性,并且排除非 DH cipher,以及弱/失效 cipher 來指定 TLS 協(xié)議,從而實(shí)現(xiàn)正向加密(Forward Secrecy)技術(shù)。對于以上這些設(shè)定工作來說,Qualys SSL/TLS test是一個(gè)非常不錯(cuò)的配置工具。

tomcatAuthenticationtomcatAuthorization 屬性都用于 AJP 連接,用于確定 Tomcat 是否應(yīng)該處理所有的認(rèn)證和授權(quán),或者是否應(yīng)委托反向代理來認(rèn)證(認(rèn)證用戶名作為 AJP 協(xié)議的一部分被傳遞給 Tomcat),而讓 Tomcat 繼續(xù)執(zhí)行授權(quán)。

allowUnsafeLegacyRenegotiation 屬性提供對 CVE-2009-3555 漏洞(一種 TLS 中間人攻擊)的應(yīng)對方案,應(yīng)用于 BIO 連接器中。如果底層 SSL 實(shí)現(xiàn)易受 CVE-2009-3555 漏洞影響,才有必要使用該屬性。參看 Tomcat 8 安全文檔可詳細(xì)了解這種缺陷的當(dāng)前狀態(tài)及其可使用的解決方案。

AJP 連接器中的 requiredSecret 屬性配置了 Tomcat 與 Tomcat 前面的反向代理之間的共享密鑰,從而防止通過 AJP 協(xié)議進(jìn)行非授權(quán)連接。

5. Host 元素

Host 元素控制著部署。自動(dòng)部署能讓管理更為輕松,但也讓攻擊者更容易部署惡意應(yīng)用。自動(dòng)部署由 autoDeploydeployOnStartup 屬性來控制。如果兩個(gè)屬性值為 false,則 server.xml 中定義的上下文將會被部署,任何更改都將需要重啟 Tomcat 才能生效。

在 Web 應(yīng)用不受信任的托管環(huán)境中,將 deployXML 設(shè)置為 false 將忽略任何包裝 Web 應(yīng)用的 context.xml,可能會把增加特權(quán)賦予 Web 應(yīng)用。注意,如果啟用安全管理器,則 deployXML 屬性默認(rèn)為 false

6. Context 元素

server.xml、默認(rèn)的 context.xml 文件,每個(gè)主機(jī)的 context.xml.default 文件、Web 應(yīng)用上下文文件

crossContext 屬性能夠控制是否允許上下文訪問其他上下文資源。默認(rèn)為 false,而且只應(yīng)該針對受信任的 Web 應(yīng)用。

privileged 屬性控制是否允許上下文使用容器提供的 servlet,比如 Manager servlet。默認(rèn)為 false,而且只針對受信任的 Web 應(yīng)用。

內(nèi)嵌 Resource 元素中的 allowLinking 屬性控制是否允許上下文使用鏈接文件。如果啟用而且上下文未經(jīng)部署,那么當(dāng)刪除上下問資源時(shí),也會一并將鏈接文件刪除。默認(rèn)值為 false。在大小寫敏感的操作系統(tǒng)上改變該值,將會禁用一些安全措施,并且允許直接訪問 WEB-INF 目錄。

7. Valve

強(qiáng)烈建議配置 AccessLogValve。默認(rèn)的 Tomcat 配置包含一個(gè) AccessLogValve。通常會對每個(gè) Host 上進(jìn)行配置,但必要時(shí)也可以在每個(gè) Engine 或 Context 上進(jìn)行配置。

應(yīng)通過 RemoteAddrValve 來保護(hù)管理應(yīng)用。注意:這個(gè) Valve 也可以用作過濾器。allow 屬性用于限制對一些已知信任主機(jī)的訪問。

默認(rèn)的 ErrorReportValve 在發(fā)送給客戶端的響應(yīng)中包含了 Tomcat 版本號。為了避免這一點(diǎn),可以在每個(gè) Web 應(yīng)用上配置自定義錯(cuò)誤處理器。另一種方法是,可以配置 ErrorReportValve,將其 showServerInfo 屬性設(shè)為 false。另外,通過創(chuàng)建帶有下列內(nèi)容的 CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties 文件,可以改變版本號。

server.info=Apache Tomcat/8.0.x

根據(jù)需要來改變該值。注意,這也會改變一些管理工具所報(bào)告的版本號,可能難于確定實(shí)際安裝的版本號。CATALINA_HOME/bin/version.bat|sh 腳本依然能夠報(bào)告版本號。

當(dāng)出現(xiàn)錯(cuò)誤時(shí),默認(rèn)的 ErrorReportValve 能向客戶端顯示堆棧跟蹤信息以及/或者 JSP 源代碼。為了避免這一點(diǎn),可以在每個(gè) Web 應(yīng)用內(nèi)配置自定義錯(cuò)誤處理器。另一種方法是,可以顯式配置一個(gè) ErrorReportValve,并將其 showReport 屬性設(shè)為 false

8. Realm

MemoryRealm 并不適用于生產(chǎn)用途,因?yàn)橐胱?Tomcat-users.xml 中的改動(dòng)生效,就必須重啟 Tomcat。

JDBCRealm 也不建議用于生產(chǎn)環(huán)境,因?yàn)樗械恼J(rèn)證和授權(quán)選項(xiàng)都占用一個(gè)線程??梢杂?DataSourceRealm 來替代它。

UserDatabaseRealm 不適合大規(guī)模安裝。它適合小規(guī)模且相對靜態(tài)的環(huán)境。

JAASRealm 使用并不廣泛,因此也不如其他幾個(gè) Realm 成熟。在未進(jìn)行大量測試之前,建議不采用這種 Realm。

默認(rèn),Realm 并不能實(shí)現(xiàn)賬戶鎖定。這就給暴力破解者帶來了方便。要想防范這一點(diǎn),需要將 Realm 包裝在 LockOutRealm 中。

9. Manager

manager 組件用來生成會話 ID。

可以利用 randomClass 屬性來改變生成隨機(jī)會話 ID 的類。

可以利用 sessionIdLength 屬性來改變會話 ID 的長度。

系統(tǒng)屬性

將系統(tǒng)屬性 org.apache.catalina.connector.RECYCLE_FACADES 設(shè)為 true,將為每一個(gè)請求創(chuàng)建一個(gè)新的門面(facade)對象,這能減少因?yàn)閼?yīng)用 bug 而將一個(gè)請求中數(shù)據(jù)暴露給其他請求的風(fēng)險(xiǎn)。

系統(tǒng)屬性 org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASHorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH 允許對請求 URI 的非標(biāo)準(zhǔn)解析。使用這些選項(xiàng),當(dāng)處于反向代理后面時(shí),攻擊者可以繞過由代理所強(qiáng)制設(shè)定的各種安全限制。

如果禁用系統(tǒng)屬性 org.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER 可以會帶來不利后果。許多違反 RFC2616 的用戶代理在應(yīng)該使用 ISO-8859-1 的規(guī)范強(qiáng)制默認(rèn)值時(shí),試圖猜測文本媒體類型的字符編碼。一些瀏覽器會解析為 UTF-7 編碼,這樣做的后果是:如果某一響應(yīng)包含的字符對 ISO-8859-1 是安全的,但如果解析為 UTF-7,卻能觸發(fā) XSS 漏洞。

Web.xml

如果Web 應(yīng)用中默認(rèn)的 conf/web.xmlWEB-INF/web.xml 文件定義了本文提到的組件,》》

在配置 DefaultServlet 時(shí),將 readonly 設(shè)為 true。將其變?yōu)?false 能讓客戶端刪除或修改服務(wù)器上的靜態(tài)資源,進(jìn)而上傳新的資源。由于不需要認(rèn)證,故而通常也不需要改變。

DefaultServletlistings 設(shè)為 false。之所以這樣設(shè)置,不是因?yàn)樵试S目錄列表是不安全之舉,而是因?yàn)橐獙Π瑪?shù)千個(gè)文件的目錄生產(chǎn)目錄列表,會大量消耗計(jì)算資源,會容易導(dǎo)致 DOS 攻擊。

DefaultServletshowServerInfo 設(shè)為 true。當(dāng)啟用目錄列表后,Tomcat 版本號就會包含在發(fā)送給客戶端的響應(yīng)中。為了避免這一點(diǎn),可以將 DefaultServletshowServerInfo 設(shè)為 false 。另一種方法是,另外,通過創(chuàng)建帶有下列內(nèi)容的 CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties 文件,可以改變版本號。

server.info=Apache Tomcat/8.0.x

根據(jù)需要來改變該值。注意,這也會改變一些管理工具所報(bào)告的版本號,可能難于確定實(shí)際安裝的版本號。CATALINA_HOME/bin/version.bat|sh 腳本依然能夠報(bào)告版本號。

可以設(shè)置 FailedRequestFilter 來拒絕那些請求參數(shù)解析時(shí)發(fā)生錯(cuò)誤的請求。沒有過濾器,默認(rèn)行為是忽略無效或過多的參數(shù)。

HttpHeaderSecurityFilter 可以為響應(yīng)添加報(bào)頭來提高安全性。如果客戶端直接訪問 Tomcat,你可能就需要啟用這個(gè)過濾器以及它所設(shè)定的所有報(bào)頭(除非應(yīng)用已經(jīng)設(shè)置過它們)。如果通過反向代理訪問 Tomcat,該過濾器的配置需要與反向代理所設(shè)置的任何報(bào)頭相協(xié)調(diào)。

總結(jié)

BASIC 與 FORM 驗(yàn)證會將用戶名及密碼存為明文。在不受信任的網(wǎng)絡(luò)情況下,使用這種認(rèn)證機(jī)制的 Web 應(yīng)用和客戶端間的連接必須使用 SSL。

會話 cookie 加上已認(rèn)證用戶,基本上就將用戶密碼擺在攻擊者面前了,無論何時(shí)給予跟密碼級別相同的保護(hù)。通常這就需要經(jīng)過 SSL 來認(rèn)證,或者在整個(gè)會話期間都使用 SSL。

上一篇:日志機(jī)制下一篇:SSL/TLS 配置