默認(rèn)的 server.xml 包含大量注釋,比如一些被注釋掉的范例組件定義。去掉這些注釋將會(huì)使其更容易閱讀和理解。
如果某個(gè)組件類型沒有列出,那么該類型也沒有能夠直接影響安全的相關(guān)設(shè)置。
將 port 屬性設(shè)為 -1 能禁用關(guān)閉端口。
如果關(guān)閉端口未被禁用,會(huì)為 shutdown 配置一個(gè)強(qiáng)密碼。
如果在 Solaris 上使用 gcc 編譯 APR 生命周期偵聽器,你會(huì)發(fā)現(xiàn) APR 生命周期偵聽器并不穩(wěn)定。如果在 Solaris 上使用 APR(或原生)連接器,需要用 Sun Studio 編譯器進(jìn)行編譯。
應(yīng)該啟用并恰當(dāng)?shù)嘏渲?Security 偵聽器。
默認(rèn)配置了一個(gè) HTTP 和 AJP 連接器。沒有用到的連接器應(yīng)從 server.xml 中清除掉。
address 屬性用來控制連接器在哪個(gè) IP 地址上偵聽連接。默認(rèn),連接器會(huì)在所有配置好的 IP 地址上進(jìn)行偵聽。
allowTrace 屬性可啟用能夠利于調(diào)試的 TRACE 請(qǐng)求。由于一些瀏覽器處理 TRACE 請(qǐng)求的方式(將瀏覽器暴露給 XSS 攻擊),所以默認(rèn)是不支持 TRACE 請(qǐng)求的。
maxPostSize 屬性控制解析參數(shù)的 POST 請(qǐng)求的最大尺寸。在整個(gè)請(qǐng)求期間,參數(shù)會(huì)被緩存,所以該值默認(rèn)會(huì)被限制到 2 MB大小,以減少 DOS 攻擊的風(fēng)險(xiǎn)。
maxSavePostSize 屬性控制在 FORM 和 CLIENT-CERT 驗(yàn)證期間,saving of POST requests。在整個(gè)驗(yàn)證期間(可能會(huì)占用好幾分鐘),參數(shù)會(huì)被緩存,所以該值默認(rèn)會(huì)被限制到 4 KB大小,以減少 DOS 攻擊的風(fēng)險(xiǎn)。
maxParameterCount 屬性控制可解析并存入請(qǐng)求的參數(shù)與值對(duì)(GET + POST)的最大數(shù)量。過多的參數(shù)將被忽略。如果想拒絕這樣的請(qǐng)求,配置FailedRequestFilter。
xpoweredBy 屬性控制是否 X-Powered-By HTTP 報(bào)頭會(huì)隨每一個(gè)請(qǐng)求發(fā)送。如果發(fā)送,則該報(bào)頭值包含 Servlet 和 JSP 規(guī)范版本號(hào)、完整的 Tomcat 版本號(hào)(比如 Apache Tomcat/8.0)、JVM Vendor 名稱,以及 JVM 版本號(hào)。默認(rèn)禁用該報(bào)頭。該報(bào)頭可以為合法用戶和攻擊者提供有用信息。
server 屬性控制 Server HTTP 報(bào)頭值。對(duì)于 Tomcat 4.1.x 到 8.0.x,該報(bào)頭默認(rèn)值為 Apache-Coyote/1.1。該報(bào)頭為合法用戶和攻擊者提供的有用信息是有限的。
SSLEnabled、scheme 和 secure 這三個(gè)屬性可以各自獨(dú)立設(shè)置。這些屬性通常應(yīng)用場(chǎng)景為:當(dāng) Tomcat 位于反向代理后面,并且該代理通過 HTTP 或 HTTPS 連接 Tomcat 時(shí)。通過這些屬性,可查看客戶端與代理間(而不是代理與 Tomcat之間)連接的 SSL 屬性。例如,客戶端可能通過 HTTPS 連接代理,但代理連接 Tomcat 卻是通過 HTTP。如果 Tomcat 有必要區(qū)分從代理處接收的安全與非安全連接,那么代理就必須使用單獨(dú)分開的連接,向 Tomcat 傳遞安全與非安全請(qǐng)求。如果代理使用 AJP,客戶端連接的 SSL 屬性會(huì)經(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)出級(jí) cipher。安全環(huán)境通常需要配置更受限的 cipher 集合。該屬性可以利用 OpenSSL 語法格式來包括/排除 cipher 套件。截止 2014 年 11 月 19 日,對(duì)于單獨(dú) Tomcat 8 與 Java 8,可使用 sslEnabledProtocols 屬性,并且排除非 DH cipher,以及弱/失效 cipher 來指定 TLS 協(xié)議,從而實(shí)現(xiàn)正向加密(Forward Secrecy)技術(shù)。對(duì)于以上這些設(shè)定工作來說,Qualys SSL/TLS test是一個(gè)非常不錯(cuò)的配置工具。
tomcatAuthentication 和 tomcatAuthorization 屬性都用于 AJP 連接,用于確定 Tomcat 是否應(yīng)該處理所有的認(rèn)證和授權(quán),或者是否應(yīng)委托反向代理來認(rèn)證(認(rèn)證用戶名作為 AJP 協(xié)議的一部分被傳遞給 Tomcat),而讓 Tomcat 繼續(xù)執(zhí)行授權(quán)。
allowUnsafeLegacyRenegotiation 屬性提供對(duì) CVE-2009-3555 漏洞(一種 TLS 中間人攻擊)的應(yīng)對(duì)方案,應(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)連接。
Host 元素控制著部署。自動(dòng)部署能讓管理更為輕松,但也讓攻擊者更容易部署惡意應(yīng)用。自動(dòng)部署由 autoDeploy 和 deployOnStartup 屬性來控制。如果兩個(gè)屬性值為 false,則 server.xml 中定義的上下文將會(huì)被部署,任何更改都將需要重啟 Tomcat 才能生效。
在 Web 應(yīng)用不受信任的托管環(huán)境中,將 deployXML 設(shè)置為 false 將忽略任何包裝 Web 應(yīng)用的 context.xml,可能會(huì)把增加特權(quán)賦予 Web 應(yīng)用。注意,如果啟用安全管理器,則 deployXML 屬性默認(rèn)為 false。
server.xml、默認(rèn)的 context.xml 文件,每個(gè)主機(jī)的 context.xml.default 文件、Web 應(yīng)用上下文文件
crossContext 屬性能夠控制是否允許上下文訪問其他上下文資源。默認(rèn)為 false,而且只應(yīng)該針對(duì)受信任的 Web 應(yīng)用。
privileged 屬性控制是否允許上下文使用容器提供的 servlet,比如 Manager servlet。默認(rèn)為 false,而且只針對(duì)受信任的 Web 應(yīng)用。
內(nèi)嵌 Resource 元素中的 allowLinking 屬性控制是否允許上下文使用鏈接文件。如果啟用而且上下文未經(jīng)部署,那么當(dāng)刪除上下問資源時(shí),也會(huì)一并將鏈接文件刪除。默認(rèn)值為 false。在大小寫敏感的操作系統(tǒng)上改變?cè)撝担瑢?huì)禁用一些安全措施,并且允許直接訪問 WEB-INF 目錄。
強(qiáng)烈建議配置 AccessLogValve。默認(rèn)的 Tomcat 配置包含一個(gè) AccessLogValve。通常會(huì)對(duì)每個(gè) Host 上進(jìn)行配置,但必要時(shí)也可以在每個(gè) Engine 或 Context 上進(jìn)行配置。
應(yīng)通過 RemoteAddrValve 來保護(hù)管理應(yīng)用。注意:這個(gè) Valve 也可以用作過濾器。allow 屬性用于限制對(duì)一些已知信任主機(jī)的訪問。
默認(rèn)的 ErrorReportValve 在發(fā)送給客戶端的響應(yīng)中包含了 Tomcat 版本號(hào)。為了避免這一點(diǎn),可以在每個(gè) Web 應(yīng)用上配置自定義錯(cuò)誤處理器。另一種方法是,可以配置 ErrorReportValve,將其 showServerInfo 屬性設(shè)為 false。另外,通過創(chuàng)建帶有下列內(nèi)容的 CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties 文件,可以改變版本號(hào)。
server.info=Apache Tomcat/8.0.x
根據(jù)需要來改變?cè)撝怠W⒁猓@也會(huì)改變一些管理工具所報(bào)告的版本號(hào),可能難于確定實(shí)際安裝的版本號(hào)。CATALINA_HOME/bin/version.bat|sh 腳本依然能夠報(bào)告版本號(hà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。
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ī)模且相對(duì)靜態(tài)的環(huán)境。
JAASRealm 使用并不廣泛,因此也不如其他幾個(gè) Realm 成熟。在未進(jìn)行大量測(cè)試之前,建議不采用這種 Realm。
默認(rèn),Realm 并不能實(shí)現(xiàn)賬戶鎖定。這就給暴力破解者帶來了方便。要想防范這一點(diǎn),需要將 Realm 包裝在 LockOutRealm 中。
manager 組件用來生成會(huì)話 ID。
可以利用 randomClass 屬性來改變生成隨機(jī)會(huì)話 ID 的類。
可以利用 sessionIdLength 屬性來改變會(huì)話 ID 的長(zhǎng)度。
將系統(tǒng)屬性 org.apache.catalina.connector.RECYCLE_FACADES 設(shè)為 true,將為每一個(gè)請(qǐng)求創(chuàng)建一個(gè)新的門面(facade)對(duì)象,這能減少因?yàn)閼?yīng)用 bug 而將一個(gè)請(qǐng)求中數(shù)據(jù)暴露給其他請(qǐng)求的風(fēng)險(xiǎn)。
系統(tǒng)屬性 org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH 和 org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH 允許對(duì)請(qǐng)求 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 可以會(huì)帶來不利后果。許多違反 RFC2616 的用戶代理在應(yīng)該使用 ISO-8859-1 的規(guī)范強(qiáng)制默認(rèn)值時(shí),試圖猜測(cè)文本媒體類型的字符編碼。一些瀏覽器會(huì)解析為 UTF-7 編碼,這樣做的后果是:如果某一響應(yīng)包含的字符對(duì) ISO-8859-1 是安全的,但如果解析為 UTF-7,卻能觸發(fā) XSS 漏洞。
如果Web 應(yīng)用中默認(rèn)的 conf/web.xml 和 WEB-INF/web.xml 文件定義了本文提到的組件,》》
在配置 DefaultServlet 時(shí),將 readonly 設(shè)為 true。將其變?yōu)?nbsp;false 能讓客戶端刪除或修改服務(wù)器上的靜態(tài)資源,進(jìn)而上傳新的資源。由于不需要認(rèn)證,故而通常也不需要改變。
將 DefaultServlet 的 listings 設(shè)為 false。之所以這樣設(shè)置,不是因?yàn)樵试S目錄列表是不安全之舉,而是因?yàn)橐獙?duì)包含數(shù)千個(gè)文件的目錄生產(chǎn)目錄列表,會(huì)大量消耗計(jì)算資源,會(huì)容易導(dǎo)致 DOS 攻擊。
DefaultServlet 的 showServerInfo 設(shè)為 true。當(dāng)啟用目錄列表后,Tomcat 版本號(hào)就會(huì)包含在發(fā)送給客戶端的響應(yīng)中。為了避免這一點(diǎn),可以將 DefaultServlet 的 showServerInfo 設(shè)為 false 。另一種方法是,另外,通過創(chuàng)建帶有下列內(nèi)容的 CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties 文件,可以改變版本號(hào)。
server.info=Apache Tomcat/8.0.x
根據(jù)需要來改變?cè)撝怠W⒁猓@也會(huì)改變一些管理工具所報(bào)告的版本號(hào),可能難于確定實(shí)際安裝的版本號(hào)。CATALINA_HOME/bin/version.bat|sh 腳本依然能夠報(bào)告版本號(hào)。
可以設(shè)置 FailedRequestFilter 來拒絕那些請(qǐng)求參數(shù)解析時(shí)發(fā)生錯(cuò)誤的請(qǐng)求。沒有過濾器,默認(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)。
BASIC 與 FORM 驗(yàn)證會(huì)將用戶名及密碼存為明文。在不受信任的網(wǎng)絡(luò)情況下,使用這種認(rèn)證機(jī)制的 Web 應(yīng)用和客戶端間的連接必須使用 SSL。
會(huì)話 cookie 加上已認(rèn)證用戶,基本上就將用戶密碼擺在攻擊者面前了,無論何時(shí)給予跟密碼級(jí)別相同的保護(hù)。通常這就需要經(jīng)過 SSL 來認(rèn)證,或者在整個(gè)會(huì)話期間都使用 SSL。