Web中間件之Apache篇

Apache簡介

Apache起初由伊利諾伊大學香檳分校的國家超級電腦應用中心(NCSA)開發。此後,Apache Httpd被
開放源代碼團體的成員不斷的發展和加強。Apache Http網站服務器擁有牢靠可信的美譽,已經在
全球超半數的網站中被使用-特別是幾乎所有最熱門和訪問量最大的網站。比方說,維基百科網站服務器
就是使用Apache的。
剛開始發展時,Apache只是Netscape網頁服務器(現在是Sun ONE)之外的開放源代碼選擇之一。
它開始在功能和速度超越其他基於UnixHTTP服務器。到了Apache 2.x的時代,實際效率又比
Apache 1.x更快,2.x比1.x能同時服務更多的網頁連接數。
1996年4月以來,Apache一直是Internet上最流行的HTTP服務器:1999年5月它在57%的網頁服務器上
運行,到了2005年7月這個比例上升到了69%。在2005年11月最風光的時候達到接近70%的市佔率,
不過在部分擁有大量域名的主機域名商轉換爲微軟IIS平臺後,Apache市佔率近年來呈現些微下滑。
同時搜索引擎巨擘Google自己的網頁服務器平臺GWS推出後(也可說是一種修改版的Apache),再加上
nginxLighttpd等輕量化網頁服務器軟件在市場上有一些能見度,這些因素都反應在整體網頁服務
器市佔率的消長,Apache的市佔率就隨之滑落。
根據Netcraft在2009年12月的最新統計數據,Apache的市佔率已經降爲53.67%,IIS降爲18.26%,
谷歌網頁服務器13.53%,nginx 8.75%。
儘管如此,Apache及其各種分支版本仍舊是當前互聯網市場上,市佔率最高的網頁服務器軟件

Apache站點搭建

Apache的站點搭建相對於IIS而言還是比較簡單的,無需過多的配置,只需要安裝相應的軟件和插件即可。以配置php站點爲例,主要分爲以下幾步:

  1. 安裝httpd服務;
  2. 安裝Mysql、php、配置phpmyadmin;
  3. 部署php站點;

下面開始詳細介紹如何搭建一個完整的Apache站點

環境介紹

操作系統:CentOS release 6.5 (Final)
Apache版本:httpd-2.2.15-60.el6.centos.4.x86_64
站點類型:php

搭建步驟

安裝httpd服務

整個安裝過程還是非常輕鬆的

yum -y install httpd
service httpd start

有必要的話可以設置其開機啓動,順便安裝一些apache拓展

chkconfig httpd on
 yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql

此時去訪問localhost或者127.0.0.1或者本機訪問本機ip就可以看見熟悉的apache界面

但是由於iptables的緣故,其它主機還是無法訪問的,此時有兩種方法可以解決:

方法一
iptables -F   //直接清除iptables規則,本次開機有效,過於簡單粗暴,不推薦
方法二
/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
順便一提,想開啓ssh服務也可將22端口如上述方法設置規則

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

安裝Mysql、php、配置phpmyadmin

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

 yum -y install php   //安裝php
 yum -y install php-mysql gd php-gd gd-devel php-xml php-common 
 yum -y install php-mbstring php-ldap php-pear php-xmlrpc php-imap  php-mcrypt
 //安裝php常用拓展
 service httpd restart   //重啓httpd服務,這一步非常重要

完成之後可以簡單測試一下,在/var/www/html目錄下新建phpinfo.php文件,讓其輸出一下相關信息

下一步就是安裝phpmyadmin,這個其實是可選步驟,只是爲了方便圖形化管理mysql,下載官網:phpmyadmin下載官網

在官網下載了phpMyAdmin-4.0.10.20-all-languages.tar.gz

下載的是老版本,這個是由於我安裝的php版本爲5.3.3,低於5.5,一開始下載的4.7.3的版本配置了半天還是顯示403比較無語,老版本不會出問題

tar -xvzf phpMyAdmin-4.0.10.20-all-languages.tar.gz
mv phpMyAdmin-4.0.10.20-all-languages /var/www/html/phpmyadmin
cd /var/www/html/phpmyadmin
cp libraries/config.default.php config.inc.php

