在 Linux 上用 SELinux 或 AppArmor 實現強制訪

yzf01發表於2021-09-09

為了解決標準的“使用者-組-其他/讀-寫-執行”許可權以及的限制以及加強安全機制,美國國家安全域性(NSA)設計出一個靈活的強制訪問控制(Mandatory Access Control:MAC)方法 SELinux(Security Enhanced Linux 的縮寫),來限制標準的許可權之外的種種許可權,在仍然允許對這個控制模型後續修改的情況下,讓程式儘可能以最小許可權訪問或在系統物件(如檔案,資料夾,網路埠等)上執行其他操作。

圖片描述

SELinux 和 AppArmor 加固 Linux 安全

另一個流行並且被廣泛使用的 MAC 是 AppArmor,相比於 SELinux 它提供更多的特性,包括一個學習模式,可以讓系統“學習”一個特定應用的行為,以及透過配置檔案設定限制實現安全的應用使用。

在 CentOS 7 中,SELinux 合併進了核心並且預設啟用強制(Enforcing)模式(下一節會介紹這方面更多的內容),與之不同的是,openSUSE 和 Ubuntu 使用的是 AppArmor 。

在這篇文章中我們會解釋 SELinux 和 AppArmor 的本質,以及如何在你選擇的發行版上使用這兩個工具之一併從中獲益。

Security Enhanced Linux 可以以兩種不同模式執行:

  • 強制(Enforcing):這種情況下,SELinux 基於 SELinux 策略規則拒絕訪問,策略規則是一套控制安全引擎的規則。

  • 寬容(Permissive):這種情況下,SELinux 不拒絕訪問,但如果在強制模式下會被拒絕的操作會被記錄下來。

SELinux 也能被禁用。儘管這不是它的一個操作模式,不過也是一種選擇。但學習如何使用這個工具強過只是忽略它。時刻牢記這一點!

使用 getenforce 命令來顯示 SELinux 的當前模式。如果你想要更改模式,使用 setenforce 0(設定為寬容模式)或 setenforce 1(強制模式)。

因為這些設定重啟後就失效了,你需要編輯 /etc/selinux/config 配置檔案並設定 SELINUX 變數為 enforcingpermissivedisabled ,儲存設定讓其重啟後也有效:

圖片描述

如何啟用和禁用 SELinux 模式

還有一點要注意,如果 getenforce 返回 Disabled,你得編輯 /etc/selinux/config 配置檔案為你想要的操作模式並重啟。否則你無法利用 setenforce 設定(或切換)操作模式。

setenforce 的典型用法之一包括在 SELinux 模式之間切換(從強制到寬容或相反)來定位一個應用是否行為不端或沒有像預期一樣工作。如果它在你將 SELinux 設定為寬容模式正常工作,你就可以確定你遇到的是 SELinux 許可權問題。

有兩種我們使用 SELinux 可能需要解決的典型案例:

  • 改變一個守護程式監聽的預設埠。

  • 給一個虛擬主機設定 /var/www/html 以外的文件根路徑值。

讓我們用以下例子來看看這兩種情況。

大部分系統管理員為了加強伺服器安全首先要做的事情之一就是更改 SSH 守護程式監聽的埠,主要是為了阻止埠掃描和外部攻擊。要達到這個目的,我們要更改 /etc/ssh/sshd_config 中的 Port 值為以下值(我們在這裡使用埠 9999 為例):

Port 9999

在嘗試重啟服務並檢查它的狀態之後,我們會看到它啟動失敗:

# systemctl restart sshd# systemctl status sshd

圖片描述

檢查 SSH 服務狀態

如果我們看看 /var/log/audit/audit.log,就會看到 sshd 被 SELinux 阻止在埠 9999 上啟動,因為它是 JBoss 管理服務的保留埠(SELinux 日誌資訊包含了詞語“AVC”,所以應該很容易把它同其他資訊區分開來):

# cat /var/log/audit/audit.log | grep AVC | tail -1

圖片描述

檢查 Linux 審計日誌

在這種情況下大部分人可能會禁用 SELinux,但我們不這麼做。我們會看到有個讓 SELinux 和監聽其他埠的 sshd 和諧共處的方法。首先確保你有 policycoreutils-python 這個包,執行:

# yum install policycoreutils-python

檢視 SELinux 允許 sshd 監聽的埠列表。在接下來的圖片中我們還能看到埠 9999 是為其他服務保留的,所以我們暫時無法用它來執行其他服務:

# semanage port -l | grep ssh

當然我們可以給 SSH 選擇其他埠,但如果我們確定我們不會使用這臺機器跑任何 JBoss 相關的服務,我們就可以修改 SELinux 已存在的規則,轉而給 SSH 分配那個埠:

# semanage port -m -t ssh_port_t -p tcp 9999

這之後,我們就可以用前一個 semanage 命令檢查埠是否正確分配了,即使用 -lC 引數(list custom 的簡稱):

# semanage port -lC# semanage port -l | grep ssh

圖片描述

給 SSH 分配埠

我們現在可以重啟 SSH 服務並透過埠 9999 連線了。注意這個更改重啟之後依然有效。

例 2:給一個虛擬主機設定 /var/www/html 以外的文件根路徑(DocumentRoot)

如果你需要用除 /var/www/html 以外目錄作為文件根目錄(DocumentRoot)(也就是說,比如 /websrv/sites/gabriel/public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

Apache 會拒絕提供內容,因為 index.html 已經被標記為了 default_t SELinux 型別,Apache 無法訪問它:

# wget  ls -lZ /websrv/sites/gabriel/public_html/index.html

圖片描述

_被標記為 default_t SELinux 型別_

和之前的例子一樣,你可以用以下命令驗證這是不是 SELinux 相關的問題:

# cat /var/log/audit/audit.log | grep AVC | tail -1

圖片描述

檢查日誌確定是不是 SELinux 的問題

要將 /websrv/sites/gabriel/public_html 整個目錄內容標記為 httpd_sys_content_t,執行:

# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

上面這個命令會賦予 Apache 對那個目錄以及其內容的讀取許可權。

最後,要應用這條策略(並讓更改的標記立即生效),執行:

# restorecon -R -v /websrv/sites/gabriel/public_html

現在你應該可以訪問這個目錄了:

# wget 

圖片描述

訪問 Apache 目錄

要獲取關於 SELinux 的更多資訊,參閱 Fedora 22 中的 。

AppArmor 的操作是基於寫在純文字檔案中的規則定義,該檔案中含有允許許可權和訪問控制規則。安全配置檔案用來限制應用程式如何與系統中的程式和檔案進行互動。

系統初始就提供了一系列的配置檔案,但其它的也可以由應用程式在安裝的時候設定或由系統管理員手動設定。

像 SELinux 一樣,AppArmor 以兩種模式執行。在 enforce 模式下,應用被賦予它們執行所需要的最小許可權,但在 complain 模式下 AppArmor 允許一個應用執行受限的操作並將操作造成的“抱怨”記錄到日誌裡(/var/log/kern.log/var/log/audit/audit.log,和其它放在 /var/log/apparmor 中的日誌)。

日誌中會顯示配置檔案在強制模式下執行時會產生錯誤的記錄,它們中帶有 audit 這個詞。因此,你可以在 AppArmor 的 enforce 模式下執行之前,先在 complain 模式下嘗試執行一個應用並調整它的行為。

可以用這個命令顯示 AppArmor 的當前狀態:

$ sudo apparmor_status

圖片描述

檢視 AppArmor 的狀態

上面的圖片指明配置 /sbin/dhclient/usr/sbin/,和 /usr/sbin/tcpdump 等處在 enforce 模式下(在 Ubuntu 下預設就是這樣的)。

因為不是所有的應用都包含相關的 AppArmor 配置,apparmor-profiles 包給其它沒有提供限制的包提供了配置。預設它們配置在 complain 模式下執行,以便系統管理員能夠測試並選擇一個所需要的配置。

我們將會利用 apparmor-profiles,因為寫一份我們自己的配置已經超出了 LFCS 的範圍了。但是,由於配置都是純文字檔案,你可以檢視並學習它們,為以後建立自己的配置做準備。

AppArmor 配置儲存在 /etc/apparmor.d 中。讓我們來看看這個資料夾在安裝 apparmor-profiles 之前和之後有什麼不同:

$ ls /etc/apparmor.d

圖片描述

檢視 AppArmor 資料夾內容

如果你再次執行 sudo apparmor_status,你會在 complain 模式看到更長的配置檔案列表。你現在可以執行下列操作。

將當前在 enforce 模式下的配置檔案切換到 complain 模式:

$ sudo aa-complain /path/to/file

以及相反的操作(complain –> enforce):

$ sudo aa-enforce /path/to/file

上面這些例子是允許使用萬用字元的。舉個例子:

$ sudo aa-complain /etc/apparmor.d/*

會將 /etc/apparmor.d 中的所有配置檔案設定為 complain 模式,反之

$ sudo aa-enforce /etc/apparmor.d/*

會將所有配置檔案設定為 enforce 模式。

要完全禁用一個配置,在 /etc/apparmor.d/disabled 目錄中建立一個符號連結:

$ sudo ln -s /etc/apparmor.d/profile.name /etc/apparmor.d/disable/

要獲取關於 AppArmor 的更多資訊,參閱 以及 文件。

在這篇文章中我們學習了一些 SELinux 和 AppArmor 這兩個著名的強制訪問控制系統的基本知識。什麼時候使用兩者中的一個或是另一個?為了避擴音高難度,你可能需要考慮專注於你選擇的發行版自帶的那一個。不管怎樣,它們會幫助你限制程式和系統資源的訪問,以提高你伺服器的安全性。

關於本文你有任何的問題,評論,或建議,歡迎在下方發表。不要猶豫,讓我們知道你是否有疑問或評論。


譯文出處:  

via:

作者: 譯者: 校對:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2818339/,如需轉載,請註明出處,否則將追究法律責任。

相關文章