一、概述
Linux audit通過分析系統上正在發生的細節信息,能夠有效幫助您提高系統的安全。但是,它本身不提供額外的安全性保障----它不會保護你的系統免受代碼故障或者任何類型的漏洞攻擊。Audit服務對跟蹤這些安全問題非常有用,並且有效幫助我們采取何種針對性的安全措施。
Audit由幾個組件組成,每個組件都為整個框架提供重要功能。Linux audit(kauditd) 內核模塊攔截系統調用並記錄相關事件。 auditd守護進程將審計報告寫入磁盤。各種命令行實用程序負責顯示,查詢和存檔審計跟蹤。
1. 將用戶與進程關聯
Audit將進程映射到啟動它們的用戶標識。這使得管理員或安全人員能夠精確地跟蹤哪個用戶擁有哪個進程並且可能在系統上進行惡意操作。
2. 審查審計線索
Linux Audit 提供了將審計報告寫入磁盤並將其轉換為可讀格式的工具。
3. 審查特定的審計事件
Audit提供了一個實用程序,允許您篩選特定感興趣事件的審計報告。你可以根據下面的內容過濾:
- User
- Group
- Audit ID
- Remote Host Name
- Remote Host Address
- System Call
- System Call Arguments
- File
- File Operations
- Success or Failure
4. 應用選擇性審計
Audit提供了篩選感興趣事件的審計報告並調整審計以僅記錄所選事件的手段。您可以創建自己的一組規則,並讓審計守護進程僅記錄您感興趣的規則。
5. 保證報告數據的可用性
審計報告由root擁有,因此只能由root用戶移除。未經授權的用戶不能刪除審計日志。
6. 防止審計數據丟失
如果內核內存不足,審計守護進程的積壓被超過,或者超過了速率限制,審計可以觸發系統關閉,以防止事件逃離審計的控制。此關閉將立即停止由審核內核組件觸發的系統,而不會將最新日志同步到磁盤。默認配置是將警告記錄到系統日志中,而不是掛起系統。
如果系統在記錄時磁盤空間不足,則可以將審計系統配置為執行干凈關閉。缺省配置指示審計守護程序在磁盤空間不足時停止記錄。
二、Linux Audit Service 架構
(Linux Audit framwork)
(1)組件
1.auditd
審計守護進程負責將通過審計內核接口生成並由應用程序和系統活動觸發的審計消息寫入磁盤。審計守護進程啟動的方式由systemd控制。審計系統功能(啟動時)由/etc/audit/auditd.conf控制。
2.auditctl
auditctl實用程序控制審計系統。它控制審計界面的日志生成參數和內核設置,以及確定哪些事件被跟蹤的規則集。
3. audit rules
文件/etc/audit/audit.rules包含一系列auditctl命令,它們在啟動審計守護程序后立即在系統引導時加載。
4. aureport
aureport實用程序允許您從審核事件日志中創建自定義報告。這種報告生成可以很容易地編寫腳本,輸出可以被各種其他應用程序使用,例如,繪制這些結果。
5. ausearch
ausearch實用程序可以使用各種密鑰或記錄格式的其他特征在審計日志文件中搜索某些事件。
6.audispd
審計調度程序守護進程(audispd)可用於將事件通知轉發給其他應用程序,而不是將它們寫入審計日志中的磁盤(或除此之外)。
7.autrace
autrace實用程序以與strace類似的方式跟蹤各個進程。 autrace的輸出被記錄到審計日志中。打印上次登錄用戶的列表,與上次類似。 aulast通過審計日志(或給定的審計日志文件)進行搜索,並根據審計日志中的時間范圍顯示所有用戶登錄和注銷的列表。
8.aulastlog
為類似於lastlog的機器的所有用戶打印上次登錄。登錄名稱,端口和上次登錄時間將被打印。
(2) Audit 進程的配置
Audit進程的配置文件是保存在/etc/audit/auditd.conf里的。
log_file = /var/log/audit/audit.log
log_format = RAW
log_group = root
priority_boost = 4
flush = INCREMENTAL
freq = 20
num_logs = 5
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 6
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
##tcp_listen_port =
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
cp_client_max_idle = 0
1. log_file
審計日志文件的完整路徑。如果您配置守護進程向除默認/var/log/audit/外的目錄中寫日志文件時,一定要修改它上面的文件權限,使得只有根用戶有讀、寫和執行權限。所有其他用戶都不能訪問這個目錄或這個目錄中的日志文件。
2. log_format
寫日志時要使用的格式。當設置為RAW時,數據會以從內核中檢索到的格式寫到日志文件中。當設置為NOLOG時,數據不會寫到日志文件中,但是如果用dispatcher選項指定了一個,則數據仍然會發送到審計事件調度程序中。
3. priority_boost
審計應采用多少優先級推進守護進程。必須是非負數。0表示沒有變化。
4. flush
多長時間向日志文件中寫一次數據。值可以是NONE、INCREMENTAL、DATA和SYNC之一。如果設置為NONE,則不需要做特殊努力來將數據刷新到日志文件中。如果設置為INCREMENTAL,則用freq選項的值確定多長時間發生一次向磁盤的刷新。如果設置為DATA,則審計數據和日志文件一直是同步的。如果設置為SYNC,則每次寫到日志文件時,數據和元數據是同步的。
5. freq
如果flush設置為INCREMETNAL,審計守護進程在寫到日志文件中前從內核中接收的記錄數。
6. num_logs
max_log_file_action設置為ROTATE時要保存的日志文件數目。必須是0~99之間的數。如果設置為小於2,則不會循環日志。如果遞增了日志文件的數目,就可能有必要遞增/etc/audit/audit.rules中的內核backlog設置值,以便留出日志循環的時間。如果沒有設置num_logs值,它就默認為0,意味着從來不循環日志文件。
7. dispatcher
當啟動這個守護進程時,由審計守護進程自動啟動程序。所有守護進程都傳遞給這個程序。可以用它來進一步定制報表或者以與您的自定義分析程序兼容的不同格式產生它們。自定義程序的示例代碼可以在/usr/share/doc/audit-
8. disp_qos
控制調度程序與審計守護進程之間的通信類型。有效值為lossy和lossless。如果設置為lossy,若審計守護進程與調度程序之間的緩沖區已滿 (緩沖區為128千字節),則發送給調度程序的引入事件會被丟棄。然而,只要log_format沒有設置為nolog,事件就仍然會寫到磁盤中。如果設置為lossless,則在向調度程序發送事件之前和將日志寫到磁盤之前,調度程序會等待緩沖區有足夠的空間。
9. max_log_file
以兆字節表示的最大日志文件容量。當達到這個容量時,會執行max_log_file _action指定的動作。
10. max_log_file_action
當達到max_log_file的日志文件大小時采取的動作。值必須是IGNORE、SYSLOG、SUSPEND、ROTATE和KEEP_LOGS之一。如果設置為IGNORE,則在日志文件達到max_log_file后不采取動作。如果設置為SYSLOG,則當達到文件容量時會向系統日志/var/log/messages中寫入一條警告。如果設置為SUSPEND,則當達到文件容量后不會向日志文件寫入審計消息。如果設置為ROTATE,則當達到指定文件容量后會循環日志文件,但是只會保存一定數目的老文件,這個數目由num_logs參數指定。老文件的文件名將為audit.log.N,其中 N是一個數字。這個數字越大,則文件越老。如果設置為KEEP_LOGS,則會循環日志文件,但是會忽略num_logs參數,因此不會刪除日志文件。
11. space_left
以兆字節表示的磁盤空間數量。當達到這個水平時,會采取space_left_action參數中的動作。
12. space_left_action
當磁盤空間量達到space_left中的值時,采取這個動作。有效值為IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和 HALT。如果設置為IGNORE,則不采取動作。如果設置為SYSLOG,則向系統日志/var/log/messages寫一條警告消息。如果設置為 EMAIL,則從action_mail_acct向這個地址發送一封電子郵件,並向/var/log/messages中寫一條警告消息。如果設置為 SUSPEND,則不再向審計日志文件中寫警告消息。如果設置為SINGLE,則系統將在單用戶模式下。如果設置為SALT,則系統會關閉。
13. action_mail_acct
負責維護審計守護進程和日志的管理員的電子郵件地址。如果地址沒有主機名,則假定主機名為本地地址,比如root。必須安裝sendmail並配置為向指定電子郵件地址發送電子郵件。
14. admin_space_left
以兆字節表示的磁盤空間數量。用這個選項設置比space_left_action更多的主動性動作,以防萬一space_left_action沒有讓管理員釋放任何磁盤空間。這個值應小於space_left_action。如果達到這個水平,則會采取admin_space_left_action所指定的動作。
15. admin_space_left_action
當自由磁盤空間量達到admin_space_left指定的值時,則采取動作。有效值為IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和HALT。與這些值關聯的動作與space_left_action中的相同。
16. disk_full_action
如果含有這個審計文件的分區已滿,則采取這個動作。可能值為IGNORE、SYSLOG、SUSPEND、SINGLE和HALT。與這些值關聯的動作與space_left_action中的相同。
提示:
如果不循環審計日志文件,則含有/var/log/audit/的分區可能變滿並引起系統錯誤。因此,建議讓/var/log/audit/位於一個單獨的專用分區。
17. disk_error_action
如果在寫審計日志或循環日志文件時檢測到錯誤時采取的動作。值必須是IGNORE、SYSLOG、SUSPEND、SINGLE和HALT之一。與這些值關的動作與space_left_action中的相同。
/etc/sysconfig/auditd文件可以用來設置帶EXTRAOPTIONS參數的auditd的命令行選項。唯一的命令行選項-f以調試模式安排守護進程。如果啟用了調試模式,則會出現標准錯誤消息而不是日志文件。AUDITD_LANG設置值可以用來修改守護進程的位置。如果設置為 none,則所有位置信息會從審計環境中刪除。如果AUDITD_CLEAN _STOP選項設置為yes,則當用service auditd stop命令停止守護進程時,會刪除審計規則與觀察器。
18. tcp_listen_port
指定Audit進程監聽的端口區間(1~65535)
19. tcp_listen_queue
設置暫時掛起連接的最大值,不要設置太小的值,因為在某些情況下,例如斷電后,掛起連接的數量可能會很高。
20. tcp_client_ports
設置允許的客戶端端口號范圍。
21. tcp_client_max_idle
指定客戶端最大掛起次數在一定的時間內。
22. tcp_max_per_addr
表示允許來自一個IP地址的並發連接數的數值。
(3)Audit系統的控制命令
1. auditctl
“auditctl -e” 控制Audit功能的開關
“auditctl -f” 設置錯誤級別[0..2] 0=silent, 1=printk, 2=panic
“auditctl -r” 控制Audit消息的速率
“auditctl -b” 設置Audit服務的最大緩存空間,如果緩存空間滿了,指定的錯誤級別動作會被觸發。
“auditctl -s” 查看Audit進程當前的狀態
AUDIT_STATUS: enabled=1 flag=2 pid=3105 rate_limit=0 backlog_limit=8192 lost=0(丟失的Audit消息數) backlog=0(未輸出的Audit緩沖區大小)
2. audit rules
要添加審計規則,可在/etc/audit/audit.rules文件中用下面的語法:
-a
,
audit rule 規則定義在auditctl(8)中。
如:
添加一條audit規則,記錄maj用戶的所用open系統調用
#auditctl-a entry,always -S open -F uid=500
open表示:要查看某一特定用戶打開的文件
在另一個終端以maj用戶登錄,登錄后執行一個ls命令即可
刪除這條audit規則
#auditctl-d entry,always -S open -F uid=500
如不想看到用戶登陸類型的消息,可以如下添加規則:
#auditctl -a exclude,always -F msgtype=USER_LOGIN
這里過濾是以“消息類型”為對象的。
監視/etc/passwd文件被讀、寫、執行、修改文件屬性的操作記錄
#auditctl -w /etc/passwd -p rwax
查看程序所有的系統調用
#auditctl -a entry,always-S all -F pid=1005
查看指定用戶打開的文件
#auditctl -a exit,always-S open -F auid=510
查看不成功的open系統調用
auditctl-a exit,always -S open -F success!=0
(4) Audit log
type=SYSCALL msg=audit(1234874638.599:5207): arch=c000003e syscall=2 success=yes exit=4 a0=62fb60 a1=0 a2=31 a3=0 items=1 ppid=25400 pid
=25616 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1164 comm="less" exe="/usr/bin/less" key="doc_log"
type=CWD msg=audit(1234874638.599:5207): cwd="/root"
type=PATH msg=audit(1234874638.599:5207): item=0 name="/var/log/audit/audit.log" inode=1219041 dev=08:06 mode=0100644 ouid=0 ogid=0 rdev=00:00
type: audit消息類型, 消息類型有100多種,可以查看https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sec-audit_record_types
msg: 消息的ID, 它有兩個部分組成, 分號之前的是Unix的時間戳,分號之后的是真正的event ID, 同一個應用程序的相同system call擁有相同的event ID, 同一個應用的不同system call則不同。
arch: 調用system call的CPU構架, 可以通過ausearch -i來指定搜索相關的log。
syscall: system call的類型, 可以查看https://github.com/torvalds/linux/blob/master/arch/sh/include/asm/unistd.h。
success: system call是成功或者失敗。
exit: system call的返回值。
a0 to a3: 系統調用的前四個參數的數字化,可以通過ausearch解碼查看。
items: 傳遞到應用程序的字符串數量。
ppid: 父進程的PID。
pid: 該進程的PID。
auid: audit ID, 針對某一用戶一個進程會被分配一個audit ID, 該audit ID會被傳遞給子進程,盡管在系統中用戶切換,該audit ID將始終保持一致。 這樣我們可以針對對某一用戶進行trace。
uid: user ID。
gid: group ID。
euid, suid, fsuid: Effective user ID, set user ID, and file system user ID.
egid, sgid, fsgid: Effective group ID, set group ID, and file system group ID.
tty: 應用程序開啟的終端,這種情況下pseudo-terminal used in an SSH session.
ses: 用戶登錄的session ID.
comm: 出現在任務列表中,應用程序的名稱。
exe: 二進制程序的解析路徑。
subj: 進程執行時selinux上下文
key: 如果audit了很多的目錄文件,分配一個key string方便后面我們通過ausearch去過濾這類log。
cwd: 進程的執行目錄.
另一種audit log格式:
inode: 指出了與文件或目錄相對應的inode number,可以通過下面的命令查看inode對應的文件或目錄:find/ -inum
dev: 指出文件或目錄對應的device ID,在例子中,對應/dev/fd/0這個設備.
mode: 對應文件或目錄的權限,這里0100600被解析為-rw-------.
ouid: 對應文件的owner’s user ID.
ogid: 對應文件的owner’s group ID.、