
如果你在之前的 linux 生涯中都禁用或忽略了 selinux,這篇文章就是專門為你寫的:這是一篇對存在于你的 linux 桌面或伺服器之下的 selinux 系統的介紹,它能夠限制權限,甚至消除程式或守護程序的脆弱性而造成破壞的可能性。
在我開始之前,你應該已經了解的是 selinux 主要是紅帽 red hat linux 以及它的衍生發行版上的一個工具。類似地, ubuntu 和 suse(以及它們的衍生發行版)使用的是 apparmor。selinux 和 apparmor 有顯著的不同。你可以在 suse,opensuse,ubuntu 等等發行版上安裝 selinux,但這是項難以置信的挑戰,除非你十分精通 linux。
說了這麼多,讓我來向你介紹 selinux。
<a></a>
linux 上傳統的通路控制标準是自主通路控制discretionary access control(dac)。在這種形式下,一個軟體或守護程序以 user id(uid)或 set owner user id(suid)的身份運作,并且擁有該使用者的目标(檔案、套接字、以及其它程序)權限。這使得惡意代碼很容易運作在特定權限之下,進而取得通路關鍵的子系統的權限。
另一方面,強制通路控制mandatory access control(mac)基于保密性和完整性強制資訊的隔離以限制破壞。該限制單元獨立于傳統的 linux 安全機制運作,并且沒有超級使用者的概念。
考慮一下 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。你要如何知道你的系統目前是什麼模式?你可以使用一條簡單的指令來檢視,這條指令就是 <code>getenforce</code>。這個指令用起來難以置信的簡單(因為它僅僅用來報告 selinux 的模式)。要使用這個工具,打開一個終端視窗并執行 <code>getenforce</code> 指令。指令會傳回 enforcing、permissive,或者 disabled(見上方圖 1)。
設定 selinux 的模式實際上很簡單——取決于你想設定什麼模式。記住:永遠不推薦關閉 selinux。為什麼?當你這麼做了,就會出現這種可能性:你磁盤上的檔案可能會被打上錯誤的權限标簽,需要你重新标記權限才能修複。而且你無法修改一個以 disabled 模式啟動的系統的模式。你的最佳模式是 enforcing 或者 permissive。
你可以從指令行或 <code>/etc/selinux/config</code> 檔案更改 selinux 的模式。要從指令行設定模式,你可以使用<code>setenforce</code> 工具。要設定 enforcing 模式,按下面這麼做:
打開一個終端視窗
執行 <code>su</code> 然後輸入你的管理者密碼
執行 <code>setenforce 1</code>
執行 <code>getenforce</code> 确定模式已經正确設定(圖 2)
圖 2:設定 selinux 模式為 enforcing。
要設定模式為 permissive,這麼做:
執行 <code>setenforce 0</code>
執行 <code>getenforce</code> 确定模式已經正确設定(圖 3)
圖 3:設定 selinux 模式為 permissive。
注:通過指令行設定模式會覆寫 selinux 配置檔案中的設定。
如果你更願意在 selinux 指令檔案中設定模式,用你喜歡的編輯器打開那個檔案找到這一行:
<code>selinux=permissive</code>
你可以按你的偏好設定模式,然後儲存檔案。
還有第三種方法修改 selinux 的模式(通過 bootloader),但我不推薦新使用者這麼做。
selinux 政策有兩種:
targeted目标 — 隻有目标網絡程序(dhcpd,httpd,named,nscd,ntpd,portmap,snmpd,squid,以及 syslogd)受保護
strict嚴格 — 對所有程序完全的 selinux 保護
你可以在 <code>/etc/selinux/config</code> 檔案中修改政策類型。用你喜歡的編輯器打開這個檔案找到這一行:
<code>selinuxtype=targeted</code>
修改這個選項為 targeted 或 strict 以滿足你的需求。
有個友善的 selinux 工具,你可能想要用它來擷取你啟用了 selinux 的系統的詳細狀态報告。這個指令在終端像這樣運作:
<code>sestatus -v</code>
你可以看到像圖 4 那樣的輸出。
圖 4:sestatus -v 指令的輸出。
和你預想的一樣,我隻介紹了 selinux 的一點皮毛。selinux 的确是個複雜的系統,想要更紮實地了解它是如何工作的,以及了解如何讓它更好地為你的桌面或伺服器工作需要更加地深入學習。我的内容還沒有覆寫到疑難解答和建立自定義 selinux 政策。
本文來自雲栖社群合作夥伴“linux中國”
原文釋出時間為:2013-04-02.