httpd 服務程序的功能是容許用戶訪問網站內容,所以 SELinux 確定會默認放行用戶對網html
第一步:把虛擬機中安裝系統的光盤設備中的系統鏡像掛載到/media/cdromlinux
[root@localhost Desktop]# mkdir -p /media/cdrom [root@localhost Desktop]# mount /dev/cdrom /media/cdrom mount: /dev/sr0 is write-protected, mounting read-only
第二步:使用 Vim 文本編輯器建立 Yum 倉庫的配置文件數據庫
[root@localhost Desktop]# vim /etc/yum.repos.d/rhel7.repo [rhel7] name=rhel7 baseurl=file:///media/cdrom enabled=1 gpgcheck=0
第三步:動手安裝 Apache 服務程序。注意,使用 yum 命令進行安裝時,跟在命令後面的Apache 服務的軟件包名稱爲 httpd。若是直接執行 yum install apache 命令,則系統會報錯。apache
[root@localhost Desktop]# 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!
第四步:啓用 httpd 服務程序並將其加入到開機啓動項中,使其可以隨系統開機而運行,從而持續爲用戶提供 Web 服務vim
[root@localhost Desktop]# systemctl start httpd [root@localhost Desktop]# systemctl enable httpd ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user. target.wants/httpd.service'
而後打開Firefox瀏覽器,在地址欄裏輸入 127.0.0.1 並按回車,就能夠看到用於提供 Web 服務的 httpd 服務程序的默認頁面了瀏覽器
一、配置服務文件參數安全
配置文件服務器
參數 | 存放位置 |
服務目錄 | /etc/httpd |
主配置文件 | /etc/httpd/conf/httpd.conf |
網站數據目錄 | /var/www/html |
訪問日誌 | /var/log/httpd/access_log |
錯誤日誌 | /var/log/httpd/error_log |
配置 httpd 服務程序時最經常使用的參數以及用途描述tcp
參數 | 用途 |
ServerRoot | 服務目錄 |
ServerAdmin | 管理員郵箱 |
User | 運行服務的用戶 |
Group | 運行服務的用戶組 |
ServerName | 網站服務器的域名 |
DocumentRoot | 網站數據目錄 |
ErrorLog | 錯誤日誌文件 |
Directory | 網站數據目錄的權限 |
Listen | 監聽的 IP 地址與端口號 |
DirectoryIndex | 默認的索引頁頁面 |
CustomLog | 訪問日誌文件 |
Timeout | 網頁超時時間,默認爲 300 秒 |
DocumentRoot 參數用於定義網站數據的保存路徑,其參數的默認值是把網站數據存放到/var/www/html 目錄中;而當前網站廣泛的首頁面名稱是 index.html,因編輯器
此能夠向/var/www/html 目錄中寫入一個文件,替換掉 httpd 服務程序的默認首頁面,該操做會當即生效。
[root@localhost Desktop]# echo "hello world" > /var/www/html/index.html
在默認狀況下,網站數據是保存在/var/www/html 目錄中,而若是想把保存網站數據的目錄修改成/home/wwwroot 目錄,該怎麼操做呢?
第一步:創建網站數據的保存目錄,並建立首頁文件
[root@localhost Desktop]# mkdir /home/wwwroot [root@localhost Desktop]# echo "New Page" > /home/wwwroot/index.html
第二步:打開 httpd 服務程序的主配置文件,將約第 119 行用於定義網站數據保存路徑的參數 DocumentRoot 修改成 /home/wwwroot,同時還須要將約第 124 行用於定義目錄權限的參數 Directory 後面的路徑也修改成/home/wwwroot。配置文件修改完畢後便可保存並退出
[root@localhost Desktop]# vim /etc/httpd/conf/httpd.conf 114 #………………省略部分輸出信息……………… 115 # DocumentRoot: The directory out of which you will serve your 116 # documents. By default, all requests are taken from this directory, but 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>
………………省略部分輸出信息………………
第三步:從新啓動 httpd 服務程序並驗證效果。但奇怪的是,爲何沒看到應該顯示的頁面,而顯示的是httpd服務程序的默認頁面,按理來講,只有在網站的首頁面文件不存
在或者用戶權限不足時,才顯示 httpd 服務程序的默認首頁面。嘗試訪問http://127.0.0.1/index.html 頁面時,居然發現頁面中顯示「Forbidden,You don't have permission to access /index.html on this server.」 而這一切都是因爲 SELinux 的緣由
二、 SELinux 安全子系統
SELinux(Security-Enhanced Linux)是美國國家安全局在 Linux 開源社區的幫助下開發的一個強制訪問控制(MAC,Mandatory Access Control)的安全子系統。SELinux
技術的目的是爲了讓各個服務進程都受到約束,使其僅獲取到本應獲取的資源。
例如,你在本身電腦上打開一個視頻軟件在看視頻,然而它卻在後臺偷偷監聽着瀏覽器中輸入的密碼信息,這顯然不是它該作的事情,SELinux 安全子系統就是爲了杜絕此類狀況而
設計的,它可以從多方面監控違法行爲:對服務程序的功能進行限制(SELinux 域限制能夠確保服務程序作不了出格的事情);對文件資源的訪問限制(SELinux 安全上下文確保文件資源只能被其所屬的服務程序進行訪問)。
SELinux 服務有三種配置模式
➢ enforcing:強制啓用安全策略模式,將攔截服務的不合法請求。
➢ permissive:遇到服務越權訪問時,只發出警告而不強制攔截。
➢ disabled:對於越權的行爲不警告也不攔
[root@localhost Desktop]# vim /etc/selinux/config
SELinux 服務的主配置文件中,定義的是 SELinux 的默認運行狀態,能夠將其理解爲系統重啓後的狀態,所以它不會在更改後當即生效。
getenforce 命令:得到當前 SELinux服務的運行模式
[root@localhost Desktop]# getenforce
Enforcing
爲驗證上面的狀況確實是由於 SELinux 而致使的,使用setenforce [0|1]命令修改 SELinux 當前的運行模式(0 爲禁用,1 爲啓用)。注意,這種修改只是臨時的,在系統重啓後就會失效
[root@localhost Desktop]# setenforce 0 [root@localhost Desktop]# getenforce Permissive
再次刷新網頁,就會看到正常的網頁內容了
httpd 服務程序的功能是容許用戶訪問網站內容,所以 SELinux 確定會默認放行用戶對網站的請求操做。可是,咱們將網站數據的默認保存目錄修改成了/home/wwwroot,而這就產生問題了。/home 目錄是用來存放普通用戶的家目錄數據的,而如今,httpd提供的網站服務卻要去獲取普通用戶家目錄中的數據了,這顯然違反了 SELinux 的監管原則。
如今,咱們把 SELinux 服務恢復到強制啓用安全策略模式,而後分別查看原始網站數據的保存目錄與當前網站數據的保存目錄是否擁有不一樣的 SELinux 安全上下文值
[root@localhost Desktop]# setenforce 1 [root@localhost Desktop]# ls -Zd /var/www/html -Z用於查看上下文 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html [root@localhost Desktop]# ls -Zd /home/wwwroot drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 /home/wwwroot
在文件上設置的 SELinux 安全上下文是由用戶段、角色段以及類型段等多個信息項共同組成的。其中,用戶段 system_u 表明系統進程的身份,角色段 object_r 表明文件目錄的角色,類型段 httpd_sys_content_t 表明網站服務的系統文件。針對當前這種狀況,咱們只須要使用 semanage 命令,將當前網站目錄/home/wwwroot 的SELinux 安全上下文修改成跟原始網站目錄的同樣就能夠了
semanage 命令
semanage 命令用於管理 SELinux 的策略,格式爲「semanage [選項] [文件]」。
➢ -l 參數用於查詢;
➢ -a 參數用於添加;
➢ -m 參數用於修改;
➢ -d 參數用於刪除。
能夠向新的網站數據目錄中新添加一條 SELinux 安全上下文,讓這個目錄以及裏面的全部文件可以被 httpd 服務程序所訪問到
[root@localhost Desktop]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot -t表示具體要使用什麼值 目錄不能有最後那個斜槓 [root@localhost Desktop]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
執行上述設置以後,還沒法當即訪問網站,還須要使用 restorecon 命令將設置好的SELinux 安全上下文當即生效。在使用 restorecon 命令時,能夠加上-Rv 參數對指定的目錄進
行遞歸操做,以及顯示 SELinux 安全上下文的修改過程。最後,再次刷新頁面,就能夠正常看到網頁內容了
[root@localhost Desktop]# 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
三、我的用戶主頁功能
若是想在系統中爲每位用戶創建一個獨立的網站,一般的方法是基於虛擬網站主機功能來部署多個網站。httpd 服務程序提供的我的用戶主頁功能徹底能夠以勝任這個工做。該功能可讓系統內全部的用戶在本身的家目錄中管理我的的網站,並且訪問起來也很是容易。
第一步:在 httpd 服務程序中,默認沒有開啓我的用戶主頁功能。須要編輯配置文件,而後在第 17 行的 UserDir disabled 參數前面加上井號(#),表示讓 httpd 服務程序開啓我的用戶主頁功能;同時再把第 24 行的 UserDir public_html 參數前面的井號(#)去掉(UserDir 參數表示網站數據在用戶家目錄中的保存目錄名稱,即 public_html 目錄)。最後,
在修改完畢後記得保存。
第二步:在用戶家目錄中創建用於保存網站數據的目錄及首頁面文件。另外,還須要把家目錄的權限修改成 755,保證其餘人也有權限讀取裏面的內容
[lisi@localhost ~]$ mkdir public_html [lisi@localhost ~]$ echo "hello world" > public_html/ [lisi@localhost ~]$ echo "hello world" > public_html/index.html
第三步:從新啓動 httpd 服務程序,在瀏覽器的地址欄中輸入網址,其格式爲「網址/~用戶名」(其中的波浪號是必需的,並且網址、波浪號、用戶名之間沒有空格),從理論上來說就能夠看到用戶的我的網站了。但顯示的確是系統報錯頁面。其實仍是SELinux的問題
第四步:httpd 服務程序在提供我的用戶主頁功能時,該用戶的網站數據目錄自己就應該是存放到與這位用戶對應的家目錄中的,因此應該不須要修改家目錄的 SELinux 安全上下文。可是,還有Linux域,Linux 域確保服務程序不能執行違規的操做,只能本本分分地爲用戶提供服務。httpd 服務中忽然開啓的這項我的用戶主頁功能到底有沒有被 SELinux 域默認容許呢?
getsebool 命令
getsebool 命令查詢並過濾出全部與 HTTP 協議相關的安全策略。其中,off 爲禁止狀態,on 爲容許狀態
[root@localhost Desktop]# getsebool -a | grep http -a表示顯示全部安全策略 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
相應的安全策略是 httpd_enable_homedirs ,爲關閉狀態,能夠用 setsebool 命令來修改 SELinux 策略中各條規則的布爾值,在 setsebool 命令後面加上-P 參數,讓修改後的 SELinux 策略規則永久生效且當即生效。隨後刷新網頁。
[root@localhost Desktop]# setsebool -P httpd_enable_homedirs=on
有時,網站的擁有者並不但願直接將網頁內容顯示出來,只想讓經過身份驗證的用戶訪客看到裏面的內容,這時就能夠在網站中添加口令功能了。
第一步:先使用 htpasswd 命令生成密碼數據庫。-c 參數表示第一次生成;後面再分別添加密碼數據庫的存放文件,以及驗證要用到的用戶名稱(該用戶沒必要是系統中已有的本地帳戶)。
[root@localhost Desktop]# htpasswd -c /etc/httpd/passwd test New password: 輸入用於網頁驗證的密碼 Re-type new password: 再次輸入 Adding password for user test
第二步:編輯我的用戶主頁功能的配置文件。把第 32~35 行的參數信息修改爲下列內容,隨後保存並退出配置文件,重啓 httpd 服務程序便可生效。
[root@localhost Desktop]# 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 authuserfile "/etc/httpd/passwd" #剛生成出來的密碼驗證文件保存路徑 33 authname "Enter passwd" #當用戶嘗試訪問我的用戶網站時的提示信息 34 authtype basic 35 require user test #用戶進行帳戶密碼登陸時須要驗證的用戶名稱,和生產密碼驗證文件時的用戶名稱同樣 36 </Directory> 37 [root@localhost Desktop]# systemctl restart httpd
此後,當用戶再想訪問某個用戶的我的網站時,就必需要輸入帳戶和密碼才能正常訪問了。另外,驗證時使用的帳戶和密碼是用 htpasswd 命令生成的專門用於網站登陸的口令密碼,而不是系統中的用戶密碼