最後更新日期: 2025 年 4 月 26 日
引言
你有沒有想過,Ubuntu 伺服器為什麼能讓一堆程式跑得亂七八糟,卻還是穩穩當當?這得感謝 AppArmor,一個超好用的「安全保鑣」!它不像普通檔案權限只管誰能讀寫,AppArmor 是「強制訪問控制」(MAC),給每個程式套上「緊身衣」,限制它們能碰什麼檔案、跑什麼路徑。沒這件緊身衣的許可,就算你是 root
,也別想亂搞!
AppArmor 是 Ubuntu 的標準安全工具,簡單好上手,特別適合桌面、伺服器或雲端環境。這篇是 Linux 訪問控制系列的第三篇,用超簡單的語言,從零教你怎麼用 AppArmor。我們從基本概念開始,一路進階到保護網站、容器,甚至跟 Ubuntu 的 snap 套件搭檔。本文特別深入講了怎麼寫規則,適合 Ubuntu 使用者、想學安全的新手,或進階管理員。第一篇講了基礎權限和 ACL,第二篇聊了 RHEL 的 SELinux,這篇專攻 AppArmor 的 Ubuntu 玩法。
這篇會講:
- AppArmor 是什麼?為啥這麼好用
- AppArmor 的兩種模式:怎麼開關
- 規則檔案:緊身衣的秘密
- 怎麼寫規則:從簡單到高階
- 實務範例:保護網站到容器
- 問題怎麼解?快速排查技巧
- 結論與進階資源
1. AppArmor 是什麼?為啥這麼好用
1.1 AppArmor 基本概念
AppArmor 是 Ubuntu 的安全神器,專門幫 Linux 系統加一道防火牆。它不像普通檔案權限(像 chmod 644
)只管用戶,AppArmor 是「強制訪問控制」(MAC),直接限制程式能幹什麼。比如,Nginx 只能讀網頁檔案,Firefox 只能用特定資料夾,就算駭客搞亂程式,它也跑不出 AppArmor 的控制。
AppArmor 2006 年開始用在 Ubuntu,現在是標準配備,連 snap 套件(像 Docker、Nextcloud)都靠它保護。跟 RHEL 的 SELinux 比,AppArmor 簡單好學,特別適合不想花太多時間搞複雜規則的人。
1.2 AppArmor 怎麼運作?
把你的伺服器想成一個遊樂園,每個程式(像 Nginx、Firefox)是個遊客,AppArmor 是園區管理員。它給每個遊客發一張「行程表」(規則檔案),說你能玩哪些遊樂設施(檔案、路徑、網路)。如果遊客想跑去禁區(像改系統檔案),AppArmor 就說:「不行,回去!」
AppArmor 的核心有兩塊:
- 規則檔案:行程表,說程式能碰什麼(像
/var/www/html
能讀)。 - 模式:決定 AppArmor 是嚴格管(Enforce)還是只警告(Complain)。
1.3 為什麼用 AppArmor?
AppArmor 在 Ubuntu 超好用,因為:
- 簡單上手:規則用路徑寫,學幾分鐘就會。
- 保護程式:限制程式行為,駭客再厲害也跑不遠。
- snap 完美搭檔:Ubuntu 的 snap 套件都靠 AppArmor 保護。
- 靈活場景:從桌面到雲端伺服器都行。
2. AppArmor 的兩種模式:怎麼開關
2.1 AppArmor 的兩種模式
AppArmor 有兩種模式,像家長管小孩的兩種態度:
- Enforce(強制模式):嚴格執行規則,沒許可就擋。
- Complain(寬鬆模式):只記錄違規行為,不擋(適合試驗)。
還有個隱藏狀態:Disabled,表示規則沒啟用,但 AppArmor 本身沒關。
檢查哪些程式被 AppArmor 管:
sudo aa-status
輸出可能像:
apparmor module is loaded.
10 profiles are loaded.
8 profiles are in enforce mode.
/usr/sbin/nginx
/snap/core/*/usr/lib/snapd/*
...
2 profiles are in complain mode.
/usr/bin/firefox
/usr/bin/man
2.2 切換模式
想改某個程式的模式?用這些命令:
-
- 設成 Enforce:
sudo aa-enforce /usr/sbin/nginx
-
- 設成 Complain:
sudo aa-complain /usr/sbin/nginx
-
- 關掉規則:
sudo aa-disable /usr/sbin/nginx
2.3 開關 AppArmor 服務
AppArmor 是系統服務,檢查狀態:
sudo systemctl status apparmor
臨時關掉(不建議):
sudo systemctl stop apparmor
開回去:
sudo systemctl start apparmor
2.4 簡單範例
檢查 Nginx 的 AppArmor 狀態:
sudo aa-status | grep nginx
如果顯示 enforce
,試切到 complain
:
sudo aa-complain /usr/sbin/nginx
sudo aa-status | grep nginx
3. 規則檔案:緊身衣的秘密
AppArmor 的規則檔案是它的核心,像給程式量身訂做的「緊身衣」,說清楚這程式能碰什麼、不能碰什麼。規則檔案通常在 /etc/apparmor.d/
,用程式路徑命名(像 /usr/sbin/nginx
)。
3.1 規則檔案長什麼樣
一個簡單的 Nginx 規則檔案可能像:
#include <tunables/global>
/usr/sbin/nginx {
# 能讀的檔案
/etc/nginx/** r,
/var/www/html/** r,
# 能寫的日誌
/var/log/nginx/*.log w,
# 能用網路
network tcp,
}
這說:Nginx 能讀 /etc/nginx
和 /var/www/html
,能寫日誌,能用 TCP 網路。
3.2 規則的關鍵語法
- 路徑:像
/var/www/html/**
,**
表示所有子路徑和檔案。 - 權限:
r
:讀(read)。w
:寫(write)。x
:執行(execute)。k
:鎖定(lock)。
- 網路:像
network tcp
,允許 TCP 連線。 - 包含:
#include <tunables/global>
,載入共用設定。
3.3 怎麼看規則
檢查 Nginx 的規則檔案:
cat /etc/apparmor.d/usr.sbin.nginx
想知道某程式被管什麼:
sudo aa-status
3.4 簡單範例
假設你想讓 Nginx 讀 /custom/web
:
-
- 編輯
/etc/apparmor.d/usr.sbin.nginx
:
- 編輯
/custom/web/** r,
-
- 重新載入 AppArmor:
sudo systemctl reload apparmor
4. 怎麼寫規則:從簡單到高階
AppArmor 的規則檔案是它的靈魂,決定程式能跑多遠。Ubuntu 預設幫很多程式(像 Nginx、Firefox)寫好規則,但如果你用非標準路徑、新程式,或者 snap 套件,就得自己動手改或寫規則。
4.1 為什麼要寫規則?
Ubuntu 的預設規則(在 /etc/apparmor.d/
)通常管標準程式,比如:
- Nginx 能讀
/var/www/html
。 - Firefox 能用
/home/user/.mozilla
。
但如果你:
- 把網頁檔案放
/data/web
。 - 跑自訂程式(像
/opt/myapp
)。 - 用 snap 套件(像 Nextcloud),需要特殊權限。
你就得加新規則。
4.2 寫規則的五個步驟
- 找問題:看日誌,程式被什麼擋了。
- 寫規則:用工具或手動改規則檔案。
- 裝規則:讓 AppArmor 讀新規則。
- 試試看:確認程式跑順。
- 調優:確保規則不亂七八糟。
步驟 1:找問題
AppArmor 擋住程式時,會在日誌(/var/log/syslog
或 /var/log/messages
)記錄。檢查日誌:
sudo journalctl | grep apparmor
範例:Nginx 想讀 /data/web/index.html
,但被擋:
Apr 26 2025 10:00:00 ubuntu apparmor="DENIED" operation="open" profile="/usr/sbin/nginx" name="/data/web/index.html" pid=1234 comm="nginx" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
這說:Nginx 想讀 /data/web/index.html
,但規則沒允許。
步驟 2:寫規則
有兩種方式寫規則:
- 手動改:直接編輯規則檔案。
- 用工具:用
aa-genprof
或aa-logprof
自動生成。
手動改:
編輯 /etc/apparmor.d/usr.sbin.nginx
:
/data/web/** r,
用工具:
用 aa-genprof
幫 Nginx 生成規則:
sudo aa-genprof /usr/sbin/nginx
這會啟動互動模式,跑 Nginx,AppArmor 會記錄它的行為,然後問你怎麼設規則(像「允許讀 /data/web
?」)。
步驟 3:裝規則
改完規則,重新載入 AppArmor:
sudo systemctl reload apparmor
或直接重啟:
sudo systemctl restart apparmor
步驟 4:試試看
重啟 Nginx,確認能讀 /data/web/index.html
:
sudo systemctl restart nginx
curl http://localhost/index.html
步驟 5:調優
檢查規則有沒有太鬆(像允許 * r
)。用 aa-logprof
微調:
sudo aa-logprof
4.3 進階一點:更聰明的規則
有些情況需要更複雜的規則,比如:
- 非標準路徑:程式讀怪路徑。
- 網路控制:限制特定連線。
- snap 套件:snap 的規則藏在別的地方。
範例:非標準路徑
假設 Nginx 要讀 /custom/web
和寫 /var/log/custom.log
:
sudo nano /etc/apparmor.d/usr.sbin.nginx
加:
/custom/web/** r,
/var/log/custom.log w,
重載:
sudo systemctl reload apparmor
sudo systemctl restart nginx
範例:網路控制
讓 Nginx 只用 HTTP(80)和 HTTPS(443):
sudo nano /etc/apparmor.d/usr.sbin.nginx
加:
network tcp 80,
network tcp 443,
重載:
sudo systemctl reload apparmor
範例:snap 套件
snap 套件(像 Nextcloud)用 AppArmor 保護,規則在 /var/lib/snapd/apparmor/profiles/
。檢查 Nextcloud 的規則:
cat /var/lib/snapd/apparmor/profiles/snap.nextcloud.*
想改規則,複製到 /etc/apparmor.d/
:
sudo cp /var/lib/snapd/apparmor/profiles/snap.nextcloud.apache /etc/apparmor.d/snap.nextcloud.apache
sudo nano /etc/apparmor.d/snap.nextcloud.apache
加:
/custom/nextcloud/** r,
重載:
sudo apparmor_parser -r /etc/apparmor.d/snap.nextcloud.apache
sudo snap restart nextcloud
4.4 小心點
-
- 太寬鬆:像允許
* r
,可能讓程式亂跑。
- 太寬鬆:像允許
怎麼辦:只給具體路徑和權限。
-
- 日誌沒東西:可能沒開日誌或程式沒跑。
怎麼辦:設 Complain 模式,跑程式:
sudo aa-complain /usr/sbin/nginx
-
- snap 規則亂套:snap 更新可能蓋掉自訂規則。
怎麼辦:規則放 /etc/apparmor.d/
。
4.5 怎麼做得更好?
- 從 Complain 開始:新程式用寬鬆模式,收集日誌。
- 具體路徑:別用
*
,用/var/www/html/**
。 - 備份:改規則前備份
/etc/apparmor.d/
。 - 試驗場:用虛擬機試,別搞亂正式伺服器。
5. 實務範例:保護網站到容器
5.1 簡單範例:幫 Nginx 讀新目錄
場景:Nginx 讀不了 /data/web/index.html
。
sudo nano /etc/apparmor.d/usr.sbin.nginx
加:
/data/web/** r,
重載:
sudo systemctl reload apparmor
sudo systemctl restart nginx
curl http://localhost/index.html
5.2 中階範例:保護 Firefox
場景:Firefox 想存 /custom/cache
,但被擋。
sudo aa-genprof /usr/bin/firefox
跑 Firefox,存檔案到 /custom/cache
,AppArmor 會問:
Profile: /usr/bin/firefox
Path: /custom/cache
Mode: r
(S) Allow / (D) Deny / (G) Glob / (N) New
選 Allow
,存規則,重載:
sudo systemctl reload apparmor
5.3 高階範例:保護 snap 的 Nextcloud
場景:snap 的 Nextcloud 要讀 /custom/nextcloud
。
sudo cp /var/lib/snapd/apparmor/profiles/snap.nextcloud.apache /etc/apparmor.d/snap.nextcloud.apache
sudo nano /etc/apparmor.d/snap.nextcloud.apache
加:
/custom/nextcloud/** r,
重載:
sudo apparmor_parser -r /etc/apparmor.d/snap.nextcloud.apache
sudo snap restart nextcloud
6. 問題怎麼解?快速排查技巧
6.1 常見麻煩
- 程式跑不動:AppArmor 可能擋住檔案或網路。
- 檔案讀不了:規則沒寫對。
- snap 怪怪的:snap 規則可能蓋掉你的設定。
6.2 排查步驟
-
- 看日誌:
sudo journalctl | grep apparmor
-
- 試寬鬆模式:
sudo aa-complain /usr/sbin/nginx
問題沒了?是 AppArmor 的問題。
-
- 分析日誌:
sudo aa-logprof
-
- 修好後切回強制模式:
sudo aa-enforce /usr/sbin/nginx
6.3 範例:修 Nginx 錯誤
Nginx 讀不了 /data/web
:
sudo journalctl | grep apparmor
sudo aa-complain /usr/sbin/nginx
sudo aa-logprof
加規則:
/data/web/** r,
切回 Enforce:
sudo aa-enforce /usr/sbin/nginx
sudo systemctl restart nginx
6.4 避免麻煩
- 新程式用 Complain 模式,先看日誌。
- 只給必要權限,別開大門。
- snap 規則放
/etc/apparmor.d/
。 - 常看
/var/log/syslog
。
7. 結論與進階資源
AppArmor 就像個聰明的保鑣,簡單好用,讓你的 Ubuntu 伺服器又安全又順暢!這篇從什麼是 AppArmor、怎麼設規則、怎麼修問題,帶你從新手到進階,還特別講了 snap 套件的玩法。第一篇教了基礎權限和 ACL,第二篇聊了 SELinux 的硬派安全,這篇專攻 AppArmor 的輕鬆風。
想再厲害?看看這些資源:
- AppArmor 官方文件:https://ubuntu.com/server/docs/security-apparmor
- Snap 教學:https://snapcraft.io/docs
- 好書:《Ubuntu Server Guide》by Ubuntu Community
- 線上資源:https://help.ubuntu.com/
希望這篇讓你愛上 AppArmor,輕鬆搞定 Ubuntu 安全!有問題或想看更多範例,隨時留言。這系列到此結束,期待你的安全冒險!