如何在 Linux 上使用 AppArmor 並檢測腳本更改

最後更新: 17/12/2025
作者: 艾薩克
  • AppArmor 實現了基於路徑設定檔的強制存取控制,這比 SELinux 更容易管理,並且對於限制服務和腳本非常有用。
  • 設定檔儲存在 /etc/apparmor.d 中,可透過 aa-status、aa-enforce、aa-complain 或 apparmor_parser 等實用程式進行管理,並可透過 aa-genprof 和 aa-logprof 以引導方式建立。
  • 透過將 AppArmor 與雜湊檢查腳本(stat、find、du、sha1sum)結合使用,可以偵測到關鍵程式碼和目錄的更改,甚至可以排除特定路徑。
  • 在雲端環境中,正確配置核心、cloud-init 和 AppArmor 可以防止許多配置問題,並更容易審核異常進程行為。

Linux 系統上的 AppArmor 安全性

如果您使用 GNU/Linux 系統,並且專注於腳本和服務的安全性,那麼您遲早會遇到這個問題。 AppArmor 是控制每個程序可以執行的操作的關鍵元件。它不僅用於加固系統:如果使用得當,它還能幫助你發現不應該發生更改的地方發生了更改,例如在程式碼中。 腳本 精美的。

接下來我們將看到,文章將以相當冷靜但切中要點的方式來闡述。 什麼是 AppArmor?它與其他系統(例如 SELinux)相比如何?本文將介紹如何在最常見的發行版(尤其是 Debian 和 Ubuntu)中啟動和管理它,如何創建和調整自己的配置文件,以及如何利用所有這些功能以及一些簡單的 shell 技巧。 檢測腳本程式碼或目錄中的更改 Linux 無需設定即時監控。

什麼是 AppArmor?它對你的腳本有什麼重要意義?

AppArmor(應用程式保護)是一種 強制存取控制機制,或 MAC整合到 Linux 核心中 透過 Linux 安全模組 (LSM) 介面實現。它並非僅僅依賴傳統的使用者/群組權限(傳統的 DAC 模型),而是增加了一個額外的層,嚴格定義了每個程式可以執行的操作。

實際上,核心會查詢 AppArmor。 在執行某些系統呼叫之前 (例如開啟檔案、建立套接字、執行其他二進位檔案、使用特定功能等)以確定請求進程是否根據其安全性設定檔授權。如果規則允許,則執行該操作;否則,根據模式,阻止或記錄該操作。

AppArmor 的基本單元是 輪廓例如:一組與執行檔關聯的規則,該檔案由其絕對路徑標識。 /usr/sbin/sshd o /bin/ping與 SELinux 不同, 個人資料規則對所有使用者均適用。 執行該二進位檔案的權限 Unix的 傳統方法仍然存在,但 AppArmor 更進一步,定義了其範圍。

設定檔以純文字檔案的形式儲存。 /etc/apparmor.d/ 通常在核心運行期間載入到核心中。 開機每個設定檔都可以以某種模式運行 嚴格(強制執行)違規行為將被阻止並記錄,或處於以下模式 放鬆(抱怨)在允許的情況下,但會被記錄在案。 日誌 稍後再查看。

AppArmor 最初由 Novell 於 2005 年推出,主要用於… SUSE 和 openSUSE然而,Canonical 從 2.6.36 版本開始將其引入內核主線。如今,許多發行版(如 Ubuntu 及其衍生版本或 Debian(從 Debian 10 開始啟用))預設都包含了該功能,而其他發行版(如 Fedora 或 RHEL)則沒有。 他們仍然依賴 SELinux 作為其主要的 MAC 解決方案。.

DAC、MAC、AppArmor 和 SELinux:它們之間有什麼區別?

為了理解 AppArmor 的優勢,有必要將 Linux 中並存的兩種權限模型區分開來: DAC(自主存取控制)和 MAC(強制存取控制)DAC 就是你一直熟悉的那個:擁有者、群組、其他人、比特 rwxACL 等。每個使用者都可以在一定範圍內管理自己的檔案權限。

就MAC模型而言, 這並非可自由裁量權。存取決策基於管理員定義並由系統強制執行的全域策略,與檔案的擁有者無關。 AppArmor 和 SELinux 正是在此發揮作用,它們都扮演著重要角色。 LSM介面下有兩種不同的MAC實作方式但使用理念卻截然不同。

SELinux 使用與進程、文件、套接字等關聯的安全標籤(上下文),並基於標籤、角色、類型和其他術語的組合做出決策。這使其具有強大的安全性和可靠性。 控制極其精細,但同時也非常複雜。 既包括管理也包括審計。而 AppArmor 則是基於… 文件路徑設定檔與可執行檔的特定路徑相關聯,並描述該二進位檔案可以使用的資源。

這使得 AppArmor 設定檔通常是 更易於閱讀、書寫和維護 對於普通管理員而言,AppArmor 是一種非常實用的選擇。作為交換,它犧牲了 SELinux 的一些靈活性,從而可以控制更多類型的操作和場景。在許多發行版中,AppArmor 已成為非常實用的選擇。 強化常規服務,而無需編寫過多語法.

在腳本和自動化方面,AppArmor 可讓您限制特定腳本的功能(例如,它可以讀取或修改哪些目錄,或是否可以開啟網路連線),而且由於其抱怨模式,它還可以… 偵測到意外訪問 甚至在屏蔽他們之前。

AppArmor 狀態、設定檔和監控

在使用 AppArmor 保護任何內容之前,您應該檢查它是否在您的系統上正常運作。在 Ubuntu 或 Debian 等現代發行版中,它通常是整合的,但是… 並非所有設定檔都始終處於啟動狀態,也並非所有設定檔都處於強制執行模式。所以值得一看。

快速檢查是否 AppArmor 已啟用, 您可以使用:

sudo aa-enabled

該命令基本上會返回一個 如果模組已激活,則回答“是”。 或傳回「否」(例如,如果核心未啟用 AppArmor 支援或服務未載入)。

如果您想查看所有已上傳個人資料及其狀態的詳細信息, 按鍵命令 是:

  為什麼 Windows 在路徑中使用反斜線 (\) 而 Unix 使用正斜線 (/)?

sudo aa-status

的輸出 aa-status 它顯示了已載入設定檔的數量、處於強制模式的設定檔數量、處於投訴模式的設定檔數量,以及與每個設定檔關聯的路由清單。這些資訊對於擁有一個…非常有用。 快速概覽 AppArmor 為您的電腦提供的實際保護級別.

例如,您可能會看到類似這樣的內容:

apparmor module is loaded.
46 profiles are loaded.
44 profiles are in enforce mode.
/snap/bin/evince
/snap/bin/evince/previewer
...
2 profiles are in complain mode.
/snap.code.code
...

處於模式中的設定檔越多 執行全球政策越嚴格,效果越好。模式中的個人資料 抱怨 他們不會阻止交易,但會記錄每一次違規行為,這對於…非常有價值 在不中斷服務的情況下調整設定檔 或審核應用程式正在嘗試執行的操作。

在 Debian 和 Ubuntu 上安裝和啟動 AppArmor

在目前的 Debian 和 Ubuntu 版本中,AppArmor 支援已經包含在標準核心中,因此 啟動系統只需安裝必要的軟體包並確保模組啟動即可。 在系統啟動過程中。

apt -y install apparmor apparmor-profiles apparmor-utils

埃爾帕克特 apparmor-utils 它提供以下線上工具: 命令 檢查狀態(aa-status),更改設定檔模式(aa-enforce, aa-complain),建立新設定檔(aa-genprof)、審查日誌(aa-logprof)等

在某些情況下,也可能需要這樣做。 強制核心使用 AppArmor 啟動 作為主動式 LSM 系統。在 Ubuntu 中,一種典型的方法是使用以下命令將參數新增至 GRUB:

perl -pi -e 's,GRUB_CMDLINE_LINUX="(.*)"$,GRUB_CMDLINE_LINUX="$1 apparmor=1 security=apparmor",' /etc/default/grub
update-grub
reboot

重啟後,AppArmor 應該會加載,您可以透過以下命令確認: aa-status o apparmor_status (後者是一個非常常見的別名)。

