返回文章列表

AppArmor組態檔案與實用工具詳解

本文探討 AppArmor 組態檔案語法、結構和常用工具,涵蓋組態檔案的讀取許可權設定、萬用字元使用、變數應用,以及如何自訂規則。同時,文章也提供 Ubuntu 系統下 AppArmor 命令列工具的使用,例如檢視狀態、切換執行模式等。此外,針對 Samba 服務在 Ubuntu 16.04、18.04 和

系統管理 資安

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-profilesapparmor-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

內容解密:

  1. sudo:使用管理員許可權執行命令。
  2. aa-audit:將指定程式的 AppArmor 組態設定為稽核模式。
  3. /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 在服務啟動過程中的檢查流程:

  1. 當服務啟動時,系統會檢查是否存在對應的 AppArmor 組態。
  2. 若組態存在且啟用,則進入強制模式檢查。
  3. 若透過檢查,服務正常啟動;若未透過,AppArmor 將記錄稽核日誌並阻擋操作。

詳細分析與解決方案

  1. 檢查 AppArmor 狀態與日誌
    首先,確認系統中 AppArmor 是否正在執行:

    sudo apparmor_status
    

    檢視相關日誌以定位問題:

    sudo journalctl -xe | grep apparmor
    
  2. 調整 Samba 組態
    編輯 /etc/apparmor.d/usr.sbin.smbd 組態檔,新增必要的檔案存取規則,例如:

    /var/lib/samba/** rwk,
    /var/log/samba/** rwk,
    
  3. 過載 AppArmor 組態
    修改完成後,過載組態以使變更生效:

    sudo systemctl reload apparmor
    
  4. 重啟 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 設定檔不允許此操作。

解決方案

  1. 編輯 /etc/apparmor.d/usr.sbin.smbd 檔案,並在規則集的末尾新增以下行:

    /run/samba/** rw,
    

    這行規則允許 Samba 對 /run/samba/ 目錄下的所有檔案進行讀寫操作。

  2. 使用 apparmor_parser 工具重新載入設定檔:

    sudo apparmor_parser -r usr.sbin.smbd
    
  3. 重新啟動 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 檔案進行寫入操作。

解決方案

  1. 編輯 /etc/apparmor.d/usr.sbin.smbd 檔案:

    • capability 部分新增 capability net_admin,
    • 在規則集的末尾新增 /run/systemd/notify rw,
  2. 重新載入設定檔並重新啟動 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 設定檔疑難排解

  1. 在 Ubuntu 18.04 虛擬機器上安裝必要的套件:

    sudo apt install apparmor-utils apparmor-profiles apparmor-profiles-extra samba
    
  2. 設定 Samba 服務的 AppArmor 設定檔為強制模式,並嘗試重新啟動 Samba。

  3. 檢視 /var/log/syslog 檔案以找出問題所在。

  4. 編輯 /etc/apparmor.d/usr.sbin.smbd 檔案,新增必要的規則。

  5. 重新載入設定檔並重新啟動 Samba 服務。

  6. 確認 Samba 是否正常運作。

透過這些步驟,您可以學習如何對 AppArmor 設定檔進行疑難排解,並修復與 Samba 相關的問題。