Apache簡介
Apache起初由伊利諾伊大學香檳分校的國家超級電腦應用中心(NCSA)開發。此後,Apache Httpd被
開放源代碼團體的成員不斷的發展和加強。Apache Http網站服務器擁有牢靠可信的美譽,已經在
全球超半數的網站中被使用-特別是幾乎所有最熱門和訪問量最大的網站。比方說,維基百科網站服務器
就是使用Apache的。
剛開始發展時,Apache只是Netscape網頁服務器(現在是Sun ONE)之外的開放源代碼選擇之一。
它開始在功能和速度超越其他基於Unix的HTTP服務器。到了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),再加上
nginx、Lighttpd等輕量化網頁服務器軟件在市場上有一些能見度,這些因素都反應在整體網頁服務
器市佔率的消長,Apache的市佔率就隨之滑落。
根據Netcraft在2009年12月的最新統計數據,Apache的市佔率已經降爲53.67%,IIS降爲18.26%,
谷歌網頁服務器13.53%,nginx 8.75%。
儘管如此,Apache及其各種分支版本仍舊是當前互聯網市場上,市佔率最高的網頁服務器軟件
Apache站點搭建
Apache的站點搭建相對於IIS而言還是比較簡單的,無需過多的配置,只需要安裝相應的軟件和插件即可。以配置php站點爲例,主要分爲以下幾步:
- 安裝httpd服務;
- 安裝Mysql、php、配置phpmyadmin;
- 部署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這兩者還真的不一樣,甚至連接方式都不相同
簡而言之
當主機填寫爲localhost時mysql會採用 unix domain socket連接
當主機填寫爲127.0.0.1時mysql會採用tcp方式連接
這是linux套接字網絡的特性,win平臺不會有這個問題
Apache日誌分析
Apache日誌主要分爲兩類:error_log
和access_log
,實際排查過程中更常用的是error_log
關於Apache日誌文件的位置,詳細信息可以查看Apache的配置文件,但是由於Linux發行版的差異和安裝方式的不同,其配置文件也不盡相同,下面開始分別介紹:
Apache日誌(Debian家族)
常用於Debian,Ubuntu或Linux 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提交的信息呢?
-
apache加載dumpio模塊。這個需要在httpd.conf文件中進行設置,apache默認不啓用該模塊,找到下面一行,去掉最前方的#號
# LoadModule dumpio_module modules/mod_dumpio.so`
-
配置日誌告警級別。將原先的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來進行控制。