Apache優化:隱藏版本信息,權限分離提高安全性,禁止日誌遍歷,日誌切割

Apache優化

在實驗環境中,我們不會去關注apache的優化,但是如果要用於生產環境中,必須要對apahe進行優化後,纔可以上線進行服務,不然會出現很多問題:如安全性,不方便查看日誌等等

實驗環境

一臺centos7主機IP192.168.1.11 純淨就可以,配置好yum源,如有需要軟件包,我後面會提供百度雲

一.查看Apache的版本信息

1)查看默認自己的版本信息

[root@apache ~]# yum -y install httpd
[root@apache ~]# yum -y install curl
[root@apache ~]# curl -I 192.168.1.11
在這裏插入圖片描述

2)隱藏apache版本信息

只有源碼安裝中的編譯過程,纔可以修改apache版本信息,我們先來源代碼安裝apahe

1.上傳並解壓httpd軟件包

鏈接:https://pan.baidu.com/s/1WI4th9jijqpCn5H7wMiWtQ
提取碼:whvt

[root@apache ~]# ls
在這裏插入圖片描述
[root@apache ~]# tar -zxvf httpd-2.4.38.tar.gz

2.修改ap_release.h參數以隱藏版本信息

[root@apache ~]# cd httpd-2.4.38/
[root@apache httpd-2.4.38]# vim include/ap_release.h
找到40~47行,改爲我如下,也可以隨意寫,然後保存退出
在這裏插入圖片描述

3.源碼安裝上apache服務

1)先把剛剛yum安裝的httpd服務刪除了
[root@apache httpd-2.4.38]# yum -y remove httpd

2)安裝編譯環境
[root@apache httpd-2.4.38]# yum -y install gcc gcc-c++ apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre openssl*

3)編譯並安裝
[root@apache httpd-2.4.38]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-ssl --enable-mpms-shared=all

這裏解釋一下參數
–enable-so :啓動動態加載模塊,也就是apache可以動態加載模塊而不需要從新編譯
–enable-rewrite:支持網站地址重寫,也就是網頁跳轉,後面會有演示
–enable-charset-lite:讓apche支持多種語言編碼
–enable-cgi:讓apahce可以支持cgi腳本
–enable-ssl:支持ssl加密,也就是https方式
–enable-mpms-shared=all:安裝apache所有運行默認模塊,主要用於模式切換,現在不必深究

[root@apache httpd-2.4.38]# make && make install

4)改一下配置文件,避免報錯
因爲是實驗環境,ServerName改爲自己主機名即可,真實環境這裏寫本服務的上的任意一個域名就行,其實沒什麼作用
[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
我這裏主機名是apache,你們寫你們的主機名即可,然後保存退出即可
在這裏插入圖片描述
5)設置一下啓動腳本並讓systemctl可以管理apache
[root@apache ~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/apache
[root@apache ~]# vim /etc/init.d/apache
在第一行後添加兩行內容,如下#號也要寫上,注意格式要一致,空格都要一致,不然會報錯

#chkconfig: 2345 11 88
# despriction:httpd apache server

在這裏插入圖片描述
這裏解釋一下意思
2345:是在哪些級別開機自啓,3是字符,5是圖形界面,至於2,4都是其他的,這樣寫就可以了
11:是開機自動啓動的順序,它開機自啓也有順序,因爲10是網卡服務,所以意思就是開機的時候在網卡後面啓動
88:這個就是關機的時候的關閉順序了

despriction:是表述信息,可以隨意
[root@apache ~]# chkconfig --add apache

6)啓動服務
[root@apache ~]# systemctl start apache
[root@apache ~]# netstat -anpt | grep 80
tcp6 0 0 :::80 :::* LISTEN 47955/httpd

7)添加環境變量path,以便可以隨時使用apache的命令
[root@apache ~]#ln -s /usr/local/httpd/bin/* /usr/local/bin/

8)訪問頁面
下面這是本機的IP
http://192.168.1.11/
在這裏插入圖片描述

3)測試隱藏版本信息效果

[root@apache ~]# curl -I 192.168.1.11
那個JAVA就是我們編譯前改的配置文件的第42行,後面的數字就是那時自定義的版本號
在這裏插入圖片描述

4)徹底隱藏版本號

