在 Linux 上用 SELinux 或 AppArmor 實現強制訪問控制(MAC)
SELinux 和 AppArmor 加固 Linux 安全
另一個流行並且被廣泛使用的 MAC 是 AppArmor,相比於 SELinux 它提供更多的特性,包括一個學習模式,可以讓系統「學習」一個特定應用的行為,以及通過配置文件設置限制實現安全的應用使用。
在 CentOS 7 中,SELinux 合併進了內核並且默認啟用 強制 模式(下一節會介紹這方面更多的內容),與之不同的是,openSUSE 和 Ubuntu 使用的是 AppArmor 。
在這篇文章中我們會解釋 SELinux 和 AppArmor 的本質,以及如何在你選擇的發行版上使用這兩個工具之一併從中獲益。
SELinux 介紹以及如何在 CentOS 7 中使用
Security Enhanced Linux 可以以兩種不同模式運行:
- 強制 :這種情況下,SELinux 基於 SELinux 策略規則拒絕訪問,策略規則是一套控制安全引擎的規則。
- 寬容 :這種情況下,SELinux 不拒絕訪問,但如果在強制模式下會被拒絕的操作會被記錄下來。
SELinux 也能被禁用。儘管這不是它的一個操作模式,不過也是一種選擇。但學習如何使用這個工具強過只是忽略它。時刻牢記這一點!
使用 getenforce
命令來顯示 SELinux 的當前模式。如果你想要更改模式,使用 setenforce 0
(設置為寬容模式)或 setenforce 1
(強制模式)。
因為這些設置重啟後就失效了,你需要編輯 /etc/selinux/config
配置文件並設置 SELINUX
變數為 enforcing
、permissive
或 disabled
,保存設置讓其重啟後也有效:
如何啟用和禁用 SELinux 模式
還有一點要注意,如果 getenforce
返回 Disabled,你得編輯 /etc/selinux/config
配置文件為你想要的操作模式並重啟。否則你無法利用 setenforce
設置(或切換)操作模式。
setenforce
的典型用法之一包括在 SELinux 模式之間切換(從強制到寬容或相反)來定位一個應用是否行為不端或沒有像預期一樣工作。如果它在你將 SELinux 設置為寬容模式正常工作,你就可以確定你遇到的是 SELinux 許可權問題。
有兩種我們使用 SELinux 可能需要解決的典型案例:
- 改變一個守護進程監聽的默認埠。
- 給一個虛擬主機設置 /var/www/html 以外的文檔根路徑值。
讓我們用以下例子來看看這兩種情況。
例 1:更改 sshd 守護進程的默認埠
大部分系統管理員為了加強伺服器安全首先要做的事情之一就是更改 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 以外的 文檔根路徑
如果你需要用除 /var/www/html
以外目錄作為 文檔根目錄 設置一個 Apache 虛擬主機(也就是說,比如 /websrv/sites/gabriel/public_html
):
DocumentRoot 「/websrv/sites/gabriel/public_html」
Apache 會拒絕提供內容,因為 index.html
已經被標記為了 default_t SELinux
類型,Apache 無法訪問它:
# wget http://localhost/index.html
# 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 http://localhost/index.html
訪問 Apache 目錄
要獲取關於 SELinux 的更多信息,參閱 Fedora 22 中的 SELinux 用戶及管理員指南。
AppArmor 介紹以及如何在 OpenSUSE 和 Ubuntu 上使用它
AppArmor 的操作是基於寫在純文本文件中的規則定義,該文件中含有允許許可權和訪問控制規則。安全配置文件用來限制應用程序如何與系統中的進程和文件進行交互。
系統初始就提供了一系列的配置文件,但其它的也可以由應用程序在安裝的時候設置或由系統管理員手動設置。
像 SELinux 一樣,AppArmor 以兩種模式運行。在 強制 模式下,應用被賦予它們運行所需要的最小許可權,但在 抱怨 模式下 AppArmor 允許一個應用執行受限的操作並將操作造成的「抱怨」記錄到日誌里(/var/log/kern.log
,/var/log/audit/audit.log
,和其它放在 /var/log/apparmor
中的日誌)。
日誌中會顯示配置文件在強制模式下運行時會產生錯誤的記錄,它們中帶有 audit
這個詞。因此,你可以在 AppArmor 的 強制 模式下運行之前,先在 抱怨 模式下嘗試運行一個應用並調整它的行為。
可以用這個命令顯示 AppArmor 的當前狀態:
$ sudo apparmor_status
查看 AppArmor 的狀態
上面的圖片指明配置 /sbin/dhclient
,/usr/sbin/
,和 /usr/sbin/tcpdump
等處在 強制 模式下(在 Ubuntu 下默認就是這樣的)。
因為不是所有的應用都包含相關的 AppArmor 配置,apparmor-profiles 包給其它沒有提供限制的包提供了配置。默認它們配置在 抱怨 模式下運行,以便系統管理員能夠測試並選擇一個所需要的配置。
我們將會利用 apparmor-profiles,因為寫一份我們自己的配置已經超出了 LFCS 認證的範圍了。但是,由於配置都是純文本文件,你可以查看並學習它們,為以後創建自己的配置做準備。
AppArmor 配置保存在 /etc/apparmor.d
中。讓我們來看看這個文件夾在安裝 apparmor-profiles 之前和之後有什麼不同:
$ ls /etc/apparmor.d
查看 AppArmor 文件夾內容
如果你再次執行 sudo apparmor_status
,你會在 抱怨 模式看到更長的配置文件列表。你現在可以執行下列操作。
將當前在 強制 模式下的配置文件切換到 抱怨 模式:
$ sudo aa-complain /path/to/file
以及相反的操作(抱怨 –> 強制):
$ sudo aa-enforce /path/to/file
上面這些例子是允許使用通配符的。舉個例子:
$ sudo aa-complain /etc/apparmor.d/*
會將 /etc/apparmor.d
中的所有配置文件設置為 抱怨 模式,反之
$ sudo aa-enforce /etc/apparmor.d/*
會將所有配置文件設置為 強制 模式。
要完全禁用一個配置,在 /etc/apparmor.d/disabled
目錄中創建一個符號鏈接:
$ sudo ln -s /etc/apparmor.d/profile.name /etc/apparmor.d/disable/
要獲取關於 AppArmor 的更多信息,參閱官方的 AppArmor wiki 以及 Ubuntu 提供的文檔。
總結
在這篇文章中我們學習了一些 SELinux 和 AppArmor 這兩個著名的強制訪問控制系統的基本知識。什麼時候使用兩者中的一個或是另一個?為了避免提高難度,你可能需要考慮專註於你選擇的發行版自帶的那一個。不管怎樣,它們會幫助你限制進程和系統資源的訪問,以提高你伺服器的安全性。
關於本文你有任何的問題,評論,或建議,歡迎在下方發表。不要猶豫,讓我們知道你是否有疑問或評論。
via: http://www.tecmint.com/mandatory-access-control-with-selinux-or-apparmor-linux/
作者:Gabriel Cánepa 譯者:alim0x 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive