linux下目錄簡介——/SElinux
一、前言
安全增強型 Linux(Security-Enhanced Linux)簡稱 SELinux,它是一個 Linux 內核模塊,也是 Linux 的一個安全子系統。
SELinux 主要由美國國家安全局開發。2.6 及以上版本的 Linux 內核都已經集成了 SELinux 模塊。
SELinux 的結構及配置非常復雜,而且有大量概念性的東西,要學精難度較大。很多 Linux 系統管理員嫌麻煩都把 SELinux 關閉了。
如果可以熟練掌握 SELinux 並正確運用,我覺得整個系統基本上可以到達"堅不可摧"的地步了(請永遠記住沒有絕對的安全)。
掌握 SELinux 的基本概念以及簡單的配置方法是每個 Linux 系統管理員的必修課。
本文均在 CentOS 7.4.1708 系統中操作。
本文純屬個人學習經驗分享交流,出錯再所難免,僅供參考!如果發現錯誤的地方,可以的話麻煩指點下,特別感謝!
二、SELinux 的作用及權限管理機制
2.1 SELinux 的作用
SELinux 主要作用就是最大限度地減小系統中服務進程可訪問的資源(最小權限原則)。
設想一下,如果一個以 root 身份運行的網絡服務存在 0day 漏洞,黑客就可以利用這個漏洞,以 root 的身份在您的服務器上為所欲為了。是不是很可怕?
SELinux 就是來解決這個問題的。
2.2 DAC
在沒有使用 SELinux 的操作系統中,決定一個資源是否能被訪問的因素是:某個資源是否擁有對應用戶的權限(讀、寫、執行)。
只要訪問這個資源的進程符合以上的條件就可以被訪問。
而最致命問題是,root 用戶不受任何管制,系統上任何資源都可以無限制地訪問。
這種權限管理機制的主體是用戶,也稱為自主訪問控制(DAC)。
2.3 MAC
在使用了 SELinux 的操作系統中,決定一個資源是否能被訪問的因素除了上述因素之外,還需要判斷每一類進程是否擁有對某一類資源的訪問權限。
這樣一來,即使進程是以 root 身份運行的,也需要判斷這個進程的類型以及允許訪問的資源類型才能決定是否允許訪問某個資源。進程的活動空間也可以被壓縮到最小。
即使是以 root 身份運行的服務進程,一般也只能訪問到它所需要的資源。即使程序出了漏洞,影響範圍也只有在其允許訪問的資源範圍內。安全性大大增加。
這種權限管理機制的主體是進程,也稱為強制訪問控制(MAC)。
而 MAC 又細分為了兩種方式,一種叫類別安全(MCS)模式,另一種叫多級安全(MLS)模式。
下文中的操作均為 MCS 模式。
2.4 DAC 和 MAC 的對比
這裏引用一張圖片來說明。
可以看到,在 DAC 模式下,只要相應目錄有相應用戶的權限,就可以被訪問。而在 MAC 模式下,還要受進程允許訪問目錄範圍的限制。
三、SELinux 基本概念
3.1 主體(Subject)
可以完全等同於進程。
註:為了方便理解,如無特別說明,以下均把進程視為主體。
3.2 對象(Object)
被主體訪問的資源。可以是文件、目錄、端口、設備等。
註:為了方便理解,如無特別說明,以下均把文件或者目錄視為對象。
3.3 政策和規則(Policy & Rule)
系統中通常有大量的文件和進程,為了節省時間和開銷,通常我們只是選擇性地對某些進程進行管制。
而哪些進程需要管制、要怎麽管制是由政策決定的。
一套政策裏面有多個規則。部分規則可以按照需求啟用或禁用(以下把該類型的規則稱為布爾型規則)。
規則是模塊化、可擴展的。在安裝新的應用程序時,應用程序可通過添加新的模塊來添加規則。用戶也可以手動地增減規則。
在 CentOS 7 系統中,有三套政策,分別是:
1. targeted:對大部分網絡服務進程進行管制。這是系統默認使用的政策(下文均使用此政策)。
2. minimum:以 targeted 為基礎,僅對選定的網絡服務進程進行管制。一般不用。
3. mls:多級安全保護。對所有的進程進行管制。這是最嚴格的政策,配置難度非常大。一般不用,除非對安全性有極高的要求。
政策可以在 /etc/selinux/config 中設定。
3.4 安全上下文(Security Context)
安全上下文是 SELinux 的核心。
安全上下文我自己把它分為「進程安全上下文」和「文件安全上下文」。
一個「進程安全上下文」一般對應多個「文件安全上下文」。
只有兩者的安全上下文對應上了,進程才能訪問文件。它們的對應關系由政策中的規則決定。
文件安全上下文由文件創建的位置和創建文件的進程所決定。而且系統有一套默認值,用戶也可以對默認值進行設定。
需要註意的是,單純的移動文件操作並不會改變文件的安全上下文。
安全上下文的結構及含義
安全上下文有四個字段,分別用冒號隔開。形如:system_u:object_r:admin_home_t:s0。
3.5 SELinux 的工作模式
SELinux 有三種工作模式,分別是:
1. enforcing:強制模式。違反 SELinux 規則的行為將被阻止並記錄到日誌中。
2. permissive:寬容模式。違反 SELinux 規則的行為只會記錄到日誌中。一般為調試用。
3. disabled:關閉 SELinux。
SELinux 工作模式可以在 /etc/selinux/config 中設定。
如果想從 disabled 切換到 enforcing 或者 permissive 的話,需要重啟系統。反過來也一樣。
enforcing 和 permissive 模式可以通過 setenforce 1|0 命令快速切換。
需要註意的是,如果系統已經在關閉 SELinux 的狀態下運行了一段時間,在打開 SELinux 之後的第一次重啟速度可能會比較慢。因為系統必須為磁盤中的文件創建安全上下文(我表示我重啟了大約 10 分鐘,還以為是死機了……)。
SELinux 日誌的記錄需要借助 auditd.service 這個服務,請不要禁用它。
3.6 SELinux 工作流程
這裏引用一張圖片,不必過多解釋。
註:上面的安全文本指的就是安全上下文。
四、SELinux 基本操作
4.1 查詢文件或目錄的安全上下文
命令基本用法
ls -Z
用法舉例
查詢 /etc/hosts 的安全上下文。
ls -Z /etc/hosts
執行結果
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts
4.2 查詢進程的安全上下文
命令基本用法
ps auxZ | grep -v grep | grep
用法舉例
查詢 Nginx 相關進程的安全上下文。
ps auxZ | grep -v grep | grep nginx
執行結果
system_u:system_r:httpd_t:s0 root 7997 0.0 0.0 122784 2156 ? Ss 14:31 0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:httpd_t:s0 nginx 7998 0.0 0.0 125332 7560 ? S 14:31 0:00 nginx: worker process
4.3 手動修改文件或目錄的安全上下文
命令基本用法
chcon [...]
選項功能-u 修改安全上下文的用戶字段-r 修改安全上下文的角色字段-t 修改安全上下文的類型字段-l 修改安全上下文的級別字段--reference 修改與指定文件或目錄相一致的安全上下文-R遞歸操作-h修改軟鏈接的安全上下文(不加此選項則修改軟鏈接對應文件)
用法舉例
修改 test 的安全上下文為 aaa_u:bbb_r:ccc_t:s0。
chcon -u aaa_u -r bbb_r -t ccc_t test
4.4 把文件或目錄的安全上下文恢復到默認值
命令基本用法
restorecon [選項] [...]
選項功能-v打印操作過程-R遞歸操作
用法舉例
添加一些網頁文件到 Nginx 服務器的目錄之後,為這些新文件設置正確的安全上下文。
restorecon -R /usr/share/nginx/html/
4.5 查詢系統中的布爾型規則及其狀態
命令基本用法
getsebool -a
由於該命令要麽查詢所有規則,要麽只查詢一個規則,所以一般都是先查詢所有規則然後用 grep 篩選。
用法舉例
查詢與 httpd 有關的布爾型規則。
getsebool -a | grep httpd
執行結果
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
#以下省略
4.6 開關一個布爾型規則
命令基本用法
setsebool [選項]
選項功能-P重啟依然生效
用法舉例
開啟 httpd_anon_write 規則。
setsebool -P httpd_anon_write on
4.7 添加目錄的默認安全上下文
命令基本用法
semanage fcontext -a -t "(/.*)?"
註:目錄或文件的默認安全上下文可以通過 semanage fcontext -l 命令配合 grep過濾查看。
用法舉例
為 Nginx 新增一個網站目錄 /usr/share/nginx/html2 之後,需要為其設置與原目錄相同的默認安全上下文。
semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"
4.8 添加某類進程允許訪問的端口
命令基本用法
semanage port -a -t -p
註:各種服務類型所允許的端口號可以通過 semanage port -l 命令配合 grep 過濾查看。
用法舉例
為 Nginx 需要使用 10080 的端口用於 HTTP 服務。
semanage port -a -t http_port_t -p tcp 10080
五、SELinux 錯誤分析和解決
5.1 認識 SELinux 日誌
當開啟了 SELinux 之後,很多服務的一些正常行為都會被視為違規行為(標題及下文中的錯誤均指違規行為)。
這時候我們就需要借助 SELinux 違規日誌來分析解決。
SELinux 違規日誌保存在 /var/log/audit/audit.log 中。
/var/log/audit/audit.log 的內容大概是這樣的。
type=LOGIN msg=audit(1507898701.391:515): pid=8523 uid=0 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=25 res=1
type=USER_START msg=audit(1507898701.421:516): pid=8523 uid=0 auid=0 ses=25 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg=‘op=PAM:session_open grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success‘
...
該文件的內容很多,而且混有很多與 SELinux 錯誤無關的系統審計日誌。我們要借助 sealert 這個實用工具來幫忙分析(如果提示找不到命令的話請安裝 setroubleshoot 軟件包)。
5.2 使用sealert分析錯誤
命令基本用法
sealert -a /var/log/audit/audit.log
執行完命令之後,系統需要花一段時間去分析日誌中的違規行為並給出分析報告。分析報告的結構講解請看下圖:
轉自:https://blog.csdn.net/yanjun821126/article/details/80828908
linux下目錄簡介——/SElinux