[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
這是apache的主配置文件,找到497行,取到前面的註釋,意思是include調用另一個配置文件,修改後保存退出就可以了
在這裏插入圖片描述
[root@apache ~]# vim /usr/local/httpd/conf/extra/httpd-default.conf
55 與 65行更改爲我如下
在這裏插入圖片描述
[root@apache ~]# systemctl restart apache
Job for apache.service failed because the control process exited with error code. See "systemctl status apache.service" and "journalctl -xe" for details. #這裏報錯了,沒事,再次重啓就可以了
[root@apache ~]# systemctl restart apache

5)測試最終結果

[root@apache ~]# curl -I 192.168.1.11
在這裏插入圖片描述

二.設置apache權限分離提供安全性

1)查看並修改apache默認用戶

1.查看apache默認用戶

[root@apache ~]# ps -aux | grep httpd
可以看到第藍色圈上的root是啓動用戶作用不大,就是誰啓動的apache服務就是誰,中間綠色的daemon纔是apache的程序用戶,用來響應客戶端請求的用戶,最後一是本條命令,不用管
在這裏插入圖片描述
[root@apache ~]# id daemon
uid=2(daemon) gid=2(daemon) 組=2(daemon)
[root@apache ~]# cat /etc/passwd | grep daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

雖然daemon沒有系統登陸的權限,但是好多服務默認都是daemon用戶,如黑客獲取了daemon用戶權限有可能會破壞其他服務,所以我們要給apache創建一個單獨用戶

2.修改apache默認用戶爲apache

[root@apache ~]# cat /etc/passwd | grep apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

apache用戶在apache服務安裝後已經自動創建了
[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
更改174,與175行把原來的daemon改爲apache,保存退出
在這裏插入圖片描述
[root@apache ~]# systemctl restart apache
Job for apache.service failed because the control process exited with error code. See “systemctl status apache.service” and “journalctl -xe” for details.

[root@apache ~]# systemctl restart apache
[root@apache ~]# ps -aux | grep httpd
再次查看,運行用戶已經改過來了
在這裏插入圖片描述

2)權限分離

在實驗環境中一般使用root用戶,或單一用戶給予關於其服務的全部權限,可是這樣在實際生產完全性非常低,一旦有入侵者攻破這一用戶,那整個網站服務和其中的數據,也就任其所爲了

1.先設置一些重要目錄的屬主屬組,之後再進行細分

1)將整個apache目錄屬主屬組設爲apache
[root@apache ~]# chown -R apache:apache /usr/local/httpd/
-R的意思就這/usr/local/htppd,包括httpd目錄本身,整個下面的所有文件目錄屬組屬主都爲apache用戶

2)再單獨給於daemon用戶,讓daemon用戶擁有對應權限
[root@apache ~]# chown -R daemon:daemon /usr/local/httpd/htdocs/
這裏設置的把上面的頂掉了,apache也只算其他用戶
[root@apache ~]# ll /usr/local/httpd/htdocs/
總用量 4 #這裏可以發現apache對其也只有讀權限,一定程度分離了權限
-rw-r--r-- 1 daemon daemon 45 6月 12 2007 index.html

2.網頁與目錄文件快速賦權

在網站的站點目錄,也就是/usr/local/httpd/htdocs,會存在目錄或文件,我們需要給予對應的權限

1.設置此目錄下所有文件的權限爲644
這裏解釋一下644 :6就是屬主讀寫(4+2) , 4屬組讀(4), 4其他用戶讀(4)

[root@apache ~]# find /usr/local/httpd/htdocs -type f -exec chmod 644 {} ;
-type後面的f就是文件的意思,-exec 是要執行的命令,{} 是將find的結果 執行前面的chmod命令

[root@apache ~]# ll /usr/local/httpd/htdocs/index.html
-rw-r--r-- 1 daemon daemon 45 6月 12 2007 /usr/local/httpd/htdocs/index.html

2.設置此目錄下所以目錄的權限爲755
7屬主讀寫執行,5屬組讀執行,5其他人讀執行

先再htdocs目錄下,創建一個目錄,方便看效果
[root@apache ~]# mkdir /usr/local/httpd/htdocs/directory
[root@apache ~]# find /usr/local/httpd/htdocs -type d -exec chmod 755 {} ;
-d是目錄的意思
[root@apache ~]# ll -d /usr/local/httpd/htdocs/directory/
drwxr-sr-x 2 root daemon 6 2月 26 02:57 /usr/local/httpd/htdocs/directory/
#這個屬組的s暫且不管,總之現在屬組也有x執行權限,通過getfacl命令查看

[root@apache ~]# getfacl /usr/local/httpd/htdocs/directory/
getfacl: Removing leading '/' from absolute path names
# file: usr/local/httpd/htdocs/directory/
# owner: root
# group: daemon
# flags: -s-
user::rwx
group::r-x #這行就是屬組的權限
other::r-x

3.日誌文件單獨授權爲root用戶,提高安全

如果apache用戶被入侵,此方法會保護日誌文件不被黑客篡改
[root@apache ~]# chown -R root:root /usr/local/httpd/logs/
[root@apache ~]# ll -d /usr/local/httpd/logs/access_log
-rw-r--r-- 1 root root 211 2月 26 01:26 /usr/local/httpd/logs/access_log

其他用戶也僅有讀取權限

4.重啓服務,保證權限配置正確,用戶依然可以正常訪問

[root@apache ~]# systemctl restart apache
訪問測試,仍可正常訪問
在這裏插入圖片描述

三.禁止日誌遍歷

apache默認開啓目錄瀏覽功能,意思就是/usr/local/httpd/htdocs中如果不存在index.html文件,就顯示這個目錄下的目錄結構
如果index.html文件爲空不會顯示目錄結構
如果存在其他html文件,但不是index.html也會顯示目錄結構

1.在htdocs目錄下創建測試目錄與文件

[root@apache ~]# echo "123123" > /usr/local/httpd/htdocs/123.html
[root@apache ~]# mkdir /usr/local/httpd/htdocs/{dir1,dir2}
[root@apache ~]# ls /usr/local/httpd/htdocs/
123.html dir1 dir2 directory index.html

2.移走index.html

[root@apache ~]# mv /usr/local/httpd/htdocs/index.html /opt/

3.測試,可以看到目錄結構

http://192.168.1.11/
在這裏插入圖片描述
這樣對應普通沒有上傳需求的網站,非常不安全

4.修改配置文件,取消此功能

[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
修改243行,改爲我下圖,報錯退出
在這裏插入圖片描述
[root@apache ~]# systemctl restart apache
Job for apache.service failed because the control process exited with error code. See “systemctl status apache.service” and “journalctl -xe” for details.

[root@apache ~]# systemctl restart apache

5.測試

再次訪問,已不會顯示目錄結構,而是報錯
在這裏插入圖片描述

四.日誌切割

默認不進行日誌切割,日誌都是在一個文件中,很不方便查看如果不進行日誌切割無法進行定期清理日誌,造成資源浪費

1)使用apache系統自動切割工具rotatelogs

1.先修改主配值文件

首先是錯誤日誌
[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
找的281行改爲我如下這樣,如果你想直接複製粘貼我後面有打好的,然後不要退出還有參數要改
在這裏插入圖片描述

ErrorLog "|/usr/local/httpd/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"

這裏解釋一下其中的參數
|:是調用命令
-l:是命令參數
%Y%m%d:是時間格式,表示當前系統的日期
86400:單位爲秒,意思是當前一個錯誤日誌生成後,過86400秒(24小時後),在生成下一個錯誤日誌文件

2.更改正確日誌位置

繼續找到310行,改爲我如下,這是正確日誌位置,然後保存退出
在這裏插入圖片描述

CustomLog "|/usr/local/httpd/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined

[root@apache ~]# systemctl restart apache
重啓服務的時候一定要看到下面的信息後再重啓一遍,然後纔可看到效果,如看不到下面信息就重啓多次即可
Job for apache.service failed because the control process exited with error code. See “systemctl status apache.service” and “journalctl -xe” for details.

[root@apache ~]# systemctl restart apache

4.測試rotatelogs工具效果

1.先測試錯誤日誌
[root@apache ~]# ls /usr/local/httpd/logs/
可以看到,已經有錯誤日誌,而且是當前的日期,另幾個日誌是沒有開啓日誌分隔時的日誌
access_log error_20200226.log error_log httpd.pid

[root@apache ~]# date
2020年 02月 26日 星期三 12:18:38 CST

2.測試正確日誌
這裏是因爲測試日誌遍歷,現在移動回來
[root@apache ~]# mv /opt/index.html /usr/local/httpd/htdocs/

客戶訪問機網頁httpd://192.168.1.11時多次刷新
回到服務器中,發現已經多出acces日誌而且是以時間格式顯示
[root@apache ~]# ls /usr/local/httpd/logs/
access_20200226.log access_log error_20200226.log error_log httpd.pid

2)使用cronolog進行日誌切換

