SELinux初探

SELinux 『 Security Enhanced Linux 』的縮寫,字面上的意義就是安全強化的 Linux 之意


傳統的文件權限與賬號關係--》自主式存取控制(Discretionary Access Control, DAC)

    是依據程序的擁有者與文件資源的 rwx 權限來決定有無存取的能力


以政策守則制訂特定程序讀取特定文件--》委任式存取控制 (Mandatory Access Control, MAC)

    主體不再是使用者 而變成了程序 目標是該程序能否讀取的文件資源


先要大概明白幾個概念

  • 主體 (Subject):
    SELinux 主要想要管理的就是程序,因此你可以將『主體』可以同 process 劃上等號;

  • 目標 (Object):
    主體程序能否存取的『目標資源』一般就是文件系統。因此這個目標可以同文件系統劃上等號;

  • 政策 (Policy):
    由於程序與文件數量龐大,因此 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策內還會有詳細的守則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 5.x 裏面僅有提供兩個主要的政策,分別是:

    • targeted:針對網絡服務限制較多,針對本機限制較少,是默認的政策;

    • strict:完整的 SELinux 限制,限制方面較爲嚴格。

          建議使用默認的 targeted 政策即可。

          守則:只要知道如何開啓和關閉某項守則的放行與否即可

  • 安全性本文 (security context):
    我們剛剛談到了主體、目標與政策面,但是主體能不能存取目標除了政策指定之外,主體與目標的安全性本文(有點類似文件系統的 rwx )必須一致才能夠順利存取。

          安全性文本需要自行配置

             程序在內存中 所以安全性本文可以存入

             文件的安全性本文放置在文件的inode中

             在inode中就可以進行安全性本文的比對以及rwx權限的確認

查看文件的安全性本文

     [root@www ~]# ll -Z /usr/local/nginx/html/index.html

     -rw-r--r--. root root unconfined_u:object_r:usr_t:s0   /usr/local/nginx/html/index.html

                                        身份識別       :  角色      :類型

  • 身份識別 (Identify):
    相當於帳號方面的身份識別!主要的身份識別則有底下三種常見的類型:


    • root:表示 root 的帳號身份

    • system_u:表示系統程序方面的識別,通常就是程序;

    • user_u:代表的是一般使用者帳號相關的身份。

  • 角色 (Role):
    透過角色欄位,我們可以知道這個數據是屬於程序、文件資源還是代表使用者。一般的角色有:


    • object_r:代表的是文件或目錄等文件資源,這應該是最常見的;

    • system_r:代表的就是程序!不過,一般使用者也會被指定成爲 system_r 

  • 類型 (Type) :(最重要!)
    在默認的 targeted 政策中, Identify 與 Role 欄位基本上是不重要的!重要的在於這個類型 (type) 欄位! 基本上,一個主體程序能不能讀取到這個文件資源,與類型欄位有關!而類型欄位在文件與程序的定義不太相同,分別是:


    • type:在文件資源 (Object) 上面稱爲類型 (Type);

    • domain:在主體程序 (Subject) 則稱爲領域 (domain) !

    • domain 需要與 type 搭配,則該程序才能夠順利的讀取文件資源!

主體程序與 文件type欄位的相關性

[root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html

-rwxr-xr-x  root root system_u:object_r:httpd_exec_t   /usr/sbin/httpd

drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t /var/www/html

wKiom1gusVDTpMJPAAAmkf_APLE787.gif-wh_50

  1. 首先,我們觸發一個可運行的目標文件,那就是具有 httpd_exec_t 這個類型的 /usr/sbin/httpd 文件;

  2. 該文件的類型會讓這個文件所造成的主體程序 (Subject) 具有 httpd 這個領域 (domain), 我們的政策針對這個領域已經制定了許多守則,其中包括這個領域可以讀取的目標資源類型;

  3. 由於 httpd domain 被配置爲可以讀取 httpd_sys_content_t 這個類型的目標文件 (Object), 因此你的網頁放置到 /var/www/html/ 目錄下,就能夠被 httpd 那支程序所讀取了;

  4. 但最終能不能讀到正確的數據,還得要看 rwx 是否符合 Linux 權限的規範!


第一個是政策內需要制訂詳細的 domain/type 相關性;

第二個是若文件的 type 配置錯誤, 那麼即使權限配置爲 rwx 全開的 777 ,該主體程序也無法讀取目標文件資源


查看SELinux的模式

    [root@www ~]# getenforce

    Enforcing

    以前兩種爲啓動模式後一種爲關閉

  • enforcing:強制模式,代表 SELinux 運行中,且已經正確的開始限制 domain/type 了;

  • permissive:寬容模式:代表 SELinux 運行中,不過僅會有警告信息並不會實際限制 domain/type 的存取。這種模式可以運來作爲 SELinux 的 debug 之用;

  • disabled:關閉,SELinux 並沒有實際運行

查看SELinux的政策

     targeted     主要是管理網絡服務

     strict          本機端的程序

    [root@www ~]# sestatus

    SELinux status:                 enabled

    SELinuxfs mount:                /selinux

    Current mode:                   enforcing

    Mode from config file:          enforcing

    Policy version:                 24

    Policy from config file:        targeted


SELinux配置文件

    [root@www ~]# vim /etc/selinux/config

    SELINUX=enforcing                啓動模式

    SELINUXTYPE=targeted        政策


SELinux的啓動與關閉

     改變政策需要reboot

     模式的開啓(enforcing或permissive)轉爲關閉(disabled)  或相反 需要reboot

     模式的開啓之間轉換不需要rebbot

     reboot之前需要觀察開機時核心是否啓動SELinux

     [root@www wanjiadi]# vim /boot/grub/menu.lst

     觀察kernel’ 行 不包含 selinux=0 則 reboot之後就會啓動


啓動模式之間的切換

     [root@www ~]# setenforce 0     切換成寬鬆模式

     [root@www ~]# setenforce 1     切換成強制模式


操作安全性本文

查看程序的安全性本文

    [root@www wanjiadi]# ps aux -Z | grep httpd

           

查看文件安全性本文

    [root@www ~]# ll -Z /var/www/html/1.html

    -rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 1.html

    -rw-r--r--. root   root   unconfined_u:object_r:admin_home_t:s0 2.html   root目錄下創建mv過來的2.html 

    -rw-r--r--. root   root   unconfined_u:object_r:httpd_sys_content_t:s0 4.html   root在/var/www/html下創建的


修改文件的安全性本文

這裏有一點又一點需要聲明:軟件安裝後比如apache 在安裝完產生/var/www之後type httpd_sys_content_t就已經確定

    [root@www ~]# chcon -t httpd_sys_content_t /var/www/html/index.html

    -R  :遞歸修改;

    -t  :後面接安全性本文的類型欄位!例如 httpd_sys_content_t ;

    -u  :後面接身份識別,例如 system_u;

    -r  :後面街角色,例如 system_r;

    --reference=範例文件:拿某個文件當範例來修改後續接的文件的類型!


還原文件的默認安全性本文(根據當前目錄設置)

    [root@www ~]# restorecon -v /var/www/html/index.html

    restorecon reset /var/www/html/5.html context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章