selinux 和 apparmor 加強 linux 安全
另一個流行并且被廣泛使用的 mac 是 apparmor,相比于 selinux 它提供更多的特性,包括一個學習模式,可以讓系統“學習”一個特定應用的行為,以及通過配置檔案設定限制實作安全的應用使用。
在 centos 7 中,selinux 合并進了核心并且預設啟用強制enforcing模式(下一節會介紹這方面更多的内容),與之不同的是,opensuse 和 ubuntu 使用的是 apparmor 。
在這篇文章中我們會解釋 selinux 和 apparmor 的本質,以及如何在你選擇的發行版上使用這兩個工具之一并從中獲益。
<a target="_blank"></a>
security enhanced linux 可以以兩種不同模式運作:
強制enforcing:這種情況下,selinux 基于 selinux 政策規則拒絕通路,政策規則是一套控制安全引擎的規則。
寬容permissive:這種情況下,selinux 不拒絕通路,但如果在強制模式下會被拒絕的操作會被記錄下來。
selinux 也能被禁用。盡管這不是它的一個操作模式,不過也是一種選擇。但學習如何使用這個工具強過隻是忽略它。時刻牢記這一點!
使用 <code>getenforce</code> 指令來顯示 selinux 的目前模式。如果你想要更改模式,使用 <code>setenforce 0</code>(設定為寬容模式)或 <code>setenforce 1</code>(強制模式)。
因為這些設定重新開機後就失效了,你需要編輯 <code>/etc/selinux/config</code> 配置檔案并設定 <code>selinux</code> 變量為<code>enforcing</code>、<code>permissive</code> 或 <code>disabled</code> ,儲存設定讓其重新開機後也有效:

