前面系列文章講解了Linux下經過文件傳輸、文件共享、郵件系統來分享和獲取資源,本文講解網絡資源獲取和共享的另一種形式,經過Apache服務程序來提供Web服務。html
本文先講解目前主流的Web服務程序以及各自的特色和優點,而後以Apache服務爲例講解Linux下Web網站的部署,並在部署過程當中穿插講解SELinux的使用。最後在以示例講解Apache的虛擬主機功能及訪問控制。linux
咱們平時在互聯網上訪問的網站服務就是Web服務,好比咱們經常使用的百度網站,他就是一個Web網站。Web網絡服務,通常是指容許用戶經過瀏覽器訪問到其中各類資源的服務。web
Web網絡服務是一種被動訪問的服務程序,當接入到互聯網中的用戶主機發出請求後,Web服務纔會響應並經過HTTP或HTTPS把請求的內容回傳給用戶。示意圖以下:數據庫
目前提供Web服務的程序有:IIS、Apache、Ngnix等。apache
IIS(Internet Information Services):互聯網信息服務,是Windows系統中默認的Web服務程序。它是一款帶圖形化界面的網站管理工具,不只提供Web網站服務,還能夠提供FTP、SMTP等服務,功能豐富。可是因爲它是用在Windows系統中,所以不介紹它。vim
Apache程序是目前市場上佔有率很高的Web服務程序之一,其特色是跨平臺、安全性高、API擴展簡單可靠。centos
Apache服務程序能夠運行在Linux、UNIX、 Windows系統中,支持基於IP、域名及端口號的虛擬主機功能,支持多種認證方式,集成有代理服務器模塊、安全Socket層(SSL),可以實時監視服務狀態與定製日誌消息,有着各種豐富的模塊支持。瀏覽器
因爲它是RHEL五、六、7中默認的Web服務程序,而且做爲老牌的Web服務程序,市場佔用率仍是很高的,所以本文主要以Apache爲例進行Web服務的演示。安全
2004年,爲俄羅斯知名門戶站點開發的Web服務程序Nginx橫空出世。它做爲一款輕量級的網站服務軟件,因其穩定性和豐富的功能而快速佔領服務器市場。服務器
它因系統資源消耗低、併發能力強的特色,在國內受到諸如新浪、騰訊、網易等門戶網站的青睞。Ngnix做爲後起之秀,截至本文寫做時爲止市場佔有率幾乎與Apache齊平,之後有機會再單獨對其進行演示和講解。
Apache是RHEL7默認的web程序,以包含在默認的安裝鏡像中,所以能夠直接掛載安裝鏡像直接安裝,也能夠用遠程Yum倉庫進行安裝。
須要注意的是,在CentOS和RHEL上,Apache軟件包和服務稱爲httpd而非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,以下圖
[root@apache ~]# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Aug 8 2019 11:41:18 [root@apache ~]#
[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) ...省略部份內容
只有掌握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的問題,所以請繼續下邊的實驗。
假設咱們把系統根目錄下的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網站。
在前面的文件傳輸、文件共享、郵件系統的文章中或多或少都講解了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默認的運行狀態,也就是系統重啓後的狀態,所以修改它不會當即生效。
用於查看SELinux的運行模式
[root@apache website]# getenforce Enforcing [root@apache website]#
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進行設置。這樣即便系統重啓,依然生效。
用於設置SELinux上下文的值,管理SELinux的策略。
語法格式:semanage [選項] [文件]」
參數
參數 | 做用 |
---|---|
-l | 查詢 |
-a | 添加 |
-m | 修改 |
-d | 刪除 |
具體使用細節能夠經過幫助命令man semanage進行查看。
該命令用於查看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表示禁止狀態。
該命令用於修改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的狀況下讓咱們自定義目錄的網站也能訪問。
經過上邊的講解,咱們大概已經知道了前面的問題就是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不能訪問,以及設置上下文值。
上一個案例演示了SELinux上下文的設置,本案例再經過Apache的我的用戶主頁功能來演示SELinux域的設置。
假設有這樣有一個需求:須要爲Linux每一位系統用戶創建一個獨立的網站。咱們該怎麼作呢?
方法有不少,httpd服務程序提供的我的用戶主頁功能徹底能夠實現這個需求。它可讓系統內全部的用戶在本身的家目錄中管理我的的網站,並且訪問起來也很是容易。
步驟以下:
我的用戶主頁功能配置文件爲:/etc/httpd/conf.d/userdir.conf 。主要修改2處:註釋掉UserDir disabled使其開啓我的主頁功能,同時設置我的網站目錄,取消UserDir public_html 前的註釋便可。
[root@apache website]# vim /etc/httpd/conf.d/userdir.conf
在用戶家目錄中創建用於保存網站數據的目錄及首頁面文件。
[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,保證其餘人也有權限讀取裏面的內容。
文章最開始已經設置了防火牆,此時咱們大體一想,應該是能夠訪問我的網頁了吧。咱們先切換到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 ~]#
此時,咱們再次訪問,便可正常訪問了。
有時候咱們不但願別人直接就能夠訪問我的網站,須要經過身份認證才能進行查看,這就須要在網站中添加口令功能來實現。
(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的虛擬主機功能和訪問控制的實現方法。