Linux 稽核系統提供強大的日誌記錄功能,能追蹤系統活動,協助資安事件調查和系統除錯。本文將探討 auditd 的組態與使用,包含規則設定、日誌管理、以及監控 Docker 容器活動等導向。透過 auditd,管理員可以捕捉系統呼叫、檔案存取等關鍵事件,並利用 ausearch 等工具分析日誌,有效提升系統安全性與可監控性。實務上,需注意 auditd 規則的順序及日誌儲存空間管理,避免系統負載過重或磁碟空間不足。

數位鑑識日誌記錄

在前面的章節中,我們探討瞭如何確保容器以最低許可權執行,並瞭解如何捕捉和強制規範容器中的異常行為。然而,正如任何經驗豐富的專業人士所說,安全遠不止於強制執行。

由於Linux內核的巧妙設計,有一種相對直接的方法可以監控容器執行時和協調器與其底層主機之間的互動。可以在執行系統上記錄不僅每個系統操作,還包括每次系統呼叫(syscall),即程式向內核請求某些操作時發生的事件。

為什麼要這樣做?至少有兩個很好的理由。

首先,稽核跟蹤提供了追蹤攻擊者如何入侵或部分入侵容器或主機的能力。您可以對這些日誌進行取證分析,逐步遍歷任何事件,並透過足夠的瞭解每個步驟所涉及的內容,追蹤攻擊者的足跡。其次,擁有如此高階別的詳細運算元據可供您使用,可以使效能調優和應用程式除錯成為可能。您可以準確地看到應用程式正在做什麼,然後根據需要進行微調。

在本章中,我們將探討所謂的“Linux稽核系統的使用者空間元件”,根據man頁面的描述。 auditd是一個與Linux稽核系統互動的方式,將系統事件寫入磁碟。該命令允許您定義儲存日誌檔案的天數,任何早於該天數的日誌檔案都會被自動刪除。

實施細節

我們將探討如何在本地主機上管理合理的日誌檔案數量,以避免用可能非常嘈雜的日誌檔案填滿磁碟。例如,在繁忙的Kubernetes主機上,容器不斷被停止和啟動,日誌可能會迅速填滿。在使用auditd時,請確保密切監控初始日誌記錄活動。如果日誌過於嘈雜,您可能會發現,與其在本地保留30天的日誌,不如將它們儲存更短的時間。如果您是在可以承擔大量日誌資料儲存的大型組織中工作,您也可以使用syslog將這些日誌轉發到上游系統,如Splunk(www.splunk.com),或者建立自己的Syslog接收器,然後清除較舊的日誌檔案。

另一個不太明顯的容量問題是,您需要注意auditd監控規則的順序。這是因為如果您選擇使用廣泛的規則,每個核心/系統互動都將被記錄到磁碟。如果您熟悉內核的Netfilter(通常用於防火牆)和其使用者空間夥伴IPtables,規則是按順序處理的,從上到下。同樣適用於此;換句話說,如果您的第一個auditd規則滿足超過50%的系統呼叫,那麼後續規則大部分時間都不會被處理。因此,您的auditd規則集處理效率更高,系統呼叫也更快,這可以加快您的系統速度。

相關檔案

我們首先來看看構成auditd套件的檔案。可以肯定的是,auditd在Red Hat Enterprise Linux上比在其他Linux發行版上更常見。也就是說,下面的命令顯示了一個Debian伺服器正在無問題地託管該套件。由於Ubuntu對auditd的實作與Debian相同,我們將在本章中使用Debian(Buster)伺服器。唯一的區別是Debian捆綁了兩個簡單的示例檔案。 auditd的好處是,當涉及到Linux發行版的成員時,就像Ubuntu和Debian一樣,組態將是相同的。事實上,在其他Linux發行版(例如Red Hat Enterprise Linux衍生版)之間轉移組態也很常見(可能除了檔案路徑和特定於發行版的套件名稱)。這是因為auditd只是將相對標準的核心事件活動轉換回人類可讀的格式。

$ dpkg -l | grep audit
ii auditd 1:2.8.4-3 amd64
User space tools for security auditing
ii libaudit-common 1:2.8.4-3 all
Dynamic library for security auditing-common files
ii libaudit1:amd64 1:2.8.4-3 amd64
Dynamic library for security auditing
ii libauparse0:amd64 1:2.8.4-3 amd64
Dynamic library for parsing security auditing

請注意,在此階段,您的auditd組態大多數將駐留在/etc/audit目錄中:

$ ls /etc/audit
auditd.conf auditd.conf.dpkg-dist audit.rules audit.rules.prev audit-stop.rules rules.d/

我們首先來看看auditd.conf檔案,因為您可以看到auditd.conf.dpkg-dist的存在是原始組態的提醒,以防我們需要它。保留預設檔案的副本是及時的,因為正如您將看到的那樣,有一些細微差別的規則集需要微調,在您熟悉語法之前,排版錯誤可能會很常見。

內容解密:

  • /etc/audit目錄包含了auditd的主要組態檔案。
  • auditd.conf是用於組態auditd行為的主要檔案。
  • 保留預設組態檔案的副本(如auditd.conf.dpkg-dist)對於在需要時還原或對比組態非常有用。
  • auditd的組態在不同的Linux發行版之間具有一定的相容性,尤其是對於同一家族的發行版。

auditd 組態與規則設定詳解

在 Linux 系統中,auditd 是一個用於記錄系統活動的重要工具,尤其是在安全性和合規性方面。本篇文章將探討 auditd 的組態檔案和規則設定,以幫助您更好地理解和使用這個強大的工具。

auditd 組態檔案解析

auditd 的主要組態檔案是 auditd.conf,它控制著 auditd 守護程式的行為。以下是組態檔案中的一些重要設定:

日誌設定

  • log_file = /var/log/audit/audit.log:指定 auditd 日誌的儲存位置。
  • log_format = RAW:設定日誌的格式為原始格式。
  • num_logs = 5:預設情況下,auditd 會保留 5 個日誌檔案。為了方便檔案存取和攜帶性,我們可以將其設定為 num_logs = 20

日誌大小與輪替

  • max_log_file = 50:設定每個日誌檔案的最大大小為 50MB。
  • max_log_file_action = ROTATE:當日誌檔案達到最大大小時,執行輪替操作。

磁碟空間管理

  • admin_space_left = 50:當磁碟剩餘空間低於 50MB 時,觸發 admin_space_left_action 設定的動作。
  • admin_space_left_action = SUSPEND:當磁碟空間不足時,暫停 auditd 的寫入操作,以避免系統當機。

auditd 規則設定

auditd 的規則設定允許您自定義要監控的系統活動。規則主要分為兩種型別:檔案系統規則和系統呼叫規則。

檔案系統規則

檔案系統規則用於監控特設定檔案或目錄的活動。例如,要監控 Docker Engine 的活動,可以新增以下規則:

-w /usr/bin/docker -p rwxa -k docker-daemon

這條規則的意思是:

  • -w /usr/bin/docker:監控 /usr/bin/docker 檔案的活動。
  • -p rwxa:捕捉讀取、寫入、執行和屬性變更等操作。
  • -k docker-daemon:為這條規則設定一個鍵名,以便於在日誌中識別相關記錄。

系統呼叫規則

系統呼叫規則用於監控特定的系統呼叫。例如,要捕捉更改系統主機名的操作,可以使用以下規則:

-a always,exit -F arch=b64 -S sethostname -S setdomainname -k system-files

這條規則的意思是:

  • -a always,exit:總是在系統呼叫離開時記錄事件。
  • -F arch=b64:指定要監控的架構為 64 位元。
  • -S sethostname -S setdomainname:監控 sethostnamesetdomainname 系統呼叫。
  • -k system-files:為這條規則設定一個鍵名。
內容解密:
  1. 組態檔案:瞭解 auditd.conf 中的重要引數及其作用,如日誌路徑、格式、日誌輪替等。
  2. 日誌管理:學習如何調整日誌數量和大小,以滿足實際需求。
  3. 磁碟空間管理:理解如何設定磁碟空間閾值和對應動作,以防止系統因磁碟空間耗盡而當機。
  4. 檔案系統規則:掌握如何新增規則以監控特設定檔案或目錄的活動,如 Docker Engine。
  5. 系統呼叫規則:學習如何監控特定的系統呼叫,如更改主機名的操作。

稽核日誌(Forensic Logging)與 auditd 組態詳解

稽核日誌是系統安全的重要組成部分,透過詳細記錄系統活動,管理員能夠在事後分析潛在的安全威脅和系統異常行為。Linux 系統中,auditd 是一個強大的稽核守護程式,用於監控和記錄系統呼叫、檔案存取、使用者行為等關鍵資訊。

auditd 規則型別與組態

auditd 的組態主要透過規則(rules)來實作,這些規則定義了哪些事件需要被記錄。規則主要分為三類別:

  1. 檔案監控規則:用於監控特設定檔案或目錄的存取行為。
  2. 系統呼叫規則:用於捕捉特定的系統呼叫,例如 mountunmount 等。
  3. 控制規則:用於控制 auditd 的行為,例如設定緩衝區大小、刪除現有規則等。