如何啟用和禁用 selinux 模式
還有一點要注意,如果 <code>getenforce</code> 傳回 disabled,你得編輯 <code>/etc/selinux/config</code> 配置檔案為你想要的操作模式并重新開機。否則你無法利用 <code>setenforce</code> 設定(或切換)操作模式。
<code>setenforce</code> 的典型用法之一包括在 selinux 模式之間切換(從強制到寬容或相反)來定位一個應用是否行為不端或沒有像預期一樣工作。如果它在你将 selinux 設定為寬容模式正常工作,你就可以确定你遇到的是 selinux 權限問題。
有兩種我們使用 selinux 可能需要解決的典型案例:
改變一個守護程序監聽的預設端口。
給一個虛拟主機設定 /var/www/html 以外的文檔根路徑值。
讓我們用以下例子來看看這兩種情況。
大部分系統管理者為了加強伺服器安全首先要做的事情之一就是更改 ssh 守護程序監聽的端口,主要是為了阻止端口掃描和外部攻擊。要達到這個目的,我們要更改 <code>/etc/ssh/sshd_config</code> 中的 port 值為以下值(我們在這裡使用端口 9999 為例):
<code>port 9999</code>
在嘗試重新開機服務并檢查它的狀态之後,我們會看到它啟動失敗:
<code># systemctl restart sshd</code>
<code># systemctl status sshd</code>
檢查 ssh 服務狀态
如果我們看看 <code>/var/log/audit/audit.log</code>,就會看到 sshd 被 selinux 阻止在端口 9999 上啟動,因為它是 jboss 管理服務的保留端口(selinux 日志資訊包含了詞語“avc”,是以應該很容易把它同其他資訊區分開來):
<code># cat /var/log/audit/audit.log | grep avc | tail -1</code>
檢查 linux 審計日志
在這種情況下大部分人可能會禁用 selinux,但我們不這麼做。我們會看到有個讓 selinux 和監聽其他端口的 sshd 和諧共處的方法。首先確定你有 <code>policycoreutils-python</code> 這個包,執行:
<code># yum install policycoreutils-python</code>
檢視 selinux 允許 sshd 監聽的端口清單。在接下來的圖檔中我們還能看到端口 9999 是為其他服務保留的,是以我們暫時無法用它來運作其他服務:
<code># semanage port -l | grep ssh</code>
當然我們可以給 ssh 選擇其他端口,但如果我們确定我們不會使用這台機器跑任何 jboss 相關的服務,我們就可以修改 selinux 已存在的規則,轉而給 ssh 配置設定那個端口:
<code># semanage port -m -t ssh_port_t -p tcp 9999</code>
這之後,我們就可以用前一個 <code>semanage</code> 指令檢查端口是否正确配置設定了,即使用 <code>-lc</code> 參數(list custom 的簡稱):
<code># semanage port -lc</code>
給 ssh 配置設定端口
我們現在可以重新開機 ssh 服務并通過端口 9999 連接配接了。注意這個更改重新開機之後依然有效。
<code>documentroot “/websrv/sites/gabriel/public_html”</code>
apache 會拒絕提供内容,因為 <code>index.html</code> 已經被标記為了 <code>default_t selinux</code> 類型,apache 無法通路它:
<code># wget http://localhost/index.html</code>
<code># ls -lz /websrv/sites/gabriel/public_html/index.html</code>
被标記為 default_t selinux 類型
和之前的例子一樣,你可以用以下指令驗證這是不是 selinux 相關的問題:
檢查日志确定是不是 selinux 的問題
要将 <code>/websrv/sites/gabriel/public_html</code> 整個目錄内容标記為 <code>httpd_sys_content_t</code>,執行:
<code># semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"</code>
上面這個指令會賦予 apache 對那個目錄以及其内容的讀取權限。
最後,要應用這條政策(并讓更改的标記立即生效),執行:
<code># restorecon -r -v /websrv/sites/gabriel/public_html</code>
現在你應該可以通路這個目錄了:
通路 apache 目錄
apparmor 的操作是基于寫在純文字檔案中的規則定義,該檔案中含有允許權限和通路控制規則。安全配置檔案用來限制應用程式如何與系統中的程序和檔案進行互動。
系統初始就提供了一系列的配置檔案,但其它的也可以由應用程式在安裝的時候設定或由系統管理者手動設定。
像 selinux 一樣,apparmor 以兩種模式運作。在 強制enforce 模式下,應用被賦予它們運作所需要的最小權限,但在 抱怨complain 模式下 apparmor 允許一個應用執行受限的操作并将操作造成的“抱怨”記錄到日志裡(<code>/var/log/kern.log</code>,<code>/var/log/audit/audit.log</code>,和其它放在 <code>/var/log/apparmor</code> 中的日志)。
日志中會顯示配置檔案在強制模式下運作時會産生錯誤的記錄,它們中帶有 <code>audit</code> 這個詞。是以,你可以在 apparmor 的 強制enforce 模式下運作之前,先在 抱怨complain 模式下嘗試運作一個應用并調整它的行為。
可以用這個指令顯示 apparmor 的目前狀态:
<code>$ sudo apparmor_status</code>
檢視 apparmor 的狀态
上面的圖檔指明配置 <code>/sbin/dhclient</code>,<code>/usr/sbin/</code>,和 <code>/usr/sbin/tcpdump</code> 等處在 強制enforce 模式下(在 ubuntu 下預設就是這樣的)。
因為不是所有的應用都包含相關的 apparmor 配置,apparmor-profiles 包給其它沒有提供限制的包提供了配置。預設它們配置在 抱怨complain 模式下運作,以便系統管理者能夠測試并選擇一個所需要的配置。
apparmor 配置儲存在 <code>/etc/apparmor.d</code> 中。讓我們來看看這個檔案夾在安裝 apparmor-profiles 之前和之後有什麼不同:
檢視 apparmor 檔案夾内容
如果你再次執行 <code>sudo apparmor_status</code>,你會在 抱怨complain 模式看到更長的配置檔案清單。你現在可以執行下列操作。
将目前在 強制enforce 模式下的配置檔案切換到 抱怨complain 模式:
以及相反的操作(抱怨 –> 強制):
上面這些例子是允許使用通配符的。舉個例子:
會将 <code>/etc/apparmor.d</code> 中的所有配置檔案設定為 抱怨complain 模式,反之
會将所有配置檔案設定為 強制enforce 模式。
要完全禁用一個配置,在 <code>/etc/apparmor.d/disabled</code> 目錄中建立一個符号連結:
在這篇文章中我們學習了一些 selinux 和 apparmor 這兩個著名的強制通路控制系統的基本知識。什麼時候使用兩者中的一個或是另一個?為了避免提高難度,你可能需要考慮專注于你選擇的發行版自帶的那一個。不管怎樣,它們會幫助你限制程序和系統資源的通路,以提高你伺服器的安全性。
原文釋出時間為:2016-08-26
本文來自雲栖社群合作夥伴“linux中國”