Tomcat 9 官方安全建議(翻譯)

Apache Tomcat 9 (9.0.53) - Security Considerations

一、Introduction

Tomcat的安全性適用于大多數(shù)用例垫桂。某些環(huán)境可能需要更多或更少的安全配置师幕。本文旨在為可能影響安全性的配置選項提供單一參考點,并就更改這些配置的影響提供一些注釋诬滩。初衷是給Tomcat部署的安全評估提供一個考量配置清單们衙。

SPR- single point of reference - 單一參考點
Definition of point of reference:something that is used to judge or understand something else。
Point of reference is the intentional use of one thing to indicate something else, and may refer to:

二碱呼、Non-Tomcat settings

Tomcat配置不應(yīng)該是唯一的防護。系統(tǒng)中的其他組件(操作系統(tǒng)宗侦、網(wǎng)絡(luò)愚臀、數(shù)據(jù)庫等)也應(yīng)受到加固。
Tomcat不應(yīng)在root用戶下運行矾利。為Tomcat進程創(chuàng)建一個專用用戶姑裂,并為該用戶提供操作系統(tǒng)所需的最低權(quán)限。例如男旗,不能使用Tomcat用戶遠程登錄舶斧。

文件權(quán)限應(yīng)受限。在發(fā)行版中察皇,文件和目錄不是全局可讀的茴厉,并且組沒有寫訪問權(quán)限。在類Unix的操作系統(tǒng)上什荣,Tomcat使用默認的umask運行矾缓,以維護在Tomcat運行時創(chuàng)建的文件(例如日志文件、擴展的WAR等)的這些權(quán)限…tar.gz0027

以ASF中的Tomcat實例為例(自動部署被禁用 auto-deployment is disabled稻爬,web應(yīng)用程序被部署為分解目錄exploded directories)嗜闻,標準配置是所有Tomcat文件的owner是root & group 是 tomcat,同時owner具有讀/寫權(quán)限桅锄,group只有讀權(quán)限琉雳,而全局沒有權(quán)限样眠。

但是,logs, temp and work directory的owner是Tomcat用戶而不是root翠肘。這意味著即使攻擊者破壞Tomcat進程檐束,他們也無法更改Tomcat配置、部署新的web應(yīng)用程序或修改現(xiàn)有的web應(yīng)用程序锯茄。Tomcat進程以007的umask運行厢塘,以維護這些權(quán)限。

在網(wǎng)絡(luò)層肌幽,考慮使用防火墻來限制晚碾。

JMX

JMX連接的安全性取決于JRE,不是Tomcat控制喂急。

通常格嘁,訪問控制非常有限(要么對所有只讀,要么對所有讀寫)廊移。Tomcat通過JMX公開大量內(nèi)部信息和控制糕簿,以幫助調(diào)試、監(jiān)視和管理狡孔《考慮到可用的有限訪問控制,JMX訪問應(yīng)被視為等同于本地root/admin訪問苗膝,并受到相應(yīng)的限制殃恒。

幾乎所有的JRE供應(yīng)商提供的JMX訪問控制不會記錄失敗的身份驗證嘗試,也不會在多次身份驗證失敗后提供帳戶鎖定功能辱揭。這使得暴力攻擊很容易發(fā)動离唐,也很難檢測。

考慮到以上所有因素问窃,應(yīng)注意確保JMX接口(如果使用)得到適當?shù)谋Wo亥鬓。JMX接口加固選項:

  • 為所有JMX用戶配置強密碼;
  • 將JMX監(jiān)聽器綁定到內(nèi)網(wǎng)域庇;
  • 限制受信任客戶端訪問JMX端口嵌戈;
  • 提供特定于應(yīng)用程序的運行狀況頁面,供外部監(jiān)控系統(tǒng)使用较剃。

三咕别、Default web applications

General、ROOT写穴、Documentation惰拱、Examples、Manager、Host Manager偿短、Securing Management Applications
全部刪掉

四欣孤、Security manager

The Security Manager (The Java? Tutorials > Essential Java Classes > The Platform Environment) (oracle.com)

要么在開始的時候就用,要么就算了吧昔逗。

五降传、server.xml

1. General