規則語法與範例

規則的基本語法如下:

-a [always|never],<list_option> -S <syscall_name> -F <field>=<value>

範例:

-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts

此規則表示:在 64 位元架構下,當 mount 系統呼叫離開時,如果使用者的登入 UID 大於或等於 1000 且不是 4294967295(表示未登入的使用者),則記錄該事件,並加上 mounts 關鍵字。

列表選項(List Options)詳解

列表選項描述
task罕見選項,僅在 forkclone 系統呼叫時捕捉。
entry在系統呼叫入口處觸發,可能因 exit 選項提供更多可見性而被棄用。
exit在系統呼叫離開時觸發,常用於過濾器,因為它提供所有欄位的存取許可權。
user使用者空間事件過濾,可使用 uidauidgidpid 等欄位。
exclude結合 msgtype 使用,以排除特定事件,例如排除 CWD(當前工作目錄)事件。

auditd 組態檔與目錄結構

主要的組態目錄為 /etc/audit,其中包含以下重要檔案:

  • auditd.conf:用於設定 auditd 守護程式的行為。
  • audit.rules:目前生效的稽核規則,由 auditd/etc/audit/rules.d/ 目錄中的規則檔案解析而來。
  • rules.d/ 目錄:用於存放自定義的稽核規則檔案,所有以 .rules 結尾的檔案都會被解析。

組態檔範例與解析

/etc/audit/rules.d/audit.rules 檔案中,我們可以定義自定義規則。例如:

-D
-b 320

第一行 -D 表示清除所有現有的規則,第二行 -b 320 設定核心緩衝區大小為 320 KB。

auditctl 命令詳解

auditctl 是用於控制 auditd 行為的命令列工具。例如,使用 -s 選項可以檢視目前的稽核狀態:

$ auditctl -s
enabled 2
failure 1

此輸出表示稽核功能已啟用,並且在失敗時採取特定動作。

最佳實踐與注意事項

  1. 自定義規則:將自定義規則存放在 /etc/audit/rules.d/ 目錄下的 .rules 檔案中,以便於管理和維護。
  2. 緩衝區大小調整:根據系統記憶體大小和稽核需求調整緩衝區大小,以避免記憶體浪費或稽核事件丟失。
  3. 關鍵字標記:使用 -k 選項為相關的稽核事件加上關鍵字,便於後續查詢和分析。

透過上述組態和最佳實踐,管理員可以有效地利用 auditd 進行系統稽核,提升系統的安全性和可監控性。

auditd 設定與規則管理詳解

auditd 是一種 Linux 上的監控工具,用於記錄系統活動。正確設定 auditd 需要了解其設定檔和規則管理。

檢查 auditd 狀態

要檢查 auditd 的狀態,可以使用 auditctl -s 命令:

$ auditctl -s
enabled 1
failure 1
pid 325
rate_limit 0
backlog_limit 320
lost 0
backlog 0
backlog_wait_time 15000
loginuid_immutable 0 unlocked

該命令輸出的資訊包括:

  • enabled:是否啟用 auditd。
  • failure:當 auditd 無法記錄事件時的處理方式。
  • pid:auditd 的行程 ID。
  • rate_limit:事件記錄速率限制。
  • backlog_limit:事件緩衝區大小限制。
  • lost:因緩衝區滿而丟失的事件數量。
  • backlog:目前緩衝區中的事件數量。
  • backlog_wait_time:當緩衝區滿時,等待的時間。

緩衝區大小設定

為了確保系統活動能夠被完整記錄,需要設定足夠大的緩衝區。可以透過檢查 backlog 的值來確定是否需要增加緩衝區大小。如果 lost 的值不為零,表示有事件被丟失,需要增加緩衝區大小。

設定 auditd 規則

auditd 的規則可以用來指定要監控的系統活動。規則可以透過 auditctl 命令或設定檔來設定。

使用 auditctl 設定規則

可以使用 auditctl 命令來設定規則,例如:

$ auditctl -w /var/log/lastlog -p wa -k catch-logins

該命令會監視 /var/log/lastlog 檔案的寫入和屬性變更,並將相關事件記錄到 /var/log/audit/audit.log 中,關鍵字為 catch-logins

使用設定檔設定規則

也可以將規則寫入 /etc/audit/rules.d/ 目錄下的檔案中,例如 audit.rules

# First rule—delete all
-D

# Increase the buffers to survive stress events such as DDoS attacks.
# Make this larger (e.g. 8192) for busy systems
-b 320

# Login and Logout events are captured
-w /var/log/lastlog -p wa -k catch-logins

