在 Linux 系統中一切皆檔案,資源也屬于某種檔案,用戶在訪問檔案的時候,系統對權限(讀、寫 、執行)進行檢查,只要用戶對檔案有足夠的權限,就可以任意操作資源,root 用戶對所有資源擁有所有權限,是個危險的存在,每年都會看到某職員一不小心把系統“干趴下”的新聞,這種權限管理的主體是用戶,被稱為 Discretionary Access Control ,DAC ,自主訪問控制,
DAC 機制下,程式直接繼承用戶的權限,用戶有權限,則用戶啟動的程式就有權限,惡意程式也有了發揮空間,DAC 讓主體自主管理權限,實踐中容易管理不當,基于讀、寫、執行的權限控制,也過于粗略,為了解決這個問題,Mandatory Access Control ,MAC ,強制訪問控制,就誕生了,MAC 機制下,管理員定義好安全策略,用戶行為被強制約束,避免發生意外,
一、初識 SELinux
SELinux 的價值 :實作 MAC 機制,增強抵御未知危害的能力,
SELinux 的出生 :NSA(美國國家安全域)和 SELinux 社區的聯合專案,
SELinux 支持內核版本 :Linux Kernel 2.6.x 及以后版本,
SELinux 干了哪些活 :定義一套 MAC 的權限系統,對系統內的一切資源(檔案)打上標記(安全背景關系),使用安全策略來控制資源訪問,用戶同時通過 DAC 和 MAC 的檢查,才能訪問資源,
二、SELinux 安全背景關系
安全背景關系是 SELinux 的核心,格式由三部分組成:用戶、角色、型別識別符號:
| 格式 | USER:ROLE:TYPE[LEVEL[:CATEGORY]] |
|---|---|
| 常見 USER | system_u、root、user_u |
| 常見 ROLE | staff_r、user_r、object_r、secadm_r、sysadm_r、system_r |
| TYPE | 型別強制訪問的重要屬性 |
| LEVEL | 安全等級,目前已經定義的安全等級為 s0 - s15,等級越來越高 |
| CATEGORY | 分類,目前已經定義的分類為 c0 - c1023 |
很多系統命令,如 ls 、 ps 、 id ,帶有 -Z 引數,可以查看檔案/行程的安全背景關系,

selinux 的用戶管理中,能跟蹤一個登陸用戶,即使用戶通過 su 命令切換了身份,也被 selinux 視為同一個用戶,
操作一:打開新的終端登陸 root

操作二:打開新的終端登陸 yishuguo

對比發現,從一開始登陸新的終端,到后期不管怎么進行用戶切換操作,SELinux 用戶身份始終保持不變,如上述操作截圖中的 unconfined_u 和 user_u,那么 user_u 和 unconfined_u 是怎么來的?如下圖:

用戶登陸關系轉換表,SELinux 就是這么把現有的系統用戶關聯起來的,
相關參考命令:
semanage user -a -L s0 -r "s0" -P user -R system_r tcxa_usemanage login -{a|d|m} [-sr] login_name
示例:
- 新增 se 用戶:
semanage user -a -L s0 -r "s0" -P user -R system_r tcxa_u- 洗掉 se 用戶:
semanage user -d tcxa_u- 新增關聯:
semanage login -a -s SEL用戶 系統用戶- 洗掉關聯:
semanage login -d -s SEL用戶 系統用戶
三、SELinux 訪問控制

因為DAC的讀、寫、執行權限過于粗略,SELinux 基于型別增強( Type-Enhanced ) 的屬性進行訪問控制,簡單說就是基于安全背景關系的型別屬性的訪問控制,上圖中主體一般是指行程,它的型別標簽為 a_t,客體是指所有可能被操作的檔案,型別標簽是 b_t,主體訪問客體時,selinux 查詢 AVC 庫里的規則,判斷主體 .a_t 能否訪問客體 .b_t,可以用一個形象的比喻:a_t ,b_t 分別是主體和客體的作業牌,AVC 是企業的規章制度,制度決定 a_t 和 b_t 權限關系,
四、SELinux 作業模式