默認的 server.xml包含大量注釋,包括注釋掉的一些范例勾怒。刪除這些注釋可以使閱讀和理解server.xml變得更加容易婆排。
如果某組件類型未列出,則該類型沒有直接影響安全性的設(shè)置笔链。

2. Server

設(shè)置 port 屬性為 -1段只,關(guān)閉shutdown port。
如果沒有關(guān)閉shutdown port鉴扫,那么就配置強密碼赞枕。

3. Listeners

使用gcc在Solaris上編譯的APR Lifecycle Listener不穩(wěn)定。如果在Solaris上使用APR/native connector 坪创,請使用Sun Studio compiler炕婶。
JNI Library Loading Listener可用于加載native code。它只能用于加載受信任的庫莱预。
應(yīng)根據(jù)需要啟用和配置Security Lifecycle Listener柠掂。

4. Connectors

默認,一個非TLS HTTP/1.1的connector配置在端口8080上依沮。不使用的Connectors應(yīng)從server.xml中刪除陪踩。

AJP Connectors 應(yīng)僅在受信的網(wǎng)絡(luò)上使用,或使用secret屬性進行保護悉抵。

AJP Connectors 阻止具有未知請求屬性的轉(zhuǎn)發(fā)請求。配置適當?shù)恼齽t表達式或?qū)傩?code>allowedRequestAttributesPattern摘完,可以允許已知的安全和/或預(yù)期屬性姥饰。

address屬性可用于控制connector 監(jiān)聽哪個IP。默認情況下孝治,connector 監(jiān)聽所有配置的IP列粪。

allowTrace屬性用于啟用對調(diào)試有用的TRACE請求。由于某些瀏覽器處理 TRACE request 響應(yīng)的方式會使瀏覽器受到XSS攻擊谈飒,因此默認情況下禁用TRACE requests岂座。

discardFacades屬性設(shè)置為true將導(dǎo)致為每個請求創(chuàng)建新的facade對象。這減少了將數(shù)據(jù)從一個請求暴露給另一個請求杭措,應(yīng)用程序中出現(xiàn)BUG的機會费什。

encodedSolidusHandling屬性允許對請求URI進行非標準解析。在反向代理后面將此屬性設(shè)置為非默認值可能會使攻擊者繞過代理的安全設(shè)置手素。

maxPostSize屬性控制POST請求(被轉(zhuǎn)為參數(shù))的最大尺寸鸳址。參數(shù)在請求期間會被緩存瘩蚪,因此默認情況下限制為2MB,以減少DOS攻擊的暴露稿黍。

maxSavePostSize屬性控制表單和客戶端證書身份驗證期間POST請求的保存疹瘦。這些參數(shù)在身份驗證期間(可能是幾分鐘)被緩存,因此默認情況下這被限制為4KB巡球,以減少DOS攻擊的風險言沐。

maxParameterCount屬性控制request中解析和存儲的參數(shù)和鍵值對的最大數(shù)量(GET+POST)。過多的參數(shù)會被忽略酣栈。如果要拒絕此類請求险胰,請配置FailedRequestFilter

xpoweredBy屬性控制X-Powered-By HTTP header是否隨每個請求一起發(fā)送钉嘹。如果發(fā)送鸯乃,則header的值包含Servlet和JSP規(guī)范版本、完整的Tomcat版本(例如ApacheTomcat/9.0)跋涣、JVM供應(yīng)商的名稱和JVM的版本缨睡。默認,此header處于禁用狀態(tài)陈辱。此header可為合法客戶端和攻擊者提供有用信息奖年。

server屬性控制服務(wù)器 HTTP header的值。Tomcat4.1.x到8.0.x的這個header的默認值是ApacheCooote/1.1沛贪。從8.5.x開始陋守,默認情況下不設(shè)置此header。此header可以向合法客戶端和攻擊者提供有限的信息利赋。

SSLEnabled水评、schemesecure屬性都可以獨立設(shè)置。通常用于配置tomact反向代理時媚送。這允許Tomcat查看客戶端和代理之間的連接的SSL屬性中燥,而不是代理和Tomcat之間的連接。比如塘偎,客戶端通過HTTPS連接到代理疗涉,代理通過HTTP連接到Tomcat。如果Tomcat有必要區(qū)分代理接收到的是安全連接還是非安全連接吟秩,那么代理必須使用單獨的connector將安全和非安全請求傳遞給Tomcat咱扣。如果代理使用AJP,則客戶端連接的SSL屬性通過AJP協(xié)議傳遞涵防,不需要單獨的連接器闹伪。

tomcatAuthenticationtomcatAuthorization屬性與AJP connectors 一起使用,來判斷Tomcat是否應(yīng)處理所有身份驗證和授權(quán),或者身份驗證是否應(yīng)委托給反向代理(身份驗證用戶名作為AJP協(xié)議的一部分傳遞給Tomcat)祭往。

AJP連接器中的requiredSecret屬性配置在Tomcat和Tomcat前面的反向代理之間的shared secret伦意。它用于防止通過AJP協(xié)議進行未經(jīng)授權(quán)的連接。

5. Host

host元素控制部署硼补。自動部署允許管理更簡單驮肉,但也使攻擊者更容易部署惡意程序。自動部署由autoDeploydeployOnStartup屬性控制已骇。如果兩者都是false离钝,則只部署server.xml中定義的Contexts ,并且任何更改都需要重啟Tomcat褪储。

在web應(yīng)用不受信任的托管環(huán)境中卵渴,將deployXML屬性設(shè)置為false,忽略于web應(yīng)用程序打包的任何context.xml鲤竹,這些context.xml可能會嘗試為web應(yīng)用程序分配更高的權(quán)限浪读。請注意,如果啟用了security manager辛藻,deployXML屬性將默認為false碘橘。

6. Context

適用于Context 元素,這些元素被定義在: file, default file, per-host file, web application context file in per-host configuration directory or inside the web application. server.xml 吱肌,context.xml痘拆, context.xml.default

crossContext屬性控制是否允許一個上下文訪問另一個上下文的資源氮墨。默認為false纺蛆,僅可為受信任的web應(yīng)用更改。

privileged 屬性控制上下文是否允許使用容器提供的servlet规揪,如Manager servlet桥氏。默認為false,僅可為受信任的web應(yīng)用更改猛铅。

allowLinking 是nested Resources element的屬性控制上下文是否允許使用鏈接文件识颊。如果已啟用且上下文未部署,則刪除上下文資源時奕坟,這些鏈接也跟隨操作。將此設(shè)置從不區(qū)分大小寫的操作系統(tǒng)(包括Windows)上的默認設(shè)置更改為將禁用許多安全措施清笨,并允許直接訪問WEB-INF目錄月杉。從不區(qū)分大小寫的操作系統(tǒng)(包括Windows)十绑,變更默認值false瞬欧,將禁用許多安全措施雷袋,并允許直接訪問WEB-INF目錄级零。

