FreeBSD MAC 簡單介紹

FreeBSD 的 MAC(Mandatory Access Control)是一個實現了安全政策的機制,在提供安全性的同時,也提供了便利性。在某些方面,有點類似 Linux 中的 Capibility。而 FreeBSD 的 MAC 框架很靈活,提供了多種模組,可以控制網路、文件存取,以及使用者、群組切換等功能。

FreeBSD MAC 提供安全性的例子

我們可以透過設定 MAC,使得某個 User 就算獲得了高權限,也無法讀寫某個特殊權限的檔案。

Biba 模型:高完整性等級的用戶不能將資料寫入低完整性的物件,以維護資料的可信度和完整性界限。

MLS 模型:低安全級別的用戶不能讀取到高安全級別的物件,以防止資料泄漏。

FreeBSD MAC 提供便利性的例子

使用者切換

假設我們今天有兩個使用者:

user1:1001
user2:1002

我希望 user2 可以切換成 user1 進行某些操作,我可以下以下指令:

sudo kldload mac_do
sudo sysctl security.mac.do.enabled=1
sudo sysctl security.mac.do.rules=uid=1002:1001

此時,以 user2 執行的程式,就可以直接透過 setuid 成 1001,不需要經由 root。 又或是 user2 可以透過 mdo 來以 user1 的身份執行程式:

mdo -u user1 cat /home/user1/user1-ro.txt

允許 Privileged Port 的使用

假設今天我希望讓 user1(uid=1001)可以直接開 80 port,不需要 root 權限,我也可以透過 MAC 的 mac_portacl 模組來實現。

sudo kldload mac_portacl
sudo sysctl net.inet.ip.portrange.reservedlow=0 net.inet.ip.portrange.reservedhigh=0
sudo sudo sysctl security.mac.portacl.suser_exempt=1
sudo sysctl security.mac.portacl.rules=1001:80:tcp:80

此時你就會發現,user1 可以直接監聽 80 port 不需要 root 權限,但監聽其它 privileged port 還是會 permission denied。

好處:

開啓 Nginx 等的 Web Service 時,我們可以直接使用例如 www-data 的 user,並且 grant 該 user 直接綁定 80、443 port 的權限,避免用 root 啓動以免軟體漏洞造成的資安問題。

Appendix

會寫這篇文章是因爲最近在幫 mac_domdo 新增 logger,想說順便來研究一下 MAC 機制: