Tomcat 安全性注意事項

2022-03-03 14:08 更新

簡介

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

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

非 Tomcat 設置

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

不應該以根用戶的身份來運行 Tomcat,應為 Tomcat 進程創(chuàng)建并分配一個專門的用戶,并為該用戶配置最少且必要的操作系統(tǒng)權限。比如,不允許使用 Tomcat 用戶實現遠程登錄。

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

對于網絡層面,需要使用防火墻來限制進站與出站連接,只允許出現那些你希望的連接。

默認的 Web 應用

概述

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

ROOT

ROOT 應用帶來安全風險的可能性非常小,但它確實含有正在使用的 Tomcat 的版本號。應該從可公開訪問的 Tomcat 實例中清除 ROOT 應用,不是出于安全性原因,而是因為這樣能給用戶提供一個更適合的默認頁面。

Documentation

Documentation 帶來安全風險的可能性非常小,但》它標識出了當前正使用的 Tomcat 版本。應該從可公開訪問的 Tomcat 實例中清除該應用。

Examples

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

Manager

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

Host Manager

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

保證管理型應用的安全性

在配置能夠為 Tomcat 實例提供管理功能的 Web 應用時,需要遵循下列指導原則:

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

安全管理器(Security Manager)

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

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

Tomcat 已經過安全管理器的測試。但大多數 Tomcat 用戶卻沒有運行過安全管理器,所以 Tomcat 也沒有相關的用戶測試過的配置?,F在已經(并會繼續(xù))報告指出了一些關于運行安全管理器時產生的 Bug。

安全管理器在運行時所暴露出的限制可能在于中斷很多應用。所以,在未經大量測試前,還是不要使用它為好。理想情況下,安全管理器應該在開發(fā)前期使用,因為對于一個成熟的應用來說,啟用安全管理器后,記錄修補問題會極大浪費時間。

啟用安全管理器會改變下列設置的默認值:

  • Host 元素的 deployXML 屬性默認值會被改為 false。

server.xml 中的關鍵配置

1. 綜述

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

如果某個組件類型沒有列出,那么該類型也沒有能夠直接影響安全的相關設置。

2. server

port 屬性設為 -1 能禁用關閉端口。

如果關閉端口未被禁用,會為 shutdown 配置一個強密碼。

3. 偵聽器

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

應該啟用并恰當地配置 Security 偵聽器。

4. 連接器

默認配置了一個 HTTP 和 AJP 連接器。沒有用到的連接器應從 server.xml 中清除掉。

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

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

maxPostSize 屬性控制解析參數的 POST 請求的最大尺寸。在整個請求期間,參數會被緩存,所以該值默認會被限制到 2 MB大小,以減少 DOS 攻擊的風險。

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

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

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

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

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

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

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

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

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

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

5. Host 元素

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

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

6. Context 元素

server.xml、默認的 context.xml 文件,每個主機的 context.xml.default 文件、Web 應用上下文文件

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

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

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

7. Valve

強烈建議配置 AccessLogValve。默認的 Tomcat 配置包含一個 AccessLogValve。通常會對每個 Host 上進行配置,但必要時也可以在每個 Engine 或 Context 上進行配置。

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

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

server.info=Apache Tomcat/8.0.x

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

當出現錯誤時,默認的 ErrorReportValve 能向客戶端顯示堆棧跟蹤信息以及/或者 JSP 源代碼。為了避免這一點,可以在每個 Web 應用內配置自定義錯誤處理器。另一種方法是,可以顯式配置一個 ErrorReportValve,并將其 showReport 屬性設為 false。

8. Realm

MemoryRealm 并不適用于生產用途,因為要想讓 Tomcat-users.xml 中的改動生效,就必須重啟 Tomcat。

JDBCRealm 也不建議用于生產環(huán)境,因為所有的認證和授權選項都占用一個線程??梢杂?DataSourceRealm 來替代它。

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

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

默認,Realm 并不能實現賬戶鎖定。這就給暴力破解者帶來了方便。要想防范這一點,需要將 Realm 包裝在 LockOutRealm 中。

9. Manager

manager 組件用來生成會話 ID。

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

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

系統(tǒng)屬性

將系統(tǒng)屬性 org.apache.catalina.connector.RECYCLE_FACADES 設為 true,將為每一個請求創(chuàng)建一個新的門面(facade)對象,這能減少因為應用 bug 而將一個請求中數據暴露給其他請求的風險。

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

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

Web.xml

如果Web 應用中默認的 conf/web.xmlWEB-INF/web.xml 文件定義了本文提到的組件,》》

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

DefaultServletlistings 設為 false。之所以這樣設置,不是因為允許目錄列表是不安全之舉,而是因為要對包含數千個文件的目錄生產目錄列表,會大量消耗計算資源,會容易導致 DOS 攻擊。

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

server.info=Apache Tomcat/8.0.x

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

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

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

總結

BASIC 與 FORM 驗證會將用戶名及密碼存為明文。在不受信任的網絡情況下,使用這種認證機制的 Web 應用和客戶端間的連接必須使用 SSL。

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

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號