sessionCookiePathUsesTrailingSlash 可用于解決許多瀏覽器(Internet Explorer丽已、Safari和Edge)中的錯誤,以防止多應(yīng)用程序共享路徑前綴時稽鞭,跨應(yīng)用程序暴露session cookie避除。但是,啟用此選項可能會給擁有映射到/*的servlet的應(yīng)用程序帶來問題翘盖。RFC6265 第8.5節(jié) 明確指出桂塞,不同的路徑不能有效將cookie與其他應(yīng)用程序隔離。

7. Valves

強烈推薦配置 AccessLogValve馍驯。Tomcat 默認配置已經(jīng)包含了AccessLogValve阁危。通常,每個主機配置一個汰瘫,但是根據(jù)情況也根據(jù)不同engine或context配置不同的AccessLogValve狂打。

任何管理應(yīng)用程序都應(yīng)受到RemoteAddrValve的保護(該Valve 也可用作 Filter)。allow 屬性用于設(shè)置受信主機混弥。

默認的ErrorReportValve在發(fā)送給客戶端的響應(yīng)中包含Tomcat版本號趴乡。為避免該情況,可以在每個web應(yīng)用程序中配置自定義錯誤處理蝗拿×滥螅或者,您可以顯式配置 ErrorReportValve并將其showServerInfo屬性設(shè)置為false蛹磺∷谒玻或者,可以變更版本號萤捆,創(chuàng)建文件 CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties裙品,內(nèi)容如下:

server.info=Apache Tomcat/9.0.x

修改為期望的值。請注意俗或,該更改將使管理工具中報告的版本號變更市怎,從而在管理工具上不能正確的判斷實際部署版本。CATALINA_HOME/bin/version.bat|sh 腳本仍會報告正確的版本號辛慰。

當發(fā)生錯誤時区匠,默認的ErrorReportValve會向客戶端顯示堆棧跟蹤 and/or JSP源代碼。為了避免這種情況帅腌,可以在每個web應(yīng)用程序中配置自定義錯誤處理驰弄。或者速客,您可以顯式配置ErrorReportValve并將其showReport屬性設(shè)置為false戚篙。

RewriteValve使用正則表達式,格式不良的正則表達式模式可能容易受到“catastrophic backtracking”或“ReDoS”的攻擊溺职。有關(guān)更多詳細信息岔擂,請參閱 Rewrite docs位喂。

8. Realms

MemoryRealm不是為生產(chǎn)環(huán)境設(shè)計的,因為對tomcat-users.xml的任何更改都需要重啟tomcat才能生效乱灵。

JDBCRealm不建議在生產(chǎn)環(huán)境中使用塑崖,因為它對于所有身份驗證和授權(quán)選項都是單線程的。改用DataSourceRealm痛倚。

UserDatabaseRealm不是為large-sacle部署設(shè)計的规婆。它適用于small-scale、相對靜態(tài)的環(huán)境状原。

JAASRealm沒有被廣泛使用聋呢,因此代碼沒有其他realms成熟。建議在使用此realm之前進行額外測試颠区。

默認削锰,realms不實現(xiàn)任何形式的帳戶鎖定。這意味著暴力攻擊可以成功毕莱。為了防止暴力攻擊器贩,所選realm應(yīng)封裝在LockOutRealm中。

9. Manager

manager組件用于生成session IDs朋截。

randomClass屬性可以更改用于生成隨機session ID的類蛹稍。

sessionIdLength屬性可以更改session ID的長度。

persistAuthentication控制在session持久化時是否包括與session關(guān)聯(lián)的已驗證主體部服。

使用JDBCStore時唆姐,會話存儲應(yīng)該是安全的(專用憑據(jù)、適當?shù)臋?quán)限)廓八,以便只有JDBCStore能夠訪問持久化的會話數(shù)據(jù)奉芦。特別是,JDBCStore不應(yīng)通過web應(yīng)用程序的憑據(jù)進行訪問剧蹂。

10. Cluster

集群實現(xiàn)需要基于一個安全声功、可信的網(wǎng)絡(luò),用于所有跟集群相關(guān)的網(wǎng)絡(luò)流量宠叼。在不安全先巴、不受信的網(wǎng)絡(luò)上運行群集是不安全的。

如果您在一個不受信任的網(wǎng)絡(luò)上運行冒冬,或者更愿意謹慎行事伸蚯,則可以使用EncryptInterceptor 對節(jié)點之間的通信進行加密。

六简烤、System Properties

org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASHorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH 系統(tǒng)屬性允許對請求URI進行非標準解析剂邮。在反向代理后面使用這些選項可使攻擊者繞過代理上的安全配置。

org.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER 系統(tǒng)屬性如果禁用會影響安全性乐埠。當規(guī)范默認使用ISO-8859-1時抗斤,很多用戶(違反RFC2616)試圖猜測文本媒體類型的字符編碼。一些瀏覽器會將包含ISO-8859-1字符的響應(yīng)解釋為UTF-7丈咐,但如果解釋為UTF-7瑞眼,則會觸發(fā)XSS漏洞。

七棵逊、web.xml

這適用于默認文件伤疙,web應(yīng)用中的文件,如果它們涉及到這些組件辆影。conf/web.xml 徒像、 /WEB-INF/tomcat-web.xml/WEB-INF/web.xml蛙讥。

DefaultServlet 配置readonly屬性為true锯蛀。變更該屬性,會允許客戶端刪除次慢、修改服務(wù)器上的靜態(tài)資源旁涤,以及上傳新資源。在沒有驗證的情況下迫像,這不應(yīng)被變更劈愚。

DefaultServlet 配置 listings 屬性為 false。這倒不是因為允許目錄瀏覽會導(dǎo)致嚴重安全問題闻妓,二十創(chuàng)建數(shù)千文件的目錄清單會占用大量CPU資源菌羽,從而導(dǎo)致DOS攻擊。

DefaultServlet 配置 showServerInfo 屬性由缆。 當開啟目錄瀏覽注祖,Tomcat version信息會被包含在response內(nèi),發(fā)送給客戶端犁功。要避免氓轰,可以顯示的配置DefaultServlet,設(shè)置showServerInfo屬性為false浸卦。替代方案署鸡,改變版本信息。創(chuàng)建文件CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties限嫌,內(nèi)容如下:

server.info=Apache Tomcat/9.0.x

修改為期望的值靴庆。請注意,該更改將使管理工具中報告的版本號變更怒医,從而在管理工具上不能正確的判斷實際部署版本炉抒。CATALINA_HOME/bin/version.bat|sh 腳本仍會報告正確的版本號。

默認CGI Servlet 是關(guān)閉的稚叹。如果開啟焰薄,在生產(chǎn)環(huán)境拿诸,debug initialisation parameter 不應(yīng)該設(shè)置為10或更高,因為debug 頁面是不安全的塞茅。

當在Windows上開啟使用了 CGI Servlet亩码,仔細檢查設(shè)置,確保它適合您的環(huán)境野瘦。默認值為secure描沟。不安全的配置可能使服務(wù)器暴露遠程代碼執(zhí)行。關(guān)于潛在風險和緩解措施的進一步信息鞭光,參見CGI How To. enableCmdLineArguments cmdLineArgumentsDecoded 吏廉。

FailedRequestFilter 可以配置并用于拒絕請求參數(shù)解析出錯的請求。如果沒有過濾器惰许,默認行為是忽略無效或過多的參數(shù)席覆。

HttpHeaderSecurityFilter 可以向response添加header以提高安全性。如果客戶端直接訪問Tomcat啡省,那么您可能希望啟用此filter及其設(shè)置的所有headers娜睛,除非您的應(yīng)用程序已經(jīng)設(shè)置了它們。如果Tomcat是通過反向代理訪問的卦睹,那么該filter的配置需要與反向代理設(shè)置的hearder進行協(xié)調(diào)畦戒。

八、General

基本身份驗證(BASIC)和表單身份驗證(FORM)以明文形式傳遞用戶名和密碼结序。使用這些身份驗證機制的Web應(yīng)用程序在通過不受信網(wǎng)絡(luò)時障斋,應(yīng)使用SSL。

對于攻擊者來說徐鹤,通過身份驗證的session cookie幾乎與用戶密碼一樣有用垃环,應(yīng)提供與密碼本身相同級別的保護。這意味著返敬,通過SSL進行身份驗證遂庄,直到會話結(jié)束一直使用SSL。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劲赠,一起剝皮案震驚了整個濱河市涛目,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凛澎,老刑警劉巖霹肝,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塑煎,居然都是意外死亡沫换,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門最铁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讯赏,“玉大人垮兑,你說我怎么就攤上這事∈妫” “怎么了甥角?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長识樱。 經(jīng)常有香客問我,道長震束,這世上最難降的妖魔是什么怜庸? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮垢村,結(jié)果婚禮上割疾,老公的妹妹穿的比我還像新娘。我一直安慰自己嘉栓,他們只是感情好宏榕,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侵佃,像睡著了一般麻昼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馋辈,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天抚芦,我揣著相機與錄音,去河邊找鬼迈螟。 笑死叉抡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的答毫。 我是一名探鬼主播褥民,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洗搂!你這毒婦竟也來了消返?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蚕脏,失蹤者是張志新(化名)和其女友劉穎侦副,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驼鞭,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡秦驯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挣棕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片译隘。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡亲桥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出固耘,到底是詐尸還是另有隱情题篷,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布厅目,位于F島的核電站番枚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏损敷。R本人自食惡果不足惜葫笼,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拗馒。 院中可真熱鬧路星,春花似錦、人聲如沸诱桂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挥等。三九已至友绝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肝劲,已是汗流浹背九榔。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涡相,地道東北人哲泊。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像催蝗,于是被迫代替她去往敵國和親切威。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容