http://blog.chinaunix.net/uid-20786165-id-3167391.html
http://blog.chinaunix.net/uid-8389195-id-1741610.html
Linux的日志系統與審核系統
最近在讀倪繼利的《Linux安全體系分析與編程》,想把一些筆記發出來,這是第一篇。
Linux的日志系統主要就是syslog系統構架,其實現是內核函數printk將消息寫入一個環形緩沖區中,供高層的sys_syslog系統調用讀取。代碼部分在linux/kernel/printk.c
相關鏈接:http://lxr.linux.no/linux+v3.1.6/kernel/audit.c
Linux的審核系統提供了一種記錄系統安全信息的方法,為系統管理員在用戶違反系統安全規則時提供及時的警告信息。內核其他線程通過內核審計API寫入套接字緩沖區隊列audit_skb_queue中,內核線程kauditd通過netlink機制將審計消息定向發送給用戶控件的審計后台auditd的主線程,auditd主線程再通過事件隊列將審計消息傳給審計后台的寫log文件線程,寫入log文件。另一方面,審計后台還通過一個與套接字綁定的管道將審計消息發送給dispatcher應用程序。代碼部分主要在 linux/kernel/audit.c
auditd在Debian里默認沒有安裝啟動,需要通過aptitude install auditd開啟。
《Linux安全體系分析與編程》部分章節下載見 http://www.linuxidc.com/Linux/2012-02/53191.htm
Linux audit的作用:幫助你了解,分析發生在你系統中的事情。
Linux 的組成:
audit 內核模塊----->監聽系統調用,記錄有價值事件
audit daemon(auditd)----->把記錄事件寫入磁盤(/var/log/audit/audit.log)
audit 命令行工具(aureport,ausearch等)------>幫助分析audit日志
內核審計緩沖區管理機制
內核審計系統將審計消息寫入審計用的緩沖區(稱為審計緩沖區)。由於審計信息是通過netlink機制發往用戶空間后台進程的,因此,審計緩沖區包括了結構sk_buff描述的套接字緩沖區,套接字緩沖區用來存儲用於發送的審計消息記錄。
審計緩沖區的結構定義如下(在linux26/kernle/audit.c中):
struct audit_buffer { struct list_head list; struct sk_buff *skb;/*格式化的套接字緩沖區,准備用於發送審計消息 */ /*每個進程的審計上下文,包括進程的狀態、時間和uid等,與進程上下文相關,可以為空 */ struct audit_context *ctx; gfp_t gfp_mask;//緩存區的標識,如:__GFP_WAIT }; |
審計套接字緩沖區組成鏈表,用於存入填充了審計消息的審計套接字緩沖區指針,鏈表定義如下(在linux26/kernle/audit.c中):
static struct sk_buff_head audit_skb_queue; |
審計套接字緩沖區鏈表用於存入審計消息,當鏈表中的緩沖區個數超過上限時,當前進程需要等待用戶空間的后台進程將審計消息寫入log文件,直到緩沖區個數小於上限值為止。
內核審計系統還使用空閑審計緩沖區鏈表audit_freelist 存放空閑的審計緩沖區,存放的個數上限為AUDIT_MAXFREE。這樣,維持一定數據的空閑緩沖區數,對於頻繁操作的審計系統來說,可以減少緩沖區的分配與釋放次數,提高系統性能。
當申請審計緩沖區時,系統先查看鏈表audit_freelist是否存在空閑的審計緩沖區;如果存在,就從鏈表中取下一個返回給申請者。如果鏈表中沒有空閑審計緩沖區,就分配一個審計緩沖區。
當調用函數audit_buffer_free釋放審計緩沖區時,先檢查空閑審計緩沖區鏈表audit_freelist的空閑審計緩沖區是否超過 上限;如果沒有超過上限,就將審計緩沖區放入鏈表audit_freelist,留給以后使用。否則,釋放緩沖區。函數 audit_buffer_free釋放審計緩沖區時,每次都釋放它包含的套接字緩沖區。
空閑審計緩沖區鏈表的定義列出如下:
#define AUDIT_MAXFREE (2*NR_CPUS) static LIST_HEAD(audit_freelist); |
Linux 系統中已經 syslog 了,syslog 會記錄系統狀態、如硬體的警告或應用軟體的記錄等。但是syslog屬於應用層,且僅只於此一應用而已,沒辦法記錄太多資訊。因此,audit 誕生以取代 syslog 的責任,來記錄核心層的事件:檔案的讀寫、系統呼叫、權限的狀態等。
在Linux/UNIX 中,審計工作主要由auditd 服務來完成。Auditd可以對整個操作系統的以下行為做審計
賬戶管理
文件系統管理
權限管理
網絡配置管理
日志文件操作管理
audit 的設定檔為 /etc/audit/audit.rules,主要分為三種類別:
• Basic audit system parameters
• File and directory watches
• System call audits
# basic audit system parameters
-D (刪除舊記錄,預設-D)
-b 8192 (buffer大小,預設256,改為8192)
-f 1 (失敗控制旗標,可設為 0 (silent), 1 (印出錯誤,預設), and 2 (panic, 把系統關閉—非正常關閉,所以會有資料遺失的風險).
-e 1 (生失效,0為失效,1為生效(預設)
# some file and directory watches
-w /var/log/audit/ (觀查目錄 /var/log/audit/)
-w /etc/auditd.conf -p rxwa (觀查檔案 /etc/auditd.conf,-p 設定權限為rxw及a屬性變更)
-w /etc/audit.rules -p rxwa
-w /etc/passwd -p rwxa
-w /etc/sysconfig/
# an example system call rule
-a entry,always -S umask
對於設定檔有幾點要說明:
• 目錄觀察的詳細度比檔案觀察低
• 無法使用任何的pathname globbing,如?或*
• 只能設定已存在的檔案,若設定觀察目錄而有新增檔案,新檔案只會在下次 audit 重啟後才會加入
利用 -k 產生 key string,以供ausearch 直接索引
-w /etc/var/log/audit/ -k LOG_audit
audit daemon的主要配置文件有兩個,一個是/etc/sysconfig/auditd, 另一個是/etc/audit/auditd.conf.
/etc/sysconfig/auditd---->配置auditd運行時的環境
AUDITD_LANG--->auditd運行時的locale
AUDITD_DISABLE_CONTEXTS---->不監控系統調用
/etc/audit/auditd.conf---->配置auditd運行時的功能,格式val = value
log_file, log_format, log_group--->log_file標示日志存放路徑,log_format標示日志記錄格式,log_group 日志的屬主。log_format有兩種格式一種是raw,記錄內核發送的原始格式,一種是nolog,也就是日志不會被寫到硬盤。注:如果你想使用aureport生成報告的話,請使用raw格式。
priority_boost--->設置auditd的優先啟動級,默認是4,具有較高的優先級啟動,0的話是正常順序啟動。
ps aux的顯示來觀察auditd的啟動優先級
root 3318 0.0 0.0 12516 764 ? S<sl Mar25 0:00 auditd
S<sl S表示進程正在睡眠,<表示具有較高的優先級,s表示多進程l表示多線程
flush and freq ---->flush的可選值為none(日志不寫到磁盤), incremental (日志寫到磁盤,freq指定多少記錄開始寫到磁盤),data(保持部分數據和磁盤的一直同步),sync(每次記錄都寫到磁盤)。freq和 incremental 可選值一起使用,表示多少條記錄一組寫到磁盤。對於高等級的業務系統設置為DATA
num_logs ------>指定log的數目,數目要求是正數,如果數目小於2,表示不會rotate日志,大於2,也就是達到指定大小會rotate日志。 max_log_file_action 指定rotate行為。
dip_qos and dipatcher--->
disp_qos = lossy 控制調度程序與審計守護進程之間的通信類型。有效值為lossy和lossless 建議使用缺省值
dispatcher = /sbin/audispd 當啟動這個守護進程時,由審計守護進程自動啟動程序。所有守護進程都傳遞給這個程序。 建議使用缺省值
name_format and name---->name_format 可以為none(不使用名字),fqd(DNS解析的詳細名字),numeric(IP地址),user(使用name選項指定的字符串)
max_log_file and max_log_file_action ---->max_log_file 指定當文件大小達到設定的M值,執行action,action可選為ignore(不處理),rotate(壓縮分文件),syslog(發warning信息),suspend(暫停auditd),keep_logs(rotate log 保留所有log)
space_left and space_left_action---->space_left指定space M 值觸發action。space_left_action 執行的動作(具體參看man auditd.conf)
action_mail_acct--->設定warning 發送的email地址
admin_space_left and admin_space_left_action ----->遺留空間 用法同space_left
disk_full_action------>同 space_left_action,執行盤空間滿的行為。如果含有這個審計文件的分區已滿,則采取這個動作
disk_error_action---->同 space_left_action, 監測磁盤錯誤發生時作出某些action
tcp_listen_port, tcp_listen_queue, tcp_client_ports and tcp_client_max_idle--->從其他audit發來的事件參數。
enable_krb5 = no 是否啟用kerberos認證 建議使用缺省值
krb5_principal = auditd Kerberos認證校驗值 建議使用缺省值
##krb5_key_file= /etc/audit/audit.key Kerberos生成的驗證key存放位置 建議使用缺省值
配置audit的規則,也就是說我們要audit什么樣的事件,具體什么事件需要audit來監控跟實際的應用有關。這里主要介紹audit的規則配置工具auditctl和文件配置方法/etc/audit/audit.rules.
這里首先介紹auditctl的應用,具體使用指南查看man auditctl。auditctl的man 描述說明這個工具主要是用來控制audit系統行為,獲取audit系統狀態,添加或者刪除audit系統的規則。控制audit系統行為和獲取audit系統狀態參數:
-s 或者auditd 狀態 auditctl -s 顯示:AUDIT_STATUS: enabled=1 flag=1 pid=2792 rate_limit=0 backlog_limit=320 lost=0 backlog=0
-e [0|1|2] 設置audit使能標識, 0 表示臨時關閉audit,1 表示啟用audit,2表示鎖住audit規則配置文件,這條命令一般設這在audit.rules的最后一條,任何人試圖修改audit規則都會被記錄,並且禁止修改。我們先運行auditctl -e 1 顯示:AUDIT_STATUS: enabled=1 flag=1 pid=2792 rate_limit=0 backlog_limit=320 lost=0 backlog=0;我們運行auditctl -e 0 顯示AUDIT_STATUS: enabled=0 flag=1 pid=2792 rate_limit=0 backlog_limit=320 lost=0 backlog=0 這里我們看到不同的參數只是修改了enabled項
-f [0|1|2]控制失敗標識。也就flag位,這個位的主要作用是This option lets you determine how you want the kernel to handle critical errors
-r 設置速率,也就是每秒鍾消息數目,非0的話如果系統在1秒鍾大於設定的值,就會觸發系統flag標識的行為
-b 設置backlog_limit
audit系統規則設置:
文件系統audit設置:
-w path path是一個文件或者目錄的絕對路徑。
-p [r|w|x|a] 和-w一起使用,監測用戶對這個目錄的讀 寫 執行 或者屬性變化如時間戳變化。
-k 指定一個key,在ausearch的時候使用
系統調用的監控:
-a 添加一條系統調用監控規則
-S 后面接需要監測的系統調用的名稱
顯示規則和移除規則:
-D 刪除所有規則
-d 刪除一條規則和-a對應
-W 刪除一條規則和-w對應
-l 列出所有規則
Linux、Unix 系統審計重點位置 -w /var/log/audit/ -k LOG_audit -w /etc/audit/ -p wa -k CFG_audit -w /etc/sysconfig/auditd -p wa -k CFG_auditd.conf -w /etc/libaudit.conf -p wa -k CFG_libaudit.conf -w /etc/audisp/ -p wa -k CFG_audisp -a entry,always -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -a entry,always -F arch=b32 -S mknod -S mknodat -a entry,always -F arch=b32 -S mount -S umount -S umount2 -w /etc/cups/ -p wa -k CFG_cups -w /etc/init.d/cups -p wa -k CFG_initd_cups -w /etc/netlabel.rules -p wa -k CFG_netlabel.rules -w /etc/racoon/racoon.conf -p wa -k CFG_racoon.conf -w /etc/racoon/psk.txt -p wa -k CFG_racoon_keys -w /etc/racoon/certs/ -p wa -k CFG_racoon_certs -w /etc/selinux/config -p wa -k CFG_selinux_config -w /etc/selinux/mls/ -p wa -k CFG_MAC_policy -w /usr/share/selinux/mls/ -p wa -k CFG_MAC_policy -w /etc/selinux/semanage.conf -p wa -k CFG_MAC_policy -a entry,always -F arch=b32 -S adjtimex -S settimeofday -S clock_settime -w /usr/sbin/stunnel -p x -w /etc/security/rbac-self-test.conf -p wa -k CFG_RBAC_self_test -w /etc/aide.conf -p wa -k CFG_aide.conf -w /etc/cron.allow -p wa -k CFG_cron.allow -w /etc/cron.deny -p wa -k CFG_cron.deny -w /etc/cron.d/ -p wa -k CFG_cron.d -w /etc/cron.daily/ -p wa -k CFG_cron.daily -w /etc/cron.hourly/ -p wa -k CFG_cron.hourly -w /etc/cron.monthly/ -p wa -k CFG_cron.monthly -w /etc/cron.weekly/ -p wa -k CFG_cron.weekly -w /etc/crontab -p wa -k CFG_crontab -w /var/spool/cron/root -k CFG_crontab_root -w /etc/group -p wa -k CFG_group -w /etc/passwd -p wa -k CFG_passwd -w /etc/gshadow -k CFG_gshadow -w /etc/shadow -k CFG_shadow -w /etc/security/opasswd -k CFG_opasswd -w /etc/login.defs -p wa -k CFG_login.defs -w /etc/securetty -p wa -k CFG_securetty -w /var/log/faillog -p wa -k LOG_faillog -w /var/log/lastlog -p wa -k LOG_lastlog -w /var/log/tallylog -p wa -k LOG_tallylog -w /etc/hosts -p wa -k CFG_hosts -w /etc/sysconfig/network-scripts/ -p wa -k CFG_network -w /etc/inittab -p wa -k CFG_inittab -w /etc/rc.d/init.d/ -p wa -k CFG_initscripts -w /etc/ld.so.conf -p wa -k CFG_ld.so.conf -w /etc/localtime -p wa -k CFG_localtime -w /etc/sysctl.conf -p wa -k CFG_sysctl.conf -w /etc/modprobe.conf -p wa -k CFG_modprobe.conf -w /etc/PAM.d/ -p wa -k CFG_pam -w /etc/security/limits.conf -p wa -k CFG_pam -w /etc/security/pam_env.conf -p wa -k CFG_pam -w /etc/security/namespace.conf -p wa -k CFG_pam -w /etc/security/namespace.init -p wa -k CFG_pam -w /etc/aliases -p wa -k CFG_aliases -w /etc/postfix/ -p wa -k CFG_postfix -w /etc/ssh/sshd_config -k CFG_sshd_config -w /etc/stunnel/stunnel.conf -k CFG_stunnel.conf -w /etc/stunnel/stunnel.pem -k CFG_stunnel.pem -w /etc/vsftpd.ftpusers -k CFG_vsftpd.ftpusers -a exit,always -F arch=b32 -S sethostname -w /etc/issue -p wa -k CFG_issue -w /etc/issue.net -p wa -k CFG_issue.net
目前的推送方式在使用syslog服務來完成審計內容向安全管理平台發送的任務,那么首先要配置相應的日志級別發送到指定的安全管理平台。
利用tail查看審計的日志,把tail的結果重定向給logger,重新打標記之后發送給syslog中的相應的日志級別。由syslog發送到安全管理平台中
tail -f /var/log/audit/audit.log |logger -it stationlog -p local3.notice&
為了使得開機啟動 把這條命令寫入到/etc/rc.local中
[root@localhost audit]# auditctl -l
No rules
[root@localhost audit]# auditctl -s
AUDIT_STATUS: enabled=1 flag=1 pid=985 rate_limit=0 backlog_limit=320 lost=0 backlog=0
[root@localhost audit]# ps -ef|grep audi
root 771 2 0 03:51 ? 00:00:00 [kauditd] 內核模塊
root 985 1 0 03:51 ? 00:00:00 auditd 用戶進程
root 1317 1238 0 06:12 pts/0 00:00:00 grep audi
審計(audit)是linux安全體系的重要組成部分,他是一種“被動”的防御體系。
在內核里有內核審計模塊,核外有核外的審計后台進程auditd。
應用程序給內核發送審計消息,內核的審計模塊再把消息轉發給用戶空間的后台進程auditd處理。
大概就是這么回事,我不是太深入,如果需要更多的內容,自己去查閱相關資料。如果沒有好的資料,我推薦一本,《linux安全體系分析與編程》作者倪繼利 。
審計說穿了就是把和系統安全有關的事件記錄下來:誰誰誰在什么時候做了什么事,結果是啥。
審計的消息來源主要有兩方面:
1.內核(我不太確定)、應用程序(audit-libs-devel包里面有編程接口)產生的。
2.系統管理員添加的審計規則,匹配規則的事件都將被記錄下來。
規則添加:
1 添加文件監視:
該規則能監視文件被讀、寫、執行、修改文件屬性的操作,並記錄
auditctl -w /etc/passwd -p rwax
上述命令記錄/etc/passwd 被讀、寫、執行修改屬性的操作
2 系統調用入口監視(entry鏈表)
該規則在進入系統調用的時候觸發,記錄此時的執行上下文
auditctl -a entry,always -F UID=root -S mkdir
上述命令記錄uid為root的用戶調用mkdir系統調用的情況
3 系統調用出口(exit鏈表)
同系統調用入口規則,不同的是在退出系統調用的時候被觸發
4 任務規則(task表)
該規則在調用fork() 或者clone()產生新進程的時候觸發,因此,該規則適用的“域”僅僅是此時可見的,例如uid gid pid 等等。(參見man auditctl和這里
auditctl -a task,always -F uid=root
5 可信應用程序規則(user表)
按照各種資料上的說法,這里的user表是用來過濾消息的,內核傳遞給審計后台進程之前先查詢這個表。
但是,不管怎么設置規則都達不到這個效果。如下:
auditctl -a user,always -F uid=root
添加上述規則,發現root的行為被記錄。這樣添加規則還是被記錄:
auditctl -a user,never -F uid=root
后來發現我的CentOS里面system-config-audit上面,該鏈表被命名為“可信應用程序”。受此啟發寫了個小程序,向審計內核里寫消息,發現這樣的消息被過濾了。
這點需要進一步驗證。
6 過濾規則(exclude表)
這個表是用來過濾消息的,也就是不想看到的消息可以在這里寫規則進行過濾。
例如:不想看到用戶登陸類型的消息,可以如下添加規則:
auditctl -a exclude,always -F msgtype=USER_LOGIN
這里過濾是以“消息類型”為對象的。
man auditctl
man auditd.conf
man audit.rules
auditctl -a exit,always -S open -S truncate -F dir=/etc -F success=0
auditctl -a exit,always -S open -F auid=510
auditctl -a exit,always -S all -F pid=1005
auditctl -a exit,always -F path=/etc/shadow -F perm=wa
auditctl -w /etc/ -p wa
auditctl -a exit,always -F dir=/etc/ -F perm=wa
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面的圖片說明了Linux Audit的各個組成之間是如何相互作用的:
linux的審計功能(audit)(轉) - llei - llei的學習筆記linux的審計功能(audit)(轉) - llei - llei的學習筆記
圖片上實線代表數據流,虛線代表組件關之間的控制系
auditd
Audit 守護進程負負責把內核產生的信息寫入到硬盤上,這些信息是由應用程序和系統活動所觸發產生的。Audit守護進程如何啟動取決於它的配置文件,/etc /sysconfig/auditd。Audit系統函數的啟動受文件/etc/audit/auditd.conf的控制。有關auditd更多的信息參照第三節:配置Audit守護進程。
auditctl
auditctl功能用來控制Audit系統,它控制着生成日志的各種變量,以及內核審計的各種接口,還有決定跟蹤哪些事件的規則。關於auditctl的更多信息參照第四節:用auditctl控制Audit系統。
audit rules
在/etc/audit/audit.rules中包含了一連串auditctl命令,這些命令在audit系統被啟用的時候被立即加載。更所關於審計規則的信息請參看第五節:給audit系統傳遞變量
aureport
aureport的功能是能夠從審計日志里面提取並產生一個個性化的報告,這些日志報告很容易被腳本化,並能應用於各種應用程序之中,如去描述結果,更多信息參看第六節:理解審計日志和生成審計報告
ausearch
這個功能能讓我們從審計日志之中通過關鍵詞或者是格式化錄入日志中的其它特征變量查詢我們想要看到的信息。詳細信息請參看第七節:用ausearch查詢audit守護進程的的日志。
audispd
這是一個審計調度進程,它可以為將審計的信息轉發給其它應用程序,而不是只能將審計日志寫入硬盤上的審計日志文件之中。
autrace
這個功能更總類似於strace,跟蹤某一個進程,並將跟蹤的結果寫入日志文件之中。更多詳細信息請參看第八節:用autrace分析進程
/etc/audisp
/etc/audisp/audispd.conf
/etc/audisp/plugins.d
/etc/audisp/plugins.d/af_unix.conf
/etc/audisp/plugins.d/syslog.conf
/etc/audit
/etc/audit/audit.rules
/etc/audit/auditd.conf
/etc/rc.d/init.d/auditd
/etc/sysconfig/auditd
/sbin/audispd
/sbin/auditctl
/sbin/auditd
/sbin/aureport
/sbin/ausearch
/sbin/autrace
/usr/bin/aulast
/usr/bin/aulastlog
/usr/bin/ausyscall
/usr/bin/auvirt
type=CRYPTO_KEY_USER msg=audit(1410606795.368:1907135): user pid=21049 uid=0 auid=0 ses=1 msg='op=destroy kind=server fp=91:81:25:ac:cb:fc:07:aa:07:47:18:e2:17:57:61:bc direction=? spid=21049 suid=0 exe="/usr/sbin/sshd" hostname=? addr=192.168.2.83 terminal=? res=success'
type=CRYPTO_SESSION msg=audit(1410606795.368:1907136): user pid=21048 uid=0 auid=0 ses=1 msg='op=start direction=from-client cipher=blowfish-cbc ksize=128 spid=21049 suid=74 rport=54438 laddr=192.168.2.109 lport=22 exe="/usr/sbin/sshd" hostname=? addr=192.168.2.83 terminal=? res=success'
type=CRYPTO_SESSION msg=audit(1410606795.368:1907137): user pid=21048 uid=0 auid=0 ses=1 msg='op=start direction=from-server cipher=blowfish-cbc ksize=128 spid=21049 suid=74 rport=54438 laddr=192.168.2.109 lport=22 exe="/usr/sbin/sshd" hostname=? addr=192.168.2.83 terminal=? res=success'
type=USER_AUTH msg=audit(1410606795.691:1907138): user pid=21048 uid=0 auid=0 ses=1 msg='op=PAM:authentication acct="root" exe="/usr/sbin/sshd" hostname=192.168.2.83 addr=192.168.2.83 terminal=ssh res=success'
type=USER_ACCT msg=audit(1410606795.691:1907139): user pid=21048 uid=0 auid=0 ses=1 msg='op=PAM:accounting acct="root" exe="/usr/sbin/sshd" hostname=192.168.2.83 addr=192.168.2.83 terminal=ssh res=success'