然後修改一下相關配置vi config.inc.php,一般改這些

$cfg['PmaAbsoluteUri'] = '';這裏填寫 phpMyAdmin 的訪問網址。

$cfg['Servers'][$i]['host'] = 'localhost'; // MySQL hostname or IP address

$cfg['Servers'][$i]['port'] = ''; // MySQL port - leave blank for default port

$cfg['Servers'][$i]['user'] = 'root'; // 填寫 MySQL 訪問 phpMyAdmin 使用的 MySQL 用戶名,默認爲 root。

$cfg['Servers'][$i]['password'] = ''; // 填寫對應上述 MySQL 用戶名的密碼。

$cfg['blowfish_secret'] = '1qaz2wsx3edc';//隨意,長度不要太短

實際過程中其實我也只是修改了password一處爲我的mysql密碼,blowfish_secret其實也可以修改,否則登錄後會給個警告,但是不影響使用最後重啓一下httpd服務 service httpd restart打開瀏覽器訪問http://localhost/phpmyadmin或者http://ip/phpmyadmin即可

部署php站點

這一步相對而言比較簡單,我直接使用了我畢設時製作的php源碼包,修改了一下其中的db_config.php,把root密碼改成目前設置的,最後訪問一下login.php,非常完美

然後登錄一下,結果。。。

寫了一個小的腳本看一下報的什麼錯

<?php
     @ $mysqli = new mysqli($dbConf[host],$dbConf[user],
                $dbConf[password],$dbConf[dbName],$dbConf[port]);
        if ($mysqli->connect_errno) {
         echo "不能連接到數據庫<br/>";
         echo mysqli_connect_error($mysqli);
        return;
        }
        else {echo "mission success!";}
?>

顯示Access denied for user ‘root’@'localhost’ (using password: NO)這個問題非常奇怪,找了半天全是關於終端登錄mysql時出現這種問題,看來問題還是出現在我寫的db_config.php上,最後根據經驗將host從127.0.0.1改成localhost居然好了

仔細查了這個問題發現對於mysql和php這兩者還真的不一樣,甚至連接方式都不相同

簡而言之

當主機填寫爲localhostmysql會採用 unix domain socket連接
當主機填寫爲127.0.0.1mysql會採用tcp方式連接
這是linux套接字網絡的特性,win平臺不會有這個問題

Apache日誌分析

Apache日誌主要分爲兩類:error_logaccess_log ,實際排查過程中更常用的是error_log

關於Apache日誌文件的位置,詳細信息可以查看Apache的配置文件,但是由於Linux發行版的差異和安裝方式的不同,其配置文件也不盡相同,下面開始分別介紹:

Apache日誌(Debian家族)

常用於DebianUbuntuLinux Mint
測試系統:Ubuntu 16.04 LTS
使用apt-get方式安裝 apache2 2.4.18-2ubuntu3.3
此時的配置文件名稱爲apache2.conf

一般情況下該配置文件路徑爲/etc/apache2/apache2.conf,如果使用編譯安裝或者dpkg等方式安裝的話路徑可能會有不同,此時一般建議使用locate搜索一下apache2.conf

updatedb
locate apache2.conf

日誌文件信息就寫在該配置文件中

其中使用了變量APACHE_LOG_DIR指代了前面的路徑,而$APACHE_LOG_DIR到底代表什麼,其實這個值是環境變量,一切和apache2環境變量有關的值全在/etc/apache2/envvars中,env爲環境縮寫,vars爲變量縮寫,打開後可以發現該值爲/var/log/apache2/

拼接一下,完整的error_log路徑爲

/var/log/apache2/error.log

查看一下/var/log/apache2下的文件,包括access.log(訪問日誌)、error.log(錯誤日誌)、other_vhosts_access.log(虛擬主機日誌)

access.log

我們可以打開access.log文件看一下其中的內容

下面我們詳細解釋一下吧,首先這個日誌格式,仍然來源於配置文件apache2.conf,其中有關於LogFormat的定義

第一個可以不用管它,它是虛擬主機的日誌文件格式,本篇不做討論

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common

第二個和第三個分別爲組合日誌格式(Combined Log Format)和通用日誌格式(Common Log Format),本系統中由於Combined在Common之前,因此access_log日誌按照Combined Log Format方式記錄,解釋下各個字段的含義,以下面一行爲例:

127.0.0.1 – - [24/May/2017:10:31:39 +0800] “GET / HTTP/1.1″ 200 3525 “-” “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0″

對應

LogFormat “%h %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”" combined

其中:

%h 遠端主機 對應127.0.0.1
%l 遠端登錄名(由identd而來),除非IdentityCheck設爲"On",否則將得到一個"-"
%u 遠程用戶名(根據驗證信息而來),若不存在得到一個"-"
%t 時間,用普通日誌時間格式(標準英語格式) 對應[24/May/2017:10:31:39 +0800]
\"%r\" 請求頭的第一行,\用於轉移雙引號,對應 "GET / HTTP/1.1"
%>s  該請求最後的狀態碼,對應200
%O 發送的字節數,包括請求頭的數據,並且不能爲零,對應3525
\"%{Referer}i\"該請求來源頁面,此處對應"-"
\"%{User-Agent}i\"該請求使用的瀏覽器信息,對應"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; 
                  rv:53.0) Gecko/20100101 Firefox/53.0"

第四個和第五個類似,補充一條

%U 請求的URL路徑,不包含查詢字符串。

關於Apache日誌完整字段內容可以參考以下文章apache日誌 LogFormat參數說明

error.log

相對於access.log日誌文件,apache的error.log要簡單一些,首先在apache2.conf文件中定義了其路徑(ErrorLog)及記錄等級(LogLevel)

類似於Linux的syslog,只記錄等級在配置文件中規定及以上的信息,如上圖所示,error.log中只記錄等級在warn以上的信息,以下爲錯誤信息等級排序:

查看一下error.log中到底記錄了什麼吧

其實這張圖不是特別好,居然記錄的全是notice的信息,而notice的等級在warn之下,爲什麼會被記錄?

注意:當錯誤日誌是一個單獨分開的正式文件的時候(如本例中就是單獨的/var/log/apache2/error.log文件),notice級別的消息總是會被記錄下來,而不能被屏蔽。但是,當使用syslog來記錄時就沒有這個問題。

以上圖片還表明了apache錯誤日誌記錄的格式爲

[日期和時間]   [錯誤等級]   錯誤消息

關於日誌文件的更多內容可以查閱該網站Apache的日誌文件

Apache日誌(RedHat家族)

常用於CentOS,Fedora或RHEL 測試系統:CentOS release 6.5 使用yum方式安裝 Apache/2.2.15 (Unix) 此時的配置文件名稱爲httpd.conf

一般情況下該配置文件路徑爲/etc/httpd/conf/httpd.conf,如果使用編譯安裝或者rpm等方式安裝的話路徑可能會有不同,此時一般建議使用locate搜索一下httpd.conf,還有更簡便的方法,後面會介紹

updatedb
locate httpd.conf

日誌文件信息就寫在該配置文件中

典型的相對路徑的寫法,還要找一下路徑的起始位置,可以搜索一下ServerRoot

拼接一下,完整的error_log路徑爲

/etc/httpd/logs/error.log

與此同時,我們還可以在/var/log/httpd/目錄下找到相同的error.log文件,這是怎麼回事呢?

顯而易見,/etc/httpd/logs/目錄是/var/log/httpd的一個軟鏈接

更簡單的查看方法,可以使用以下命令

httpd -V

指出了httpd的根目錄爲/etc/httpd,錯誤日誌目錄爲/etc/httpd/+logs/error_log,配置文件目錄爲/etc/httpd/+conf/httpd.conf

查看一下/etc/httpd/logs下的文件,包括access.log(訪問日誌)、error.log(錯誤日誌)、ssl_access_log(https訪問日誌)、ssl_error_log(https錯誤日誌)、ssl_request_log(https請求日誌)

access.log

我們可以打開access.log文件看一下其中的內容