SELinux 有三種作業模式,分別是 enforcing 、 permissive 和 disabled ,
| enforcing | permissive | disabled |
|---|---|---|
| 強制模式 | 寬容模式 | 關閉策略 |
| 違反SELinux規則的行為都會被阻止并被記錄到日志中, | 違反SELinux規則的行為只記錄到日志,不會攔截, | ** |
SELinux 作業模式可以通過 /etc/selinux/config 組態檔中 SELINUX 引數來配置,參考配置:
SELINUX=enforcing | permissive | disabled
這里需要注意的是修改完配置需要重啟系統才能生效,當然,也可以通過 setenforce 1|0 來臨時快速切換 enforcing 和 permissive,并通過 getenforce 或者 sestatus 命令來驗證當前狀態,
五、SELinux 日常維護
auditd 記錄了 selinux 的安全日志,默認存盤在 /var/log/audit/audit.log ,我們利用命令分析該日志:
audit2why</var/log/audit/audit.log
找到例外或不當的日志記錄,然后調整 selinux 的權限,一般分四步——
- 分析攔截日志轉換成AV
cat audit.log|audit2allow -m tcxa -o tcxa.te
- 檢查并編譯模塊
checkmodule -mM -o tcxa.mod tcxa.te
- 創建新模塊
semodule_package -o tcxa.pp -m tcxa.mod
- 分析攔截日志轉換成AV
semanagemodule -a tcxa.pp
selinux 的調整,都是圍繞 semanage 這個工具完成的,常見操作案例如下:
- 為某標簽型別增加埠訪問權限:
semanage port -a -t http_port_t -p tcp39999
- 為指定目錄或檔案添加默認標簽型別:
semanage fcontext -a -t httpd_sys_content_t'/srv/www(/.*)?'
- 恢復指定目錄或檔案默認標簽型別:
restorecon -Rv/srv/www
- 臨時變更檔案標簽型別:
chcon -R -t/srv/www/
- 查找 SELinux 安全策略規則庫:
sesearch -A -s tc_httpd_t -t tc_httpd_rw_t
- 切換當前用戶角色:
newrole -r sysadm_r
- 查看和設定 SELinux 功能的 bool 值:
getsebool -a | grep http
setsebool -P httpd_use_nfs on | off
六、自定義 SELinux 規則模塊
有時我們需要自定義 selinux 規則模塊,
假設我們在系統上新部署了 Apache,根據行程被拉起的方式不同,Apache 行程安全背景關系也會不同,如注冊為系統服務的方式和通過登陸用戶后手動執行命令啟動,效果是不一樣的,
系統服務啟動方式的安全背景關系可能是:
system_u:system_r:initrc_t
用戶登陸執行命令的安全背景關系可能為:
unconfined_u:unconfined_r:unconfined_t
httpd 行程的安全背景關系的第一標簽(用戶)和第二標簽(角色)屬性是根據啟動者的身份進行判定的,如何設定第三標簽屬性呢?
我們可以借助于 system-config-selinux 工具或者命令列工具 /usr/bin/sepolgen 來配置,簡單說明如下:
[root@localhost Desktop]# system-config-selinux


通過向導完成操作后,會基于 SELinux 的模版檔案在指定目錄下生成 4 個基礎的檔案,我們也可以自行基于這 4 個基礎檔案添加或者修改需要的內容,最后執行 tc_httpd.sh 腳本即可自動完成 SELinux 擴展模塊的編譯,并自動嘗試加載模塊和設定安全背景關系內容,
# ./tc_httpd.sh
# /usr/local/apache2.2/bin/apachectl restart


上面截圖的 Apache 行程的標簽型別名稱是 tc_httpd_t ,Apache 程式目錄/檔案的標簽型別名稱是 tc_httpd_rw_t ,我們可以搜索 SELinux 安全策略規則集,進一步了解 tc_httpd_t 和 tc_httpd_rw_t 的訪問規則,
[root@localhost apache2.2]# sesearch -A -s tc_httpd_t -t tc_httpd_rw_t
Found 2 semantic av rules:
allow tc_httpd_t tc_httpd_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow tc_httpd_t tc_httpd_rw_t : dir { ioctl read write create getattr setattr
lock unlink link rename add_name remove_name reparent search rmdir open } ;
通過上述輸出,可以知道 tc_httpd_t 對 tc_httpd_rw_t 的操作權限,看字面意思也能猜出個大概,對于 SELinux 模塊的操作可以通過 semodule 和 semanage 兩個命令進行,可以自行參考 man 幫助手冊,
SELinux 如果能熟練掌握并正確運用,那么對于 0day 漏洞的抵御能力等同于是加了一層“銅墻鐵壁”,
(易樹國 | 天存資訊)
Ref
- SELinux Project
- semanage - SELinux Policy Management tool
- semodule - Manage SELinux policy modules
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285640.html
標籤:其他
上一篇:sql注入
下一篇:網頁設計與制作(基本步驟)
