一文徹底明白linux中的selinux到底是什麼

一文徹底明白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 的對比

這裡引用一張圖片來說明。

一文徹底明白linux中的selinux到底是什麼

可以看到,在 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。

一文徹底明白linux中的selinux到底是什麼

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 工作流程

這裡引用一張圖片,不必過多解釋。

一文徹底明白linux中的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

執行完命令之後,系統需要花一段時間去分析日誌中的違規行為並給出分析報告。分析報告的結構講解請看下圖:

一文徹底明白linux中的selinux到底是什麼

一文徹底明白linux中的selinux到底是什麼


分享到:


相關文章: