使用Apache服務部署靜態網站

10.1 網站服務程序

1970年,做爲互聯網前身的ARPANET(阿帕網)已初具雛形,並開始向非軍用部門開放,許多大學和商業部門開始陸續接入。雖然彼時阿帕網的規模(只有4臺主機聯網運行)還不如如今的局域網成熟,可是它依然爲網絡技術的進步打下了紮實的基礎。html

想必大多數人都是經過訪問網站而開始接觸互聯網的吧。咱們平時訪問的網站服務就是Web網絡服務,通常是指容許用戶經過瀏覽器訪問到互聯網中各類資源的服務。如圖10-1所示,Web網絡服務是一種被動訪問的服務程序,即只有接收到互聯網中其餘主機發出的請求後纔會響應,最終用於提供服務程序的Web服務器會經過HTTP(超文本傳輸協議)或HTTPS(安全超文本傳輸協議)把請求的內容傳送給用戶。mysql

目前可以提供Web網絡服務的程序有IIS、Nginx和Apache等。其中,IIS(Internet Information Services,互聯網信息服務)是Windows系統中默認的Web服務程序,這是一款圖形化的網站管理工具,不只能夠提供Web網站服務,還能夠提供FTP、NMTP、SMTP等服務。可是,IIS只能在Windows系統中使用,暫時不在咱們的學習範圍以內。linux

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-1  主機與Web服務器之間的通訊web

2004年10月4日,爲俄羅斯知名門戶站點而開發的Web服務程序Nginx橫空出世。Nginx程序做爲一款輕量級的網站服務軟件,因其穩定性和豐富的功能而快速佔領服務器市場,但Nginx最被承認的還當是系統資源消耗低且併發能力強,所以獲得了國內諸如新浪、網易、騰訊等門戶站的青睞。本書將在第20章講解Nginx服務程序。sql

Apache程序是目前擁有很高市場佔有率的Web服務程序之一,其跨平臺和安全性普遍被承認且擁有快速、可靠、簡單的API擴展。圖10-2所示爲Apache服務基金會的著名Logo,它的名字取自美國印第安人的土著語,寓意着擁有高超的做戰策略和無窮的耐性。Apache服務程序能夠運行在Linux系統、UNIX系統甚至是Windows系統中,支持基於IP、域名及端口號的虛擬主機功能,支持多種認證方式,集成有代理服務器模塊、安全Socket層(SSL),可以實時監視服務狀態與定製日誌消息,並有着各種豐富的模塊支持。數據庫

Apache程序是在RHEL 五、六、七、8系統的默認Web服務程序,其相關知識點一直也是RHCSA和RHCE認證考試的重點內容。vim

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-2  Apache軟件基金會著名的Logo瀏覽器

總結來講,Nginx服務程序做爲後起之秀,已經經過自身的優點與努力贏得了大批站長的信賴。本書配套的在線學習站點https://www.linuxprobe.com就是基於Nginx服務程序部署的,不得不說Nginx也真的很棒!安全

可是,Apache程序做爲老牌的Web服務程序,一方面在Web服務器軟件市場具備至關高的佔有率,另外一方面Apache也是RHEL 8系統中默認的Web服務程序,並且仍是RHCSA和RHCE認證考試的必考內容,所以不管從實際應用角度仍是從應對紅帽認證考試的角度,咱們都有必要好好學習Apache服務程序的部署,並深刻挖掘其可用的豐富功能。服務器

再來回憶下軟件倉庫的配置過程吧:

第1步:把系統鏡像掛載到/media/cdrom目錄。

[root@linuxprobe ~]# mkdir -p /media/cdrom
[root@linuxprobe ~]# mount /dev/cdrom /media/cdrom
mount: /media/cdrom: WARNING: device write-protected, mounted read-only.

第2步:使用Vim文本編輯器建立軟件倉庫的配置文件,下述命令中具體參數的含義可參考4.1.4小節

[root@linuxprobe ~]# vim /etc/yum.repos.d/rhel8.repo
[BaseOS]
name=BaseOS
baseurl=file:///media/cdrom/BaseOS
enabled=1
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///media/cdrom/AppStream
enabled=1
gpgcheck=0

第3步:動手安裝Apache服務程序。注意,使用dnf命令進行安裝時,跟在命令後面的Apache服務的軟件包名稱爲httpd。

[root@linuxprobe ~]# dnf install httpd
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
AppStream                                       3.1 MB/s | 3.2 kB     00:00    
BaseOS                                          2.7 MB/s | 2.7 kB     00:00    
Dependencies resolved.
================================================================================
 Package            Arch   Version                   Repository           Size
================================================================================
Installing:
 httpd              x86_64 2.4.37-10.module+el8+2764+7127e69e   AppStream 1.4 M
Installing dependencies:
 apr                x86_64 1.6.3-9.el8                          AppStream 125 k
 apr-util           x86_64 1.6.1-6.el8                          AppStream 105 k
 httpd-filesystem   noarch 2.4.37-10.module+el8+2764+7127e69e   AppStream  34 k
 httpd-tools        x86_64 2.4.37-10.module+el8+2764+7127e69e   AppStream 101 k
 mod_http2          x86_64 1.11.3-1.module+el8+2443+605475b7    AppStream 156 k
 redhat-logos-httpd noarch 80.7-1.el8                           BaseOS     25 k
Installing weak dependencies:
 apr-util-bdb       x86_64 1.6.1-6.el8                          AppStream  25 k
 apr-util-openssl   x86_64 1.6.1-6.el8                          AppStream  27 k
Enabling module streams:
 httpd                     2.4                                                 

Transaction Summary
================================================================================
Install  9 Packages

Total size: 2.0 M
Installed size: 5.4 M
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
………………省略部分輸出信息………………                                    
Complete!

第4步:啓用httpd服務程序並將其加入到開機啓動項中,使其可以隨系統開機而運行,從而持續爲用戶提供Web服務:

[root@linuxprobe ~]# systemctl start httpd
[root@linuxprobe ~]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

你們在瀏覽器(這裏以Firefox瀏覽器爲例)的地址欄中輸入http://127.0.0.1並按回車鍵,就能夠看到用於提供Web服務的默認頁面了,如圖10-3所示。

[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-3  httpd服務程序的默認頁面

10.2 配置服務文件參數

須要提醒你們的是,前文介紹的httpd服務程序的安裝和運行,僅僅是httpd服務程序的一些皮毛,咱們依然有很長的道路要走。在Linux系統中配置服務,其實就是修改服務的配置文件,所以,還須要知道這些配置文件的所在位置以及用途,httpd服務程序的主要配置文件及存放位置如表10-1所示。

表10-1                                               Linux系統中的配置文件

做用 文件名稱
服務目錄 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
網站數據目錄 /var/www/html
訪問日誌 /var/log/httpd/access_log
錯誤日誌 /var/log/httpd/error_log

主配置文件中保存的是最重要的服務參數,通常名稱都是以在/etc中,以軟件名稱命名的一個文件夾,裏面叫作「服務名稱.conf」,例如這裏的「/etc/httpd/conf/httpd.conf」熟練後就能記住了。

你們在首次打開httpd服務程序的主配置文件,可能會嚇一跳—居然有356行!這得至少須要一週的時間才能看完吧?!可是,你們只要仔細觀看就會發如今這裏調皮了。由於在這個配置文件中,全部以井號(#)開始的行都是註釋行,其目的是對httpd服務程序的功能或某一行參數進行介紹,不須要逐行研究這些內容。

在httpd服務程序的主配置文件中,存在三種類型的信息:註釋行信息、全局配置、區域配置,如圖10-4所示。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-4  httpd服務主配置文件的參數結構

各位讀者在學習第四章時已經接觸過註釋信息,所以這裏主要講解全局配置參數與區域配置參數的區別。顧名思義,全局配置參數就是一種全局性的配置參數,可做用於對全部的子站點,既保證了子站點的正常訪問,也有效減小了頻繁寫入重複參數的工做量。區域配置參數則是單獨針對於每一個獨立的子站點進行設置的。就像在大學食堂裏面打飯,食堂負責打飯的阿姨先給每位同窗來一碗標準大小的白飯(全局配置),而後再根據每位同窗的具體要求盛放他們想吃的菜(區域配置)。在httpd服務程序主配置文件中,最爲經常使用的參數如表10-2所示。

表10-2                          配置httpd服務程序時最經常使用的參數以及用途描述

參數 做用
ServerRoot 服務目錄
ServerAdmin 管理員郵箱
User 運行服務的用戶
Group 運行服務的用戶組
ServerName 網站服務器的域名
DocumentRoot 網站數據目錄
Listen 監聽的IP地址與端口號
DirectoryIndex 默認的索引頁頁面
ErrorLog 錯誤日誌文件
CustomLog 訪問日誌文件
Timeout 網頁超時時間,默認爲300秒

從表10-2中可知,DocumentRoot參數用於定義網站數據的保存路徑,其參數的默認值是把網站數據存放到/var/www/html目錄中;而當前網站廣泛的首頁面名稱是index.html,所以能夠向/var/www/html/index.html文件中寫入一段內容,替換掉httpd服務程序的默認首頁面,該操做會當即生效。

[root@linuxprobe ~]# echo "Welcome To LinuxProbe.Com" > /var/www/html/index.html 
[root@linuxprobe ~]# firefox

在執行上述操做以後,再在Firefox瀏覽器中刷新httpd服務程序,能夠看到該程序的首頁面內容已經發生了改變,如圖10-5所示。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-5  首頁面內容已經被修改

你們在完成這個實驗以後,是否是信心爆棚了呢?!在默認狀況下,網站數據是保存在/var/www/html目錄中,而若是想把保存網站數據的目錄修改成/home/wwwroot目錄,該怎麼操做呢?且看下文。

第1步:創建網站數據的保存目錄,並建立首頁文件。

[root@linuxprobe ~]# mkdir /home/wwwroot
[root@linuxprobe ~]# echo "The New Web Directory" > /home/wwwroot/index.html

第2步:打開httpd服務程序的主配置文件,將約第122行用於定義網站數據保存路徑的參數DocumentRoot修改成/home/wwwroot,同時還須要將約第127行與134行用於定義目錄權限的參數Directory後面的路徑也修改成/home/wwwroot。配置文件修改完畢後便可保存並退出。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf 
………………省略部分輸出信息………………
117 #
118 # DocumentRoot: The directory out of which you will serve your
119 # documents. By default, all requests are taken from this directory, but
120 # symbolic links and aliases may be used to point to other locations.
121 #
122 DocumentRoot "/home/wwwroot"
123 
124 #
125 # Relax access to content within /var/www.
126 #
127 <Directory "/home/wwwroot">
128     AllowOverride None
129     # Allow open access:
130     Require all granted
131 </Directory>
132 
133 # Further relax access to the default document root:
134 <Directory "/home/wwwroot">
………………省略部分輸出信息………………

第3步:從新啓動httpd服務程序並驗證效果,瀏覽器刷新頁面後的內容如圖10-6所示。奇怪!怎麼提示權限不足了?

[root@linuxprobe ~]# systemctl restart httpd
[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-6  Web頁面提示權限不足

10.3 SELinux安全子系統

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

SELinux(Security-Enhanced Linux)是美國國家安全局在Linux開源社區的幫助下開發的一個強制訪問控制(MAC,Mandatory Access Control)的安全子系統。Linux系統使用SELinux技術的目的是爲了讓各個服務進程都受到約束,使其僅獲取到本應獲取的資源。

例如,您在本身的電腦上下載了一個美圖軟件,正全神貫注地使用它給照片進行美顏的時候,它卻在後臺默默監聽着瀏覽器中輸入的密碼信息,而這顯然不該該是它應作的事情(哪怕是訪問電腦中的圖片資源,都情有可原)。SELinux安全子系統就是爲了杜絕此類狀況而設計的,它可以從多方面監控違法行爲:對服務程序的功能進行限制——SELinux域限制能夠確保服務程序作不了出格的事情;對文件資源的訪問限制——SELinux安全上下文確保文件資源只能被其所屬的服務程序進行訪問。

Tips

若是通常權限和防火牆是門窗,那麼SELinux即是在外面安裝的防禦欄,讓系統內部更加安全。

常常會把「SELinux域」和「SELinux安全上下文」稱爲是Linux系統中的雙保險,系統內的服務程序只能規規矩矩地拿到本身所應該獲取的資源,這樣即使***進入了系統,也沒法利用系統內的服務程序進行越權操做。可是,很是惋惜的是,SELinux服務比較複雜,配置難度也很大,加之不少運維人員對這項技術理解不深,從而致使不少服務器在部署好Linux系統後直接將SELinux禁用了;這絕對不是明智的選擇。

SELinux服務有三種配置模式,具體以下。

enforcing:強制啓用安全策略模式,將攔截服務的不合法請求。

permissive:遇到服務越權訪問時,只發出警告而不強制攔截。

disabled:對於越權的行爲不警告也不攔截。

本書中的全部實驗都是在強制啓用安全策略模式下進行的,雖然在禁用SELinux服務後確實可以減小報錯概率,但這在生產環境中至關不推薦。建議你們檢查一下本身的系統,查看SELinux服務主配置文件中定義的默認狀態。若是是permissive或disabled,建議趕忙修改成enforcing。

[root@linuxprobe ~]# vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

SELinux服務的主配置文件中,定義的是SELinux的默認運行狀態,能夠將其理解爲系統重啓後的狀態,所以它不會在更改後當即生效。可使用getenforce命令得到當前SELinux服務的運行模式:

[root@linuxprobe ~]# getenforce 
Enforcing

爲了確認圖10-6所示的結果確實是由於SELinux而致使的,能夠用setenforce [0|1]命令修改SELinux當前的運行模式(0爲禁用,1爲啓用)。注意,這種修改只是臨時的,在系統重啓後就會失效:

[root@linuxprobe ~]# setenforce 0
[root@linuxprobe ~]# getenforce
Permissive

再次刷新網頁,就會看到正常的網頁內容了,如圖10-7所示。可見,問題確實是出在了SELinux服務上面。

[root@linuxprobe wwwroot]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-7  頁面內容按照預期顯示

如今,回憶下前面的操做中究竟是哪裏出問題了呢?

httpd服務程序的功能是容許用戶訪問網站內容,所以SELinux確定會默認放行用戶對網站的請求操做。可是,咱們將網站數據的默認保存目錄修改成了/home/wwwroot,而這就產生問題了。在6.1小節中講到,/home目錄是用來存放普通用戶的家目錄數據的,而如今,httpd提供的網站服務卻要去獲取普通用戶家目錄中的數據了,這顯然違反了SELinux的監管原則。

如今,把SELinux服務恢復到強制啓用安全策略模式,而後分別查看原始網站數據的保存目錄與當前網站數據的保存目錄是否擁有不一樣的SELinux安全上下文值。ls命令中「-Z」參數用於查看文件的安全上下文值,而「-d」參數表明對象是個文件夾。

[root@linuxprobe ~]# setenforce 1
[root@linuxprobe ~]# ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
[root@linuxprobe ~]# ls -Zd /home/wwwroot
drwxrwxrwx. root root unconfined_u:object_r:home_root_t:s0 /home/wwwroot

在文件上設置的SELinux安全上下文是由用戶段、角色段以及類型段等多個信息項共同組成的。其中,用戶段system_u表明系統進程的身份,角色段object_r表明文件目錄的角色,類型段httpd_sys_content_t表明網站服務的系統文件。因爲SELinux服務實在太過複雜,如今你們只須要簡單熟悉SELinux服務的做用就能夠,將來會在本書的進階篇中單獨拿出一個章節仔細講解SELinux服務。

針對當前這種狀況,咱們只須要使用semanage命令,將當前網站目錄/home/wwwroot的SELinux安全上下文修改成跟原始網站目錄的同樣就好了。

semanage命令用於管理SELinux的策略,英文全稱爲:「SELinux manage」,語法格式爲:「semanage [參數] [文件]」。

SELinux服務極大地提高了Linux系統的安全性,將用戶權限緊緊地鎖在籠子裏。semanage命令不只可以像傳統chcon命令那樣—設置文件、目錄的策略,還可以管理網絡端口、消息接口(這些新特性將在本章後文中涵蓋)。使用semanage命令時,常常用到的幾個參數及其做用如表10-3所示:

表10-3                       semanage命令中經常使用參數以及做用

參數 做用
-l 查詢
-a 添加
-m 修改
-d 刪除

例如,向新的網站數據目錄中新添加一條SELinux安全上下文,讓這個目錄以及裏面的全部文件可以被httpd服務程序所訪問到:

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*

注意,執行上述設置以後,還沒法當即訪問網站,還須要使用restorecon命令將設置好的SELinux安全上下文當即生效。在使用restorecon命令時,能夠加上-Rv參數對指定的目錄進行遞歸操做,以及顯示SELinux安全上下文的修改過程。最後,再次刷新頁面,就能夠正常看到網頁內容了,結果如圖10-8所示。

[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/
Relabeled /home/wwwroot from unconfined_u:object_r:user_home_dir_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-8  正常看到網頁內容

真可謂是一波三折!本來認爲只要把httpd服務程序配置穩當就能夠大功告成,結果卻反覆受到了SELinux安全上下文的限制。因此,建議你們在配置httpd服務程序時,必定要細心、耐心。一旦成功配妥httpd服務程序以後,就會發現SELinux服務並無那麼難。

Tips

因爲在RHCSA、RHCE或RHCA考試中,都須要先重啓您的機器而後再執行判分腳本。所以,建議讀者在平常工做中要養成將所需服務添加到開機啓動項中的習慣,好比這裏就須要添加systemctl enable httpd命令。

10.4 我的用戶主頁功能

若是想在系統中爲每位用戶創建一個獨立的網站,一般的方法是基於虛擬網站主機功能來部署多個網站。但這個工做會讓管理員苦不堪言(尤爲是用戶數量很龐大時),並且在用戶自行管理網站時,還會碰到各類權限限制,須要爲此作不少額外的工做。其實,httpd服務程序提供的我的用戶主頁功能徹底能夠勝任這個工做。該功能可讓系統內全部的用戶在本身的家目錄中管理我的的網站,並且訪問起來也很是容易。

第1步:在httpd服務程序中,默認沒有開啓我的用戶主頁功能。爲此,咱們須要編輯下面的配置文件,而後在第17行的UserDir disabled參數前面加上井號(#),表示讓httpd服務程序開啓我的用戶主頁功能;同時再把第24行的UserDir public_html參數前面的井號(#)去掉(UserDir參數表示網站數據在用戶家目錄中的保存目錄名稱,即public_html目錄)。最後,在修改完畢後記得保存。

[root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf 
  1 #
  2 # UserDir: The name of the directory that is appended onto a user's home
  3 # directory if a ~user request is received.
  4 #
  5 # The path to the end user account 'public_html' directory must be
  6 # accessible to the webserver userid.  This usually means that ~userid
  7 # must have permissions of 711, ~userid/public_html must have permissions
  8 # of 755, and documents contained therein must be world-readable.
  9 # Otherwise, the client will only receive a "403 Forbidden" message.
 10 #
 11 <IfModule mod_userdir.c>
 12     #
 13     # UserDir is disabled by default since it can confirm the presence
 14     # of a username on the system (depending on home directory
 15     # permissions).
 16     #
 17     # UserDir disabled
 18 
 19     #
 20     # To enable requests to /~user/ to serve the user's public_html
 21     # directory, remove the "UserDir disabled" line above, and uncomment
 22     # the following line instead:
 23     # 
 24       UserDir public_html
 25 </IfModule>
 26 
 27 #
 28 # Control access to UserDir directories.  The following is an example
 29 # for a site where these directories are restricted to read-only.
 30 #
 31 <Directory "/home/*/public_html">
 32     AllowOverride FileInfo AuthConfig Limit Indexes
 33     Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
 34     Require method GET POST OPTIONS
 35 </Directory>

第2步:在用戶家目錄中創建用於保存網站數據的目錄及首頁面文件。另外,還須要把家目錄的權限修改成755,保證其餘人也有權限讀取裏面的內容。

[root@linuxprobe home]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ mkdir public_html
[linuxprobe@linuxprobe ~]$ echo "This is linuxprobe's website" > public_html/index.html
[linuxprobe@linuxprobe ~]$ chmod -R 755 /home/linuxprobe

第3步:從新啓動httpd服務程序,在瀏覽器的地址欄中輸入網址,其格式爲「網址/~用戶名」(其中的波浪號是必需的,並且網址、波浪號、用戶名之間沒有空格),從理論上來說就能夠看到用戶的我的網站了。不出所料的是,系統顯示報錯頁面,如圖10-9所示。這必定仍是SELinux惹的禍。

[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# systemctl restart httpd

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-9  禁止訪問用戶的我的網站

第4步:思考此次報錯的緣由是什麼。httpd服務程序在提供我的用戶主頁功能時,該用戶的網站數據目錄自己就應該是存放到與這位用戶對應的家目錄中的,因此應該不須要修改家目錄的SELinux安全上下文。可是,前文還講到了SELinux域的概念。SELinux域確保服務程序不能執行違規的操做,只能本本分分地爲用戶提供服務。httpd服務中忽然開啓的這項我的用戶主頁功能到底有沒有被SELinux域默認容許呢?

接下來使用getsebool命令查詢並過濾出全部與HTTP協議相關的安全策略。其中,off爲禁止狀態,on爲容許狀態。

[root@linuxprobe ~]# getsebool -a | grep http
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_dbus_sssd --> off
httpd_dontaudit_search_dirs --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> off
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> off
httpd_run_ipa --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off
mysql_connect_http --> off
named_tcp_bind_http_port --> off
prosody_bind_http_port --> off

面對如此多的SELinux域安全策略規則,實在沒有必要逐個理解它們,咱們只要能經過名字大體猜想出相關的策略用途就足夠了。好比,想要開啓httpd服務的我的用戶主頁功能,那麼用到的SELinux域安全策略應該是httpd_enable_homedirs吧?大體肯定後就能夠用setsebool命令來修改SELinux策略中各條規則的布爾值了。你們必定要記得在setsebool命令後面加上-P參數,讓修改後的SELinux策略規則永久生效且當即生效。隨後刷新網頁,其效果如圖10-10所示。

[root@linuxprobe ~]# setsebool -P httpd_enable_homedirs=on
[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-10  正常看到我的用戶主頁面中的內容

有時,網站的擁有者並不但願直接將網頁內容顯示出來,只想讓經過身份驗證的用戶訪客看到裏面的內容。

第1步:先使用htpasswd命令生成密碼數據庫。-c參數表示第一次生成;後面再分別添加密碼數據庫的存放文件,以及驗證要用到的用戶名稱(該用戶沒必要是系統中已有的本地帳戶)。

[root@linuxprobe ~]# htpasswd -c /etc/httpd/passwd linuxprobe
New password:此處輸入用於網頁驗證的密碼
Re-type new password:再輸入一遍進行確認
Adding password for user linuxprobe

第2步:繼續編輯我的用戶主頁功能的配置文件。把第31~37行的參數信息修改爲下列內容,其中井號(#)開頭的內容爲添加的註釋信息,可將其忽略。隨後保存並退出配置文件,重啓httpd服務程序便可生效。

[root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf
………………省略部分輸出信息………………
 27 #
 28 # Control access to UserDir directories.  The following is an example
 29 # for a site where these directories are restricted to read-only.
 30 #
 31 <Directory "/home/*/public_html">
 32     AllowOverride all 
        #剛剛生成出的密碼驗證文件保存路徑
 33     authuserfile "/etc/httpd/passwd" 
        #當用戶訪問網站時的提示信息
 34     authname "My privately website"
        #驗證方式爲口令模式
 35     authtype basic
        #訪問網站時須要驗證的用戶名稱
 36     require user linuxprobe
 37 </Directory>
[root@linuxprobe ~]# systemctl restart httpd

此後,當用戶再想訪問某個用戶的我的網站時,就必需要輸入帳戶和密碼才能正常訪問了。另外,驗證時使用的帳戶和密碼是用htpasswd命令生成的專門用於網站登陸的口令密碼,而不是系統中的用戶密碼,請不要搞錯了。登陸界面如圖10-11與圖10-12所示。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-11  須要輸入帳戶和密碼才能訪問

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-12 口令驗證成功

出現問題?大膽提問!

因讀者們硬件不一樣或操做錯誤均可能致使實驗配置出錯,請耐心再仔細看看操做步驟吧,不要氣餒~

Linux技術交流學習請加讀者羣(推薦):https://www.linuxprobe.com/club

*本羣特點:確保每一位羣友都是《Linux就該這麼學》的讀者,答疑更有針對性,不按期領取定製禮品。

10.5 虛擬網站主機功能

若是每臺運行Linux系統的服務器上只能運行一個網站,那麼人氣低、流量小的草根站長就要被迫承擔着高昂的服務器租賃費用了,這顯然也會形成硬件資源的浪費。在虛擬專用服務器(Virtual Private Server,VPS)與雲計算技術誕生之前,IDC服務供應商爲了可以更充分地利用服務器資源,同時也爲了下降購買門檻,因而紛紛啓用了虛擬主機功能。

利用虛擬主機功能,能夠把一臺處於運行狀態的物理服務器分割成多個「虛擬的服務器」。可是,該技術沒法實現目前雲主機技術的硬件資源隔離,讓這些虛擬的服務器共同使用物理服務器的硬件資源,供應商只能限制硬盤的使用空間大小。出於各類考慮的因素(主要是價格低廉),目前依然有不少企業或我的站長在使用虛擬主機的形式來部署網站。

Apache的虛擬主機功能是服務器基於用戶請求的不一樣IP地址、主機域名或端口號,實現提供多個網站同時爲外部提供訪問服務的技術,如圖10-13所示,用戶請求的資源不一樣,最終獲取到的網頁內容也各不相同。若是你們以前沒有作過網站,可能不太理解其中的原理,等一下子搭建出實驗環境並看到實驗效果以後,您必定就會明白了。

再次提醒你們,在作每一個實驗以前請先將虛擬機還原到最初始狀態,以避免多個實驗之間相互產生衝突。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-13 用戶請求網站資源

10.5.1 基於IP地址

若是一臺服務器有多個IP地址,並且每一個IP地址與服務器上部署的每一個網站一一對應,這樣當用戶請求訪問不一樣的IP地址時,會訪問到不一樣網站的頁面資源。並且,每一個網站都有一個獨立的IP地址,對搜索引擎優化也大有裨益。所以以這種方式提供虛擬網站主機功能不只最多見,也受到了網站站長的歡迎(尤爲是草根站長)。

在第4章和第9章分別講解了用於配置網絡的兩種方法,你們在實驗中和工做中可隨意選擇。就當前的實驗來說,須要配置的IP地址如圖10-14所示。在配置完畢並重啓網卡服務以後,記得檢查網絡的連通性,確保三個IP地址都可正常訪問,如圖10-15所示(這很重要,必定要測試好,而後再進行下一步!)。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-14  使用nmtui命令配置網絡參數

[root@linuxprobe ~]# nmcli connection up ens160 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-15  分別檢查3個IP地址的連通性

第1步:分別在/home/wwwroot中建立用於保存不一樣網站數據的3個目錄,並向其中分別寫入網站的首頁文件。每一個首頁文件中應有明確區分不一樣網站內容的信息,方便稍後能更直觀地檢查效果。

[root@linuxprobe ~]# mkdir -p /home/wwwroot/10
[root@linuxprobe ~]# mkdir -p /home/wwwroot/20
[root@linuxprobe ~]# mkdir -p /home/wwwroot/30
[root@linuxprobe ~]# echo "IP:192.168.10.10" > /home/wwwroot/10/index.html
[root@linuxprobe ~]# echo "IP:192.168.10.20" > /home/wwwroot/20/index.html
[root@linuxprobe ~]# echo "IP:192.168.10.30" > /home/wwwroot/30/index.html

第2步:在httpd服務的配置文件中大約132行處開始,分別追加寫入三個基於IP地址的虛擬主機網站參數,而後保存並退出。記得須要重啓httpd服務,這些配置才生效。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
132 <VirtualHost 192.168.10.10>
133     DocumentRoot /home/wwwroot/10
134     ServerName www.linuxprobe.com
135     <Directory /home/wwwroot/10>
136     AllowOverride None
137     Require all granted
138     </Directory>
139 </VirtualHost>
  
140 <VirtualHost 192.168.10.20>
141     DocumentRoot /home/wwwroot/20
142     ServerName www.linuxcool.com
143     <Directory /home/wwwroot/20>
144     AllowOverride None
145     Require all granted
146     </Directory>
147 </VirtualHost>
  
148 <VirtualHost 192.168.10.30>
149     DocumentRoot /home/wwwroot/30
150     ServerName www.linuxdown.com
151     <Directory /home/wwwroot/30>
152     AllowOverride None
153     Require all granted
154     </Directory>
155 </VirtualHost>
………………省略部分輸出信息………………
[root@linuxprobe ~]# systemctl restart httpd

第3步:此時訪問網站,則會看到httpd服務程序的默認首頁面,提示權限不足。你們如今應該馬上就反應過來—這是SELinux在搗鬼。因爲當前的/home/wwwroot目錄及裏面的網站數據目錄的SELinux安全上下文與網站服務不吻合,所以httpd服務程序沒法獲取到這些網站數據目錄。咱們須要手動把新的網站數據目錄的SELinux安全上下文設置正確(見前文的實驗),並使用restorecon命令讓新設置的SELinux安全上下文當即生效,這樣就能夠當即看到網站的訪問效果了,如圖10-16所示。

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30/*
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot
Relabeled /home/wwwroot from unconfined_u:object_r:user_home_dir_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/10 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/10/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/20 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/20/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/30 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/30/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-16  基於不一樣的IP地址訪問虛擬主機網站

10.5.2 基於主機域名

當服務器沒法爲每一個網站都分配一個獨立IP地址的時候,能夠嘗試讓Apache自動識別用戶請求的域名,從而根據不一樣的域名請求來傳輸不一樣的內容。在這種狀況下的配置更加簡單,只須要保證位於生產環境中的服務器上有一個可用的IP地址(這裏以192.168.10.10爲例)就能夠了。因爲當前尚未介紹如何配置DNS解析服務,所以須要手工定義IP地址與域名之間的對應關係。/etc/hosts是Linux系統中用於強制把某個主機域名解析到指定IP地址的配置文件。簡單來講,只要這個文件配置正確,即便網卡參數中沒有DNS信息也依然可以將域名解析爲某個IP地址。

第1步:手工定義IP地址與域名之間對應關係的配置文件,保存並退出後會當即生效。能夠經過分別ping這些域名來驗證域名是否已經成功解析爲IP地址。

[root@linuxprobe ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.10   www.linuxprobe.com www.linuxcool.com www.linuxdown.com
[root@linuxprobe ~]# ping -c 4 www.linuxprobe.com
PING www.linuxprobe.com (192.168.10.10) 56(84) bytes of data.
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=4 ttl=64 time=0.069 ms
--- www.linuxprobe.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.061/0.069/0.077/0.008 ms
[root@linuxprobe ~]# 

第2步:分別在/home/wwwroot中建立用於保存不一樣網站數據的三個目錄,並向其中分別寫入網站的首頁文件。每一個首頁文件中應有明確區分不一樣網站內容的信息,方便稍後能更直觀地檢查效果。

[root@linuxprobe ~]# mkdir -p /home/wwwroot/linuxprobe
[root@linuxprobe ~]# mkdir -p /home/wwwroot/linuxcool
[root@linuxprobe ~]# mkdir -p /home/wwwroot/linuxdown
[root@linuxprobe ~]# echo "www.linuxprobe.com" > /home/wwwroot/linuxprobe/index.html
[root@linuxprobe ~]# echo "www.linuxcool.com" > /home/wwwroot/linuxcool/index.html
[root@linuxprobe ~]# echo "www.linuxdown.com" > /home/wwwroot/linuxdown/index.html

第3步:在httpd服務的配置文件中大約132行處開始,分別追加寫入三個基於主機名的虛擬主機網站參數,而後保存並退出。記得須要重啓httpd服務,這些配置才生效。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
132 <VirtualHost 192.168.10.10>
133     Documentroot /home/wwwroot/linuxprobe
134     ServerName www.linuxprobe.com
135     <Directory /home/wwwroot/linuxprobe>
136     AllowOverride None
137     Require all granted
138     </Directory>
139 </VirtualHost>
 
140 <VirtualHost 192.168.10.10>
141     Documentroot /home/wwwroot/linuxcool
142     ServerName www.linuxcool.com
143     <Directory /home/wwwroot/linuxcool>
144     AllowOverride None
145     Require all granted
146     </Directory>
147 </VirtualHost>
 
148 <VirtualHost 192.168.10.10>
149     Documentroot /home/wwwroot/linuxdown
150     ServerName www.linuxdown.com
151     <Directory /home/wwwroot/linuxdown>
152     AllowOverride None
153     Require all granted
154     </Directory>
155 </VirtualHost>
………………省略部分輸出信息………………
[root@linuxprobe ~]# systemctl restart httpd

第4步:由於當前的網站數據目錄仍是在/home/wwwroot目錄中,所以仍是必需要正確設置網站數據目錄文件的SELinux安全上下文,使其與網站服務功能相吻合。最後記得用restorecon命令讓新配置的SELinux安全上下文當即生效,這樣就能夠當即訪問到虛擬主機網站了,效果如圖10-17所示。

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxprobe
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxprobe/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxcool
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxcool/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxdown
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxdown/*
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot
Relabeled /home/wwwroot from unconfined_u:object_r:user_home_dir_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/linuxprobe from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/linuxprobe/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/linuxcool from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/linuxcool/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/linuxdown from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/linuxdown/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@linuxprobe ~]# firefox 

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-17  基於主機域名訪問虛擬主機網站

10.5.3 基於端口號

基於端口號的虛擬主機功能可讓用戶經過指定的端口號來訪問服務器上的網站資源。在使用Apache配置虛擬網站主機功能時,基於端口號的配置方式是最複雜的。所以咱們不只要考慮httpd服務程序的配置因素,還須要考慮到SELinux服務對新開設端口的監控。通常來講,使用80、44三、8080等端口號來提供網站訪問服務是比較合理的,若是使用其餘端口號則會受到SELinux服務的限制。

在接下來的實驗中,咱們不但要考慮到目錄上應用的SELinux安全上下文的限制,還須要考慮SELinux域對httpd服務程序的管控。

第1步:分別在/home/wwwroot中建立用於保存不一樣網站數據的三個目錄,並向其中分別寫入網站的首頁文件。每一個首頁文件中應有明確區分不一樣網站內容的信息,方便稍後能更直觀地檢查效果。

[root@linuxprobe ~]# mkdir -p /home/wwwroot/6111
[root@linuxprobe ~]# mkdir -p /home/wwwroot/6222
[root@linuxprobe ~]# mkdir -p /home/wwwroot/6333
[root@linuxprobe ~]# echo "port:6111" > /home/wwwroot/6111/index.html
[root@linuxprobe ~]# echo "port:6222" > /home/wwwroot/6222/index.html
[root@linuxprobe ~]# echo "port:6333" > /home/wwwroot/6333/index.html

第2步:在httpd服務配置文件的第46行至48行分別添加用於監聽61十一、6222和6333端口的參數。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf 
………………省略部分輸出信息……………… 
 37 # Listen: Allows you to bind Apache to specific IP addresses and/or
 38 # ports, instead of the default. See also the 
 39 # directive.
 40 #
 41 # Change this to Listen on specific IP addresses as shown below to 
 42 # prevent Apache from glomming onto all bound IP addresses.
 43 #
 44 #Listen 12.34.56.78:80
 45 Listen 80
 46 Listen 6111
 47 Listen 6222
 48 Listen 6333
………………省略部分輸出信息……………… 

第3步:在httpd服務的配置文件中大約134行處開始,分別追加寫入三個基於端口號的虛擬主機網站參數,而後保存並退出。記得須要重啓httpd服務,這些配置才生效。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息……………… 
134 <VirtualHost 192.168.10.10:6111>
135     DocumentRoot /home/wwwroot/6111
136     ServerName www.linuxprobe.com
137     <Directory /home/wwwroot/6111>
138     AllowOverride None
139     Require all granted
140     </Directory> 
141 </VirtualHost>

142 <VirtualHost 192.168.10.10:6222>
143     DocumentRoot /home/wwwroot/6222
144     ServerName www.linuxcool.com
145     <Directory /home/wwwroot/6222>
146     AllowOverride None
147     Require all granted
148     </Directory>
149 </VirtualHost>

150 <VirtualHost 192.168.10.10:6333>
151     DocumentRoot /home/wwwroot/6333
152     ServerName www.linuxdown.com
153     <Directory /home/wwwroot/6333>
154     AllowOverride None
155     Require all granted
156     </Directory>
157 </VirtualHost>
………………省略部分輸出信息………………

第4步:由於咱們把網站數據目錄存放在/home/wwwroot目錄中,所以仍是必需要正確設置網站數據目錄文件的SELinux安全上下文,使其與網站服務功能相吻合。最後記得用restorecon命令讓新配置的SELinux安全上下文當即生效。

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6333/*
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/
Relabeled /home/wwwroot from unconfined_u:object_r:user_home_dir_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/6111 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/6111/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/6222 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/6222/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/6333 from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /home/wwwroot/6333/index.html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@linuxprobe ~]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.

見鬼了!在穩當配置httpd服務程序和SELinux安全上下文並重啓httpd服務後,居然出現報錯信息。這是由於SELinux服務檢測到61十一、6222和6333端口本來不屬於Apache服務應該須要的資源,但如今卻以httpd服務程序的名義監聽使用了,因此SELinux會拒絕使用Apache服務使用這三個端口。咱們可使用semanage命令查詢並過濾出全部與HTTP協議相關且SELinux服務容許的端口列表。

[root@linuxprobe ~]# semanage port -l | grep http
http_cache_port_t            tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t            udp      3130
http_port_t                  tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t          tcp      5988
pegasus_https_port_t         tcp      5989

第5步:SELinux容許的與HTTP協議相關的端口號中默認沒有包含61十一、6222和6333,所以須要將這三個端口號手動添加進去。該操做會當即生效,並且在系統重啓事後依然有效。設置好後再重啓httpd服務程序,而後就能夠看到網頁內容了,結果如圖10-18所示。

[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6111
[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6222
[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6333
[root@linuxprobe ~]# semanage port -l | grep http
http_cache_port_t            tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t            udp      3130
http_port_t                  tcp      6333, 6222, 6111, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t          tcp      5988
pegasus_https_port_t         tcp      5989
[root@linuxprobe ~]# systemctl restart httpd
[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-18  基於端口號訪問虛擬主機網站

10.6 Apache的訪問控制

Apache能夠基於源主機名、源IP地址或源主機上的瀏覽器特徵等信息對網站上的資源進行訪問控制。它經過Allow指令容許某個主機訪問服務器上的網站資源,經過Deny指令實現禁止訪問。在容許或禁止訪問網站資源時,還會用到Order指令,這個指令用來定義Allow或Deny指令起做用的順序,其匹配原則是按照順序進行匹配,若匹配成功則執行後面的默認指令。好比「Order Allow, Deny」表示先將源主機與容許規則進行匹配,若匹配成功則容許訪問請求,反之則拒絕訪問請求。

第1步:先在服務器上的網站數據目錄中新建一個子目錄,並在這個子目錄中建立一個包含Successful單詞的首頁文件。

[root@linuxprobe ~]# mkdir /var/www/html/server
[root@linuxprobe ~]# echo "Successful" > /var/www/html/server/index.html

第2步:打開httpd服務的配置文件,在第161行後面添加下述規則來限制源主機的訪問。這段規則的含義是容許使用Firefox瀏覽器的主機訪問服務器上的首頁文件,除此以外的全部請求都將被拒絕。使用Firefox瀏覽器的訪問效果如圖10-19所示,而其它瀏覽器訪問效果如圖10-20所示。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
161 <Directory "/var/www/html/server">
162     SetEnvIf User-Agent "Firefox" ff=1
163     Order allow,deny
164     Allow from env=ff
165 </Directory>
………………省略部分輸出信息………………
[root@linuxprobe ~]# systemctl restart httpd
[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-19  火狐瀏覽器成功訪問

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖10-20 其它瀏覽器訪問失敗

除了匹配源主機的瀏覽器特徵以外,還能夠經過匹配源主機的IP地址進行訪問控制。例如,咱們只容許IP地址爲192.168.10.20的主機訪問網站資源,那麼就能夠在httpd服務配置文件的第161行後面添加下述規則。這樣在重啓httpd服務程序後再用本機(即服務器,其IP地址爲192.168.10.10)來訪問網站的首頁面時就會提示訪問被拒絕了,如圖10-21所示。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
161 <Directory "/var/www/html/server">
162     Order allow,deny 
163     Allow from 192.168.10.20
164 </Directory>
………………省略部分輸出信息………………
[root@linuxprobe ~]# systemctl restart httpd
[root@linuxprobe ~]# firefox

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

 

此文章僅記錄本身的一個學習過程,逆水行舟

相關文章
相關標籤/搜索