Tomcat 安全配置與性能優化

       Tomcat 是 Apache軟件基金會下的一個免費、開源的WEB應用服務器,它能夠運行在 Linux 和 Windows 等多個平臺上,因爲其性能穩定、擴展性好、免費等特色深受廣大用戶喜好。目前,不少互聯網應用和企業應用都部署在 Tomcat 服務器上,好比咱們公司,哈。javascript

       以前咱們 tomcat 都採用的是默認的配置,所以在安全方面仍是有所隱患的。上週對測試環境的全部服務器的tomcat都作了安全優化,其間也粗略作了一些性能優化,這裏就簡單記錄分享下!php


1、版本安全css

       升級當前的tomcat版本爲最新穩定版本。故名思議,最新穩定版本就要兼顧最新和穩定這兩個概念。一個穩定的版本,是須要時間沉澱的,而最新又是相對於穩定版而言的最新。所以咱們通常會選擇當前大版本中,最新版本往前推幾個版本或者往前推幾個月出的版本。html

       目前,企業經常使用的tomcat大版本爲6.0和7.0版本,8.0版本雖然已經出了好久了,可是仍然不建議使用。前端

       在升級版本中,須要注意的事情有兩點:java

       一、儘可能避免跨大版本的升級linux

       二、將當前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件進行備份,而後部署完新版本的 tomcat 以後,將這些配置文件覆蓋過去便可,而後停掉舊版本,啓動新版本便可完成升級操做。nginx


2、隱藏版本信息程序員

       爲了不***針對某些版本進行***,所以咱們須要隱藏或者假裝 Tomcat 的版本信息。web

       默認 Tomcat 的版本信息以下:

wKioL1THggbTLhhwAACiJ-DsJNk917.jpg

       針對該信息的顯示是由一個jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,名稱爲 catalina.jar。

       咱們能夠經過 jar xf 命令解壓這個 jar 包會獲得兩個目錄 META-INF 和 org ,經過修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段來實現來更改咱們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
固然,還有另一種方法來實現隱藏或假裝Tomcat的版本信息,不過本質和上面同樣,操做以下:
[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便可看到效果!

效果以下:

wKiom1THgTXRjNmjAACVmIAPnIw396.jpg

3、優化 web.xml

        servlet與其它適用於整個Web應用程序設置的配置文件,必須符合servlet規範的標準格式。經過它能夠配置你web應用的相關選項,tomcat在啓動的時候會讀取這個文件,完成你開發的系統的一些初始化操做。

它能夠作以下事情: 

        一、提供基於 servlet 的相關配置

        二、增長監聽器,監控session或在tomcat啓動時,加載一些你但願加載的資源。好比建立數據庫鏈接池等等

        三、設置session過時時間,tomcat默認是30分鐘

        四、更改應用的默認網頁,經常使用爲index.html/index.jsp等

        五、增長過濾器,作一些你但願的過濾操做,好比敏感詞彙的過濾

        六、增長一些 jstl(標準標籤庫)的定義,方便在jsp中直接includ進來,直接使用這些標籤

        七、struts,spring或hibernate的一些配置等等

下面摘錄下O'REILLY 的《Tomcat 權威指南》中的一段話:

       web.xml 的文件格式定義在 Servlet 規範中,所以全部符合 Servlet 規範的 Java Servlet Container 都會用到它。當 Tomcat 部署應用程序時(在激活過程當中,或加載應用程序後),它都會讀取通用的conf/web.xml,而後再讀取web應用程序中的WEB-INF/web.xml。其實根據他們的位置,咱們就能夠知道,conf/web.xml文件中的設定會應用於全部的web應用程序,而某些web應用程序的WEB-INF/web.xml中的設定只應用於該應用程序自己
       若是沒有WEB-INF/web.xml文件,tomcat會輸出找不到的消息,但仍然會部署並使用web應用程序,servlet規範的做者想要實現一種能迅速並簡易設定新範圍的方法,以用做測試,所以,這個web.xml並非必要的,不過一般最好仍是讓每個上線的web應用程序都有一個本身的WEB-INF/web.xml,即便它只用作識別,但我想這是一個好的習慣。

       因爲Servlet規範主要是對於web程序員,而非系統管理員使用的。所以,對於運維來說,咱們可能更關心的是站點的默認網頁、自定義錯誤頁面、禁止列目錄等功能。

       因爲,正常生產環境中,確定不會直接由tomcat對公網提供服務,前端確定放的有apache或者nginx。所以,針對站點的默認主頁和自定義錯誤頁面,咱們均在前端的apache或者nginx中作。另外,公司也可能交由程序猿在項目內的WEB-INF/web.xml中去作定義。

       在tomcat新版本中,自動默認已經禁止列目錄功能。

       下面,我列出幾種常見功能,在web.xml中的表現形式:

站點默認主頁:

wKiom1THgX2yR-5kAACrCs_ImBs054.jpg

自定義錯誤頁面:

spacer.gifwKioL1THglzzidkDAACeimCxejE470.jpg

定義會話超時時間:

spacer.gifwKiom1THgX7gU_c9AABUIfdPmYE558.jpg

禁止列目錄:

spacer.gifwKioL1THgl2goCXFAAFWSl0ysxs201.jpg


4、優化 tomcat-user.xml

       該文件含有用戶名、角色以及密碼的清單文件。負責提供webapps下manager項目的登陸認證管理。

       在生產環境中,咱們須要將該文件所有註釋。

       註釋效果以下:

spacer.gifwKiom1THgX6zBiIKAAI3e77oT-w339.jpg


5、優化 server.xml

       Tomcat的主配置文件,該文件中包含不少主要元素,好比Service、Connector、Host等,這些元素都會建立軟件"對象"、排序及進程管道中設置的這些元素嵌套方,使咱們能夠執行過濾、分組等工做。

       若是要對改文件作優化,咱們須要先了解該文件的結構!

       server.xml的結構圖:

wKiom1THgX6CdvJRAADYw0nW4Dw501.jpg

      該文件描述瞭如何啓動Tomcat Server 

<Server>
    <Listener />
    <GlobaNamingResources>
    </GlobaNamingResources
    <Service>
        <Connector />
        <Engine>
            <Logger />
            <Realm />
               <host>
                   <Logger />
                   <Context />
               </host>
        </Engine>
    </Service>
</Server>

針對該文件,咱們須要優化的點有以下:

一、maxThreads 鏈接數限制

       maxThreads 是 Tomcat 所能接受最大鏈接數。通常設置不要超過8000以上,若是你的網站訪問量很是大可能使用運行多個Tomcat實例的方法,即,在一個服務器上啓動多個tomcat而後作負載均衡處理。

這裏還須要注意的一點是,tomcat 和 php 不一樣。php能夠按照cpu和內存的狀況去配置鏈接數,上萬很正常。而 java 還須要注意 jvm 的參數配置。若是不注意就會由於jvm參數太小而崩潰。

二、多虛擬主機

       強烈建議不要使用 Tomcat 的虛擬主機,推薦每一個站點使用一個實例。即,能夠啓動多個 Tomcat,而不是啓動一個 Tomcat 裏面包含多個虛擬主機。由於 Tomcat是多線程,共享內存,任何一個虛擬主機中的應用崩潰,都會影響到全部應用程序。雖然採用多實例的方式會產生過多的開銷,但至少保障了應用程序的隔離和安全。

三、壓錯傳輸

       tomcat做爲一個應用服務器,也是支持 gzip 壓縮功能的。咱們能夠在 server.xml 配置文件中的 Connector 節點中配置以下參數,來實現對指定資源類型進行壓縮。

   compression="on"             # 打開壓縮功能 
   compressionMinSize="50"      # 啓用壓縮的輸出內容大小,默認爲2KB 
   noCompressionUserAgents="gozilla, traviata"      # 對於如下的瀏覽器,不啓用壓縮 
   compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些資源類型須要壓縮

提示:

       Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程 HTML、CSS、Javascript和Text,它能夠節省40% 左右的流量。更爲重要的是,它能夠對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。可是,壓縮會增長 Tomcat 的負擔,所以最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,將壓縮的任務交由 Nginx/Apache 去作。

四、管理AJP端口

       AJP是爲 Tomcat 與 HTTP 服務器之間通訊而定製的協議,能提供較高的通訊速度和效率。若是tomcat前端放的是apache的時候,會使用到AJP這個鏈接器。因爲咱們公司前端是由nginx作的反向代理,所以不使用此鏈接器,所以須要註銷掉該鏈接器。

<!--
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->

五、更改關閉 Tomcat 實例的指令

       server.xml中定義了能夠直接關閉 Tomcat 實例的管理端口。咱們經過 telnet 鏈接上該端口以後,輸入 SHUTDOWN (此爲默認關閉指令)便可關閉 Tomcat 實例(注意,此時雖然實例關閉了,可是進程仍是存在的)。因爲默認關閉 Tomcat 的端口和指令都很簡單。默認端口爲8005,指令爲SHUTDOWN 。所以咱們須要將關閉指令修改複雜一點。

       固然,在新版的 Tomcat 中該端口僅監聽在127.0.0.1上,所以你們也沒必要擔憂。除非***登錄到tomcat本機去執行關閉操做。

       修改實例:

<Server port="8005" shutdown="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd">

六、更改 Tomcat 的服務監聽端口

       通常公司的 Tomcat 都是放在內網的,所以咱們針對 Tomcat 服務的監聽地址都是內網地址。

       修改實例:

<Connector port="8080" address="172.16.100.1" />

七、關閉war自動部署

       默認 Tomcat 是開啓了對war包的熱部署的。爲了防止被植入***等惡意程序,所以咱們要關閉自動部署。

       修改實例:

      <Host name="localhost"  appBase=""
            unpackWARs="false" autoDeploy="false">


6、禁用 Tomcat 管理頁面

       咱們線上是不使用 Tomcat 默認提供的管理頁面的,所以都會在初始化的時候就把這些頁面刪掉。這些頁面是存放在 Tomcat 安裝目錄下的webapps目錄下的。

       咱們只須要刪除該目錄下的全部文件便可。

       固然,還有涉及管理頁面的2個配置文件 host-manager.xml 和 manager.xml 也須要一併刪掉。這兩個文件存放在 Tomcat 安裝目錄下的conf/Catalina/localhost目錄下。


7、用普通用戶啓動 Tomcat

       爲了進一步安全,咱們不建議使用 root 來啓動 Tomcat。這邊建議使用專用用戶 tomcat 或者 nobody 用戶來啓動 Tomcat。

       在啓動以前,須要對咱們的tomcat 安裝目錄下全部文件的屬主和屬組都設置爲指定用戶。


8、分離 Tomcat 和項目的用戶

        爲了防止 Tomcat 被植入 web shell 程序後,能夠修改項目文件。所以咱們要將 Tomcat 和項目的屬主作分離,這樣子,即使被搞,他也沒法建立和編輯項目文件。

相關文章
相關標籤/搜索