默認的 server.xml 包含大量注釋,比如一些被注釋掉的范例組件定義。去掉這些注釋將會使其更容易閱讀和理解。
如果某個組件類型沒有列出,那么該類型也沒有能夠直接影響安全的相關設置。
將 port 屬性設為 -1 能禁用關閉端口。
如果關閉端口未被禁用,會為 shutdown 配置一個強密碼。
如果在 Solaris 上使用 gcc 編譯 APR 生命周期偵聽器,你會發現 APR 生命周期偵聽器并不穩定。如果在 Solaris 上使用 APR(或原生)連接器,需要用 Sun Studio 編譯器進行編譯。
應該啟用并恰當地配置 Security 偵聽器。
默認配置了一個 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 報頭會隨每一個請求發送。如果發送,則該報頭值包含 Servlet 和 JSP 規范版本號、完整的 Tomcat 版本號(比如 Apache Tomcat/8.0)、JVM Vendor 名稱,以及 JVM 版本號。默認禁用該報頭。該報頭可以為合法用戶和攻擊者提供有用信息。
server 屬性控制 Server HTTP 報頭值。對于 Tomcat 4.1.x 到 8.0.x,該報頭默認值為 Apache-Coyote/1.1。該報頭為合法用戶和攻擊者提供的有用信息是有限的。
SSLEnabled、scheme 和 secure 這三個屬性可以各自獨立設置。這些屬性通常應用場景為:當 Tomcat 位于反向代理后面,并且該代理通過 HTTP 或 HTTPS 連接 Tomcat 時。通過這些屬性,可查看客戶端與代理間(而不是代理與 Tomcat之間)連接的 SSL 屬性。例如,客戶端可能通過 HTTPS 連接代理,但代理連接 Tomcat 卻是通過 HTTP。如果 Tomcat 有必要區分從代理處接收的安全與非安全連接,那么代理就必須使用單獨分開的連接,向 Tomcat 傳遞安全與非安全請求。如果代理使用 AJP,客戶端連接的 SSL 屬性會經由 AJP 協議傳遞,那么就不需要使用單獨的連接。
sslEnabledProtocols 屬性用來確定所使用的 SSL/TLS 協議的版本。從 2014 年發生的 POODLE 攻擊起,SSL 協議被認為是不安全的,單獨 Tomcat 設置中該屬性的安全設置為 sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"。
ciphers 屬性控制 SSL 連接所使用的 cipher。默認使用 JVM 的缺省 cipher。這往往意味著,可用 cipher 列表將包含弱導出級 cipher。安全環境通常需要配置更受限的 cipher 集合。該屬性可以利用 OpenSSL 語法格式來包括/排除 cipher 套件。截止 2014 年 11 月 19 日,對于單獨 Tomcat 8 與 Java 8,可使用 sslEnabledProtocols 屬性,并且排除非 DH cipher,以及弱/失效 cipher 來指定 TLS 協議,從而實現正向加密(Forward Secrecy)技術。對于以上這些設定工作來說,Qualys SSL/TLS test是一個非常不錯的配置工具。
tomcatAuthentication 和 tomcatAuthorization 屬性都用于 AJP 連接,用于確定 Tomcat 是否應該處理所有的認證和授權,或者是否應委托反向代理來認證(認證用戶名作為 AJP 協議的一部分被傳遞給 Tomcat),而讓 Tomcat 繼續執行授權。
allowUnsafeLegacyRenegotiation 屬性提供對 CVE-2009-3555 漏洞(一種 TLS 中間人攻擊)的應對方案,應用于 BIO 連接器中。如果底層 SSL 實現易受 CVE-2009-3555 漏洞影響,才有必要使用該屬性。參看 Tomcat 8 安全文檔可詳細了解這種缺陷的當前狀態及其可使用的解決方案。
AJP 連接器中的 requiredSecret 屬性配置了 Tomcat 與 Tomcat 前面的反向代理之間的共享密鑰,從而防止通過 AJP 協議進行非授權連接。
Host 元素控制著部署。自動部署能讓管理更為輕松,但也讓攻擊者更容易部署惡意應用。自動部署由 autoDeploy 和 deployOnStartup 屬性來控制。如果兩個屬性值為 false,則 server.xml 中定義的上下文將會被部署,任何更改都將需要重啟 Tomcat 才能生效。
在 Web 應用不受信任的托管環境中,將 deployXML 設置為 false 將忽略任何包裝 Web 應用的 context.xml,可能會把增加特權賦予 Web 應用。注意,如果啟用安全管理器,則 deployXML 屬性默認為 false。
server.xml、默認的 context.xml 文件,每個主機的 context.xml.default 文件、Web 應用上下文文件
crossContext 屬性能夠控制是否允許上下文訪問其他上下文資源。默認為 false,而且只應該針對受信任的 Web 應用。
privileged 屬性控制是否允許上下文使用容器提供的 servlet,比如 Manager servlet。默認為 false,而且只針對受信任的 Web 應用。
內嵌 Resource 元素中的 allowLinking 屬性控制是否允許上下文使用鏈接文件。如果啟用而且上下文未經部署,那么當刪除上下問資源時,也會一并將鏈接文件刪除。默認值為 false。在大小寫敏感的操作系統上改變該值,將會禁用一些安全措施,并且允許直接訪問 WEB-INF 目錄。
強烈建議配置 AccessLogValve。默認的 Tomcat 配置包含一個 AccessLogValve。通常會對每個 Host 上進行配置,但必要時也可以在每個 Engine 或 Context 上進行配置。
應通過 RemoteAddrValve 來保護管理應用。注意:這個 Valve 也可以用作過濾器。allow 屬性用于限制對一些已知信任主機的訪問。
默認的 ErrorReportValve 在發送給客戶端的響應中包含了 Tomcat 版本號。為了避免這一點,可以在每個 Web 應用上配置自定義錯誤處理器。另一種方法是,可以配置 ErrorReportValve,將其 showServerInfo 屬性設為 false。另外,通過創建帶有下列內容的 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。
MemoryRealm 并不適用于生產用途,因為要想讓 Tomcat-users.xml 中的改動生效,就必須重啟 Tomcat。
JDBCRealm 也不建議用于生產環境,因為所有的認證和授權選項都占用一個線程。可以用 DataSourceRealm 來替代它。
UserDatabaseRealm 不適合大規模安裝。它適合小規模且相對靜態的環境。
JAASRealm 使用并不廣泛,因此也不如其他幾個 Realm 成熟。在未進行大量測試之前,建議不采用這種 Realm。
默認,Realm 并不能實現賬戶鎖定。這就給暴力破解者帶來了方便。要想防范這一點,需要將 Realm 包裝在 LockOutRealm 中。
manager 組件用來生成會話 ID。
可以利用 randomClass 屬性來改變生成隨機會話 ID 的類。
可以利用 sessionIdLength 屬性來改變會話 ID 的長度。
將系統屬性 org.apache.catalina.connector.RECYCLE_FACADES 設為 true,將為每一個請求創建一個新的門面(facade)對象,這能減少因為應用 bug 而將一個請求中數據暴露給其他請求的風險。
系統屬性 org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH 和 org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH 允許對請求 URI 的非標準解析。使用這些選項,當處于反向代理后面時,攻擊者可以繞過由代理所強制設定的各種安全限制。
如果禁用系統屬性 org.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER 可以會帶來不利后果。許多違反 RFC2616 的用戶代理在應該使用 ISO-8859-1 的規范強制默認值時,試圖猜測文本媒體類型的字符編碼。一些瀏覽器會解析為 UTF-7 編碼,這樣做的后果是:如果某一響應包含的字符對 ISO-8859-1 是安全的,但如果解析為 UTF-7,卻能觸發 XSS 漏洞。
如果Web 應用中默認的 conf/web.xml 和 WEB-INF/web.xml 文件定義了本文提到的組件,》》
在配置 DefaultServlet 時,將 readonly 設為 true。將其變為 false 能讓客戶端刪除或修改服務器上的靜態資源,進而上傳新的資源。由于不需要認證,故而通常也不需要改變。
將 DefaultServlet 的 listings 設為 false。之所以這樣設置,不是因為允許目錄列表是不安全之舉,而是因為要對包含數千個文件的目錄生產目錄列表,會大量消耗計算資源,會容易導致 DOS 攻擊。
DefaultServlet 的 showServerInfo 設為 true。當啟用目錄列表后,Tomcat 版本號就會包含在發送給客戶端的響應中。為了避免這一點,可以將 DefaultServlet 的 showServerInfo 設為 false 。另一種方法是,另外,通過創建帶有下列內容的 CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties 文件,可以改變版本號。
server.info=Apache Tomcat/8.0.x
根據需要來改變該值。注意,這也會改變一些管理工具所報告的版本號,可能難于確定實際安裝的版本號。CATALINA_HOME/bin/version.bat|sh 腳本依然能夠報告版本號。
可以設置 FailedRequestFilter 來拒絕那些請求參數解析時發生錯誤的請求。沒有過濾器,默認行為是忽略無效或過多的參數。
HttpHeaderSecurityFilter 可以為響應添加報頭來提高安全性。如果客戶端直接訪問 Tomcat,你可能就需要啟用這個過濾器以及它所設定的所有報頭(除非應用已經設置過它們)。如果通過反向代理訪問 Tomcat,該過濾器的配置需要與反向代理所設置的任何報頭相協調。
BASIC 與 FORM 驗證會將用戶名及密碼存為明文。在不受信任的網絡情況下,使用這種認證機制的 Web 應用和客戶端間的連接必須使用 SSL。
會話 cookie 加上已認證用戶,基本上就將用戶密碼擺在攻擊者面前了,無論何時給予跟密碼級別相同的保護。通常這就需要經過 SSL 來認證,或者在整個會話期間都使用 SSL。