AppArmor實用指南 輕鬆構築Ubuntu伺服器的強大安全防線

最後更新日期: 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

    1. 編輯 /etc/apparmor.d/usr.sbin.nginx
/custom/web/** r,
    1. 重新載入 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 寫規則的五個步驟

  1. 找問題:看日誌,程式被什麼擋了。
  2. 寫規則:用工具或手動改規則檔案。
  3. 裝規則:讓 AppArmor 讀新規則。
  4. 試試看:確認程式跑順。
  5. 調優:確保規則不亂七八糟。

步驟 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-genprofaa-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 排查步驟

    1. 看日誌:
sudo journalctl | grep apparmor
    1. 試寬鬆模式:
sudo aa-complain /usr/sbin/nginx

問題沒了?是 AppArmor 的問題。

    1. 分析日誌:
sudo aa-logprof
    1. 修好後切回強制模式:
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,輕鬆搞定 Ubuntu 安全!有問題或想看更多範例,隨時留言。這系列到此結束,期待你的安全冒險!