AppArmor 作為 Linux 系統重要的安全模組,其組態檔案的正確性直接影響系統安全性和服務穩定性。理解組態檔案的語法和規則是使用 AppArmor 的基礎。本文從 web-data 抽象檔案範例出發,逐步解析了 AppArmor 組態檔案的結構和規則,包括讀取許可權、萬用字元和變數的使用。同時,也介紹了可調引數子目錄的概念和作用,讓讀者瞭解如何根據需求調整組態檔案。此外,文章還提供了一些自訂 AppArmor 組態檔案的範例規則,幫助讀者快速上手。
AppArmor 組態檔案與實用工具詳解
瞭解 AppArmor 組態檔案
首先,讓我們探討 AppArmor 的組態檔案。以下是一個 web-data 抽象檔案的範例:
/srv/www/htdocs/ r,
/srv/www/htdocs/** r,
# virtual hosting
/srv/www/vhosts/ r,
/srv/www/vhosts/** r,
# mod_userdir
@{HOME}/public_html/ r,
@{HOME}/public_html/** r,
/srv/www/rails/*/public/ r,
/srv/www/rails/*/public/** r,
/var/www/html/ r,
/var/www/html/** r,
這個檔案列出了 Apache 守護程式允許讀取的目錄。讓我們逐一分析:
- 每個規則都以
r,結尾,表示允許 Apache 對該目錄進行讀取操作。 - 每個規則必須以逗號結尾。
/srv/www/htdocs/ r,表示允許 Apache 讀取該目錄本身。/srv/www/htdocs/** r,中的**萬用字元使該規則具有遞迴性,即 Apache 可以讀取該目錄下的所有子目錄和檔案。
內容解密:
@{HOME}變數允許該規則適用於任何使用者的家目錄。- 沒有明確的規則禁止 Apache 從其他位置讀取檔案,意味著未列出的位置對 Apache 守護程式是禁止的。
可調引數子目錄
可調引數子目錄包含具有預定義變數的檔案。您也可以使用此目錄定義新的變數或對組態檔案進行調整:
donnie@ubuntu3:/etc/apparmor.d/tunables$ ls -l
total 56
-rw-r--r-- 1 root root 624 Mar 15 2017 alias
-rw-r--r-- 1 root root 376 Mar 15 2017 apparmorfs
-rw-r--r-- 1 root root 804 Mar 15 2017 dovecot
-rw-r--r-- 1 root root 694 Mar 15 2017 global
-rw-r--r-- 1 root root 983 Mar 15 2017 home
...
自訂 AppArmor 組態檔案
雖然空間不允許我們詳細介紹如何從頭開始編寫自己的 AppArmor 組態檔案,但以下是一些範例規則:
| 規則 | 說明 |
|---|---|
/var/run/some_program.pid rw, | 程式對該程式 ID 檔案具有讀寫許可權。 |
/etc/ld.so.cache r, | 程式對該檔案具有讀取許可權。 |
/tmp/some_program.* l, | 程式能夠建立和刪除具有 some_program 名稱的連結。 |
/bin/mount ux | 程式對 mount 工具具有可執行許可權,並且將無限制地執行(即沒有 AppArmor 組態檔案)。 |
使用 AppArmor 命令列工具
是否具備所有必要的 AppArmor 工具取決於您的 Linux 發行版。在 OpenSUSE Leap 工作站上,這些工具是預設安裝的。在 Ubuntu Server 虛擬機器上,您需要自行安裝:
sudo apt install apparmor-utils
首先,讓我們檢視 Ubuntu 機器上的 AppArmor 狀態:
donnie@ubuntu2204-packt:~$ sudo aa-status
apparmor module is loaded.
61 profiles are loaded.
43 profiles are in enforce mode.
...
圖表翻譯:
此圖示呈現了 AppArmor 的狀態,包括已載入的組態檔案數量和強制執行模式的數量。
AppArmor 的執行模式
AppArmor 有兩種模式:強制執行模式(enforce mode)和投訴模式(complain mode)。強制執行模式與 SELinux 的強制執行模式相同,防止系統程式執行不符合活動策略的操作,並記錄任何違規行為。
投訴模式與 SELinux 的寬容模式(permissive mode)相同,允許程式執行不符合活動策略的操作,但會將這些操作記錄在日誌檔案中。
大多數強制執行模式的組態檔案與網路管理或 lxc 容器管理相關。兩個例外是 snapd 的組態檔案,snapd 是使 snap 軟體套件技術生效的守護程式。
AppArmor 組態與疑難排解
在 Ubuntu 上安裝 daemon 套件時,有時會附帶預先定義的 AppArmor 組態檔,有時則不會。即使安裝了套件並附帶組態檔,也有可能預設為強制模式(enforce mode)或非強制模式。例如,在設定 DNS 伺服器並安裝 bind9 套件時,會得到一個已經處於強制模式的 AppArmor 組態檔;而安裝 mysql-server 套件時,也會獲得一個有效的組態檔並且預設為強制模式。
不同套件的 AppArmor 組態差異
然而,當安裝 mariadb-server 替代 mysql-server 時,會發現 AppArmor 組態檔被預設停用。檢視 usr.sbin.mysqld 組態檔內容時,可以看到以下註解:
# 此檔案故意留空,以預設停用較新版本的 MariaDB 的 AppArmor,
# 同時提供與舊版本和 MySQL 的無縫升級。
# 預設情況下,我們不希望為 MariaDB 伺服器設定任何 AppArmor 組態檔。
# 它並未提供太多有用的功能或安全性,反而會為使用者帶來問題,
# 而許多使用者甚至不知道系統上正在執行 AppArmor。
# 使用者可以自行修改和維護自己的組態檔,在此情況下將會被使用。
# 當從舊版本升級時,修改過組態檔案的使用者將被提示是否保留或丟棄該組態檔,
# 而對於預設安裝,我們將自動停用該組態檔。
另一方面,安裝 Samba 伺服器的 samba 套件時,並不會附帶任何 AppArmor 組態檔。需要額外安裝 apparmor-profiles 和 apparmor-profiles-extra 套件來取得相關組態:
sudo apt install apparmor-profiles apparmor-profiles-extra
安裝後,組態檔預設處於投訴模式(complain mode)。可以使用 aa-enforce 工具將 Samba 相關的組態檔切換至強制模式:
sudo aa-enforce /usr/sbin/nmbd usr.sbin.nmbd
sudo aa-enforce /usr/sbin/smbd usr.sbin.smbd
需注意,重新啟動 Samba 服務後,AppArmor 的保護才會生效。
切換 AppArmor 組態模式
AppArmor 提供多種工具來管理組態檔的模式:
| 命令 | 說明 |
|---|---|
aa-audit | 將組態檔設定為稽核模式(audit mode),記錄允許和拒絕的操作 |
aa-disable | 完全停用組態檔 |
aa-complain | 將組態檔設定為投訴模式 |
稽核模式範例程式碼與解析
以下是一個範例稽核模式設定:
sudo aa-audit /usr/sbin/smbd
內容解密:
sudo:使用管理員許可權執行命令。aa-audit:將指定程式的 AppArmor 組態設定為稽核模式。/usr/sbin/smbd:Samba 服務的執行檔路徑。
疑難排解:Ubuntu 16.04 中的 Samba 組態問題
在 Ubuntu 16.04 中,嘗試重新啟動 Samba 服務時可能會遇到錯誤:
sudo systemctl restart smbd
Job for smbd.service failed because the control process exited with error code.
檢視服務狀態時,可以看到錯誤訊息:
sudo systemctl status smbd
● smbd.service - LSB: start Samba SMB/CIFS daemon (smbd)
Loaded: loaded (/etc/init.d/smbd; bad; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2017-12-05 14:56:35 EST; 13s ago
Docs: man:systemd-sysv-generator(8)
Process: 31160 ExecStop=/etc/init.d/smbd stop (code=exited, status=0/SUCCESS)
Process: 31171 ExecStart=/etc/init.d/smbd start (code=exited, status=1/FAILURE)
Dec 05 14:56:35 ubuntu3 systemd[1]: Starting LSB: start Samba SMB/CIFS daemon (smbd)...
Dec 05 14:56:35 ubuntu3 smbd[31171]: * Starting SMB/CIFS daemon smbd
Dec 05 14:56:35 ubuntu3 smbd[31171]: ...fail!
進一步檢視 /var/log/syslog 日誌,可以發現與 AppArmor 相關的錯誤訊息:
Dec 5 20:09:10 ubuntu3 kernel: [174226.392671] audit: type=1400 audit(1512522550.765:510): apparmor="DENIED" operation="lock" profile="/usr/sbin/smbd" pid=14612 comm="smbd" requested_mask="c" denied_mask="c" fsuid=0 ouid=0
此錯誤表示 AppArmor 組態阻止了 Samba 服務的正常運作。### 疑難排解與進階操作
使用 Plantuml 圖表說明 AppArmor 工作流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title AppArmor組態檔案與實用工具詳解
package "Linux Shell 操作" {
package "檔案操作" {
component [ls/cd/pwd] as nav
component [cp/mv/rm] as file
component [chmod/chown] as perm
}
package "文字處理" {
component [grep] as grep
component [sed] as sed
component [awk] as awk
component [cut/sort/uniq] as text
}
package "系統管理" {
component [ps/top/htop] as process
component [systemctl] as service
component [cron] as cron
}
package "管線與重導向" {
component [| 管線] as pipe
component [> >> 輸出] as redirect
component [$() 命令替換] as subst
}
}
nav --> file : 檔案管理
file --> perm : 權限設定
grep --> sed : 過濾處理
sed --> awk : 欄位處理
pipe --> redirect : 串接命令
process --> service : 服務管理
note right of pipe
命令1 | 命令2
前者輸出作為後者輸入
end note
@enduml
圖表翻譯: 此圖示呈現了 AppArmor 在服務啟動過程中的檢查流程:
- 當服務啟動時,系統會檢查是否存在對應的 AppArmor 組態。
- 若組態存在且啟用,則進入強制模式檢查。
- 若透過檢查,服務正常啟動;若未透過,AppArmor 將記錄稽核日誌並阻擋操作。
詳細分析與解決方案
檢查 AppArmor 狀態與日誌
首先,確認系統中 AppArmor 是否正在執行:sudo apparmor_status檢視相關日誌以定位問題:
sudo journalctl -xe | grep apparmor調整 Samba 組態
編輯/etc/apparmor.d/usr.sbin.smbd組態檔,新增必要的檔案存取規則,例如:/var/lib/samba/** rwk, /var/log/samba/** rwk,過載 AppArmor 組態
修改完成後,過載組態以使變更生效:sudo systemctl reload apparmor重啟 Samba 服務
確保變更生效並檢查服務狀態:sudo systemctl restart smbd sudo systemctl status smbd
最佳實踐與注意事項
- 定期檢查 AppArmor 狀態
確保所有必要服務都有正確的 AppArmor 組態。 - 測試組態變更
在投訴模式下測試新組態,以避免影響服務運作。 - 監控稽核日誌
及時發現並處理潛在的安全問題或組態錯誤。
透過上述步驟,可以有效解決因 AppArmor 組態導致的服務啟動失敗問題,並提升系統的安全性與穩定性。
AppArmor 設定檔疑難排解實務
在 Ubuntu 系統中,AppArmor 是一種強制性存取控制(MAC)安全模組,用於限制程式的許可權,防止惡意程式對系統造成損害。然而,在某些情況下,AppArmor 的設定檔可能會出現錯誤或與某些服務(如 Samba)不相容的問題,導致服務無法正常啟動。本文將探討如何在 Ubuntu 16.04、18.04 和 22.04 中對 AppArmor 設定檔進行疑難排解。
Ubuntu 16.04 中的 Samba AppArmor 設定檔問題
在 Ubuntu 16.04 中,Samba 的 AppArmor 設定檔存在一個已知問題。當啟用 AppArmor 的強制模式(enforce mode)時,Samba 服務無法正常啟動。檢視 /var/log/syslog 檔案,可以看到相關的錯誤訊息:
apparmor="DENIED" operation="open" profile="/usr/sbin/smbd" name="/run/samba/msg.lock"
這個錯誤訊息表明,Samba 嘗試存取 /run/samba/msg.lock 目錄,但 AppArmor 設定檔不允許此操作。
解決方案
編輯
/etc/apparmor.d/usr.sbin.smbd檔案,並在規則集的末尾新增以下行:/run/samba/** rw,這行規則允許 Samba 對
/run/samba/目錄下的所有檔案進行讀寫操作。使用
apparmor_parser工具重新載入設定檔:sudo apparmor_parser -r usr.sbin.smbd重新啟動 Samba 服務:
sudo systemctl restart smbd
Ubuntu 18.04 中的 Samba AppArmor 設定檔問題
在 Ubuntu 18.04 中,Samba 的 AppArmor 設定檔存在另一個問題。檢視 /var/log/syslog 檔案,可以看到相關的錯誤訊息:
audit: type=1400 audit(...): apparmor="DENIED" operation="capability" profile="/usr/sbin/smbd" capability=net_admin
audit: type=1400 audit(...): apparmor="DENIED" operation="open" profile="/usr/sbin/smbd" name="/run/systemd/notify"
這些錯誤訊息表明,Samba 需要 net_admin 功能來正常存取網路,且需要對 /run/systemd/notify socket 檔案進行寫入操作。
解決方案
編輯
/etc/apparmor.d/usr.sbin.smbd檔案:- 在
capability部分新增capability net_admin,。 - 在規則集的末尾新增
/run/systemd/notify rw,。
- 在
重新載入設定檔並重新啟動 Samba 服務:
sudo apparmor_parser -r usr.sbin.smbd sudo systemctl restart smbd
Ubuntu 22.04 中的 Samba AppArmor 設定檔問題
在 Ubuntu 22.04 中,Samba 的 AppArmor 設定檔已修復相關問題。然而,目前存在一個 Samba 的 bug,可能會導致 Samba 在 AppArmor 設定檔啟用時無法啟動。
解決方案
此問題預計將在未來的更新中修復。目前,可以參考 Ubuntu 18.04 中的解決方案進行臨時處理。
手動實驗室:AppArmor 設定檔疑難排解
在 Ubuntu 18.04 虛擬機器上安裝必要的套件:
sudo apt install apparmor-utils apparmor-profiles apparmor-profiles-extra samba設定 Samba 服務的 AppArmor 設定檔為強制模式,並嘗試重新啟動 Samba。
檢視
/var/log/syslog檔案以找出問題所在。編輯
/etc/apparmor.d/usr.sbin.smbd檔案,新增必要的規則。重新載入設定檔並重新啟動 Samba 服務。
確認 Samba 是否正常運作。
透過這些步驟,您可以學習如何對 AppArmor 設定檔進行疑難排解,並修復與 Samba 相關的問題。