前面系列文章講解了Linux下通過檔案傳輸、檔案共享、郵件系統來分享和獲取資源,本文講解網路資源獲取和共享的另外一種形式,通過Apache服務程式來提供Web服務,
本文先講解目前主流的Web服務程式以及各自的特點和優勢,然后以Apache服務為例講解Linux下Web網站的部署,并在部署程序中穿插講解SELinux的使用,最后在以示例講解Apache的虛擬主機功能及訪問控制,
一、Web服務程式分類
我們平時在互聯網上訪問的網站服務就是Web服務,比如我們常用的百度網站,他就是一個Web網站,Web網路服務,一般是指允許用戶通過瀏覽器訪問到其中各種資源的服務,
Web網路服務是一種被動訪問的服務程式,當接入到互聯網中的用戶主機發出請求后,Web服務才會回應并通過HTTP或HTTPS把請求的內容回傳給用戶,示意圖如下:

目前提供Web服務的程式有:IIS、Apache、Ngnix等,
1.1 IIS
IIS(Internet Information Services):互聯網資訊服務,是Windows系統中默認的Web服務程式,它是一款帶圖形化界面的網站管理工具,不僅提供Web網站服務,還可以提供FTP、SMTP等服務,功能豐富,但是由于它是用在Windows系統中,因此不介紹它,
1.2 Apache
Apache程式是目前市場上占有率很高的Web服務程式之一,其特點是跨平臺、安全性高、API擴展簡單可靠,
Apache服務程式可以運行在Linux、UNIX、 Windows系統中,支持基于IP、域名及埠號的虛擬主機功能,支持多種認證方式,集成有代理服務器模塊、安全Socket層(SSL),能夠實時監視服務狀態與定制日志訊息,有著各類豐富的模塊支持,
由于它是RHEL5、6、7中默認的Web服務程式,并且作為老牌的Web服務程式,市場占用率還是很高的,因此本文主要以Apache為例進行Web服務的演示,
1.3 Ngnix
2004年,為俄羅斯知名門戶站點開發的Web服務程式Nginx橫空出世,它作為一款輕量級的網站服務軟體,因其穩定性和豐富的功能而快速占領服務器市場,
它因系統資源消耗低、并發能力強的特點,在國內受到諸如新浪、騰訊、網易等門戶網站的青睞,Ngnix作為后起之秀,截至本文寫作時為止市場占有率幾乎與Apache齊平,以后有機會再單獨對其進行演示和講解,
二、Apache安裝及操作案例
2.1 Apache安裝及配置
2.1.1 Apache安裝
Apache是RHEL7默認的web程式,以包含在默認的安裝鏡像中,因此可以直接掛載安裝鏡像直接安裝,也可以用遠程Yum倉庫進行安裝,
需要注意的是,在CentOS和RHEL上,Apache軟體包和服務稱為httpd而非apache,
- 安裝Apache
先檢查Apache是否安裝,如果未安裝,通過yum倉庫安裝即可
[root@apache ~]# rpm -q httpd
package httpd is not installed
[root@apache ~]# yum install httpd
Loaded plugins: fastestmirror, langpacks
...省略部分內容
Complete!
[root@apache ~]# rpm -q httpd
httpd-2.4.6-90.el7.centos.x86_64
[root@apache ~]#
安裝完成后,httpd服務是沒有啟動的,還需要將其啟動,并加入到開機啟動中
[root@apache ~]# systemctl start httpd
[root@apache ~]# systemctl enable httpd
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
[root@apache ~]#
此時在虛擬機Centos內部,打開瀏覽器,即可看到apache部署成功

如果要讓外部機器(如宿主機)訪問此Web,則需要對防火墻進行設定,當然直接關閉防火墻也可以,不過這樣存在風險,
根據前文講解的防火墻知識,打開HTTP和HTTPS的80和443埠
[root@apache ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@apache ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@apache ~]# firewall-cmd --reload
success
[root@apache ~]#
這樣宿主機上也可以直接訪問該Web,如下圖

- 查看httpd版本資訊:
[root@apache ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2019 11:41:18
[root@apache ~]#
- 查看httpd運行狀態
[root@apache ~]# systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running) since Mon 2020-02-10 10:52:35 CST; 7min ago
Docs: man:httpd(8)
man:apachectl(8)
...省略部分內容
2.1.2 Apache配置
只有掌握httpd服務相關組態檔以及各自的用途,才能更好地對其進行配置了,
- 主要組態檔
httpd服務程式默認主要組態檔(這些默認配置是可以進行修改的)如下:
| 用途 | 檔案 |
|---|---|
| 服務目錄 | /etc/httpd |
| 主組態檔 | /etc/httpd/conf/httpd.conf |
| 網站資料目錄 | /var/www/html |
| 訪問日志 | /var/log/httpd/access_log |
| 錯誤日志 | /var/log/httpd/error_log |
主組態檔為:/etc/httpd/conf/httpd.conf,在此檔案中存存在三種型別的型別:注釋行資訊、全域配置、區域配置,
從主組態檔中截取部分進行說明如下:

全域配置引數
全域配置引數就是一種全域性的配置引數,可作用于對所有的子站點,既保證了子站點的正常訪問,也有效減少了頻繁寫入重復引數的作業量,
區域配置引數
區域配置引數則是單獨針對于每個獨立的子站點進行設定的,
- 主要引數
httpd服務程式最常用的引數如下
| 引數 | 用途 |
|---|---|
| ServerRoot | 服務目錄 |
| ServerAdmin | 管理員郵箱 |
| User | 運行服務的用戶 |
| Group | 運行服務的用戶組 |
| ServerName | 網站服務器的域名 |
| DocumentRoot | 網站資料目錄 |
| Directory | 網站資料目錄的權限 |
| Listen | 監聽的 IP 地址與埠號 |
| DirectoryIndex | 默認的索引頁頁面 |
| ErrorLog | 錯誤日志檔案 |
| CustomLog | 訪問日志檔案 |
| Timeout | 網頁超時時間,默認為 300 秒 |
- 案例演示:修改網站首頁內容
分析:既然上表中提到DocumentRoot是用于定義網站資料的保存路徑,那我們查看下其引數的默認值,然后把對應網頁內容放入該目錄,就可以實作網頁替換,靜態網頁名稱一般為index.html,
打開主組態檔
[root@apache ~]# vim /etc/httpd/conf/httpd.conf

查看到看默認網站資料目錄為:/var/www/html,默認該目錄為空,向目錄中創建index.html檔案,并通過瀏覽器進行查看,
如果忘記VI或VIM編輯器使用方法的,請回傳復習前面的文章:“linux入門系列4--vi&vim編輯器”,
[root@apache ~]# ll /var/www/html/
total 0
[root@apache ~]# echo "hi,this is heimatengyun's blog">/var/www/html/index.html
[root@apache ~]# ll /var/www/html/
total 4
-rw-r--r--. 1 root root 31 Feb 10 11:59 index.html
[root@apache ~]#
在宿主機通過瀏覽器再次查看,即可查看剛才新加的網頁檔案內容

通過這樣的操作,我們應該明白,如果你已經做好你的網頁內容,只需要往/var/www/html/目錄存放,即可實作網站的訪問,
但實際作業中,有可能我們會更換網站目錄,把網站內容存放到一個指定的目錄中,而非默認的/var/www/html/,這該怎么做呢?這就會涉及到SELinux的問題,因此請繼續下邊的實驗,
2.2 SELinux相關知識
2.2.1 問題引出
假設我們把系統根目錄下的website目錄作為網站目錄,我們進行如下操作:
(1)創建自定義網站目錄和網頁檔案
[root@apache /]# mkdir /website
[root@apache /]# cd /website/
[root@apache website]# echo "this is my custom directory">index.html
[root@apache website]# ll
total 4
-rw-r--r--. 1 root root 28 Feb 10 12:21 index.html
[root@apache website]#
(2)主組態檔中配置目錄
[root@apache website]# vim /etc/httpd/conf/httpd.conf

主要修改DocumentRoot引數指定網站目錄為/website,同時修改定義目錄權限的區域引數Directory,
(3)訪問驗證
配置完成后,重啟httpd服務
[root@apache website]# systemctl restart httpd
在宿主機中瀏覽器查看

見鬼,怎么顯示的還是httpd默認的頁面呢?
一般情況只有網站的首頁頁面檔案不存在或用戶權限不足時,才顯示httpd默認的頁面,比如后文的4.1,設定禁止的ip訪問后,就直接跳轉到此頁面,
我們在加上檔案名試下呢

可以看到提示權限不足,看到這里,你應該想到是SELinux在搞鬼,為了驗證一下,讓我們把SELinux關閉后在試試看
[root@apache website]# getenforce
Enforcing
[root@apache website]# setenforce 0
[root@apache website]# getenforce
Permissive
[root@apache website]#
再次在宿主機瀏覽器訪問

發現可以訪問了,那說明果然是SELinux在搞鬼,但生產環境不建議直接關閉SELinux,接下來我們就來看看SELinux相關的知識,掌握之后我們在來開啟SELinux并進行設定,使其在SELinux開啟的情況下依然可以訪問我們Web網站,
2.2.2 SELinux相關知識
在前面的檔案傳輸、檔案共享、郵件系統的文章中或多或少都講解了SELinux相關的知識,本文再次集中總結一下,
2.2.2.1 SELinux概述
SELinux(Security-Enhanced Linux)是美國國家安全域在Linux開源社區的幫助下開發的 一個強制訪問控制(MAC,Mandatory Access Control)的安全子系統,
RHEL7系統使用SELinux技術的目的是為了讓各個服務行程都受到約束,使其僅獲取到本應獲取的資源,它的重要性不言而喻,舉個例子,比如你從網上下載了一個軟體用于編輯檔案,但是這個軟體“不老實”,當你正在努力碼字的同時,它卻悄悄監視你在各個網站登錄時輸入的密碼,然后悄悄上傳到黑客指定的地址,SELinux就是為了防止這種情況的發生而開發的,從而更好的保護你的電腦,
SELinux具體從兩個方面進行限制:SELinux域和背景關系,
SELinux域對服務程式的功能進行限制,可以確保服務程式做不了出格的事情,
SELinux背景關系對檔案資源的訪問限制,確保檔案資源 只能被其所屬的服務程式進行訪問,
開啟SELinux后,這樣就等于開啟了系統雙保險,系統內的服務程式只能規規矩矩地拿到自己所應該獲取的資源,這樣即便黑客入侵了系 統,也無法利用系統內的服務程式進行越權操作,
SELinux配置有三種模式,如下:
| 引數值 | 作用 |
|---|---|
| enforcing | 強制啟用安全策略模式,將攔截服務的不合法請求 |
| permissive | 遇到服務越權訪問時,只發出警告而不強制攔截 |
| disabled | 對于越權的行為不警告也不攔截 |
正如2.2.1中,通過setenforce 0命令將SELinux關閉后,我們的Web就可以訪問了,就是這個道理,
SELinux組態檔對應為:/etc/selinux/config ,
[root@apache website]# cat /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
[root@apache website]#
該檔案中的值定義的是SELinux默認的運行狀態,也就是系統重啟后的狀態,因此修改它不會立即生效,
2.2.2 SELinux相關命令
- getenforce命令
用于查看SELinux的運行模式
[root@apache website]# getenforce
Enforcing
[root@apache website]#
- setenforece命令
setenforce 0或1,用于禁用(0)或啟用(1)SELinux,注意這個命令的修改只是臨時的,系統重啟后就會失效,
[root@apache website]# getenforce
Enforcing
[root@apache website]# setenforce 0
[root@apache website]# getenforce
Permissive
[root@apache website]
因此,如果原來系統的SELinux是關閉的,如果要開啟它,需要在組態檔中將進行設定SELINUX=enforcing,并同時要通過setenforce 1進行設定,這樣即使系統重啟,依然生效,
- semanage命令
用于設定SELinux背景關系的值,管理SELinux的策略,
語法格式:semanage [選項] [檔案]”
引數
| 引數 | 作用 |
|---|---|
| -l | 查詢 |
| -a | 添加 |
| -m | 修改 |
| -d | 洗掉 |
具體使用細節可以通過幫助命令man semanage進行查看,
- getseboll命令
該命令用于查看SELinux域相關的安全策略,
語法格式:getsebool -a(其中-a引數表示查看所有域相關的安全策略)
[root@apache ~]# getsebool
usage: getsebool -a or getsebool boolean...
[root@apache ~]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
...省略部分內容
其中,on表示允許狀態,off表示禁止狀態,
- setsebool命令
該命令用于修改SELinux域相關的策略規則,
語法格式:setsebool -P 規則項=on或off (其中-P引數表示立即讓修改永久生效)
[root@apache ~]# getsebool -a | grep xdm_write_home
xdm_write_home --> off
[root@apache ~]# setsebool -P xdm_write_home=on
[root@apache ~]# getsebool -a | grep xdm_write_home
xdm_write_home --> on
[root@apache ~]# setsebool -P xdm_write_home=off
[root@apache ~]# getsebool -a | grep xdm_write_home
xdm_write_home --> off
[root@apache ~]# getsebool xdm_write_home
xdm_write_home --> off
以上實驗,我們先查看grep xdm_write_home狀態,然后將其改為on,查看修改是否生效,然后再將其改回原值,查看某一項的值可以通過正則匹配,也可以直接通過該具體項獲取,
有了以上這些儲備知識,我們再繼續完成開啟SELinux的情況下讓我們自定義目錄的網站也能訪問,
2.3 Apache案例1:修改網站目錄
通過上邊的講解,我們大概已經知道了前面的問題就是SELinux背景關系引起,因此我們通過以下命令來查看下默認的/var/www/html和我們自定義的/website他們的SELinux背景關系的值究竟有什么不同
[root@apache website]# ll -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
[root@apache website]# ll -Z /website/
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html
[root@apache website]#
我們通過ll命令的-Z引數進行查看,很明顯就看到了不同,(-Z引數專門用于查看SELinux域相關設定)
可以看到在檔案上設定的SELinux安全背景關系是由用戶段、角色段以及型別段等多個資訊項共同組成的,以上示例中,用戶段system_u代表系統行程的身份,角色段object_r代表檔案目錄的角色, 型別段httpd_sys_content_t代表網站服務的系統檔案,
搞清楚區別后,我們直接用前邊講解的semanage命令添加SELinux安全背景關系即可,使其目錄及里邊的所有檔案能夠被httpd服務程式訪問到
[root@apache website]# ll -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
[root@apache website]# ll -Z /website/
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html
[root@apache website]# semanage fcontext -a -t httpd_sys_content_t /website
[root@apache website]# semanage fcontext -a -t httpd_sys_content_t /website/*
[root@apache website]# ll -Z /website/
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html
[root@apache website]# restorecon -Rv /website/
restorecon reset /website context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /website/index.html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[root@apache website]# ll -Z /website/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
[root@apache website]#
需要注意的是,設定背景關系值后并非立即生效,還需要執行restorecon才會生效,程序如上,請自行體驗,
經過這樣設定后,就可以正常訪問了,

本案例演示了SELinux背景關系對資源的限制導致的web不能訪問,以及設定背景關系值,
2.4 Apache案例2:用戶個人主頁功能
上一個案例演示了SELinux背景關系的設定,本案例再通過Apache的個人用戶主頁功能來演示SELinux域的設定,
假設有這樣有一個需求:需要為Linux每一位系統用戶建立一個獨立的網站,我們該怎么做呢?
方法有很多,httpd服務程式提供的個人用戶主頁功能完全可以實作這個需求,它可以讓系統內所有的用戶在自己的家目錄中管理個人的網站,而且訪問起來也非常容易,
步驟如下:
2.4.1 開啟個人主頁功能
個人用戶主頁功能組態檔為:/etc/httpd/conf.d/userdir.conf ,主要修改2處:注釋掉UserDir disabled使其開啟個人主頁功能,同時設定個人網站目錄,取消UserDir public_html 前的注釋即可,
[root@apache website]# vim /etc/httpd/conf.d/userdir.conf

2.4.2 創建網站目錄及檔案
在用戶家目錄中建立用于保存網站資料的目錄及首頁面檔案,
[root@apache website]# useradd heima
[root@apache website]# echo "123456" | passwd --stdin heima
Changing password for user heima.
passwd: all authentication tokens updated successfully.
[root@apache website]# su - heima
[heima@apache ~]$ ls
[heima@apache ~]$ pwd
/home/heima
[heima@apache ~]$ mkdir public_html
[heima@apache ~]$ echo "this is heima's website">public_html/index.html
[heima@apache ~]$ ll public_html/
total 4
-rwxrwxr-x. 1 heima heima 24 Feb 10 16:11 index.html
[heima@apache ~]$ chmod -Rf 775 /home/heima/
另外,還需要把家目錄的權限修改為755,保證其他人也有權限讀取里面的內容,
2.4.3 設定SELinux安全域策略
文章最開始已經設定了防火墻,此時我們大致一想,應該是可以訪問個人網頁了吧,我們先切換到root用戶,重啟httpd服務,然后進行訪問,結果很不幸,這次又提示權限不足,
[root@apache ~]# systemctl restart httpd

訪問地址為ip/~用戶名,其中的波浪號是必需的,而且網址、波浪號、用戶名之間沒有空格,
我們回想一下,這個現象和案例1遇到的癥狀有幾分相似,當時是因為我們新建了一個目錄/website,而沒有設定SELinux背景關系所導致,那這次是不是也是因為SELinux的背景關系導致呢?
很顯然不是,httpd服務程式在提供個人用戶主頁功能時,該用戶的網站資料目錄本身就應該是存放到與這位用戶對應的家目錄中的,所以應該不需要修改家目錄的 SELinux 安全背景關系,如果你實在不放心,也可以執行如下命令驗證:
[heima@apache ~]$ ll -Z /home/heima/
drwxrwxr-x. heima heima unconfined_u:object_r:httpd_user_content_t:s0 public_html
[heima@apache ~]$
對吧,很明顯不是SELinux背景關系導致,因為httpd默認就給用戶目錄添加了背景關系值,
那是什么原因呢,我們還是按照之前的方法來排查,先把SELinux關閉,然后在此訪問,結果可以正常訪問了,那說明就是SELinux的問題,再回想我們前面提到的SELinux通過背景關系和域這兩個方面進行限制和保護,既然背景關系沒問題,因此自然而然,我們應該知道這就是SELinux域導致的,
Linux 域確保服務程式不能執行違規的操作,只能本本分分地為用戶提供服務,httpd 服務中突然開啟的這項個人用 戶主頁功能到底有沒有被SELinux域默認允許呢?
給個人主頁相關的域規則項為:httpd_enable_homedirs,如果不知道記住即可,我們看下他的狀態確實為off,因此將其改為on就可以了,切換到root用戶進行操作
[root@apache ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
[root@apache ~]# setsebool httpd_enable_homedirs=on
[root@apache ~]#
此時,我們再次訪問,即可正常訪問了,

2.4.4 設定需要用戶密碼才能登陸
有時候我們不希望別人直接就可以訪問個人網站,需要通過身份認證才能進行查看,這就需要在網站中添加口令功能來實作,
(1)生成密碼資料庫
[root@apache ~]# htpasswd -c /etc/httpd/passed heima
New password:
Re-type new password:
Adding password for user heima
[root@apache ~]#
注意,檔案名任意取,在下一步中保持一致即可,-c引數表示第一次生成,設定密碼為888888,以區別之前heima用戶登錄系統的密碼123456,這樣做的目的是為了區分說明不此處設定的密碼不是用戶登錄系統的密碼,
(2)修改組態檔
[root@apache ~]# vim /etc/httpd/conf.d/userdir.conf
<Directory "/home/*/public_html">
# AllowOverride FileInfo AuthConfig Limit Indexes
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# Require method GET POST OPTIONS
AllowOverride all
authuserfile "/etc/htppd/passed"
authname "heima website"
authtype basic
require user heima
Require method GET POST OPTIONS
</Directory>
將文末的內容注釋并按如下進行修改即可

修改完成后,重啟httpd
[root@apache ~]# systemctl restart httpd
再次訪問,就要求輸入密碼了,

此時輸入用戶名heima,以及剛才創建的888888密碼(注意不是heima登錄系統的密碼)即可登錄網站,

這個案例演示了SELinux域對行程的控制,以及如何對其進行設定,
通過案例1和案例2,不僅完整演示了Apache常用操作,還特別演示了生產級別的SELinux域和背景關系的設定,
下一篇文章繼續演示Apache的虛擬主機功能和訪問控制的實作方法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/122587.html
標籤:Linux
