Linux就該這么學》最新正式版已出版上市,同學們可在線上京東網當當網淘寶網亞馬遜等電商平臺購買。

*亦可就近在新華書店購買*

章節簡述:

本章先向讀者科普什么是Web服務程序,以及Web服務程序的用處,然后通過對比當前主流的Web服務程序來使讀者更好地理解其各自的優勢及特點,最后通過對httpd服務程序中“全局配置參數”、“區域配置參數”及“注釋信息”的理論講解和實戰部署,確保讀者學會Web服務程序的配置方法,并真正掌握在Linux系統中配置服務的技巧。

劉遄老師還會在本章講解SELinux服務的作用、三種工作模式以及策略管理方法,確保讀者掌握SELinux域和SELinux安全上下文的配置方法,并依次完成多個基于httpd服務程序實用功能的部署實驗,其中包括httpd服務程序的基本部署、個人用戶主頁功能和口令加密認證方式的實現,以及分別基于IP地址、主機名(域名)、端口號部署虛擬主機網站功能。

10.1 網站服務程序

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

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

目前能夠提供Web網絡服務的程序有IIS、Nginx和Apache等。其中,IIS(Internet Information Services,互聯網信息服務)是Windows系統中默認的Web服務程序,這是一款圖形化的網站管理工具,不僅可以提供Web網站服務,還可以提供FTP、NMTP、SMTP等服務。但是,IIS只能在Windows系統中使用,而我們這本書的名字是《Linux就該這么學》,所以它也就不在我們的學習范圍之內了。

頁面請求過程

圖10-1? 主機與Web服務器之間的通信

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

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

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

圖10-2? Apache軟件基金會著名的Logo

總結來說,Nginx服務程序作為后起之秀,已經通過自身的優勢與努力贏得了大批站長的信賴。本書配套的在線學習站點http://www.52437949.com就是基于Nginx服務程序部署的,不得不說Nginx也真的很棒!

但是,Apache程序作為老牌的Web服務程序,一方面在Web服務器軟件市場具有相當高的占有率,另一方面Apache也是RHEL 7系統中默認的Web服務程序,而且還是RHCSA和RHCE認證考試的必考內容,因此無論從實際應用角度還是從應對紅帽認證考試的角度,我們都有必要好好學習Apache服務程序的部署,并深入挖掘其可用的豐富功能。

第1步:把光盤設備中的系統鏡像掛載到/media/cdrom目錄。

[[email protected] ~]# mkdir -p /media/cdrom
[[email protected] ~]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only

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

[[email protected] ~]# vim /etc/yum.repos.d/rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

第3步:動手安裝Apache服務程序。注意,使用yum命令進行安裝時,跟在命令后面的Apache服務的軟件包名稱為httpd。如果直接執行yum install apache命令,則系統會報錯。

[[email protected] ~]# yum install httpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出信息………………
Dependencies Resolved
================================================================================
 Package Arch Version Repository Size
================================================================================
Installing:
 httpd x86_64 2.4.6-17.el7 rhel 1.2 M
Installing for dependencies:
 apr x86_64 1.4.8-3.el7 rhel 103 k
 apr-util x86_64 1.5.2-6.el7 rhel 92 k
 httpd-tools x86_64 2.4.6-17.el7 rhel 77 k
 mailcap noarch 2.1.41-2.el7 rhel 31 k
Transaction Summary
================================================================================
Install 1 Package (+4 Dependent packages)
Total download size: 1.5 M
Installed size: 4.3 M
Is this ok [y/d/N]: y
Downloading packages:
--------------------------------------------------------------------------------
………………省略部分輸出信息………………
Complete!

第4步:啟用httpd服務程序并將其加入到開機啟動項中,使其能夠隨系統開機而運行,從而持續為用戶提供Web服務:

[[email protected] ~]# systemctl start httpd
[[email protected] ~]# systemctl enable httpd
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

大家在瀏覽器(這里以Firefox瀏覽器為例)的地址欄中輸入http://127.0.0.1并按回車鍵,就可以看到用于提供Web服務的httpd服務程序的默認頁面了,如圖10-3所示。

[[email protected] ~]# firefox

Apache默認頁面

圖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

大家在首次打開httpd服務程序的主配置文件,可能會嚇一跳—竟然有353行!這得至少需要一周的時間才能看完吧?!但是,大家只要仔細觀看就會發現劉遄老師在這里調皮了。因為在這個配置文件中,所有以井號(#)開始的行都是注釋行,其目的是對httpd服務程序的功能或某一行參數進行介紹,我們不需要逐行研究這些內容。

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

httpd配置文件分析

圖10-4? httpd服務程序的主配置文件的構成

各位讀者在學習第4章時已經接觸過注釋信息,因此這里主要講解全局配置參數與區域配置參數的區別。顧名思義,全局配置參數就是一種全局性的配置參數,可作用于對所有的子站點,既保證了子站點的正常訪問,也有效減少了頻繁寫入重復參數的工作量。區域配置參數則是單獨針對于每個獨立的子站點進行設置的。就像在大學食堂里面打飯,食堂負責打飯的阿姨先給每位同學來一碗標準大小的白飯(全局配置),然后再根據每位同學的具體要求盛放他們想吃的菜(區域配置)。在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目錄中寫入一個文件,替換掉httpd服務程序的默認首頁面,該操作會立即生效。

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

[[email protected] ~]# echo "Welcome To LinuxProbe.Com" > /var/www/html/index.html
[[email protected] ~]# firefox
驗證apache服務實驗效果

圖10-5? httpd服務程序的首頁面內容已經被修改

大家在完成這個實驗之后,是不是信心爆棚了呢?!在默認情況下,網站數據是保存在/var/www/html目錄中,而如果想把保存網站數據的目錄修改為/home/wwwroot目錄,該怎么操作呢?且看下文。

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

[[email protected] ~]# mkdir /home/wwwroot
[[email protected] ~]# echo "The New Web Directory" > /home/wwwroot/index.html

第2步:打開httpd服務程序的主配置文件,將約第119行用于定義網站數據保存路徑的參數DocumentRoot修改為/home/wwwroot,同時還需要將約第124行用于定義目錄權限的參數Directory后面的路徑也修改為/home/wwwroot。配置文件修改完畢后即可保存并退出。

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf 
………………省略部分輸出信息………………
113 
114 #
115 # DocumentRoot: The directory out of which you will serve your
116 # documents. By default, all requests are taken from this directory, bu t
117 # symbolic links and aliases may be used to point to other locations.
118 #
119 DocumentRoot "/home/wwwroot"
120 
121 #
122 # Relax access to content within /var/www.
123 #
124 <Directory "/home/wwwroot">
125 AllowOverride None
126 # Allow open access:
127 Require all granted
128 </Directory>
………………省略部分輸出信息………………
[[email protected] ~]#

第3步:重新啟動httpd服務程序并驗證效果,瀏覽器刷新頁面后的內容如圖10-6所示。奇怪!為什么看到了httpd服務程序的默認首頁面?按理來說,只有在網站的首頁面文件不存在或者用戶權限不足時,才顯示httpd服務程序的默認首頁面。我們在嘗試訪問http://127.0.0.1/index.html頁面時,竟然發現頁面中顯示“Forbidden,You don't have permission to access /index.html on this server.”。而這一切正是SELinux在搗鬼。

[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# firefox

Apache默認頁面

圖10-6? httpd服務程序的默認首頁面

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

10.3?SELinux安全子系統

selinux

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

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

劉遄老師經常會把“SELinux域”和“SELinux安全上下文”稱為是Linux系統中的雙保險,系統內的服務程序只能規規矩矩地拿到自己所應該獲取的資源,這樣即便黑客入侵了系統,也無法利用系統內的服務程序進行越權操作。但是,非常可惜的是,SELinux服務比較復雜,配置難度也很大,加之很多運維人員對這項技術理解不深,從而導致很多服務器在部署好Linux系統后直接將SELinux禁用了;這絕對不是明智的選擇。

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

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

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

disabled:對于越權的行為不警告也不攔截。

本書中的所有實驗都是在強制啟用安全策略模式下進行的,雖然在禁用SELinux服務后確實能夠減少報錯幾率,但這在生產環境中相當不推薦。建議大家檢查一下自己的系統,查看SELinux服務主配置文件中定義的默認狀態。如果是permissive或disabled,建議趕緊修改為enforcing。

[[email protected] ~]# 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 two 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服務的運行模式:

[[email protected] ~]# getenforce 
Enforcing

為了確認圖10-6所示的結果確實是因為SELinux而導致的,可以用setenforce [0|1]命令修改SELinux當前的運行模式(0為禁用,1為啟用)。注意,這種修改只是臨時的,在系統重啟后就會失效:

[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive

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

[[email protected] wwwroot]# firefox

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

現在,我們來回憶一下前面的操作中到底是哪里出問題了呢?

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

現在,我們把SELinux服務恢復到強制啟用安全策略模式,然后分別查看原始網站數據的保存目錄與當前網站數據的保存目錄是否擁有不同的SELinux安全上下文值:

[[email protected] ~]# setenforce 1
[[email protected] ~]# ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
[[email protected] ~]# 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命令

semanage命令用于管理SELinux的策略,格式為“semanage [選項] [文件]”。

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

-l參數用于查詢;

-a參數用于添加;

-m參數用于修改;

-d參數用于刪除。

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

[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*

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

[[email protected] ~]# restorecon -Rv /home/wwwroot/
restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[[email protected] ~]# firefox

Apache配置成功的頁面

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

真可謂是一波三折!原本認為只要把httpd服務程序配置妥當就可以大功告成,結果卻反復受到了SELinux安全上下文的限制。所以,建議大家在配置httpd服務程序時,一定要細心、耐心。一旦成功配妥httpd服務程序之后,就會發現SELinux服務并沒有那么難。

因為在RHCSA、RHCE或RHCA考試中,都需要先重啟您的機器然后再執行判分腳本。因此,建議讀者在日常工作中要養成將所需服務添加到開機啟動項中的習慣,比如這里就需要添加systemctl enable httpd命令。

10.4 個人用戶主頁功能

如果想在系統中為每位用戶建立一個獨立的網站,通常的方法是基于虛擬網站主機功能來部署多個網站。但這個工作會讓管理員苦不堪言(尤其是用戶數量很龐大時),而且在用戶自行管理網站時,還會碰到各種權限限制,需要為此做很多額外的工作。其實,httpd服務程序提供的個人用戶主頁功能完全可以以勝任這個工作。該功能可以讓系統內所有的用戶在自己的家目錄中管理個人的網站,而且訪問起來也非常容易。

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

[[email protected] ~]# 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,保證其他人也有權限讀取里面的內容。

[[email protected] home]# su - linuxprobe
Last login: Fri May 22 13:17:37 CST 2017 on :0
[[email protected] ~]$ mkdir public_html
[[email protected] ~]$ echo "This is linuxprobe's website" > public_html/index.html
[[email protected] ~]$ chmod -Rf 755 /home/linuxprobe

第3步:重新啟動httpd服務程序,在瀏覽器的地址欄中輸入網址,其格式為“網址/~用戶名”(其中的波浪號是必需的,而且網址、波浪號、用戶名之間沒有空格),從理論上來講就可以看到用戶的個人網站了。不出所料的是,系統顯示報錯頁面,如圖10-9所示。這一定還是SELinux惹的禍。

無法訪問個人用戶網站

圖10-9? 禁止訪問用戶的個人網站

第4步:思考這次報錯的原因是什么。httpd服務程序在提供個人用戶主頁功能時,該用戶的網站數據目錄本身就應該是存放到與這位用戶對應的家目錄中的,所以應該不需要修改家目錄的SELinux安全上下文。但是,前文還講到了SELinux域的概念。SELinux域確保服務程序不能執行違規的操作,只能本本分分地為用戶提供服務。httpd服務中突然開啟的這項個人用戶主頁功能到底有沒有被SELinux域默認允許呢?

接下來使用getsebool命令查詢并過濾出所有與HTTP協議相關的安全策略。其中,off為禁止狀態,on為允許狀態。

[[email protected] ~]# 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 --> on
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> 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
named_tcp_bind_http_port --> off
prosody_bind_http_port --> off

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

[[email protected] ~]# setsebool -P httpd_enable_homedirs=on
[[email protected] ~]# firefox

Apache個人網站功能

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

有時,網站的擁有者并不希望直接將網頁內容顯示出來,只想讓通過身份驗證的用戶訪客看到里面的內容,這時就可以在網站中添加口令功能了。

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

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

第2步:編輯個人用戶主頁功能的配置文件。把第31~35行的參數信息修改成下列內容,其中井號(#)開頭的內容為劉遄老師添加的注釋信息,可將其忽略。隨后保存并退出配置文件,重啟httpd服務程序即可生效。

[[email protected] ~]# 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>
[[email protected] ~]# systemctl restart httpd

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

Apache密碼驗證

圖10-11? 網站提示需要輸入賬戶和密碼才能訪問

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

10.5 虛擬網站主機功能

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

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

Apache的虛擬主機功能是服務器基于用戶請求的不同IP地址、主機域名或端口號,實現提供多個網站同時為外部提供訪問服務的技術,如圖10-12所示,用戶請求的資源不同,最終獲取到的網頁內容也各不相同。如果大家之前沒有做過網站,可能不太理解其中的原理,等一會兒搭建出實驗環境并看到實驗效果之后,您一定就會明白了。

再次提醒大家,在做每個實驗之前請先將虛擬機還原到最初始狀態,以免多個實驗之間相互產生沖突。

Apache虛擬主機功能拓撲

圖10-12 用戶請求網站資源[原圖附件]

10.5.1 基于IP地址

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

劉遄老師在第4章和第9章分別講解了用于配置網絡的兩種方法,大家在實驗中和工作中可隨意選擇。就當前的實驗來講,需要配置的IP地址如圖10-13所示。在配置完畢并重啟網卡服務之后,記得檢查網絡的連通性,確保三個IP地址均可正常訪問,如圖10-14所示(這很重要,一定要測試好,然后再進行下一步!)。 nmtui對網卡添加多IP地址

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

第1步:分別在/home/wwwroot中創建用于保存不同網站數據的3個目錄,并向其中分別寫入網站的首頁文件。每個首頁文件中應有明確區分不同網站內容的信息,方便我們稍后能更直觀地檢查效果。 確認網卡配置正確

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

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

第2步:在httpd服務的配置文件中大約113行處開始,分別追加寫入三個基于IP地址的虛擬主機網站參數,然后保存并退出。記得需要重啟httpd服務,這些配置才生效。

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
113 <VirtualHost 192.168.10.10>
114 DocumentRoot /home/wwwroot/10
115 ServerName www.52437949.com
116 <Directory /home/wwwroot/10 >
117 AllowOverride None
118 Require all granted
119 </Directory>
120 </VirtualHost>
121 <VirtualHost 192.168.10.20>
122 DocumentRoot /home/wwwroot/20
123 ServerName bbs.linuxprobe.com
124 <Directory /home/wwwroot/20 >
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
129 <VirtualHost 192.168.10.30>
130 DocumentRoot /home/wwwroot/30
131 ServerName tech.linuxprobe.com
132 <Directory /home/wwwroot/30 >
133 AllowOverride None
134 Require all granted
135 </Directory>
136 </VirtualHost>
………………省略部分輸出信息………………
[[email protected] ~]# systemctl restart httpd

第3步:此時訪問網站,則會看到httpd服務程序的默認首頁面。大家現在應該立刻就反應過來—這是SELinux在搗鬼。由于當前的/home/wwwroot目錄及里面的網站數據目錄的SELinux安全上下文與網站服務不吻合,因此httpd服務程序無法獲取到這些網站數據目錄。我們需要手動把新的網站數據目錄的SELinux安全上下文設置正確(見前文的實驗),并使用restorecon命令讓新設置的SELinux安全上下文立即生效,這樣就可以立即看到網站的訪問效果了,如圖10-15所示。

[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/*
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20/*
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30/*
[[email protected] ~]# restorecon -Rv /home/wwwroot
restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/10 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/10/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/20 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/20/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/30 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/30/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[[email protected] ~]# firefox

驗證基于IP地址的虛擬主機功能的結果

圖10-15? 基于不同的IP地址訪問虛擬主機網站

10.5.2 基于主機域名

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

第1步:手工定義IP地址與域名之間對應關系的配置文件,保存并退出后會立即生效。可以通過分別ping這些域名來驗證域名是否已經成功解析為IP地址。

[[email protected] ~]# 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.52437949.com bbs.linuxprobe.com tech.linuxprobe.com
[[email protected] ~]# ping -c 4 www.52437949.com
PING www.52437949.com (192.168.10.10) 56(84) bytes of data.
64 bytes from www.52437949.com (192.168.10.10): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from www.52437949.com (192.168.10.10): icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from www.52437949.com (192.168.10.10): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from www.52437949.com (192.168.10.10): icmp_seq=4 ttl=64 time=0.069 ms
--- www.52437949.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
[[email protected] ~]# 

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

[[email protected] ~]# mkdir -p /home/wwwroot/www
[[email protected] ~]# mkdir -p /home/wwwroot/bbs
[[email protected] ~]# mkdir -p /home/wwwroot/tech
[[email protected] ~]# echo "www.52437949.com" > /home/wwwroot/www/index.html
[[email protected] ~]# echo "BBS.linuxprobe.com" > /home/wwwroot/bbs/index.html
[[email protected] ~]# echo "TECH.linuxprobe.com" > /home/wwwroot/tech/index.html

第3步:在httpd服務的配置文件中大約113行處開始,分別追加寫入三個基于主機名的虛擬主機網站參數,然后保存并退出。記得需要重啟httpd服務,這些配置才生效。

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
113 <VirtualHost 192.168.10.10>
114 DocumentRoot "/home/wwwroot/www"
115 ServerName "www.52437949.com"
116 <Directory "/home/wwwroot/www">
117 AllowOverride None
118 Require all granted
119 </directory> 
120 </VirtualHost>
121 <VirtualHost 192.168.10.10>
122 DocumentRoot "/home/wwwroot/bbs"
123 ServerName "bbs.linuxprobe.com"
124 <Directory "/home/wwwroot/bbs">
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
129 <VirtualHost 192.168.10.10>
130 DocumentRoot "/home/wwwroot/tech"
131 ServerName "tech.linuxprobe.com"
132 <Directory "/home/wwwroot/tech">
133 AllowOverride None
134 Require all granted
135 </directory>
136 </VirtualHost>
………………省略部分輸出信息………………

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

[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www/*
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs/*
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/tech
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/tech/*
[[email protected] ~]# restorecon -Rv /home/wwwroot
reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/www context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/www/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/bbs context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/bbs/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/tech context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/tech/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[[email protected] ~]# firefox 

驗證虛擬主機功能結果

圖10-16? 基于主機域名訪問虛擬主機網站

10.5.3 基于端口號

基于端口號的虛擬主機功能可以讓用戶通過指定的端口號來訪問服務器上的網站資源。在使用Apache配置虛擬網站主機功能時,基于端口號的配置方式是最復雜的。因此我們不僅要考慮httpd服務程序的配置因素,還需要考慮到SELinux服務對新開設端口的監控。一般來說,使用80、443、8080等端口號來提供網站訪問服務是比較合理的,如果使用其他端口號則會受到SELinux服務的限制。

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

第1步:分別在/home/wwwroot中創建用于保存不同網站數據的兩個目錄,并向其中分別寫入網站的首頁文件。每個首頁文件中應有明確區分不同網站內容的信息,方便我們稍后能更直觀地檢查效果。

[[email protected] ~]# mkdir -p /home/wwwroot/6111
[[email protected] ~]# mkdir -p /home/wwwroot/6222
[[email protected] ~]# echo "port:6111" > /home/wwwroot/6111/index.html
[[email protected] ~]# echo "port:6222" > /home/wwwroot/6222/index.html

第2步:在httpd服務配置文件的第43行和第44行分別添加用于監聽6111和6222端口的參數。

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf?
………………省略部分輸出信息……………… 
 33 #
 34 # Listen: Allows you to bind Apache to specific IP addresses and/or
 35 # ports, instead of the default. See also the <VirtualHost>
 36 # directive.
 37 #
 38 # Change this to Listen on specific IP addresses as shown below to 
 39 # prevent Apache from glomming onto all bound IP addresses.
 40 #
 41 #Listen 12.34.56.78:80
 42 Listen 80
 43 Listen 6111
 44 Listen 6222
………………省略部分輸出信息………………?

第3步:在httpd服務的配置文件中大約113行處開始,分別追加寫入兩個基于端口號的虛擬主機網站參數,然后保存并退出。記得需要重啟httpd服務,這些配置才生效。

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息……………… 
113 <VirtualHost 192.168.10.10:6111>
114 DocumentRoot "/home/wwwroot/6111"
115 ServerName www.52437949.com
116 <Directory "/home/wwwroot/6111">
117 AllowOverride None
118 Require all granted
119 </Directory> 
120 </VirtualHost>
121 <VirtualHost 192.168.10.10:6222>
122 DocumentRoot "/home/wwwroot/6222"
123 ServerName bbs.linuxprobe.com
124 <Directory "/home/wwwroot/6222">
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
………………省略部分輸出信息………………

第4步:因為我們把網站數據目錄存放在/home/wwwroot目錄中,因此還是必須要正確設置網站數據目錄文件的SELinux安全上下文,使其與網站服務功能相吻合。最后記得用restorecon命令讓新配置的SELinux安全上下文立即生效。

[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222
[[email protected] ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*
[[email protected] ~]# restorecon -Rv /home/wwwroot/
restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/6111 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/6111/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/6222 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/6222/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[[email protected] ~]# systemctl restart httpd
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.

見鬼了!在妥當配置httpd服務程序和SELinux安全上下文并重啟httpd服務后,竟然出現報錯信息。這是因為SELinux服務檢測到6111和6222端口原本不屬于Apache服務應該需要的資源,但現在卻以httpd服務程序的名義監聽使用了,所以SELinux會拒絕使用Apache服務使用這兩個端口。我們可以使用semanage命令查詢并過濾出所有與HTTP協議相關且SELinux服務允許的端口列表。

[[email protected] ~]# 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協議相關的端口號中默認沒有包含6111和6222,因此需要將這兩個端口號手動添加進去。該操作會立即生效,而且在系統重啟過后依然有效。設置好后再重啟httpd服務程序,然后就可以看到網頁內容了,結果如圖10-17所示。

[[email protected] ~]# semanage port -a -t http_port_t -p tcp?6111
[[email protected] ~]# semanage port -a -t http_port_t -p tcp?6222
[[email protected] ~]# 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 ?6222, 6111, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# firefox

基于端口虛擬主機實驗成功

圖10-17? 基于端口號訪問虛擬主機網站

10.6 Apache的訪問控制

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

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

[[email protected] ~]#?mkdir /var/www/html/server
[[email protected]?~]# echo "Successful" > /var/www/html/server/index.html

第2步:打開httpd服務的配置文件,在第129行后面添加下述規則來限制源主機的訪問。這段規則的含義是允許使用Firefox瀏覽器的主機訪問服務器上的首頁文件,除此之外的所有請求都將被拒絕。使用Firefox瀏覽器的訪問效果如圖10-18所示。

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
129 <Directory "/var/www/html/server">
130 SetEnvIf User-Agent "Firefox" ff=1
131 Order allow,deny
132 Allow from env=ff
133 </Directory>
………………省略部分輸出信息………………
[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# firefox

訪問成功

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

除了匹配源主機的瀏覽器特征之外,還可以通過匹配源主機的IP地址進行訪問控制。例如,我們只允許IP地址為192.168.10.20的主機訪問網站資源,那么就可以在httpd服務配置文件的第129行后面添加下述規則。這樣在重啟httpd服務程序后再用本機(即服務器,其IP地址為192.168.10.10)來訪問網站的首頁面時就會提示訪問被拒絕了,如圖10-19所示。

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分輸出信息………………
129 <Directory "/var/www/html/server">
130 Order allow,deny 
131 Allow from 192.168.10.20
132 </Directory>
………………省略部分輸出信息………………
[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# firefox

訪問失敗
圖10-19? 因IP地址不符合要求而被拒絕訪問

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

1.什么是Web網絡服務?

答:一種允許用戶通過瀏覽器訪問到互聯網中各種資源的服務。

2.相較于Nginx服務程序,Apache服務程序最大的優勢是什么?

答:Apache服務程序具備跨平臺特性、安全性,而且擁有快速、可靠、簡單的API擴展。

3.httpd服務程序沒有檢查到首頁文件,會提示報錯信息嗎?

答:不會,httpd服務在未找到網站首頁文件時,會向訪客顯示一個默認頁面。

4.簡述Apache服務主配置文件中全局配置參數、區域配置參數和注釋信息的作用。

答:全局配置參數是一種全局性的配置參數,可作用于對所有的子站點;區域配置參數則是單獨針對于每個獨立的子站點進行設置的;而注釋信息一般是對服務程序的功能或某一行參數進行介紹。

5.簡述SELinux服務的作用。

答:為了讓各個服務進程都受到約束,使其僅獲取到本應獲取的資源。

6.在使用getenforce命令查看SELinux服務模式時,發現其配置模式為permissive,這代表強制開啟模式嗎?

答:不是,強制開啟模式是enforcing,而permissive是只發出警告而不強制攔截的模式。

7.在使用semanage命令修改了文件上應用的SELinux安全上下文后,還需要執行什么命令才可以讓更改立即生效?

答:還需要restorecon命令即可讓新的SELinux安全上下文參數立即生效。

8.要想查詢并過濾出所有與HTTP協議相關的SELinux域策略有哪些,應該怎么做呢?

答:可以結合管道符來實現,即執行getsebool -a | grep http命令。

9.?Apache服務程序可以基于哪些資源來創建虛擬主機網站呢?

答:可以基于IP地址、主機名(域名)或者端口號創建虛擬主機網站。

10.相對于基于IP地址和基于主機名(域名)配置的虛擬主機網站來說,使用端口號配置虛
擬主機網站有哪些特點?

答:在使用端口號來配置虛擬主機網站時,必須要考慮到SELinux域對httpd服務程序所用端口號的控制策略,還要在httpd服務程序的主配置文件中使用Listen參數來開啟要監聽的端口號。

本文原創地址:http://www.52437949.com/chapter-10.html編輯:劉遄,審核員:暫無