2021-05-12 14:32:11
SELinux 入門指南
回到 Kernel 2.6 時代,那時候引入了一個新的安全系統,用以提供存取控制安全策略的機制。這個系統就是 Security Enhanced Linux (SELinux),它是由美國國家安全域性(NSA)貢獻的,它為 Linux 核心子系統引入了一個健壯的強制控制存取(Mandatory Access Control)架構。
如果你在之前的 Linux 生涯中都禁用或忽略了 SELinux,這篇文章就是專門為你寫的:這是一篇對存在於你的 Linux 桌面或伺服器之下的 SELinux 系統的介紹,它能夠限制許可權,甚至消除程式或守護行程的脆弱性而造成破壞的可能性。
在我開始之前,你應該已經了解的是 SELinux 主要是紅帽 Red Hat Linux 以及它的衍生發行版上的一個工具。類似地, Ubuntu 和 SUSE(以及它們的衍生發行版)使用的是 AppArmor。SELinux 和 AppArmor 有顯著的不同。你可以在 SUSE,openSUSE,Ubuntu 等等發行版上安裝 SELinux,但這是項難以置信的挑戰,除非你十分精通 Linux。
說了這麼多,讓我來向你介紹 SELinux。
DAC vs. MAC
Linux 上傳統的存取控制標準是自主存取控制(Discretionary Access Control)(DAC)。在這種形式下,一個軟體或守護行程以 User ID(UID)或 Set owner User ID(SUID)的身份執行,並且擁有該使用者的目標(檔案、通訊端、以及其它進程)許可權。這使得惡意程式碼很容易執行在特定許可權之下,從而取得存取關鍵的子系統的許可權。
另一方面,強制存取控制(Mandatory Access Control)(MAC)基於保密性和完整性強制資訊的隔離以限制破壞。該限制單元獨立於傳統的 Linux 安全機制運作,並且沒有超級使用者的概念。
SELinux 如何工作
考慮一下 SELinux 的相關概念:
- 主體(Subjects)
- 目標(Objects)
- 策略(Policy)
- 模式(Mode)
當一個主體(Subject)(如一個程式)嘗試存取一個目標(Object)(如一個檔案),SELinux 安全伺服器(SELinux Security Server)(在核心中)從策略資料庫(Policy Database)中執行一個檢查。基於當前的模式(mode),如果 SELinux 安全伺服器授予許可權,該主體就能夠存取該目標。如果 SELinux 安全伺服器拒絕了許可權,就會在 /var/log/messages 中記錄一條拒絕資訊。
聽起來相對比較簡單是不是?實際上過程要更加複雜,但為了簡化介紹,只列出了重要的步驟。
模式
SELinux 有三個模式(可以由使用者設定)。這些模式將規定 SELinux 在主體請求時如何應對。這些模式是:
- Enforcing (強制)— SELinux 策略強制執行,基於 SELinux 策略規則授予或拒絕主體對目標的存取
- Permissive (寬容)— SELinux 策略不強制執行,不實際拒絕存取,但會有拒絕資訊寫入紀錄檔
- Disabled (禁用)— 完全禁用 SELinux
圖 1:getenforce 命令顯示 SELinux 的狀態是 Enforcing 啟用狀態。
預設情況下,大部分系統的 SELinux 設定為 Enforcing。你要如何知道你的系統當前是什麼模式?你可以使用一條簡單的命令來檢視,這條命令就是 getenforce
。這個命令用起來難以置信的簡單(因為它僅僅用來報告 SELinux 的模式)。要使用這個工具,開啟一個終端視窗並執行 getenforce
命令。命令會返回 Enforcing、Permissive,或者 Disabled(見上方圖 1)。
設定 SELinux 的模式實際上很簡單——取決於你想設定什麼模式。記住:永遠不推薦關閉 SELinux。為什麼?當你這麼做了,就會出現這種可能性:你磁碟上的檔案可能會被打上錯誤的許可權標籤,需要你重新標記許可權才能修復。而且你無法修改一個以 Disabled 模式啟動的系統的模式。你的最佳模式是 Enforcing 或者 Permissive。
你可以從命令列或 /etc/selinux/config
檔案更改 SELinux 的模式。要從命令列設定模式,你可以使用 setenforce
工具。要設定 Enforcing 模式,按下面這麼做:
- 開啟一個終端視窗
- 執行
su
然後輸入你的管理員密碼 - 執行
setenforce 1
- 執行
getenforce
確定模式已經正確設定(圖 2)
圖 2:設定 SELinux 模式為 Enforcing。
要設定模式為 Permissive,這麼做:
- 開啟一個終端視窗
- 執行
su
然後輸入你的管理員密碼 - 執行
setenforce 0
- 執行
getenforce
確定模式已經正確設定(圖 3)
圖 3:設定 SELinux 模式為 Permissive。
註:通過命令列設定模式會覆蓋 SELinux 組態檔中的設定。
如果你更願意在 SELinux 命令檔案中設定模式,用你喜歡的編輯器開啟那個檔案找到這一行:
SELINUX=permissive
你可以按你的偏好設定模式,然後儲存檔案。
還有第三種方法修改 SELinux 的模式(通過 bootloader),但我不推薦新使用者這麼做。
策略型別
SELinux 策略有兩種:
- Targeted(目標) — 只有目標網路進程(dhcpd,httpd,named,nscd,ntpd,portmap,snmpd,squid,以及 syslogd)受保護
- Strict(嚴格) — 對所有進程完全的 SELinux 保護
你可以在 /etc/selinux/config
檔案中修改策略型別。用你喜歡的編輯器開啟這個檔案找到這一行:
SELINUXTYPE=targeted
修改這個選項為 targeted 或 strict 以滿足你的需求。
檢查完整的 SELinux 狀態
有個方便的 SELinux 工具,你可能想要用它來獲取你啟用了 SELinux 的系統的詳細狀態報告。這個命令在終端像這樣執行:
sestatus -v
你可以看到像圖 4 那樣的輸出。
圖 4:sestatus -v 命令的輸出。
僅是皮毛
和你預想的一樣,我只介紹了 SELinux 的一點皮毛。SELinux 的確是個複雜的系統,想要更紮實地理解它是如何工作的,以及了解如何讓它更好地為你的桌面或伺服器工作需要更加地深入學習。我的內容還沒有覆蓋到疑難排解和建立自定義 SELinux 策略。
SELinux 是所有 Linux 管理員都應該知道的強大工具。現在已經向你介紹了 SELinux,我強烈推薦你回到 Linux.com(當有更多關於此話題的文章發表的時候)或看看 NSA SELinux 文件 獲得更加深入的指南。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-05/131162.htm
相關文章