Tomcat安全配置與性能優化

来源:http://www.cnblogs.com/peke/archive/2017/12/09/8013160.html
-Advertisement-
Play Games

Tomcat 是 Apache軟體基金會下的一個免費、開源的WEB應用伺服器,它可以運行在 Linux 和 Windows 等多個平臺上,由於其性能穩定、擴展性好、免費等特點深受廣大用戶喜愛。目前,很多互聯網應用和企業應用都部署在 Tomcat 伺服器上,比如我們公司,哈。 之前我們 tomcat ...


   Tomcat 是 Apache軟體基金會下的一個免費、開源的WEB應用伺服器,它可以運行在 Linux 和 Windows 等多個平臺上,由於其性能穩定、擴展性好、免費等特點深受廣大用戶喜愛。目前,很多互聯網應用和企業應用都部署在 Tomcat 伺服器上,比如我們公司,哈。

        之前我們 tomcat 都採用的是預設的配置,因此在安全方面還是有所隱患的。上周對測試環境的所有伺服器的tomcat都做了安全優化,其間也粗略做了一些性能優化,這裡就簡單記錄分享下!

 

一、版本安全

        升級當前的tomcat版本為最新穩定版本。故名思議,最新穩定版本就要兼顧最新和穩定這兩個概念。一個穩定的版本,是需要時間沉澱的,而最新又是相對於穩定版而言的最新。因此我們一般會選擇當前大版本中,最新版本往前推幾個版本或者往前推幾個月出的版本。

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

 

       在升級版本中,需要註意的事情有兩點:

       1、儘量避免跨大版本的升級

       2、將當前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件進行備份,然後部署完新版本的 tomcat 之後,將這些配置文件覆蓋過去即可,然後停掉舊版本,啟動新版本即可完成升級操作。

 

二、隱藏版本信息

       為了避免黑客針對某些版本進行攻擊,因此我們需要隱藏或者偽裝 Tomcat 的版本信息。

 

 針對該信息的顯示是由一個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即可看到效果!

三、優化 web.xml

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

它可以做如下事情: 

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

        2、增加監聽器,監控session或在tomcat啟動時,載入一些你希望載入的資源。比如創建資料庫連接池等等

        3、設置session過期時間,tomcat預設是30分鐘

        4、更改應用的預設網頁,常用為index.html/index.jsp等

        5、增加過濾器,做一些你希望的過濾操作,比如敏感辭彙的過濾

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

        7、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中的表現形式:

 

站點預設主頁,

自定義錯誤頁面,

定義會話超時時間,

禁止列目錄.

四、優化 tomcat-user.xml

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

       在生產環境中,我們需要將該文件全部註釋。

五、優化 server.xml

       Tomcat的主配置文件,該文件中包含很多主要元素,比如Service、Connector、Host等,這些元素都會創建軟體"對象"、排序及進程管道中設置的這些元素嵌套方,使我們可以執行過濾、分組等工作。

       如果要對改文件做優化,我們需要先瞭解該文件的結構!

 

       server.xml的結構圖:

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

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

 

針對該文件,我們需要優化的點有如下:

1、maxThreads 連接數限制

       maxThreads 是 Tomcat 所能接受最大連接數。一般設置不要超過8000以上,如果你的網站訪問量非常大可能使用運行多個Tomcat實例的方法,即,在一個伺服器上啟動多個tomcat然後做負載均衡處理。

這裡還需要註意的一點是,tomcat 和 php 不同。php可以按照cpu和記憶體的情況去配置連接數,上萬很正常。而 java 還需要註意 jvm 的參數配置。如果不註意就會因為jvm參數過小而崩潰。

2、多虛擬主機

       強烈建議不要使用 Tomcat 的虛擬主機,推薦每個站點使用一個實例。即,可以啟動多個 Tomcat,而不是啟動一個 Tomcat 裡面包含多個虛擬主機。因為 Tomcat是多線程,共用記憶體,任何一個虛擬主機中的應用崩潰,都會影響到所有應用程式。雖然採用多實例的方式會產生過多的開銷,但至少保障了應用程式的隔離和安全。

3、壓錯傳輸

       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 去做。