如果您需要擴展社區維護的預先定義設定檔集合,您也可以安裝:

apt install apparmor-profiles-extra

這些附加配置檔案涵蓋了大量服務和應用程序,其中許多是 暴露於網路之中,尤其值得關注的是限制其活動範圍。.

基本設定檔管理:強制執行、投訴、停用和重新加載

AppArmor 啟動並運行後,關鍵在於正確管理設定檔。每個文件都包含在其中。 /etc/apparmor.d/ 它定義了設定檔的規則,其名稱通常與可執行檔的路徑相對應,只是將斜線替換為句點。例如: /etc/apparmor.d/bin.ping 是 /bin/ping 的設定檔。.

通常情況下,你不需要手動編輯這些文件來更改模式;其他工具就是用來做這件事的。 具體實用程式例如,強制使用特定設定檔 嚴格模式(強制) 你可以使用:

sudo aa-enforce /usr/sbin/cupsd

另一方面,如果您想在…中建立個人資料 放鬆模式(抱怨) 因為你懷疑它導致了問題,或者你想在不阻塞流量的情況下對其進行微調,你可以執行以下操作:

sudo aa-complain /usr/sbin/privoxy

這些命令既接受可執行檔的路徑,也接受可執行檔的路徑。 設定檔路徑事實上,如果您想更改所有已定義設定檔的全域模式,請執行以下操作: /etc/apparmor.d/你可以運行:

