SELinux vs AppArmor:Linux 伺服器的比較
15 分鐘閱讀 - 2026年5月21日

比較適用於 Linux 伺服器安全性的 SELinux 與 AppArmor:瞭解每個 MAC 架構的運作方式、主要差異,以及為您的主機設定選擇哪一個。
SELinux 對比 AppArmor:哪種 MAC 框架適合您的伺服器?
SELinux 與 AppArmor 皆在 Linux 系統上實施強制存取控制(MAC),即使程序取得 root 權限,仍會限制其可執行的操作。兩者的差異在於實現方式:SELinux 會為每個檔案和程序分配持久的標籤;AppArmor 則採用檔案路徑規則。這項設計選擇決定了其他一切:複雜度、安全性深度,以及各發行版預設搭載哪種工具。
SELinux 的運作原理
SELinux 最初由美國國家安全局 (NSA) 開發,並預設內建於 RHEL、CentOS、Fedora 及 Rocky Linux 系統中。它會為系統上的每個物件(包括檔案、程序、連接埠及套接字)標記一個安全上下文,格式為 user:role:type:level。 type 字段透過稱為「類型強制執行」(Type Enforcement, TE)的機制,承擔了大部分的核心工作。
例如,Apache 網頁伺服器以 httpd_t。網頁內容檔案則具有不同的類型。若無政策規則明確允許 httpd_t 存取該內容類型,則請求將被拒絕。這是一種「預設拒絕」的模型。除非規則另有規定,否則任何行為皆不被允許。
SELinux 亦支援多層級安全 (MLS) 與多類別安全 (MCS),這兩者會依據敏感度層級對資料進行分類,並據此限制存取權限。MCS 正是賦予 SELinux 強大容器隔離能力的核心機制,能確保各容器彼此隔離,並與主機保持分離。這在 Kubernetes 和 OpenShift 等環境中至關重要,因為這些環境中的 Pod 會共用同一個節點。
其代價在於複雜性。SELinux 的學習曲線陡峭。要排除存取拒絕的問題,必須閱讀稽核日誌、理解安全上下文,有時還需使用 audit2allow。對於沒有專職安全人員的團隊而言,這確實是一項實質負擔。
AppArmor 的運作原理
AppArmor 採用了不同的方法。它不對物件進行標記,而是根據應用程式的檔案路徑,將安全設定檔附加至應用程式。例如,針對 /usr/sbin/nginx 便定義了 Nginx 可以讀取哪些目錄、可以綁定哪些埠,以及需要哪些功能。設定檔是儲存在 /etc/apparmor.d/.
AppArmor 是 Ubuntu、Debian 和 SUSE 系統的預設 MAC 框架,自 Linux 核心 2.6.36 版本起即已內建。未設定設定檔的應用程式將回退至標準 Linux DAC 權限。
AppArmor 針對每個設定檔提供兩種運作模式:強制模式(阻擋並記錄違規行為)與警告模式(僅記錄違規行為而不阻擋)。此設計使逐步部署新設定檔成為可能。建議先以警告模式啟動,檢視日誌後再收緊設定檔,最後切換至強制模式。
諸如 aa-genprof 和 aa-logprof 等工具,可透過觀察應用程式行為並據此生成規則,協助互動式建立設定檔。相較於 SELinux 政策模組,其語法更易於手動閱讀與編輯。
其缺點在於,基於路徑的規則無法追蹤檔案的移動。理論上,硬連結或綁定掛載可能繞過基於路徑的限制。此外,AppArmor 缺乏原生的 MLS/MCS 支援,因此雖能將容器與主機隔離,卻無法像 SELinux 那樣將容器彼此隔離。
並列比較
| 功能 | SELinux | AppArmor |
|---|---|---|
| 存取控制模型 | 基於標籤(安全上下文) | 基於路徑(檔案系統位置) |
| 預設立場 | 全數拒絕 | 全准許(依設定檔限制) |
| 檔案移動 | 標籤隨檔案移動 | 安全性與路徑綁定 |
| 支援 MLS/MCS | 是 | 否 |
| 容器隔離 | 容器對容器及容器對主機 | 僅限容器對主機 |
| 政策格式 | 編譯二進位模組 | 人可讀的文字檔案 |
| 預設發行版 | RHEL、Fedora、CentOS、Rocky Linux | Ubuntu、Debian、SUSE |
| 學習曲線 | 陡峭 | 中等 |
基本設定
SELinux
檢查當前狀態:
sestatus
getenforce以「Permissive」模式啟動,以記錄違規行為而不阻擋任何操作:
setenforce 0對大多數伺服器使用「targeted」政策。此政策會限制高風險服務(如網頁伺服器和資料庫),同時讓其他所有項目不受限制。請在 /etc/selinux/config:
SELINUX=enforcing
SELINUXTYPE=targeted檢查檔案與程序的安全上下文:
ls -Z /var/www/html
ps -eZ | grep httpd若服務使用非標準埠號,請更新政策:
semanage port -a -t ssh_port_t -p tcp 9999對於會產生存取拒絕的自訂應用程式,請從稽核日誌建立政策模組:
ausearch -m avc -ts recent | audit2allow -M my_custom_policy
semodule -i my_custom_policy.ppAppArmor
檢查已載入的設定檔:
sudo aa-status若需配置檔管理工具,請安裝實用程式套件:
sudo apt install apparmor-utils在應用程式執行期間以互動方式建立設定檔:
sudo aa-genprof /path/to/binary透過掃描日誌中的違規記錄來優化配置檔:
sudo aa-logprof在不同模式之間切換配置檔:
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx該選擇哪一種?
對大多數系統管理員而言,務實的答案是:使用您所用發行版預設搭載的方案。RHEL、CentOS、Fedora 和 Rocky Linux 預設搭載 SELinux;Ubuntu、Debian 和 SUSE 則預設搭載 AppArmor。這兩套框架皆針對其原生平台具備成熟的工具與政策。在任何發行版上切換至非預設選項,不僅會增加工作量,更會降低社群支援。
除此之外,請根據您的需求決定:
- 若需符合 PCI DSS、HIPAA 或 DISA-STIG 規範,請選擇 SELinux。若在 Kubernetes 或 OpenShift 上運行多租戶容器工作負載,請選擇 SELinux。若在共享主機上需要容器間隔離,請選擇 SELinux。若您的環境處理機密或分級敏感資料,請選擇 SELinux。
- 若您使用 Ubuntu 或 Debian 且希望在無需過多學習成本的情況下獲得 MAC 保護,請選擇 AppArmor。若您的環境是運行標準 Web 服務的單一伺服器或小型叢集。若快速部署比細粒度的標籤級控制更為重要。
這兩種框架均僅會增加極少的執行時開銷。SELinux 會將存取決策緩存於其存取向量快取 (AVC) 中。AppArmor 的政策載入過程可能會在開機時造成些微延遲,但在執行時影響微乎其微。對於大多數主機工作負載而言,這兩者都不會成為效能瓶頸。
若您需要具備完整 root 權限的可靠主機基礎架構,以便配置任一框架,FDC 的專用伺服器或 VPS 將賦予您充分的控制權,讓您能根據環境需求,依自身需求設定 SELinux 或 AppArmor。

Linux 伺服器加固清單
15 分鐘閱讀 - 2026年5月8日