1. 程式人生 > 其它 >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 的對比

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

 

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

 

轉自:(6條訊息) 一文徹底明白linux中的selinux到底是什麼_yanjun821126的部落格-CSDN部落格_selinux