Tomcat8安裝, 安全配置與性能優化

一、Tomcat 安裝

  •  官網:http://tomcat.apache.org/
  •  Tomcat8官網下載地址:http://tomcat.apache.org/download-80.cgi
  •  爲了便於文件管理,個人習慣  在/opt目錄下創建 一個install目錄用於存放 軟件安裝包,在/usr 目錄下創建local文件夾用戶存放解壓文件 
  • 下載安裝包: wget http://apache.fayea.com/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32.tar.gz
  • 解壓壓縮包: tar -zxvf apache-tomcat-8.0.32.tar.gz
  • 移動解壓文件到 mv apache-tomcat-8.0.32/ /usr/local/
  • 爲方便起見,可以使用  mv /usr/local/apache-tomcat-8.0.32/ /usr/local/tomcat8/ 修改目錄名稱

 設置端口防火牆:
   centos7以下版本設置方法: 
      方法一:便於測試,可以先關閉關閉 iptables,防止端口攔截無法進行測試:service iptables stop 
      方法二:在iptables中添加允許規則(以下以Tomcat默認端口8080爲例),操作步驟如下:
        1、添加規則  sudo iptables -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT   
        2、保存規則:sudo /etc/rc.d/init.d/iptables save
        3、重啓iptables: sudo service iptables restart

   centos7設置方法:
開啓端口
     firewall-cmd --zone=public --add-port=80/tcp --permanent
 
命令含義:
  --zone #作用域
  --add-port=80/tcp  #添加端口,格式爲:端口/通訊協議
  --permanent   #永久生效,沒有此參數重啓後失效
 
重啓防火牆
  firewall-cmd --reload
      
 Tomcat服務啓動停止:
      啓動tomcat:sh /usr/local/tomcat8/bin/startup.sh

      查看日誌:tail -200f /usr/local/tomcat8/logs/catalina.out
    
      停止tomcat: sh /usr/local/tomcat8/bin/shutdown.sh

二、Tomcat 安全配置與優化

   2.1優化server.xml

       2.1.1 隱藏版本信息

  • 隱藏HTTP 頭部的版本信息 。   

         編輯server.xml: vi /usr/local/tomcat8/conf/server.xml 

                 爲Connector 添加 server 屬性      
<span style="font-family:Consolas, Liberation Mono, Menlo, Courier, monospace;">                </span><span style="font-family:Microsoft YaHei;"> <Connector port="8080" protocol="HTTP/1.1"
                                          connectionTimeout="20000"
                                          redirectPort="8443" server="APP Srv1.0"/></span>


  • 隱藏404頁面出現的版本號
     
          針對該信息的顯示是由一個jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,名稱爲 catalina.jar。

         我們可以通過 jar xf 命令解壓這個 jar 包會得到兩個目錄 META-INF 和 org ,通過修改 org/apache/catalina/util/ServerInfo.properties 文件中        的 serverinfo 字段來實現來更改我們tomcat的版本信息。

      文件信息如下:

[root@localhost ~]#  cat /usr/local/tomcat8/lib/org/apache/catalina/util/ServerInfo.properties |grep -v '^$|#'
server.info=Apache Tomcat/8.0.23
server.number=8.0.23.0
server.built=Mar 18 2016 20:31:49 UTC
還有另外一種方法來實現隱藏或僞裝Tomcat的版本信息,其本質和上面一樣,操作如下:
[root@localhost ~]# cd /usr/local/tomcat8/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        # 如果想修改成其它版本號,把這個地方的值改成其它值就行了

      修改效果如下:

         

         2.1.2禁用Tomcat管理界面

              生產環境一般不適用Tomcat默認的管理界面,這些頁面存放在Tomcat 的webapps安裝目錄下,

          把該目錄下的所有文件刪除即可:rm -rf  /usr/local/tomcat8/webapps/*

          另外刪除相關的配置文件 host-manager.xml 和 manager.xml,在Tomcat 安裝目錄 conf/Catalina/localhost目錄下。

         註釋或刪除tomcat_user.xml 中的所有用戶權限。

         2.1.3  應用程序安全

             

               tomcat默認 開啓了對war熱部署。爲了防止被植入木馬惡意攻擊,我們要關閉war包自動部署。

              關閉自動加載最新代碼(設置reloadable

 

    修改實例:                          

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

         2.1.4 更改關閉Tomcat的指令

               server.xml中定義了可以直接關閉 Tomcat 實例的管理端口。我們通過 telnet 連接上該端口之後,輸入 SHUTDOWN (此爲默認關閉指             令)即可關閉 Tomcat 實例(注意,此時雖然實例關閉了,但是進程還是存在的)。由於默認關閉 Tomcat 的端口和指令都很簡單。默認端口爲          8005,指令爲SHUTDOWN 。因此我們需要將關閉指令修改複雜一點。

       當然,在新版的 Tomcat 中該端口僅監聽在127.0.0.1上,因此大家也不必擔心。除非黑客登陸到tomcat本機去執行關閉操作。

       修改實例:

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

        或者禁用8005端口

            <Server port="-1" shutdown="SHUTDOWN">


        2.1.5 連接池配置

           使用線程池,用較少的線程處理較多的訪問,可以提高tomcat處理請求的能力。

           編輯配置文件 server.xml : vi  /usr/local/tomcat8/conf/server.xml

            2.1.5.1 打開被註釋的默認連接池配置

                     默認配置:                                              

<!--
             <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
                    maxThreads="150" minSpareThreads="4"/>
                 -->

                                修改實例:           
 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
             maxThreads="150" minSpareThreads="100" 
         prestartminSpareThreads="true" maxQueueSize="100"/> 

                   參數講解:

  •  name: 線程名稱
  •  namePrefix: 線程前綴
  •  maxThreads : 最大併發連接數,不配置時默認200,一般建議設置500800 ,要根據自己的硬件設施條件和實際業務需求而定。
  •  minSpareThreads:Tomcat啓動初始化的線程數,默認值25   
  •  prestartminSpareThreads:在tomcat初始化的時候就初始化minSpareThreads的值, 不設置true時minSpareThreads   
  •  maxQueueSize: 最大的等待隊列數,超過則拒絕請求

              2.1.5.2 修改鏈接配置

                 
                 默認配置:
 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

                  修改配置:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
        connectionTimeout="20000"
        redirectPort="8443" 
        executor="tomcatThreadPool"
        enableLookups="false" 
        acceptCount="100" 
        maxPostSize="10485760" 
        compression="on" 
        disableUploadTimeout="true" 
        compressionMinSize="2048" 
        noCompressionUserAgents="gozilla, traviata" 
        acceptorThreadCount="2" 
        compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" 
        URIEncoding="utf-8"/>


            參數講解:
  •    port:連接端口。  
  •   protocol:連接器使用的傳輸方式。  Tomcat 8 設置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol    
  •   protocol, Tomcat 6、7 設置 nio 更好:org.apache.coyote.http11.Http11NioProtocol      
            注:
           每個web客戶端請求對於服務器端來說就一個單獨的線程,客戶端的請求數量增多將會導致線程數就上去了,CPU就忙着           跟線程切換。
            而NIO則是使用單線程(單個CPU)或者只使用少量的多線程(多CPU)來接受Socket,而由線程池來處理堵塞在pipe     或者隊       列裏的請求.這樣的話,只要OS可以接受TCP的連接,web服務器就可以處理該請求。大大提高了web服務器的可伸縮性。   
  •   executor: 連接器使用的線程池名稱
  •  enableLookups:禁用DNS  查詢 
  •   acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,默認設置 100 。
  •  maxPostSize:限制 以FORM URL 參數方式的POST請求的內容大小,單位字節,默認是 2097152(2兆),10485760 爲 10M。如果要禁用限制,則可以設置爲 -1。
  • acceptorThreadCount: 用於接收連接的線程的數量,默認值是1。一般這個指需要改動的時候是因爲該服務器是一個多核CPU,如果是多核 CPU 一般配置爲 2。
  • compression:傳輸時是壓縮。
  • compressionMinSize:壓縮的大小
  • noCompressionUserAgents:不啓用壓縮的瀏覽器
           提示:
              壓縮會增加Tomcat負擔,最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,壓縮交由Nginx/Apache 去做。 
             Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的 瀏覽過程 HTML、CSS、Javascript和Text,它可以節省40% 左右的流量。更爲重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。

                2.1.6 管理AJP端口


                        AJP是爲 Tomcat 與 HTTP 服務器之間通信而定製的協議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個連接                      器。 默認是開啓的。如果不使用apache,註釋該連接器。
                  實例:            
<span style="font-family:Microsoft YaHei;">                             <!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />--></span>

    2.2 JVM


   

     2.3 應用程序部署

             默認tomcat是root身份運行的,這樣不安全。不要使用root用戶啓動tomcat。Java程序與C程序不同。nginx,httpd 使用root用戶啓動守護80端口,子進程/線程會通過setuid(),setgid()兩個函數切換到普通用戶。即父進程所有者是root用戶,子進程與多線程所有者是一個非root用戶,這個用戶沒有shell,無法通過ssh與控制檯登陸系統,Java 的JVM 是與系統無關的,是建立在OS之上的,你使用什麼用戶啓動Tomcat,那麼Tomcat 就會繼承該所有者的權限爲了防止 Tomcat 被植入 web shell 程序後,可以修改項目文件。因此我們要將 Tomcat 和項目的屬主做分離,這樣子,即便被搞,他也無法創建和編輯項目文件。 
                 設置普通用戶,用來啓動tomcat
1
2
3
4
5
6
[root@localhost ~]# groupadd tomcat
[root@localhost ~]# useradd -g tomcat tomcat
[root@localhost ~]# passwd tomcat
[root@localhost ~]# chown tomcat.tomcat -R /usr/local/tomcat
[root@localhost ~]# su - tomcat /usr/local/tomcat/bin/startup.sh
[root@localhost ~]# echo 'su - tomcat -c "tomcat /usr/local/tomcat/bin/startup.sh"' >> /etc/rc.local  #開機啓動




參考資料:

    https://github.com/judasn/Linux-Tutorial/blob/master/Tomcat-Install-And-Settings.md

    http://nolinux.blog.51cto.com/4824967/1608940

   centos7設置防火牆:http://stackoverflow.com/questions/24729024/centos-7-open-firewall-port

    JVM模型:http://xmuzyq.iteye.com/blog/599750

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章