sudo aa-complain /etc/apparmor.d/*

或反方向:

sudo aa-enforce /etc/apparmor.d/*

在更極端的情況下,你可能需要 暫時停用特定設定檔為此,有 aa-disable:

sudo aa-disable /etc/apparmor.d/usr.sbin.cupsd

如果您需要仔細審查應用程式的所有操作,即使是通常允許的操作,也可以使用稽核模式。 aa-audit,這使得 所有被監控的通話都會被錄音。 不屏蔽它們。

當您手動修改設定檔或想要從檔案重新載入設定檔時,可以使用下列方法: apparmor_parser 載入或重新載入特定設定檔:

cat /etc/apparmor.d/profile.name | sudo apparmor_parser -a # cargar
cat /etc/apparmor.d/profile.name | sudo apparmor_parser -r # recargar

如果您想要重新載入系統上所有活動設定文件,可以使用 init 腳本(或現代發行版 systemd 中的等效腳本):

/etc/init.d/apparmor reload

探索並了解現有使用者資料

載入到核心中的設定檔反映了核心中檔案的內容。 /etc/apparmor.d/若要列出目錄內容,您可以執行以下操作:

sudo ls /etc/apparmor.d

你會看到諸如此類的名字 usr.sbin.sshd, usr.bin.man等等。發行版本身的許多設定檔都分組到子目錄中,例如: /etc/apparmor.d/local專為因應局部變化而設計,而不改變主要輪廓。

如果您好奇並想查看特定個人資料的規則,只需:

sudo cat /etc/apparmor.d/usr.sbin.sshd

乍一看,語法可能顯得有些枯燥,但很多行都是如此。 用簡單易懂的方式解釋 這有助於理解每個模組的用途。無論如何,如果您不熟悉語法,最好不要手動編輯這些文件,而是使用互動式生成和調整工具。

偵測沒有設定檔的進程,並確定需要限制的進程的優先權。

並非系統上的所有程式都會關聯 AppArmor 設定檔。事實上,大多數程式都沒有。您最先可能需要鎖定的程式通常是… 那些暴露在網路環境中的人要么是因為它們開放端口,要么是因為它們處理潛在的危險數據。

AppArmor 包含該工具 aa-unconfined 列出正在監聽網路但沒有設定檔的進程:

aa-unconfined

如果新增參數 --paranoid該實用程式將顯示 所有運行進程,只要它們至少保持一個活動的網路連線即可。 而且不受限制:

aa-unconfined --paranoid

此清單旨在幫助您決定從何處著手。例如,您可能會發現 Web 服務、代理程式或資料庫守護程式… 他們沒有遵守任何 AppArmor 政策。這是邀請您為他們建立專屬個人資料。

使用 aa-genprof 和 aa-logprof 建立新設定檔

從零開始建立個人資料可能令人望而生畏,但 AppArmor 提供的「學習模式」工具可以大大簡化這項任務。其理念很簡單: 你以抱怨模式運行程序,讓它完成工作,然後從日誌中建立設定檔。 由 AppArmor 產生。

  Windows 2 上 WSL 11 基本指令與高階管理的綜合指南

它的主要用途是 aa-genprof。其基本語法為:

sudo aa-genprof nombre_ejecutable

例如,要產生一個設定文件, dhclient (DHCP客戶端),您可以啟動:

sudo aa-genprof dhclient

典型的工作流程大致如下: aa-genprof 會建立一個初始的空白或非常開放的個人資料。它以抱怨模式加載,並要求你在另一個地方這樣做。 終端使用要分析的應用程式(在本例中,使用 dhclient 啟動或強制取得新的 IP)。

程式運作時,AppArmor 會記錄所有在強制模式下會被封鎖的操作。然後,當您返回 aa-genprof 並選擇掃描事件選項時,該工具會顯示以下內容: 一個互動式列表,列出了檢測到的違規行為以及規則建議.

第一個事件的例子可以是輔助腳本的執行:

Perfil: /usr/sbin/dhclient
Ejecutar: /usr/sbin/dhclient-script
Severity: desconocido
(I)nherit / (C)hild / (P)rofile / (N)amed / (U)nconfined / (X) ix On / (D)eny / Abo(r)t / (F)inalizar

接下來,您可以決定如何處理子進程:使用相同的設定檔啟動腳本(繼承),帶有子設定檔(孩子),並擁有專門的個人資料(個人資料/姓名),而不限制(不受限制)或阻止其執行(否認).

AppArmor 也進行管理 能力這些是最初為…保留的特殊核心權限。 (例如,使用原始套接字、更改系統時間等)。在效能分析過程中,您會看到類似以下內容:

Perfil: /usr/sbin/dhclient
Capability: net_raw
Severity: 8
(A)llow / (D)eny / (I)gnorar / Audi(t) / Abo(r)t / (F)inalizar

在每種情況下,您都可以決定是否允許、拒絕、忽略(不建立規則)、審核或中止。這同樣適用於… 文件訪問其中將展示具體的路由、存取模式(讀取、寫入等)和可能的可重複使用抽象。

抽象 它們是將通用規則打包成可重複使用檔案的集合(例如, <abstractions/nameservice> (用於所有與名稱解析相關的操作)。而不是加上一條寬鬆的規則 /etc/nsswitch.conf您可以加入抽象概念並簡化設定檔。

流程結束時,aa-genprof 會提示儲存修改後的設定文件,並自動以強制模式重新載入它們,以便程式能夠正常運作。 受您剛剛批准的規則約束如果之後偵測到新的行為,您可以隨時再次執行它。 aa-genprof 或者更直接地說, aa-logprof 關於已記錄的日誌。

事實上, aa-genprof 只是一個底層使用 aa-logprof 的小腳本。它會建立一個空的設定文件,將其設定為投訴模式,啟動程序,然後呼叫 `aa-logprof` 從記錄的違規資訊建立設定檔。您可以使用 aa-logprof 當您想要根據新事件完善現有個人資料時,請單獨進行此操作。

使用 shell 和哈希檢測程式碼和目錄的更改

除了存取控制功能外,在許多情況下,它還具有其他吸引力。 偵測腳本程式碼或目錄內容是否已更改 例如,在兩次執行之間,為了觸發一次 完整備份 只有在進行修改時才需要修改,而不是持續漸進式修改。

我們這裡討論的不是即時監控(要實現即時監控,你需要…) 通知 以及衍生工具),而是進行一次性檢查:運行一個腳本來檢查目錄狀態,如果檢測到與上次相比發生了變化,則採取相應措施。

一種非常簡單的建立完整目錄(不帶任何例外)的方法是使用 stat下面的結構圖說明了這個概念:

DIR_TO_CHECK='/dir/to/check'
OLD_STAT_FILE='/home/johndoe/old_stat.txt'

如果;那麼
OLD_STAT=$(cat «$OLD_STAT_FILE»)
其他
OLD_STAT="無"
fi

NEW_STAT=$(stat -t «$DIR_TO_CHECK»)

如果;那麼
echo '目錄已更改。請執行操作! '
# 在這裡進行備份、驗證等操作。
echo «$NEW_STAT» > «$OLD_STAT_FILE»
fi

邏輯很簡單: 將 `stat` 的結果儲存在一個檔案中,下次執行時進行比較。 使用新的結果。如果結果不同,則表示目錄中的某些內容(例如大小、時間等)發生了變化。這種方法速度很快,但略顯笨拙,而且無法輕鬆排除子路徑。

如果你想檢查一個目錄,但是 排除某些檔案或子目錄 (例如 tmp/ (例如本機檔案或日誌檔案),您可以結合使用來建立更複雜的功能。 find, du, sort y sha1sum 取得您感興趣的樹木的生長狀況「足跡」。

腳本範例可以是:

DIR_TO_CHECK='/dir/to/check'
PATH_TO_EXCLUDE="/dir/to/check/tmp*"
OLD_SUM_FILE='/home/johndoe/old_sum.txt'

如果;那麼
OLD_SUM=$(cat «$OLD_SUM_FILE»)
其他
OLD_SUM="無"
fi

NEW_SUM=$(find «$DIR_TO_CHECK»/* \! -path «$PATH_TO_EXCLUDE» -print0 \
| xargs -0 du -b –time –exclude=»$PATH_TO_EXCLUDE» \
| sort -k4,4 \
| sha1sum \
| awk '{print $1}')

如果;那麼
echo "目錄已更改。“請執行操作! 」
echo «$NEW_SUM» > «$OLD_SUM_FILE»
fi

關鍵在於進行計算的那一行。 新總和:

  • find ... \! -path "$PATH_TO_EXCLUDE" -print0列出目錄下的所有文件,但排除符合特定模式的文件。 -print0 它會用空字元分隔名稱,以避免空格和特殊字元造成的混亂。
  • xargs -0 du -b --time --exclude=...對於獲取的每個文件,都會計算其大小(以位元組為單位)和時間戳資訊(取決於選項),並建立一個列表,其中每一行代表一個文件系統物件。 不需要的路徑再次被排除。.
  • sort -k4,4清單是按照包含路徑的列(通常是第四列)排序的,因此順序是確定的,任何變更都會反映在序列中。
  • sha1sum | awk '{print $1}':計算 SHA1 校驗和 整個清單會產生一個簡短的目錄結構,該結構「代表」目錄的完整狀態(不包括已排除的目錄)。目錄大小、路徑或時間戳記的任何變更都會導致目錄結構變更。

這樣,每次執行腳本時,你就能知道在兩次運行之間,是否發生了變化。 樹狀圖中的相關內容已被修改、新增、刪除或重新命名。這樣一來,你就可以執行其他操作:重新產生完整備份、執行完整性檢查、重新載入服務等等。

  T-Mobile 遭駭客攻擊:與中國有關的網路攻擊使電信安全面臨風險

AppArmor 如何融入腳本變更偵測?

上述技巧本身就已經能夠讓你… 檢測腳本程式碼或其關聯資源中的修改但是,如果將它與 AppArmor 結合使用,就可以更進一步,讓安全系統本身在腳本開始執行其預期之外的操作時發出警告。

假設你有一個腳本,它應該只讀取一組檔案並寫入特定目錄。如果你定義了一個 AppArmor 設定文件,只允許… 讀取 /opt/misdatos/ 並寫入 /var/log/miscript/任何試圖存取其他網站的行為都會在日誌中產生違規事件(在投訴模式下),或會被直接阻止(在強制模式下)。

因此,如果有人修改腳本(或用惡意腳本替換它)來刪除文件,那麼… /etc/ 或透過網路傳送資料時,AppArmor 將起到安全保障作用。此外,還可以查看日誌。 aa-logprof 或直接在 /var/log/syslog/journalctl你可以 檢測異常行為,以揭示程式碼或執行邏輯的變化。.

一個切實可行的策略是將這兩種方法結合起來:

  • 一方面,使用一個小型哈希腳本(基於 stat 或內容總和) 檢查腳本程式碼及其資源是否已更改 自上次審核以來。
  • 另一方面,將腳本置於一個經過精心調校的 AppArmor 設定檔下,可以限制其行為,並且 記錄任何偏離劇本的行為.

如果兩個系統都發出訊號(不同的雜湊值和 AppArmor 中的新違規),則很明顯地表明某些東西發生了變化,值得徹底檢查。

AppArmor 和 Linux 虛擬機器配置相關的常見問題

在 Azure 等雲端環境中,AppArmor 通常與其他關鍵系統元件共存,例如 cloud-init 和 Azure Linux 代理當它們被創造出來的時候 虛擬機 從自訂鏡像開始,經常會遇到設定錯誤,雖然這些錯誤並非直接由 AppArmor 引起,但確實會影響受設定檔限制的服務。

典型案例:從鏡像部署虛擬機器時,虛擬機器狀態保持不變。 creating 持續一段時間後,它轉向 failed 例如:

Provisioning failed. OS Provisioning for VM 'sentilo' did not finish in the allotted time...

好吧:

OSProvisioningInternalError: The VM encountered an error during deployment...

為了診斷這些問題,人們會訴諸於… 串口控制台日誌 啟用 Azure 啟動診斷功能後,您可以查看從核心命令列選項到 systemd 目標序列、cloud-init 和 Azure 代理執行、網路設定和金鑰產生等所有內容。 SSH等等。

這些日誌會檢查目標是否已達成。 網路已上線如果 cloud-init 已完成其各個階段(init-local, init(配置和最終模組),如果預配 ISO 磁碟已正確掛載(它們需要 UDF 驅動程式),或 Azure 代理程式標記 Finished provisioning.

常見錯誤包括:

  • UDF 模組被封鎖或缺失預配磁碟未掛載,cloud-init 無法讀取元數據,導致出現「未找到 Azure 元資料」訊息。
  • Unicode問題 在 VM 標籤或密碼中,尤其是在舊版的 cloud-init 中,這些版本無法很好地處理非 ASCII 字元。
  • 組裝 /var/tmp 使用 noexec這會阻止 cloud-init 運行 dhclient 在 20.3 之前的版本中,當它被複製到該路徑時。

所有這些問題都可以透過更新到最新版本的 cloud-init、更正掛載參數以及確保必要的核心模組(例如 UDF)未被鎖定來解決。 /etc/modprobe.d/如果您還在這些虛擬機器上使用 AppArmor,則值得檢查一下。 避免過於嚴格的個人資料 這會影響 cloud-init、dhclient、systemd-networkd 或 Azure 代理程式等元件,因為它們可能會幹擾設定。

完全禁用 AppArmor(別無選擇時)

雖然建議調整設定檔和模式而不是走捷徑,但在某些特殊情況下,這樣做可能是必要的。 完全禁用 AppArmor例如,排除它在測試環境中造成深奧問題的可能性。

sudo /etc/init.d/apparmor stop
sudo update-rc.d -f apparmor remove

如果以後想重新啟動它,只需啟動它並在預設啟動層級重新註冊即可:

sudo /etc/init.d/apparmor start
sudo update-rc.d apparmor defaults

請注意,停用 AppArmor 會移除它提供的整個 MAC 保護層,使進程再次變得脆弱。 僅受傳統 DAC 許可證的限制最明智的做法是僅將此措施用於特定的診斷目的,一旦確定了問題,就重新啟用它並調整衝突的設定檔。

綜上所述,可以將 AppArmor 的使用與簡單的雜湊和比較技術相結合,以限制腳本和服務的行為,而不會變得過於複雜。 偵測 Linux 系統程式碼和金鑰目錄的變化這為管理生產環境或雲端的機器提供了一層額外的保障,您肯定不希望任何東西在您不知情的情況下發生移動。

使用 cron 和 at 在 Linux 中安排任務
相關文章:
使用 cron 和 at 在 Linux 中安排任務:實用且完整的指南