SELinux vs AppArmor:Linux 伺服器的比較

15 分鐘閱讀 - 2026年5月21日

hero section cover
目錄
  • SELinux 對比 AppArmor:哪種 MAC 框架適合您的伺服器?
  • SELinux 的運作原理
  • AppArmor 的運作原理
  • 並列比較
  • 基本設定
  • 該選擇哪一種?
分享

比較適用於 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:leveltype 字段透過稱為「類型強制執行」(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-genprofaa-logprof 等工具,可透過觀察應用程式行為並據此生成規則,協助互動式建立設定檔。相較於 SELinux 政策模組,其語法更易於手動閱讀與編輯。

其缺點在於,基於路徑的規則無法追蹤檔案的移動。理論上,硬連結或綁定掛載可能繞過基於路徑的限制。此外,AppArmor 缺乏原生的 MLS/MCS 支援,因此雖能將容器與主機隔離,卻無法像 SELinux 那樣將容器彼此隔離。

並列比較

功能SELinuxAppArmor
存取控制模型基於標籤(安全上下文)基於路徑(檔案系統位置)
預設立場全數拒絕全准許(依設定檔限制)
檔案移動標籤隨檔案移動安全性與路徑綁定
支援 MLS/MCS
容器隔離容器對容器及容器對主機僅限容器對主機
政策格式編譯二進位模組人可讀的文字檔案
預設發行版RHEL、Fedora、CentOS、Rocky LinuxUbuntu、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.pp

AppArmor

檢查已載入的設定檔:

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 中的殭屍進程:尋找、移除、預防

Linux 中的殭屍進程:尋找、移除、預防

學習如何在 Linux 中識別、移除和預防殭屍進程。伺服器管理員的指令、程式碼修正和監控技巧。

15 分鐘閱讀 - 2026年5月19日

Linux 伺服器加固清單

15 分鐘閱讀 - 2026年5月8日

更多文章