SELinux 入門詳解
回到 Kernel 2.6 時代,那時候引入了一個新的安全系統(tǒng),用以提供訪問控制安全策略的機(jī)制。這個系統(tǒng)就是 Security Enhanced Linux (SELinux),它是由美國國家安全局(NSA)貢獻(xiàn)的,它為 Linux 內(nèi)核子系統(tǒng)引入了一個健壯的強(qiáng)制控制訪問Mandatory Access Control架構(gòu)。
如果你在之前的 Linux 生涯中都禁用或忽略了 SELinux,這篇文章就是專門為你寫的:這是一篇對存在于你的 Linux 桌面或服務(wù)器之下的 SELinux 系統(tǒng)的介紹,它能夠限制權(quán)限,甚至消除程序或守護(hù)進(jìn)程的脆弱性而造成破壞的可能性。
在我開始之前,你應(yīng)該已經(jīng)了解的是 SELinux 主要是紅帽 Red Hat Linux 以及它的衍生發(fā)行版上的一個工具。類似地, Ubuntu 和 SUSE(以及它們的衍生發(fā)行版)使用的是 AppArmor。SELinux 和 AppArmor 有顯著的不同。你可以在 SUSE,openSUSE,Ubuntu 等等發(fā)行版上安裝 SELinux,但這是項難以置信的挑戰(zhàn),除非你十分精通 Linux。
說了這么多,讓我來向你介紹 SELinux。
DAC vs. MAC
Linux 上傳統(tǒng)的訪問控制標(biāo)準(zhǔn)是自主訪問控制Discretionary Access Control(DAC)。在這種形式下,一個軟件或守護(hù)進(jìn)程以 User ID(UID)或 Set owner User ID(SUID)的身份運行,并且擁有該用戶的目標(biāo)(文件、套接字、以及其它進(jìn)程)權(quán)限。這使得惡意代碼很容易運行在特定權(quán)限之下,從而取得訪問關(guān)鍵的子系統(tǒng)的權(quán)限。
另一方面,強(qiáng)制訪問控制Mandatory Access Control(MAC)基于保密性和完整性強(qiáng)制信息的隔離以限制破壞。該限制單元獨立于傳統(tǒng)的 Linux 安全機(jī)制運作,并且沒有超級用戶的概念。
SELinux 如何工作
考慮一下 SELinux 的相關(guān)概念:
- 主體Subjects
- 目標(biāo)Objects
- 策略Policy
- 模式Mode
當(dāng)一個主體Subject(如一個程序)嘗試訪問一個目標(biāo)Object(如一個文件),SELinux 安全服務(wù)器SELinux Security Server(在內(nèi)核中)從策略數(shù)據(jù)庫Policy Database中運行一個檢查?;诋?dāng)前的模式mode,如果 SELinux 安全服務(wù)器授予權(quán)限,該主體就能夠訪問該目標(biāo)。如果 SELinux 安全服務(wù)器拒絕了權(quán)限,就會在 /var/log/messages 中記錄一條拒絕信息。
聽起來相對比較簡單是不是?實際上過程要更加復(fù)雜,但為了簡化介紹,只列出了重要的步驟。
模式
SELinux 有三個模式(可以由用戶設(shè)置)。這些模式將規(guī)定 SELinux 在主體請求時如何應(yīng)對。這些模式是:
- Enforcing 強(qiáng)制— SELinux 策略強(qiáng)制執(zhí)行,基于 SELinux 策略規(guī)則授予或拒絕主體對目標(biāo)的訪問
- Permissive 寬容— SELinux 策略不強(qiáng)制執(zhí)行,不實際拒絕訪問,但會有拒絕信息寫入日志
- Disabled 禁用— 完全禁用 SELinux

