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_do
和 mdo
新增 logger,想說順便來研究一下 MAC 機制:
- freebsd-src:
- PR #1512: Add logger for usr.bin/mdo/mdo.c: a logger like sudo.
