前面系列文章講解了Linux下通過文件傳輸、文件共用、郵件系統來分享和獲取資源,本文講解網路資源獲取和共用的另外一種形式,通過Apache服務程式來提供Web服務。 ...
前面系列文章講解了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的虛擬主機功能和訪問控制的實現方法。