下面我們詳細解釋一下吧,首先這個日誌格式,仍然來源於配置文件httpd.conf,其中有關於LogFormat的定義

這個和Debian家族的apache2.conf中的定義是一樣的,此處就不詳細展開了,有一點不同之處:httpd.conf中的access.log指定了日誌格式爲Combined Log Format,而apache2.conf中並未提及,只是按照順序選擇了Combined Log Format

error.log

這個和Debian家族的error.log基本上是相同的,httpd中同樣記錄了LogLevel爲Warn

注意:當錯誤日誌是一個單獨分開的正式文件的時候(如本例中就是單獨的/var/log/apache2/error.log文件),notice級別的消息總是會被記錄下來,而不能被屏蔽。但是,當使用syslog來記錄時就沒有這個問題。

以上圖片還表明了apache錯誤日誌記錄的格式爲

[日期和時間]   [錯誤等級]   錯誤消息

查看該日誌我們可以發現一個問題:php的access.log和error.log直接記錄在了httpd的日誌路徑下,難道php的日誌不會記錄在自己的相關目錄下嗎?

這個問題可以在/etc/php.ini(php配置文件默認路徑)中得到答案

php的錯誤日誌文件可以自定義輸出路徑,也可以輸出到syslog中,但是在該文件中均被分號註釋了,因此日誌文件默認通過web中間件進行存儲

Apache日誌分析Web攻擊行爲

Apache日誌有一個重要作用就是分析Web攻擊行爲

sql注入攻擊

下面使用Apache日誌分析sqlmap對網站進行sql注入攻擊。

首先還是找一處注入點

打開access.log文件可以看見非常多的訪問記錄,包括IP、訪問時間、UA以及sqlmap的攻擊payload等信息

xss攻擊

下面使用Apache日誌分析burp suite對網站進行xss跨站攻擊。

首先使用burp suite隨意攔截一處網址url,並在dcbid字段標記,使用xss-fuzzing攻擊

由於這個站點設置過XSS過濾,因此以上payload沒有成功

但是查看日誌文件,同樣可以看見大量的xss攻擊記錄

post方式訪問

Apache的日誌能否記錄POST請求數據呢?我們使用burp suite將GET請求更改爲POST,並添加內容爲hello qingteng~~

去日誌文件中查看,可以發現對於此次的POST 請求,日誌中是有記錄的,但並未記錄POST提交的內容

那麼apache中如何讓日誌文件記錄POST提交的信息呢?

  1. apache加載dumpio模塊。這個需要在httpd.conf文件中進行設置,apache默認不啓用該模塊,找到下面一行,去掉最前方的#號

     # LoadModule dumpio_module modules/mod_dumpio.so`
    

  1. 配置日誌告警級別。將原先的LogLevel註釋掉,添加DumpIO模塊的記錄

    LogLevel debug

    DumpIOInput On

    DumpIOOutput On

    DumpIOLogLevel debug

3.重啓apache

測試一下,還是POST方式傳入hello qingteng~~,此時在error.log(特別注意不是access.log)中,我們可以看見POST傳入的值

補充知識點

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

這個問題非常簡單,打開httpd.conf文件,

找到Listen 80 一行,將80修改爲想要設置的端口號,保存,重啓httpd即可

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

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

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

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

第一列中既有root,又有apache,其中第一行爲httpd主進程,自第二行起爲httpd子進程,這個是由於apache默認端口爲80(http)和443(https),而Linux中啓動小於1024的端口,必須使用root權限。

如果配置文件中的Listen directive設置了默認端口爲80(或者是其它的值,但要小於1024),接下來apache httpd就需要root權限來啓動apache,這是因爲在將應用進程綁定在(1-1024)這個保留端口範圍內的時候,需要root權限。

當 server一旦啓動並且執行了些許初步動作,比如打開log日誌文件,接下來server會裝載執行指定數目的child processes,這些process是用來複雜監聽端口,處理來自client的請求並且返回響應。

而主httpd process仍然以root權限繼續運行,但是這些child processes會以較低的權限運行,而這些行爲都可以通過選擇Multi-processing Module來進行控制。

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