# Don't enable immutability
#(if you set this to "2" you need a reboot to make changes)
-e 1

然後使用 augenrules --load 命令載入規則。

載入和檢查規則

可以使用 augenrules --check 命令檢查規則檔案的語法是否正確。如果正確,可以使用 augenrules --load 命令載入規則。

載入規則後,可以使用 auditctl -l 命令列出目前生效的規則。

測試規則

可以透過觸發相關事件來測試規則是否生效。例如,如果設定了監視 /var/log/lastlog 檔案的規則,可以嘗試登入系統,然後檢查 /var/log/audit/audit.log 中是否有相關事件記錄。

$ cat /var/log/audit/audit.log | grep 'catch-logins'
type=CONFIG_CHANGE msg=audit(1595611642.941:886): auid=1000 ses=17 subj==unconfined op=add_rule key="catch-logins" list=4 res=1

不可變規則

auditd 支援不可變規則,可以防止攻擊者修改規則。要啟用不可變規則,需要將 /etc/audit/audit.rules 檔案中的 -e 選項設為 2,然後重新啟動系統。

要修改不可變規則,需要先將 -e 選項設為 1,然後重新載入規則,修改完成後再將 -e 選項設為 2,並重新載入規則。

程式碼解析

下面是範例程式碼,用於監視 /var/log/lastlog 檔案的寫入和屬性變更:

-w /var/log/lastlog -p wa -k catch-logins

內容解密:

  • -w:指定要監視的檔案或目錄。
  • /var/log/lastlog:要監視的檔案路徑。
  • -p:指定要監視的操作型別(wa 表示寫入和屬性變更)。
  • wa:操作型別,包括寫入(w)和屬性變更(a)。
  • -k:指定事件記錄的關鍵字。
  • catch-logins:事件記錄的關鍵字。

這個範例程式碼用於監視 /var/log/lastlog 檔案的寫入和屬性變更,並將相關事件記錄到 /var/log/audit/audit.log 中,關鍵字為 catch-logins

4.1 法醫日誌記錄(Forensic Logging)與監控

在現代的系統管理中,詳細的日誌記錄對於安全性和故障排除至關重要。Linux 提供了 auditd 服務來幫助管理員實作詳細的系統日誌記錄。本文將探討如何利用 auditd 來監控 Docker 容器的活動。

設定 auditd 以捕捉特定事件

首先,我們需要設定 auditd 以捕捉特定的系統事件。例如,若要監控登入事件,可以新增以下規則:

auditctl -a exit,always -F arch=b64 -S open -k catch-logins

執行上述命令後,當登入事件發生時,auditd 將記錄相關的日誌。我們可以透過以下命令檢視這些日誌:

cat /var/log/audit/audit.log | grep 'catch-logins'

內容解密:

  • auditctl:用於控制 auditd 服務的命令。
  • -a exit,always:表示在指定系統呼叫離開時總是記錄日誌。
  • -F arch=b64:指定要監控的系統架構(此處為 64 位元)。
  • -S open:指定要監控的系統呼叫(此處為 open)。
  • -k catch-logins:為該規則設定一個鍵值(key),以便於日後搜尋相關日誌。

監控 Docker 容器的活動

若要監控 Docker 容器的活動,可以新增以下規則:

auditctl -w /usr/bin/docker -p rwxa -k docker-daemon

執行 docker run -d -p80:80 nginx 命令後,auditd 將記錄 Docker 相關的操作。我們可以透過以下命令檢視這些日誌:

cat /var/log/audit/audit.log | grep docker

內容解密:

  • auditctl -w:用於新增監視規則。
  • /usr/bin/docker:要監視的檔案或目錄。
  • -p rwxa:指定要監視的操作(讀取、寫入、執行、屬性變更)。
  • -k docker-daemon:為該規則設定一個鍵值。

使用 ausearch 命令分析日誌

由於 auditd 產生的日誌量可能非常龐大,因此需要使用 ausearch 命令來高效地搜尋和分析日誌。例如:

ausearch -i | grep -i "docker"

內容解密:

  • ausearch:用於搜尋和分析 auditd 日誌的命令。
  • -i:表示以可讀格式輸出日誌。
  • grep -i "docker":用於過濾包含 “docker” 的日誌行。

其他有用的 auditd 命令

除了 ausearch 之外,auditd 還提供了其他有用的命令,例如:

  • aulastlog:用於檢查使用者最近的登入記錄。
  • aulast:用於顯示系統啟動和關閉的時間。
  • aureport:用於生成日誌報告。

這些命令都有助於更好地理解和分析系統活動,從而提高安全性和故障排除的效率。