Tomcat 是 Apache軟件基金會下的一個免費(fèi)、開源的WEB應(yīng)用服務(wù)器,,它可以運(yùn)行在 Linux 和 Windows 等多個平臺上,,由于其性能穩(wěn)定、擴(kuò)展性好,、免費(fèi)等特點(diǎn)深受廣大用戶喜愛,。目前,很多互聯(lián)網(wǎng)應(yīng)用和企業(yè)應(yīng)用都部署在 Tomcat 服務(wù)器上,,比如我們公司,,哈。 之前我們 tomcat 都采用的是默認(rèn)的配置,,因此在安全方面還是有所隱患的,。上周對測試環(huán)境的所有服務(wù)器的tomcat都做了安全優(yōu)化,,其間也粗略做了一些性能優(yōu)化,這里就簡單記錄分享下,! 一,、版本安全升級當(dāng)前的tomcat版本為最新穩(wěn)定版本。故名思議,,最新穩(wěn)定版本就要兼顧最新和穩(wěn)定這兩個概念,。一個穩(wěn)定的版本,是需要時(shí)間沉淀的,,而最新又是相對于穩(wěn)定版而言的最新,。因此我們一般會選擇當(dāng)前大版本中,最新版本往前推幾個版本或者往前推幾個月出的版本,。 目前,,企業(yè)常用的tomcat大版本為6.0和7.0版本,8.0版本雖然已經(jīng)出了很久了,,但是仍然不建議使用,。 在升級版本中,需要注意的事情有兩點(diǎn): 1,、盡量避免跨大版本的升級 2,、將當(dāng)前老版本 tomcat 的server.xml、catalina.sh,、web.xml和tomcat-users.xml文件進(jìn)行備份,,然后部署完新版本的 tomcat 之后,將這些配置文件覆蓋過去即可,,然后停掉舊版本,,啟動新版本即可完成升級操作。 二,、隱藏版本信息為了避免黑客針對某些版本進(jìn)行攻擊,,因此我們需要隱藏或者偽裝 Tomcat 的版本信息。 默認(rèn) Tomcat 的版本信息如下:
針對該信息的顯示是由一個jar包控制的,,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,,名稱為 catalina.jar。 我們可以通過 jar xf 命令解壓這個 jar 包會得到兩個目錄 META-INF 和 org , 通過修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段來實(shí)現(xiàn)來更改我們tomcat的版本信息,。 文件信息如下: [root@localhost ~]# cat org/apache/catalina/util/ServerInfo.properties |grep -v '^$|#' server.info=Apache Tomcat/7.0.53 server.number=7.0.53.0 server.built=Mar 25 2014 06:20:16 當(dāng)然,,還有另外一種方法來實(shí)現(xiàn)隱藏或偽裝Tomcat的版本信息,不過本質(zhì)和上面一樣,,操作如下: [root@localhost ~]# cd /usr/local/apache-tomcat-7.0.53/lib [root@localhost lib]# mkdir -p org/apache/catalina/util [root@localhost lib]# cd org/apache/catalina/util [root@localhost util]# vim ServerInfo.properties server.info=nolinux # 如果想修改成其它版本號,,把這個地方的值改成其它值就行了 修改完畢之后,重啟 Tomcat即可看到效果,! 效果如下:
三,、優(yōu)化 web.xmlservlet與其它適用于整個Web應(yīng)用程序設(shè)置的配置文件,,必須符合servlet規(guī)范的標(biāo)準(zhǔn)格式。通過它可以配置你web應(yīng)用的相關(guān)選項(xiàng),,tomcat在啟動的時(shí)候會讀取這個文件,,完成你開發(fā)的系統(tǒng)的一些初始化操作。 它可以做如下事情: 1,、提供基于 servlet 的相關(guān)配置 2,、增加監(jiān)聽器,監(jiān)控session或在tomcat啟動時(shí),,加載一些你希望加載的資源,。比如創(chuàng)建數(shù)據(jù)庫連接池等等 3,、設(shè)置session過期時(shí)間,,tomcat默認(rèn)是30分鐘 4、更改應(yīng)用的默認(rèn)網(wǎng)頁,,常用為index.html/index.jsp等 5,、增加過濾器,做一些你希望的過濾操作,,比如敏感詞匯的過濾 6,、增加一些 jstl(標(biāo)準(zhǔn)標(biāo)簽庫)的定義,方便在jsp中直接includ進(jìn)來,,直接使用這些標(biāo)簽 7,、struts,spring或hibernate的一些配置等等 下面摘錄下O'REILLY 的《Tomcat 權(quán)威指南》中的一段話: web.xml 的文件格式定義在 Servlet 規(guī)范中,,因此所有符合 Servlet 規(guī)范的 Java Servlet Container 都會用到它,。當(dāng) Tomcat 部署應(yīng)用程序時(shí)(在激活過程中,或加載應(yīng)用程序后),,它都會讀取 通用的conf/web.xml ,,然后再讀取web應(yīng)用程序中的 WEB-INF/web.xml 。其實(shí)根據(jù)他們的位置,,我們就可以知道,, conf/web.xml文件中的設(shè)定會應(yīng)用于所有的web應(yīng)用程序,而某些web應(yīng)用程序的WEB-INF/web.xml中的設(shè)定只應(yīng)用于該應(yīng)用程序本身 ,。 由于Servlet規(guī)范主要是對于web程序員,,而非系統(tǒng)管理員使用的。因此,,對于運(yùn)維來講,,我們可能更關(guān)心的是站點(diǎn)的默認(rèn)網(wǎng)頁、 自定義錯誤頁面,、禁止列目錄等功能,。 由于,正常生產(chǎn)環(huán)境中,,肯定不會直接由tomcat對公網(wǎng)提供服務(wù),,前端肯定放的有apache或者nginx。因此,,針對站點(diǎn)的默認(rèn)主頁和自定義錯誤頁面,,我們均在前端的apache或者nginx中做。另外,,公司也可能交由程序猿在項(xiàng)目內(nèi)的 WEB-INF/web.xml中去做定義,。 在tomcat新版本中,自動默認(rèn)已經(jīng)禁止列目錄功能,。 下面,,我列出幾種常見功能,在web.xml中的表現(xiàn)形式: 站點(diǎn)默認(rèn)主頁:
自定義錯誤頁面:
定義會話超時(shí)時(shí)間:
禁止列目錄:
四,、優(yōu)化 tomcat-user.xml該文件含有用戶名,、角色以及密碼的清單文件。負(fù)責(zé)提供webapps下manager項(xiàng)目的登錄認(rèn)證管理,。 在生產(chǎn)環(huán)境中,,我們需要將該文件全部注釋。 注釋效果如下:
五,、優(yōu)化 server.xmlTomcat的主配置文件,,該文件中包含很多主要元素,比如Service,、Connector,、Host等,這些元素都會創(chuàng)建軟件"對象",、排序及進(jìn)程管道中設(shè)置的這些元素嵌套方,,使我們可以 執(zhí)行過濾、分組等工作。 如果要對改文件做優(yōu)化,,我們需要先了解該文件的結(jié)構(gòu),! server.xml的結(jié)構(gòu)圖:
該文件描述了如何啟動Tomcat Server <Server> <Listener /> <GlobaNamingResources> </GlobaNamingResources <Service> <Connector /> <Engine> <Logger /> <Realm /> <host> <Logger /> <Context /> </host> </Engine> </Service> </Server> 針對該文件,我們需要優(yōu)化的點(diǎn)有如下: 1,、 maxThreads 連接數(shù)限制 maxThreads 是 Tomcat 所能接受最大連接數(shù),。一般設(shè)置不要超過8000以上,如果你的網(wǎng)站訪問量非常大可能使用運(yùn)行多個Tomcat實(shí)例的方法,, 即,,在一個服務(wù)器上啟動多個tomcat然后做負(fù)載均衡處理。 這里還需要注意的一點(diǎn)是,,tomcat 和 php 不同,。php可以按照cpu和內(nèi)存的情況去配置連接數(shù),上萬很正常,。而 java 還需要注意 jvm 的參數(shù)配置,。如果不注意就會因?yàn)閖vm參數(shù)過小而崩潰。 2,、多虛擬主機(jī)強(qiáng)烈建議不要使用 Tomcat 的虛擬主機(jī),,推薦每個站點(diǎn)使用一個實(shí)例,。即,,可以啟動多個 Tomcat,而不是啟動一個 Tomcat 里面包含多個虛擬主機(jī),。因?yàn)?Tomcat是多線程,,共享內(nèi)存,任何一個虛擬主機(jī)中的應(yīng)用崩潰,,都會影響到所有應(yīng)用程序,。雖然采用多實(shí)例的方式會產(chǎn)生過多的開銷,但至少保障了應(yīng)用程序的隔離和安全,。 3,、壓錯傳輸tomcat作為一個應(yīng)用服務(wù)器,也是支持 gzip 壓縮功能的,。我們可以在 server.xml 配置文件中的 Connector 節(jié)點(diǎn)中配置如下參數(shù),,來實(shí)現(xiàn)對指定資源類型進(jìn)行壓縮。 compression="on" # 打開壓縮功能 compressionMinSize="50" # 啟用壓縮的輸出內(nèi)容大小,,默認(rèn)為2KB noCompressionUserAgents="gozilla, traviata" # 對于以下的瀏覽器,,不啟用壓縮 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些資源類型需要壓縮 提示: Tomcat 的壓縮是在客戶端請求服務(wù)器對應(yīng)資源后,從服務(wù)器端將資源文件壓縮,,再輸出到客戶端,,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽。相對于普通的瀏覽過程 HTML,、CSS,、Javascript和Text,,它可以節(jié)省40% 左右的流量。更為重要的是,,它可以對動態(tài)生成的,,包括CGI、PHP,、JSP,、ASP、Servlet,SHTML等輸出的網(wǎng)頁也能進(jìn)行壓縮,,壓縮效率也很高,。但是, 壓縮會增加 Tomcat 的負(fù)擔(dān),,因此最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,,將壓縮的任務(wù)交由 Nginx/Apache 去做。 4,、管理AJP端口AJP是為 Tomcat 與 HTTP 服務(wù)器之間通信而定制的協(xié)議,,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時(shí)候,,會使用到AJP這個連接器,。由于我們公司前端是由nginx做的反向代理,因此不使用此連接器,,因此需要注銷掉該連接器,。 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> --> 5、更改關(guān)閉 Tomcat 實(shí)例的指令server.xml中定義了可以直接關(guān)閉 Tomcat 實(shí)例的管理端口,。我們通過 telnet 連接上該端口之后,,輸入 SHUTDOWN (此為默認(rèn)關(guān)閉指令)即可關(guān)閉 Tomcat 實(shí)例(注意,此時(shí)雖然實(shí)例關(guān)閉了,,但是進(jìn)程還是存在的),。由于默認(rèn)關(guān)閉 Tomcat 的端口和指令都很簡單。默認(rèn)端口為8005,,指令為SHUTDOWN ,。因此我們需要將關(guān)閉指令修改復(fù)雜一點(diǎn)。 當(dāng)然,,在新版的 Tomcat 中該端口僅監(jiān)聽在127.0.0.1上,,因此大家也不必?fù)?dān)心。除非黑客登陸到tomcat本機(jī)去執(zhí)行關(guān)閉操作,。 修改實(shí)例: <Server port="8005" shutdow n="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd"> 6,、更改 Tomcat 的服務(wù)監(jiān)聽端口一般公司的 Tomcat 都是放在內(nèi)網(wǎng)的,因此我們針對 Tomcat 服務(wù)的監(jiān)聽地址都是內(nèi)網(wǎng)地址。 修改實(shí)例: <Connector port="8080" address="172.16.100.1" /> 7,、關(guān)閉war自動部署默認(rèn) Tomcat 是開啟了對war包的熱部署的,。為了防止被植入木馬等惡意程序,因此我們要關(guān)閉自動部署,。 修改實(shí)例: <Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false"> 六,、禁用 Tomcat 管理頁面我們線上是不使用 Tomcat 默認(rèn)提供的管理頁面的,因此都會在初始化的時(shí)候就把這些頁面刪掉,。這些頁面是存放在 Tomcat 安裝目錄下的webapps目錄下的,。 我們只需要刪除該目錄下的所有文件即可。 當(dāng)然,,還有涉及管理頁面的2個配置文件 host-manager.xml 和 manager.xml 也需要一并刪掉,。這兩個文件存放在 Tomcat 安裝目錄下的conf/Catalina/localhost目錄下。 七,、用普通用戶啟動 Tomcat為了進(jìn)一步安全,,我們不建議使用 root 來啟動 Tomcat。這邊建議使用專用用戶 tomcat 或者 nobody 用戶來啟動 Tomcat,。 在啟動之前,,需要對我們的tomcat 安裝目錄下所有文件的屬主和屬組都設(shè)置為指定用戶。 八,、分離 Tomcat 和項(xiàng)目的用戶為了防止 Tomcat 被植入 web shell 程序后,,可以修改項(xiàng)目文件。因此我們要將 Tomcat 和項(xiàng)目的屬主做分離,,這樣子,,即便被搞,他也無法創(chuàng)建和編輯項(xiàng)目文件,。 |
|