Web中間件學習篇Tomcat

Tomcat簡介

Tomcat(Apache Tomcat)是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun和其他公司及個人共同開發而成。

Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。

對於一個初學者來說,可以這樣認爲,當在一臺機器上配置好Apache 服務器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。

實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作爲一個與Apache 獨立的進程單獨運行的。

當配置正確時,Apache 爲HTML頁面服務,而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務器一樣,具有處理HTML頁面的功能。

另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Apache服務器。

Tomcat站點搭建

Tomcat雖全稱爲Apache Tomcat但是配置方法和Apache差別還是不小的,首先它和很多java應用類似,其重點在於環境變量的配置。既包括java環境變量的配置,也包括tomcat環境變量的配置。本次我們直接使用tomcat的軟件包進行配置,搭建Linux+Tomcat+Mysql+Jsp的站點,分爲以下幾步:

  1. 安裝並配置Java環境
  2. 安裝並配置Tomcat環境
  3. 安裝並配置Mysql
  4. 部署Jsp站點

本篇介紹的Tomcat環境搭建,主要參考的文章是linux公社的一篇:CentOS 6.6下安裝配置Tomcat環境,對於其中的部分細節略作修改。下面開始詳細介紹如何搭建一個完整的Tomcat站點

環境介紹

操作系統:CentOS release 6.5 (Final)
Java版本:jdk1.8.0_60
Tomcat版本: apache-tomcat-8.0.45 
站點類型:Jsp

搭建站點

安裝並配置Java環境

這一步還是非常簡單的,概括一下就是:

下載並安裝jdk,同時修改環境變量

wget http://download.Oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz
//官網下載jdk1.8

tar -xvzf jdk-8u60-linux-x64.tar.gz -C /usr/local/
//將其解壓至/usr/local目錄下,此時的文件夾名應爲jdk1.8.0_60

cd /usr/local/

ln -sv jdk1.8.0_60  jdk
//在/usr/local目錄下建立一個軟鏈接,爲方便將jdk1.8.0_60建立一個叫jdk的軟鏈接(重命名亦可mv jdk1.8.0_60 jdk)

然後在/etc/profile.d/目錄下創建一個腳本jdk.sh,修改環境變量

vim /etc/profile.d/jdk.sh
--------------------------------------------------->
JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
<---------------------------------------------------
. /etc/profile.d/jdk.sh        //重讀此文件,讓變量生效 ,注意.號後有空格

其實這種寫腳本的方式修改環境變量的方法相對於直接敲命令,更加實用便捷。

此時執行

java -version

安裝並配置Tomcat環境

和配置Java環境非常類似,步驟也大致相同

下載並安裝tomcat,同時修改環境變量

wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.45/bin/apache-tomcat-8.0.45.tar.gz
tar xf apache-tomcat-8.0.45.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-8.0.45 tomcat  //亦可使用mv apache-tomcat-8.0.45 tomcat

然後在/etc/profile.d/目錄下創建一個腳本tomcat.sh,修改環境變量

vim /etc/profile.d/tomcat.sh
--------------------------------------------------->
CATALINA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export PATH CATALINA_BASE
<---------------------------------------------------
. /etc/profile.d/tomcat.sh

此時執行

catalina.sh version

可以看到,tomcat的根路徑就是/usr/local/tomcat

接下來就是配置Tomcat

配置默認端口爲80端口(修改server.xml)

vim /usr/local/tomcat/conf/server.xml
---------------------------------------------------------->
 <Connector port="80" protocol="HTTP/1.1"      //默認端口爲8080,改爲80
        connectionTimeout="20000"
        redirectPort="8443" />

配置manager-gui管理頁面(配置tomcat-users.xml)

vim /usr/local/tomcat/conf/tomcat-users.xml
------------------------------------------------------------------------------->
<role rolename="manager-gui"/>                  //倒數第二行添加,指定用戶可以使用的接口爲manager-gui
<user username="tomcat" password="tomcat" roles="manager-gui"/>      //用戶名和密碼爲tomcat,在manager-gui接口使用

開始第一個網頁

類似於apache之於/var/www/html/,nginx之於/usr/share/nginx/html/,tomcat同樣有自己對應的網頁目錄,一般就是根目錄+webapps/,在本機上就是/usr/local/tomcat/webapps/

假如我們要創建一個叫test的項目,我們需要同時在test目錄下建立WEB-INF/classes和WEB-INF/lib文件夾

mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}   //-v參數是顯示創建目錄是否成功

ok,可以在test目錄下寫下第一個Jsp網頁了(注:和apache和nginx不同,tomcat默認支持Jsp,因此無需再安裝Jsp)

vim /usr/local/tomcat/webapps/test/index.jsp
--------------------------------------------------------------->
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <%
            out.println("Hello qingteng!");      //嵌入java語言
        %>
    </body>
</html>

運行一下好了

catalina.sh start

非常nice,本機直接訪問127.0.0.1或者本機IP

而我們創建的test項目下的index.jsp文件,可通過訪問ip/test/index.jsp打開

此時其他主機還是無法通過ip的方式訪問該主機的,和apache類似,需要開啓80端口的訪問規則

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT  //添加開啓80端口規則
/etc/rc.d/init.d/iptables save  //保存配置
/etc/rc.d/init.d/iptables restart   //重啓iptables
/etc/init.d/iptables status   //查看開放的端口,出現80

此時其它主機已經可以正常訪問

還有另外一種訪問方式,既然我們已經配置了tomcat-users.xml中的賬號密碼,我們可以通過點擊右上角Manager App,並輸入我們配置的賬號密碼對web應用進行管理

可以看見我們創建的項目test,單擊進去就是/test/index.jsp

安裝並配置Mysql

yum -y install mysql mysql-server mysql-devel   //安裝mysql和其相關拓展
chkconfig mysqld on  //設置其開機啓動
service mysqld start   //啓動mysqld服務
/usr/bin/mysql_secure_installation  //設置mysql的一些安全配置
這一步還是很重要的,主要是設置mysql的root密碼,是否需要刪除匿名賬號等等,根據實際需要設置

此時我們可以登錄一下mysql

部署Jsp站點

這裏用JEECMS做演示,首先放入程序文件,程序可從http://www.jeecms.com下載,下載安裝包即可:

unzip jeecmsv8.1.zip
cd jeemsv8.1
mv ROOT/ /usr/local/tomcat/webapps/cms
catalina.sh stop
catalina.sh start

然後訪問ip/cms頁面即可

安裝過程非常簡單,在安裝好mysql的情況下,只需要填寫一下數據庫的密碼,僅十幾秒即可完成

重啓完成後訪問http://192.168.248.141/cms/jeeadmin/jeecms/login.do,使用admin/password登錄即可,至此站點搭建完畢

Tomcat日誌分析

相對於apache和nginx,tomcat的日誌不僅數量更多而且配置和理解起來也更加複雜,下面詳細梳理一下tomcat日誌的知識點

首先看一下tomcat的位置,不同於其它web中間件,它的日誌並不在/var/log目錄下,而在tomcat安裝路徑之下的logs文件夾,比如我的本機的路徑就是/usr/local/tomcat/logs/,看一下里面有什麼吧

感覺還是挺多的,去個重分別解釋一下吧

日誌種類說明

序號            名稱                                        說明
1        catalina.date.log                       Catalina引擎的日誌文件
2        catalina.out                            Catalina控制檯輸出,包括標準輸出和錯誤輸出
3        host-manager.date.log                   主機管理日誌
4        localhost.date.log                      Tomcat下內部代碼丟出的日誌
5        locahost_access_log.date.txt            網頁訪問日誌
6        manager.date.log                        應用管理日誌

關於以上日誌的內容如果展開了說非常多,而且很多都要閱讀官方英文文檔才能瞭解其大致用途,下面挑一些重點日誌,詳細展開,較爲冷門的就一筆帶過了。

首先關於以上日誌文件的配置

12346均在tomcat根目錄/conf/logging.properties下
5在tomcat根目錄/conf/server.xml下

logging.properties

一般日誌文件定義是3行
1.  首行決定什麼級別及以上的信息輸出
    每類日誌的級別分爲如下 7 種:
    SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)
    OFF爲禁用輸出;ALL爲全部輸出
2. 第二行決定輸出日誌文件的路徑
3. 第三行決定日誌文件的前綴

此外catalina.out由於是輸出控制檯(console)信息,該信息源於Linux輸出的重定向,因此與其它日誌不同

順便一提,manager和host-manager分別對應tomcat後臺頁面的Manager App和Host Manager,想要生成這兩類日誌,需要在tomcat-users.xml裏分別配置manager-gui和admin-gui角色的賬號密碼,並訪問相應頁面,否則這兩個日誌都會是空的

Tomcat默認使用JULI日誌系統(可以參考官網文檔修改成使用log4j),它是對默認的JDK日誌java.util.logging進行一定的封裝,和標準JDK日誌支持相同的配置。最大的不同是針對不同的classloader,可以使用不同的配置文件,使得tomcat下不同的Web應用程序可以使用各自獨立的日誌文件。也就是說,Tomcat下的默認日誌有如下2個層次:

  • 全局配置文件.