4、管理AJP埠

       AJP是為 Tomcat 與 HTTP 伺服器之間通信而定製的協議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個連接器。由於我們公司前端是由nginx做的反向代理,因此不使用此連接器,因此需要註銷掉該連接器。

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

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

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

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

       修改實例:

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

6、更改 Tomcat 的服務監聽埠

 

       一般公司的 Tomcat 都是放在內網的,因此我們針對 Tomcat 服務的監聽地址都是內網地址。

       修改實例:

 

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

 

7、關閉war自動部署

       預設 Tomcat 是開啟了對war包的熱部署的。為了防止被植入木馬等惡意程式,因此我們要關閉自動部署。

       修改實例:

<Host name="localhost"  appBase=""

            unpackWARs="false" autoDeploy="false">

 

六、禁用 Tomcat 管理頁面

       我們線上是不使用 Tomcat 預設提供的管理頁面的,因此都會在初始化的時候就把這些頁面刪掉。這些頁面是存放在 Tomcat 安裝目錄下的webapps目錄下的。

       我們只需要刪除該目錄下的所有文件即可。

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

 

七、用普通用戶啟動 Tomcat

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

       在啟動之前,需要對我們的tomcat 安裝目錄下所有文件的屬主和屬組都設置為指定用戶。

 

 

八、分離 Tomcat 和項目的用戶

        為了防止 Tomcat 被植入 web shell 程式後,可以修改項目文件。因此我們要將 Tomcat 和項目的屬主做分離,這樣子,即便被搞,他也無法創建和編輯項目文件。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概念 將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。 二、模式動機 組合模式,通過設計一個抽像的組件類,使它既代表葉子對象,又代表組合對象,將葉子對象和組合對象統一起來。使得客戶端在操作時不再區分當前操作的是葉子對象還是組合對象,而是以 ...
  • spring 和 mybatis 整合的那篇: ssm(2) . 配置文件比ssm(1) 更多, 在做項目的時候, 配置文件是一個讓人頭大的事情. 那麼在spring boot中, 實現相同功能, 需不需要做那麼多配置呢. 一. 從pom.xml 開始 pom.xml文件, 直觀的感覺, 就是非常的 ...
  • Serverless無服務應用架構縱橫談 一、Serverless是啥 自從互聯網興起以來,Server就成了網路的核心部件。所以圍繞Server的生意圈,也發展得如火如荼。 從最早的電信托管,到虛擬機,到現在的Serverless,形成了幾大陣容: 1、IaaS(基礎設施即服務:Infrastru ...
  • 前臺: 支持四套模版, 可以在後臺切換 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對伺服器負擔小 3.網站前端採用主流的響應式佈局,同一頁面同時支持PC、平板、手機(三 ...
  • ui設計作為新人的你該如何入門?後期又該如何規劃自己的職業,往往好的規劃和學習帶給你的成就同時也會帶給你相應的薪水。 ...
  • 大sz的游戲 Description 大sz最近在玩一個由星球大戰改編的游戲。話說絕地武士當前共控制了N個星球。但是,西斯正在暗處悄悄地準備他們的復仇計劃。絕地評議會也感覺到了這件事。於是,準備加派絕地武士到各星球防止西斯的突襲。一個星球受到攻擊以後,會儘快通知到總基地。需要的時間越長的星球就需要越 ...
  • 描述 本篇文章將將要分析設計模式中的工廠模式,具體包括如下內容: (1)Eclipse安裝和漢化 (2)Tomcat安裝和CATALIAN_HOME變數配置 (3)在Eclipse中配置Tomcat 1 Eclipsea安裝和漢化 1 Eclipsea安裝和漢化 Eclipse安裝在前一章節中講過。 ...
  • 發現要堅持寫博客真的是一件很困難的事情,各種原因都會導致顧不上博客。本來打算寫自己動手實現orm,看看時間,還是先實現一個動態sql,下次有時間再補上orm完整的實現吧。 用過mybatis的人,估計對動態sql都不陌生,如果沒有用過,就當看看熱鬧吧。我第一次接觸mysql是在大四的時候,當時就覺得 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...