SELinux使用詳解

SELinux(Security-Enhanced Linux)是美國國家安全局在Linux開源社區的幫助下開發的一個強制訪問控制(MAC,Mandatory Access Control)的安全子系統。Linux系統使用SELinux技術的目的是爲了讓各個服務進程都受到約束,使其僅能獲取到本應獲取的資源。
例如,你在電腦上安裝了一個美圖軟件,當你在全神貫注地使用它給照片進行美顏時,它卻在後臺默默監視着你的QQ聊天記錄,而這顯然不該該是它應作的事情,若是是監視電腦中的圖片資源還說的過去。SELinux安全子系統就是爲了杜絕此類狀況而設計的,它可以從多方面監控違法行爲:對服務程序的功能進行限制(SELinux域限制能夠確保服務程序作不了出格的事情);對文件資源的訪問限制(SELinux安全上下文確保文件資源只能被其所屬的服務程序進行訪問)。「SELinux域」和「SELinux安全上下文」是SELinux的雙保險,使服務程序沒法進行越權操做。
SELinux服務有三種運行模式,具體以下:html

  • Enforcing:強制啓用安全策略模式,將攔截服務的不合法請求。
  • Permissive:遇到服務越權訪問時,只發出警告而不強制攔截。
  • Disabled:對於越權的行爲不警告也不攔截。

selinux的配置文件位置:/etc/selinux/config,連接文件位置:/etc/sysconfig/selinux
本人的機器環境python

ip地址 操做系統 安裝軟件
192.168.2.211 Centos 7 64位 yum方式安裝httpd

一、查詢selinux服務的工做狀態
sestatus
SELinux使用詳解
二、查看selinux的運行模式
getenforce
SELinux使用詳解
三、修改selinux的運行模式linux

setenforce 0  #將運行模式設置爲Permissive,即臨時關閉selinux,重啓系統後失效
setenforce 1  #將運行模式設置爲Enforcing,若是配置文件裏是Permissive,重啓系統後失效

SELinux使用詳解
四、修改配置文件,使其永久關閉selinux,重啓系統後生效
注:配置文件裏定義的是selinux的默認運行狀態,能夠理解爲系統重啓後的狀態web

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i 's/SELINUXTYPE=targeted/#&/' /etc/selinux/config
setenforce 0

五、查詢安全上下文相關命令,使用-Z參數
查看目錄的安全上下文,使用ls -Z
SELinux使用詳解
查看文件的安全上下文
SELinux使用詳解
查看進程的安全上下文,使用ps -Z
SELinux使用詳解
查看selinux用戶的安全上下文,使用id -Z
SELinux使用詳解
六、使用selinux須要記住的四個命令vim

  • semanage:該命令用於管理selinux的安全上下文,可查看、添加、修改和刪除進程、文件或目錄的安全上下文策略
  • restorecon:執行semanage命令後,須要使用restorecon命令將設置好的安全上下文當即生效,能夠加上-Rv參數對指定的目錄進行遞歸操做,以及顯示修改過程
  • getsebool:查詢selinux域的安全策略,須要加上-a參數
  • setsebool:修改selinux域的安全策略的規則,加上-P參數使其永久且當即生效

七、修改httpd服務的默認網站目錄,來配置selinux
(1)安裝httpd服務,並設置firewalld防火牆容許http服務瀏覽器

yum -y install httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

(2)將網站數據目錄修改成/home/wwwroot目錄,並建立首頁文件安全

mkdir /home/wwwroot
echo "The New Web Directory" > /home/wwwroot/index.html

(3)修改httpd服務的配置文件
vim /etc/httpd/conf/httpd.conf
SELinux使用詳解
(4)啓動httpd服務,並驗證效果
systemctl start httpd
SELinux使用詳解
經過瀏覽器訪問發現顯示上圖頁面,而這正是selinux在搗鬼。
(5)查看selinux運行狀態,並關閉它tcp

getenforce
setenforce 0

SELinux使用詳解
再次刷新頁面,就會看到正常的網頁內容了。
SELinux使用詳解
咱們把httpd服務的網站數據默認保存目錄修改成/home/wwwroot,這顯然違反了selinux的監管原則,/home目錄是用來存放普通用戶的家目錄數據的,而如今httpd服務卻要去獲取普通用戶家目錄中的數據,selinux天然是不容許了。咱們如今把selinux服務恢復到強制啓用安全策略模式,而後修改selinux的安全上下文便可。
(6)啓用selinux,而且對比/var/www/html和/home/wwwroot目錄的安全上下文有什麼區別ide

setenforce 1
ls -Zd /var/www/html/
ls -Zd /home/wwwroot/

SELinux使用詳解
selinux安全上下文是由用戶段、角色段和類型段等多個信息項組成的,用戶段system_u表示系統進程的身份,角色段object_r表示文件目錄的角色,類型段httpd_sys_content_t表示網站服務的系統文件。即然如此,那咱們只將/home/wwwroot目錄的安全上下文修改成跟原始網站目錄同樣就好了。
(7)安裝所需命令軟件包
yum -y install policycoreutils-python.x86_64
(8)將/home/wwwroot目錄添加一條安全上下文網站

semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*

SELinux使用詳解
咱們再經過瀏覽器訪問一下,能正常顯示網頁內容,OK。
SELinux使用詳解
八、開啓httpd服務的我的用戶主頁功能,來配置selinux
(1)修改配置文件,開啓我的用戶主頁功能
vim /etc/httpd/conf.d/userdir.conf
SELinux使用詳解
(2)切換到普通用戶,而且建立網站目錄及首頁文件

useradd xuad
su - xuad
mkdir public_html
echo "This is user's website" > public_html/index.html
chmod -Rf 755 /home/xuad/
exit
systemctl restart httpd

在瀏覽器地址欄裏輸入「http://192.168.2.223/~xuad」,不出所料,報錯了
SELinux使用詳解
httpd服務既然提供了我的用戶主頁功能,那麼用戶的網站目錄天然是存在在用戶的家目錄中,因此應該不是selinux安全上下文的問題。咱們前面有提到過selinux域,那麼是否是被它給阻止了呢?
(3)查看與http協議相關的安全策略
getsebool -a | grep http
SELinux使用詳解
這麼多的安全策略規則,咱們不必逐個理解它們,只須要經過名字大體猜想出相關的策略用途就能夠了。那麼經過名字咱們很容易能發現應該是httpd_enable_homedirs規則,而此規則是off,咱們應該將其修改成on。
(4)修改selinux域策略規則,該操做永久生效,而且當即生效
setsebool -P httpd_enable_homedirs=on
而後刷新一下頁面,能正常顯示首頁內容了。
SELinux使用詳解
九、配置基於端口號的多站點,來配置selinux
(1)建立網站目錄及首頁文件

mkdir -p /home/wwwroot/8111
mkdir -p /home/wwwroot/8222
echo "port:8111" > /home/wwwroot/8111/index.html
echo "port:8222" > /home/wwwroot/8222/index.html

(2)修改配置文件,增長兩個監聽端口,而且添加兩個虛擬站點配置
vim /etc/httpd/conf/httpd.conf
SELinux使用詳解
SELinux使用詳解
(3)查看selinux安全上下文

ls -Zd /home/wwwroot/8111/
ls -Zd /home/wwwroot/8222/

SELinux使用詳解
前面咱們修改了/home/wwwroot目錄的安全上下文,此時咱們新建的兩個目錄默認繼承了上層目錄的安全上下文,這裏無須再修改了。如今重啓httpd服務
systemctl restart httpd
SELinux使用詳解
奇怪,啓動時竟然報錯了。由於8111和8222端口不屬於httpd服務,但如今卻被httpd服務監聽使用了,因此selinux會拒絕httpd服務使用這兩個端口。
(4)查看與http協議相關的selinux服務容許的端口列表
semanage port -l | grep http
SELinux使用詳解
顯然http_port_t規則裏沒有8111和8222這兩個端口號。
(5)往http_port_t規則裏添加端口號

semanage port -a -t http_port_t -p tcp 8111
semanage port -a -t http_port_t -p tcp 8222

SELinux使用詳解
此操做當即生效,且永久生效,無須使用restorecon命令。
(6)配置firewalld防火牆容許8111和8222端口

firewall-cmd --permanent --add-port=8111/tcp
firewall-cmd --permanent --add-port=8222/tcp
firewall-cmd --reload
firewall-cmd --list-ports

SELinux使用詳解
(7)重啓httpd服務,並經過瀏覽器驗證
systemctl restart httpd
SELinux使用詳解
SELinux使用詳解網站頁面正常顯示,OK。

相關文章
相關標籤/搜索