That is usually done in the ${catalina.base}/conf/logging.properties file. The file is specified by the java.util.logging.config.file System property which is set by the startup scripts. If it is not readable or is not configured, the default is to use the ${java.home}/lib/logging.properties file in the JRE.

  • Web應用程序中使用WEB-INF/classes/logging.properties

默認的JRE中的logging.properties會把日誌輸出到System.err(ConsoleHandler)中,而默認的Tomcat下的配置文件conf/logging.properties會增加多個FileHandlers把日誌輸出到不同的文件。

關於Juli日誌系統的更多內容,或者想把Juli改成Log4j的,推薦這篇文章:Tomcat日誌機制

server.xml

前面提到5類的日誌可歸納爲運行日誌,一般用於排查服務端console、catalina、tomcat、web應用管理遇到的錯誤,而且其中詳細的配置應該查閱的是對應版本tomcat的官方文檔:Apache Tomcat 8 Docs Home

接下來要介紹的就是訪問日誌,即訪問網頁的記錄,類似於apache和nginx中的access.log,首先看一下它在server.xml是如何配置的

關注點主要就是紅框標註處

className        開啓訪問日誌必用類
directory        日誌存放目錄
prefix           日誌名前綴
suffix           日誌文件後綴
pattern          日誌記錄的格式

除了第一個className不允許修改外,其它字段值可以根據實際需要修改,最重要的就是pattern,我們結合實際的一例日誌文件解釋一下

192.168.248.1 – - [14/Aug/2017:19:39:20 -0700] “GET /cms/jeeadmin/jeecms/index.do HTTP/1.1″ 200 555

而與之對應的pattern是這樣,和apache的access.log確實比較類似

pattern=”%h %l %u %t “%r” %s %b”

%h      爲遠程主機名(若無法獲取主機名亦可爲遠程主機IP)對應192.168.248.1
%l      爲遠端登錄名(由identd而來),除非IdentityCheck設爲"On",否則將得到一個"-"
%u      爲遠程用戶名(根據驗證信息而來),若不存在得到一個"-"
%t      爲時間,用普通日誌時間格式(標準英語格式) 對應[14/Aug/2017:19:39:20 -0700]
&quot;  爲雙引號"的實體編碼
%r      爲請求頭第一行(包括HTTP方法和請求的URI),對應GET /cms/jeeadmin/jeecms/index.do HTTP/1.1
%s      爲HTTP響應狀態碼
%b      爲發送信息的字節數,不包括HTTP頭,如果字節數爲0的話,顯示爲-

關於這個的字段的詳細配置說明,查閱官方英文文檔最爲準確:Tomcat8訪問日誌字段說明

Tomcat日誌分析Web攻擊行爲

和之前不同,此次我們使用IBM的AppScan進行深度掃描,相對於手工拿burp suite、sqlmap測試,測試時間更加漫長,甚至比AWVS的時間還長,掃描了約1個半小時才掃描了21%,爲了不耽誤時間直接暫停了,去看結果。

掃描完成後,localhost_access_log增加至13M左右

sql注入攻擊

在日誌文件中搜索關鍵字”SELECT”

可以看見AppScan採用的payload確實比較特別,除了普通的參數注入外,還會嘗試url注入,並添加一些不可見字符

xss攻擊

在日誌中搜索關鍵字”script”

xss的payload相對而言比較簡單,大多數是做了url編碼後直接測試

目錄遍歷

在日誌中搜索關鍵字”../”或者”..%2F”或者”%uff0e%uff0e/”或者”%2e%2e/”或者”%252e%252e/”等等,這些均是各種編碼後的../

命令執行

在日誌中搜索關鍵字”system”或者”exec”

一般在命令執行攻擊中,system和exec出現的頻率還是比較高的

任意文件讀取

在日誌中搜索關鍵字”/etc/passwd”

/etc/passwd可以說是攻擊者最喜歡讀取的文件了,將其作爲參數值傳遞看回顯結果來判斷是否存在該類型漏洞。

關於AppScan探測的漏洞還有很多,此處就不一一解釋了,有興趣可以自行探索一下

補充知識點

1. 如何修改Tomcat默認端口號?

這個問題其實上面已經給出答案了,修改server.xml中的port

<Connector port=”80″ protocol=”HTTP/1.1″

測試時在本機瀏覽器輸入http://127.0.0.1:新端口號 即可

注:外網主機此時可能無法通過http://IP:新端口號 方式訪問,記得修改iptables,添加新端口號規則。

2. 以root身份啓動Tomcat,該服務以什麼用戶運行?

使用ps aux|grep tomcat|grep -v grep查看一下

只有一個root啊,沒有tomcat這個用戶嗎?從/etc/passwd中確實可以看出,安裝tomcat不會在系統中新建tomcat用戶,以root身份啓動tomcat,那麼該服務就是以root身份運行的。

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