SELinux 入門
回到 Kernel 2.6 時代,那時候引入了一個新的安全系統,用以提供訪問控制安全策略的機制。這個系統就是 Security Enhanced Linux (SELinux),它是由美國國家安全局(NSA)貢獻的,它為 Linux 內核子系統引入了一個健壯的 強制控制訪問 架構。
如果你在之前的 Linux 生涯中都禁用或忽略了 SELinux,這篇文章就是專門為你寫的:這是一篇對存在於你的 Linux 桌面或伺服器之下的 SELinux 系統的介紹,它能夠限制許可權,甚至消除程序或守護進程的脆弱性而造成破壞的可能性。
在我開始之前,你應該已經了解的是 SELinux 主要是紅帽 Red Hat Linux 以及它的衍生髮行版上的一個工具。類似地, Ubuntu 和 SUSE(以及它們的衍生髮行版)使用的是 AppArmor。SELinux 和 AppArmor 有顯著的不同。你可以在 SUSE,openSUSE,Ubuntu 等等發行版上安裝 SELinux,但這是項難以置信的挑戰,除非你十分精通 Linux。
說了這麼多,讓我來向你介紹 SELinux。
DAC vs. MAC
Linux 上傳統的訪問控制標準是 自主訪問控制 (DAC)。在這種形式下,一個軟體或守護進程以 User ID(UID)或 Set owner User ID(SUID)的身份運行,並且擁有該用戶的目標(文件、套接字、以及其它進程)許可權。這使得惡意代碼很容易運行在特定許可權之下,從而取得訪問關鍵的子系統的許可權。
另一方面, 強制訪問控制 (MAC)基於保密性和完整性強制信息的隔離以限制破壞。該限制單元獨立於傳統的 Linux 安全機制運作,並且沒有超級用戶的概念。
SELinux 如何工作
考慮一下 SELinux 的相關概念:
- 主體
- 目標
- 策略
- 模式
當一個 主體 (如一個程序)嘗試訪問一個 目標 (如一個文件), SELinux 安全伺服器 (在內核中)從 策略資料庫 中運行一個檢查。基於當前的 模式 ,如果 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 文檔 獲得更加深入的指南。
LCTT - 相關閱讀:鳥哥的 Linux 私房菜——程序管理與 SELinux 初探
via: https://www.linux.com/learn/docs/ldp/883671-an-introduction-to-selinux
作者:Jack Wallen 譯者:alim0x 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive