在 Linux 中使用 SELinux 或 AppArmor 實現強制訪問控制
Linux 內建支援兩種強制訪問控制 (MAC) 系統:SELinux 和 AppArmor。這兩個系統都在 Linux 自帶的預設任意訪問控制 (DAC) 基礎上增加了額外的訪問控制層。在本文中,我們將深入探討這兩個系統的實現,提供實際示例及其各自的輸出。
瞭解 SELinux 和 AppArmor
SELinux,即安全增強型 Linux,是 Linux 核心安全模組,提供了一種支援訪問控制安全策略的機制。它是一個高度靈活的 MAC 系統,為系統中的每個物件(檔案、目錄、埠等)分配標籤,並使用策略定義這些物件之間的互動。SELinux 通常用於需要強大、複雜安全策略的場景。
另一方面,AppArmor(應用程式裝甲)是另一個基於路徑的 MAC 系統,配置和管理起來比 SELinux 簡單一些。它根據一組規則限制程式,這些規則指定程式可以訪問哪些檔案和功能。當易用性和簡單性至關重要時,AppArmor 是一個不錯的選擇。
實現 SELinux
檢查 SELinux 狀態 - 首先,透過執行 sestatus 確保 SELinux 在您的系統上已啟用。輸出將顯示 SELinux 狀態和當前的強制模式。
$ sestatus SELinux status: enabled Current mode: enforcing
如果 SELinux 已停用,則需要啟用它並將模式設定為“強制”。您可以透過編輯 /etc/selinux/config 檔案來實現。
瞭解 SELinux 上下文 - 在 SELinux 中,每個檔案、使用者、程序和資源都有一個上下文,用於做出訪問決策。使用 ls -Z 列出檔案及其 SELinux 上下文。
$ ls -Z /var/www/html/index.html -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
在上述輸出中,system_u:object_r:httpd_sys_content_t:s0 是檔案的 SELinux 上下文。
更改檔案上下文 - 假設您想從新目錄 /var/www/new_dir 提供檔案服務。預設情況下,SELinux 將阻止 HTTP 伺服器訪問這些檔案。您可以透過使用 chcon 命令對目錄應用正確的上下文來允許訪問。
$ chcon -R -t httpd_sys_content_t /var/www/new_dir
使用 ls -Z 驗證更改。
$ ls -Z /var/www/new_dir drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/new_dir
實現 AppArmor
檢查 AppArmor 狀態 - 使用 sudo systemctl status apparmor 確保 AppArmor 已安裝並正在執行。輸出應顯示 AppArmor 處於活動狀態(正在執行)。
$ sudo systemctl status apparmor ● apparmor.service - Load AppArmor profiles Loaded: loaded (/lib/systemd/system/apparmor.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2023-06-27 12:34:56 UTC; 1h 10min ago
如果 AppArmor 未執行,請使用 sudo systemctl start apparmor 啟動它。
AppArmor 配置檔案 - AppArmor 透過位於 /etc/apparmor.d/ 中的配置檔案控制程式訪問。使用 sudo aa-status 列出配置檔案。
$ sudo aa-status apparmor module is loaded. 14 profiles are loaded. 14 profiles are in enforce mode.
建立和實施配置檔案:假設您想為 /usr/sbin/nginx 程式建立一個配置檔案。首先,使用 aa-complain 將 AppArmor 設定為對此程式的“抱怨”模式。
$ sudo aa-complain /usr/sbin/nginx
接下來,在程式執行時使用 aa-genprof 生成配置檔案。
$ sudo aa-genprof /usr/sbin/nginx
最後,使用 aa-enforce 將程式置於“強制”模式。
$ sudo aa-enforce /usr/sbin/nginx
現在,Nginx 在指定的 AppArmor 配置檔案下執行,任何違規行為都將被阻止並記錄。
超越基本 SELinux 實現
上一節概述了開始使用 SELinux 的基本步驟,但 SELinux 可以提供更細粒度的訪問控制和安全功能。
布林值 - SELinux 中的布林值啟用或停用對特定功能的訪問。例如,假設您想允許 Apache HTTP 伺服器建立到任何目的地的網路連線。這可以透過設定 httpd_can_network_connect 布林值來完成。
$ setsebool -P httpd_can_network_connect on
要檢視此布林值的當前狀態,請使用 getsebool。
$ getsebool httpd_can_network_connect httpd_can_network_connect --> on
使用者角色和級別 - 在 SELinux 中,使用者與角色關聯,角色與域關聯。您可以透過為使用者分配特定角色來定義使用者可以訪問哪些資源。此外,SELinux 支援多級安全。這意味著您可以為使用者和資源指定安全級別,從而建立一項策略,只允許具有特定級別的使用者訪問相同級別的資源。
高階 AppArmor 實現
與 SELinux 一樣,AppArmor 也提供了超出其基本功能的其他功能 -
子配置檔案和子配置檔案 - AppArmor 允許建立子配置檔案和子配置檔案,以更精細地控制應用程式許可權。例如,如果您有一個 Web 伺服器的父配置檔案,則可以為該伺服器執行的 CGI 指令碼建立一個子配置檔案,從而限制這些指令碼的許可權。
網路訪問控制 - AppArmor 可以控制應用程式可以訪問哪些網路資源。例如,您可以建立一個配置檔案,允許程式僅開啟到特定 IP 地址或埠的網路連線。
配置檔案堆疊 - AppArmor 支援配置檔案堆疊,這意味著您可以將多個配置檔案應用於單個任務。這允許您組合來自不同配置檔案的規則,從而在訪問控制策略中提供更高的自定義程度和粒度。
SELinux 和 AppArmor 都是用於在 Linux 中實現強制訪問控制的強大工具。有效使用它們的關鍵在於瞭解您的特定需求以及您願意在訪問控制策略中管理的複雜程度。透過研究每個工具的各種功能和特性,您可以選擇最適合您情況的工具,併為您的系統提供最大程度的保護。
結論
雖然 SELinux 和 AppArmor 都提供了強大的訪問控制機制,但兩者之間的選擇將取決於您的特定需求。如果您需要對系統的每個方面進行高度靈活和細粒度的控制,則 SELinux 是最佳選擇。但是,如果您更喜歡一種更簡單、更使用者友好的安全方法,則 AppArmor 將更合適。請記住,保護您的系統不是一次性操作,而是一個持續監控、更新和實施訪問控制策略的過程。