圖 1:getenforce 命令顯示 SELinux 的狀態(tài)是 Enforcing 啟用狀態(tài)。
默認(rèn)情況下,大部分系統(tǒng)的 SELinux 設(shè)置為 Enforcing。你要如何知道你的系統(tǒng)當(dāng)前是什么模式?你可以使用一條簡單的命令來查看,這條命令就是 getenforce。這個命令用起來難以置信的簡單(因為它僅僅用來報告 SELinux 的模式)。要使用這個工具,打開一個終端窗口并執(zhí)行 getenforce 命令。命令會返回 Enforcing、Permissive,或者 Disabled(見上方圖 1)。
設(shè)置 SELinux 的模式實際上很簡單——取決于你想設(shè)置什么模式。記住:永遠(yuǎn)不推薦關(guān)閉 SELinux。為什么?當(dāng)你這么做了,就會出現(xiàn)這種可能性:你磁盤上的文件可能會被打上錯誤的權(quán)限標(biāo)簽,需要你重新標(biāo)記權(quán)限才能修復(fù)。而且你無法修改一個以 Disabled 模式啟動的系統(tǒng)的模式。你的最佳模式是 Enforcing 或者 Permissive。
你可以從命令行或 /etc/selinux/config 文件更改 SELinux 的模式。要從命令行設(shè)置模式,你可以使用 setenforce 工具。要設(shè)置 Enforcing 模式,按下面這么做:
- 打開一個終端窗口
- 執(zhí)行 su 然后輸入你的管理員密碼
- 執(zhí)行 setenforce 1
- 執(zhí)行 getenforce 確定模式已經(jīng)正確設(shè)置(圖 2)

圖 2:設(shè)置 SELinux 模式為 Enforcing。
要設(shè)置模式為 Permissive,這么做:
- 打開一個終端窗口
- 執(zhí)行 su 然后輸入你的管理員密碼
- 執(zhí)行 setenforce 0
- 執(zhí)行 getenforce 確定模式已經(jīng)正確設(shè)置(圖 3)

圖 3:設(shè)置 SELinux 模式為 Permissive。
注:通過命令行設(shè)置模式會覆蓋 SELinux 配置文件中的設(shè)置。
如果你更愿意在 SELinux 命令文件中設(shè)置模式,用你喜歡的編輯器打開那個文件找到這一行:
SELINUX=permissive
你可以按你的偏好設(shè)置模式,然后保存文件。
還有第三種方法修改 SELinux 的模式(通過 bootloader),但我不推薦新用戶這么做。
策略類型
SELinux 策略有兩種:
- Targeted目標(biāo) — 只有目標(biāo)網(wǎng)絡(luò)進(jìn)程(dhcpd,httpd,named,nscd,ntpd,portmap,snmpd,squid,以及 syslogd)受保護(hù)
- Strict嚴(yán)格 — 對所有進(jìn)程完全的 SELinux 保護(hù)
你可以在 /etc/selinux/config 文件中修改策略類型。用你喜歡的編輯器打開這個文件找到這一行:
SELINUXTYPE=targeted
修改這個選項為 targeted 或 strict 以滿足你的需求。
檢查完整的 SELinux 狀態(tài)
有個方便的 SELinux 工具,你可能想要用它來獲取你啟用了 SELinux 的系統(tǒng)的詳細(xì)狀態(tài)報告。這個命令在終端像這樣運行:
sestatus -v
你可以看到像圖 4 那樣的輸出。

圖 4:sestatus -v 命令的輸出。
僅是皮毛
和你預(yù)想的一樣,我只介紹了 SELinux 的一點皮毛。SELinux 的確是個復(fù)雜的系統(tǒng),想要更扎實地理解它是如何工作的,以及了解如何讓它更好地為你的桌面或服務(wù)器工作需要更加地深入學(xué)習(xí)。我的內(nèi)容還沒有覆蓋到疑難解答和創(chuàng)建自定義 SELinux 策略。
SELinux 是所有 Linux 管理員都應(yīng)該知道的強(qiáng)大工具?,F(xiàn)在已經(jīng)向你介紹了 SELinux,我強(qiáng)烈推薦你回到 Linux.com(當(dāng)有更多關(guān)于此話題的文章發(fā)表的時候)或看看NSA SELinux 文檔 獲得更加深入的指南。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
 關(guān)注官方微信
                    關(guān)注官方微信