安全增強式 linux,即SELINUX(Security-Enhanced Linux)是一個 Linux 內核的安全模塊,其提供了訪問控制安全策略機制,包括了強制訪問控制(Mandatory Access Control,mac)。SELinux 是一組內核修改和用戶空間工具,已經被添加到各種 Linux 發行版中。其軟件架構力圖將安全決策的執行與安全策略分離,并簡化涉及執行安全策略的軟件的數量。
Linux安全之SELinux理解
1. SELinux 介紹
安全增強式 Linux(SELinux)是一種強制訪問控制的實現。它的作法是以最小權限原則為基礎,在 Linux 核心中使用 Linux 安全模塊。它并非一個 Linux 發行版,而是一組可以應用在類 Unix 操作系統(如 Linux、BSD 等)的修改。 SELinux 更能遵從最小權限的理念安全增強式SELinux是一個在內核中實踐的強制訪問控制安全性機制
Linux安全之SELinux理解
兩種訪問控制
- DAC:自主訪問控制
- MAC:強制訪問控制
SELinux有兩種工作級別
- strict: 每個進程都受到 selinux 的控制
- targeted: 僅有限個進程受到 selinux 控制,只監控容易被入侵的進程
在未啟用 SELinux 的情況下,要控制用戶的文件訪問權,唯有通過酌情訪問控制(DAC)方法如文件權限或訪問控制清單(ACL)。不論用戶或程序都可以將不安全的文件權限賦予其它人,或反過來訪問系統在正常運作下無須訪問的部份。舉個例說:
- 管理員不能控制用戶:用戶可以把誰都可讀入的權限賦予敏感文件,例如 ssh 金鑰及慣常用來放置這些金鑰的目錄,~/.ssh/。
- 進程可以更改安全性屬性:每位用戶的郵件文件應該只供該用戶讀入,但郵件客戶端軟件有能力將它們改為誰都可讀入。
- 進程繼承用戶的權限:假若 Firefox 被木馬程序所占用,它可能會閱讀用戶的私人 ssh 金鑰,盡管它沒有理由如此做。
基本上在傳統 DAC 模式只在兩個權限級別,root及用戶,而當中不能簡易地實施最小權限的理念。很多由 root 引導 1 的進程在后期會撇除它們的權限并以受限制的用戶身份來運行,有些則會在 chroot 的情況下執行,但這些安全措施都是酌情的。
1.2 解決方案
SELinux 更能遵從最小權限的理念。在缺省的 enforcing 情況下,一切均被拒絕,接著有一系列例外的政策來允許系統的每個元素(服務、程序、用戶)運作時所需的訪問權。當一項服務、程序或用戶嘗試訪問或修改一個它不須用的文件或資源時,它的請求會遭拒絕,而這個行動會被記錄下來。
由于 SELinux 是在內核中實踐的,應用程序無須被特別編寫或重寫便可以采用 SELinux。當然,如果一個程序特別留意稍后所提及的 SELinux 錯誤碼,它的運作可能會更暢順。
理論上,下列樣例方案可提供更高安全度:
- 局限只有某些獲授權的程序可讀入用戶的 ~/.ssh/ 目錄
- 防止派發郵件程序更改擁有群組、群組設置或其它讀檔權限
- 阻止瀏覧器讀入用戶的主目錄
SELinux 擁有三個基本的操作模式,當中 Enforcing 是缺省的模式。
- Enforcing這個缺省模式會在系統上啟用并實施 SELinux 的安全性政策,拒絕訪問及記錄行動
- Permissive在 Permissive 模式下,SELinux 會被啟用但不會實施安全性政策,而只會發出警告及記錄行動。Permissive 模式在排除 SELinux 的問題時很有用
- DisabledSELinux 已被停用
SELinux 的模式可以通過 Adminstration 選單里的 SELinux 圖像管理界面、或者在命令行執行 system-config-selinux 來查看及更改(SELinux 圖像管理界面是 policycoreutils-gui 組件的一部份,缺省是不會被安裝的)。
2.2 獲取當前 SELinux 運行狀態
sestatus 命令
# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 21 Policy from config file: targeted
getenforce 命令
- 可能返回結果有三種:Enforcing、Permissive 和 DisabledDisabled 代表 SELinux 被禁用Permissive 代表僅記錄安全警告但不阻止可疑行為Enforcing 代表記錄警告且阻止可疑行為。
# getenforce Disabled
2.3 改變 SELinux 運行狀態
臨時修改
- setenforce命令setenforce [ Enforcing | Permissive | 1 | 0 ]
- 注意事項該命令可以立刻改變 SELinux 運行狀態,在 Enforcing 和 Permissive 之間切換,結果保持至關機。若是在 setenforce 0 之后服務或者程序依然無法運行,那么就可以肯定不是 SELinux 導致的。
# 強制訪問控制 setenforce 1 # 自主訪問控制 setenforce 0
永久修改
- 修改配置文件/etc/sysconfig/selinux或者/etc/selinux/config
- SELINUX=disabled為主開關,只有它打開了,設定訪問控制才有意義
# cat /etc/sysconfig/selinux # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
2.4 布爾型規則
因為在SELinux中有些類型沒有被啟動或者你需要關閉某些類型,這個時候你就需要使用下列命令來修改SELinux的類型了
獲取類型狀態
- getsebool命令:
- 語法:getsebool [-a] [boolean]
# 獲取所以類型及其運行狀態 getsebool -a # 獲取某個類型及其運行狀態 getsebool httpd_t
修改類型狀態
- setsebool命令:
- 語法:setsebool [ -P] boolean value | bool1=val1 bool2=val2 ...
# 臨時修改 setsebool httpd_t 1 # 永久修改 setsebool -P httpd_t 1
3. SELinux 政策
配置文件 /etc/sysconfig/selinux 還包含了 SELinux 運行策略的信息,通過改變變量 SELINUXTYPE 的值實現。
兩種策略
- targeted 代表僅針對預制的幾種網絡服務和訪問請求使用 SELinux 保護
- strict 代表所有網絡服務和訪問請求都要經過 SELinux
注意事項
- 可以在/etc/sysconfig/selinux中對其進行修改
- RHELFedora默認設置為 targeted,包含了對幾乎所有常見網絡服務的 SELinux 策略配置,已經默認安裝并且可以無需修改直接使用。
# cat /etc/sysconfig/selinux # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=strict
4. SELinux 訪問控制4.1 三種訪問控制方法
- 強制類型(TE)TE 是針對型政策所采用的主要訪問控制機制
- 基于?色的訪問控制(RBAC)它以 SELinux 用戶(未必等同 Linux 用戶)為基礎,但缺省的針對型政策并未采用它
- 多層保障(MLS)普遍不獲采用,而且經常隱藏在缺省的針對型政策內
所有進程及文件都擁有一個 SELinux 的安全性脈絡,我們這里查看 Apache 的主頁,來看看 SELinux 安全性脈絡來看看它們如何運作的。
# 查看 Apache 的主頁 # -Z 這個標旗在多數工具內都可用來顯示 SELinux 安全性脈絡(例如:ls -Z、 ps axZ 等) # ls -Z /var/www/html/index.html -rw-r--r-- username username system_u:object_r:httpd_sys_content_t /var/www/html/index.html
SELinux 脈絡欄
- system_u:object_r:httpd_sys_content_t基于「用戶:角色:類型:多層保障」在上述例子里,「用戶:角色:類型」欄都有顯示,而「多層保障」是隱藏的在缺省的針對型政策里,類型是用來實施「強制類型」的重要字段,在這里它是 httpd_sys_content_t
- httpd進程的 SELinux 安全性脈絡從類型欄可以看出 Apache 在 httpd_t 這個類型本地內運行
# ps axZ | grep httpd system_u:system_r:httpd_t 3234 ? Ss 0:00 /usr/sbin/httpd
SELinux 安全機制
- 唯有相似的類型才可互相訪問,因此以 httpd_t 運行的 Apache 可以讀入擁有 httpd_sys_content_t 類型的 /var/www/html/index.html
- 由于 Apache 在 httpd_t 這個本地內運行但不屬 username 這個用戶,縱使 /home/username/myfile.txt 可供任何人讀入,Apache 卻不能訪問該文件,因為它的 SELinux 安全性脈絡并不是 httpd_t 類型
- 倘若 Apache 被人占用,又假設它仍未取得更改 SELinux 標簽至另一個脈絡的 root 權限,它將會不能引導 httpd_t 本地外的進程(藉此防止權限升級),或訪問與 httpd_t 本地不相關的文件
SELinux 拒絕某個文件、進程或資源被訪問的基要原因
- 一個被錯誤標簽的文件
- 一個進程在錯誤的 SELinux 安全性脈絡下運行
- 政策出錯,某個進程要訪問一個在編寫政策時意料不到的文件,并產生錯誤信息
- 一個入侵的企圖
日志分析
- 日志檔是排除任何疑難的關鍵,而 SELinux 亦不例外
- SELinux 缺省會通過 Linux 審計系統 auditd 將日志寫在 /var/log/audit/audit.log 內,而該務服缺省為啟用的
- 假若 auditd 長駐程序并未運行,信息將會被寫進 /var/log/messages
- SELinux 的日志都以 AVC 這個關鍵字作標簽,讓 grep 等程序可輕易地把它們從其它信息中過濾出來。
日志分析工具
- 用 SELinux排除疑難工具協助你分析日志檔,將它們轉換為供人閱讀的格式
- SELinux 排除疑難工具是由 setroubleshoot 組件所提供的
- 這個工具包含一個以可讀格式顯示信息及解決方案的圖像界面、一個桌面通報圖示、與及一個長駐進程,setroubleshootd,它負責查閱新的 SELinux AVC 警告并傳送至通報圖示
# 這個工具可以從 X 窗口圖像管理員的「系統」選單或從命令行引導 sealert -b # 不運行 X 服務器的人可以通過命令行產生供人閱讀的報告 sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt
5.2 重新標簽文件
chcon: 這個指令可以用來更改一個或多個文件與目錄的 SELinux 安全性脈絡,正如 chown 或 chmod 可以用來更改一個文件的擁有者或標準權限。
語法
- chcon [OPTION]... CONTEXT FILE...
- chcon [OPTION]... [-u USER] [-r ROLE] [-t TYPE] FILE...
- chcon [OPTION]... --reference=RFILE FILE...
選項
- -R:遞歸打標
舉例
- chcon -t httpd_sys_content_t index.html
實戰演示
# 就以Apache為例,假設你想修改DocumentRoot以另一個位置來伺服網頁,替換缺省的/var/www/html #目錄。譬如說我們在 /html 創建了一個目錄(又或者掛載點),然后在那里創建一個 index.html文檔: mkdir /html touch /html/index.html # 查看selinux屬性信息 # ls -Z /html/index.html -rw-r--r-- root root user_u:object_r:default_t /html/index.html # ls -Z | grep html drwxr-xr-x root root user_u:object_r:default_t html # 我們可以見到/html這個目錄以及/html/index.html這個文件都擁有缺省的default_t安全性脈絡類型。 # 如果我們打開瀏覽器并嘗試查看該頁,SELinux 將會正確地拒絕它們被訪問并記錄錯誤,因為該目錄與文 # 件擁有不正確的安全性脈絡。我們須要設置供 Apache 使用的 httpd_sys_content_t 正確安全性脈絡。 # chcon -v --type=httpd_sys_content_t /html context of /html changed to user_u:object_r:httpd_sys_content_t # chcon -v --type=httpd_sys_content_t /html/index.html context of /html/index.html changed to user_u:object_r:httpd_sys_content_t # ls -Z /html/index.html -rw-r--r-- root root user_u:object_r:httpd_sys_content_t /html/index.html # ls -Z | grep html drwxr-xr-x root root user_u:object_r:httpd_sys_content_t html # 我們同樣也可以利用 -R 這個回遞標旗同時將它們的脈絡設置: chcon -Rv --type=httpd_sys_content_t /html # 以這個方式更改安全性脈絡在系統重新開機后仍會獲保留,直至該部份文件系統被重新標簽。 # 這個動作也算頗常,因此正確的解決方法,就是于測試后編寫一條自定的規則,并把它與本地 # 的規則進行合并。它將會是原有的 200 多條規則外的一條規則。要作出永久性、能過渡文件 # 系統重新標簽的安全性脈絡改動,我們采用SELinux管理工具,或者在命令行執行semanage指令。 semanage fcontext -a -t httpd_sys_content_t "/html(/.*)?" # 如此便會將 /html 以下的一切加入 httpd_sys_content_t 這個文件脈絡類型。
5.3 撤消缺省的安全性脈絡
restorecon: 這個指令可以用來撤消為文件缺省的安全性脈絡
語法
- restorecon [-R] /path/to/somewhere
選項
- -R:遞歸撤標
實戰演示
# 讓我們再次以 Apache 作為樣例。設假有位用戶在他的主目錄內編輯了一個index.html檔并將該文件 # 遷移(mv)至 DocumentRoot 的 /var/www/html 內。縱使復制(cp)這個指令普遍會沿用目標目 # 錄或文件的安全性脈絡,遷移(mv)指令則會保留源文件的安全性脈絡。我們可以利用 chcon 這個指令 # 來更改問題文件的安全性脈絡,但由于這些文件已經位于 Apache 缺省的 DocumentRoot內,我們只 # 須撤消這個目錄或文件的安全性脈絡便成了。要單單撤消 index.html 檔的脈絡,我們可以利用。 restorecon -v /var/www/html/index.html # 如果要以回遞的方式撤消整個目錄的缺省安全性脈絡 restorecon -Rv /var/www/html # 除此之外,如果我們只想檢查/var/www/html目錄內有哪些文件的安全性脈絡需要被撤消 # 我們在采用 restorecon 時可以應用 -n 這個標旗來防止重新標簽的行動 restorecon -Rv -n /var/www/html
6. 參考鏈接
送人玫瑰,手有余香!
- SELinux 入門
- centos Selinux 講解
文章作者:Escape
文章鏈接:https://www.escapelife.site/posts/639ee49c.htm