一、簡介
安全增強型 Linux(Security-Enhanced Linux)簡稱 SELinux,它是一個 Linux 內核模塊,也是 Linux 的一個安全子系統。
SELinux 主要由美國國家安全局開發。2.6 及以上版本的 Linux 內核都已經集成了 SELinux 模塊。
SELinux 的結構及配置非常複雜,而且有大量概念性的東西,要學精難度較大。很多 Linux 系統管理員嫌麻煩都把 SELinux 關閉了。
二、SELinux 基本概念
2.1 主體(Subject)
可以完全等同於進程。
注:爲了方便理解,如無特別說明,以下均把進程視爲主體。
2.2 對象(Object)
被主體訪問的資源。可以是文件、目錄、端口、設備等。
注:爲了方便理解,如無特別說明,以下均把文件或者目錄視爲對象。
2.3 政策和規則(Policy & Rule)
系統中通常有大量的文件和進程,爲了節省時間和開銷,通常我們只是選擇性地對某些進程進行管制。
而哪些進程需要管制、要怎麼管制是由政策決定的。
一套政策裏面有多個規則。部分規則可以按照需求啓用或禁用(以下把該類型的規則稱爲布爾型規則)。
規則是模塊化、可擴展的。在安裝新的應用程序時,應用程序可通過添加新的模塊來添加規則。用戶也可以手動地增減規則。
在 CentOS 7 系統中,有三套政策,分別是:
-
targeted:對大部分網絡服務進程進行管制。這是系統默認使用的政策(下文均使用此政策)。
-
minimum:以 targeted 爲基礎,僅對選定的網絡服務進程進行管制。一般不用。
-
mls:多級安全保護。對所有的進程進行管制。這是最嚴格的政策,配置難度非常大。一般不用,除非對安全性有極高的要求。
政策可以在 /etc/selinux/config 中設定。
2.4 安全上下文(Security Context)
安全上下文是 SELinux 的核心。
安全上下文我自己把它分爲「進程安全上下文」和「文件安全上下文」。
一個「進程安全上下文」一般對應多個「文件安全上下文」。
只有兩者的安全上下文對應上了,進程才能訪問文件。它們的對應關係由政策中的規則決定。
文件安全上下文由文件創建的位置和創建文件的進程所決定。而且系統有一套默認值,用戶也可以對默認值進行設定。
需要注意的是,單純的移動文件操作並不會改變文件的安全上下文。
安全上下文的結構及含義
安全上下文有四個字段,分別用冒號隔開。形如:system_u:object_r:admin_home_t:s0。
三、SELinux 基本操作
3.1 查詢文件或目錄的安全上下文
命令基本用法
ls -Z
用法舉例
查詢 /etc/hosts 的安全上下文。
ls -Z /etc/hosts
執行結果
-rw-r–r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts
3.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
3.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
3.4 把文件或目錄的安全上下文恢復到默認值
命令基本用法
restorecon [選項] […]
選項功能-v打印操作過程-R遞歸操作
用法舉例
添加一些網頁文件到 Nginx 服務器的目錄之後,爲這些新文件設置正確的安全上下文。
restorecon -R /usr/share/nginx/html/
3.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
#以下省略
3.6 開關一個布爾型規則
命令基本用法
setsebool [選項]
選項功能-P重啓依然生效
用法舉例
開啓 httpd_anon_write 規則。
setsebool -P httpd_anon_write on
3.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(/.*)?”
3.8 添加某類進程允許訪問的端口
命令基本用法
semanage port -a -t -p
注:各種服務類型所允許的端口號可以通過 semanage port -l 命令配合 grep 過濾查看。
用法舉例
爲 Nginx 需要使用 10080 的端口用於 HTTP 服務。
semanage port -a -t http_port_t -p tcp 10080
四、SELinux 錯誤分析和解決
4.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 軟件包)。
4.2 使用sealert分析錯誤
命令基本用法
sealert -a /var/log/audit/audit.log
執行完命令之後,系統需要花一段時間去分析日誌中的違規行爲並給出分析報告。
五、selinux 開關
selinux策略模式
targeted:針對網路服務限制較多,針對本機限制較少,默認爲這個策略。
strict:完整的SELinux 限制,限制方面較爲嚴格。
selinux三種模式
enforcing:強制模式,代表SELinux運作中,且已經正確的開始限制domain/type了。
permissive:寬容模式,代表SELinux運作中,不過僅會有警告訊息並不會實際限制domain/type的存取.這種模式可以運來作爲SELinux的debug之用(看下什麼原因導致無法訪問)。
disabled:關閉模式
查詢當前selinux模式
getenforce
臨時關閉
setenforce 0