apache自帶的切割工具容易造成數據丟失,因此我們一般使用第三方切割工具cronolog

1.上傳cronolog工具並安裝

鏈接:https://pan.baidu.com/s/1547EuH46lSQa-5sbf-IL-g
提取碼:q6ij

回到root目錄下,並上傳軟件包
在這裏插入圖片描述
[root@apache ~]# tar -zxvf cronolog-1.6.2.tar.gz
[root@apache cronolog-1.6.2]# ./configure && make && make install

2.查找安裝到了哪裏,/sbin下的那個是命令

[root@apache cronolog-1.6.2]# find / -name cronolog
/root/cronolog-1.6.2/src/cronolog
/usr/local/sbin/cronolog

3.這次使用虛擬主機做

1.先打開虛擬主機功能
[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
去掉這行的#號
在這裏插入圖片描述
[root@apache ~]# systemctl restart apache
Job for apache.service failed because the control process exited with error code. See “systemctl status apache.service” and “journalctl -xe” for details.

[root@apache ~]# systemctl restart apache

2.添加一個I臨時P(重啓網卡會失效),做基於IP的虛擬主機
[root@apache ~]# ifconfig ens33:1 192.168.1.200
[root@apache ~]# ifconfig

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.11  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::953c:64db:834f:b238  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ea:b3:4d  txqueuelen 1000  (Ethernet)
        RX packets 30927  bytes 11775679 (11.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17799  bytes 2781661 (2.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.200  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:0c:29:ea:b3:4d  txqueuelen 1000  (Ethernet)

3.修改虛擬主機配置文件,並配置日誌切割
[root@apache ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
裏面有兩個例子,把而個例子,整個都刪掉,第一個改爲我如下,我後面有打好的,可以直接複製
在這裏插入圖片描述

<VirtualHost 192.168.1.200:80>
    ServerAdmin [email protected]
    DocumentRoot "/virtual/htdocs"
    ServerName apache
    ErrorLog "|/usr/local/sbin/cronolog /virtual/logs/www.ajbn.com_error_%Y%m%d.log"
    CustomLog "|/usr/local/sbin/cronolog /virtual/logs/www.ajbn.com-access_%Y%m%d.log" combined
    <Directory />
    Require all granted
    </Directory>
</VirtualHost>

4.創建配置文件中寫的目錄與默認首頁
[root@apache ~]# mkdir -p /virtual/{logs,htdocs}
[root@apache ~]# echo "<h1>Log File</h1>" > /virtual/htdocs/index.html
[root@apache ~]# systemctl restart apache
Job for apache.service failed because the control process exited with error code. See “systemctl status apache.service” and “journalctl -xe” for details.

[root@apache ~]# systemctl restart apache

5.測試效果

http://192.168.1.200/
先訪問虛擬主機,並刷新多次
在這裏插入圖片描述
在回來查看,日誌,因爲沒有出錯,這裏只有正確日誌
[root@apache ~]# ls /virtual/logs/
我這後來改過日期,所以和上面對不上,文件後面的日期就是當前日期,可使用date命令查看
www.ajbn.com-access_20201210.log

然後我解釋一下那個沒有輪轉時間,意思就是隻要系統日期變更了,就從新記錄一份,也就是,分割一個日誌文件出來,然後文件名稱是當前日期,這裏不是秒數的概念了而是日期

可以試一下
[root@apache ~]# date -s "2020-12-11"
這條命令修改系統時間
2020年 12月 11日 星期五 00:00:00 CST

這時候,訪問一次虛擬主機192.168.1.200
再回來看日誌,已經多了一個
[root@apache logs]# ls
www.ajbn.com-access_20201210.log www.ajbn.com-access_20201211.log

然後上面沒有說一個問題,現在運行apache的用戶是apache,正常說我們新創建的文件/virtual和下面的子文件夾,apache用戶肯定沒有寫入權限,日誌也就無法寫入,

但是這裏可以寫入,這是因爲是root用戶打開了apache服務,他就是主進程用戶,而apache服務的日誌文件是由主進程用戶負責並寫入的

!!實驗完畢

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