簡介
在 IBM Systems 雜志(2009 年 8 月)上,我發(fā)表了一篇名為 “Monitoring Events with AIX Audit” 的文章。在那篇文章中,我沒有討論審計報告的生成過程。AIX 提供的 auditselect 實用程序可以從審計日志中選擇事件記錄。但是,當采用流模式進行審計時,可以使用 sed 和 awk 實用程序生成格式化的報告。在本文中,我將討論審計事件并演示如何生成日常審計報告。
審計概述
AIX 審計可以配置為三種模式:流、二進制或者流和二進制。我個人喜歡選用流模式,因為它以文本模式寫審計日志文件,允許實時地查看審計事件。流模式將事件寫入循環(huán)的緩沖文件 stream.out 中。因此,如果包含審計日志文件的文件系統(tǒng)滿了,它仍然會繼續(xù)將事件寫到日志文件的開頭。
當以二進制模式使用審計時,會以二進制格式寫入數(shù)據(jù)。如果希望長期收集并保存審計事件記錄,該模式一般是首選方式。但是,作為良好的管理實踐,也可以使用流模式保存審計事件的歷史記錄。
審計配置文件
在開始配置審計時,必須非常小心地進行嘗試,在剛開始收集審計事件時,毫無疑問會出錯。負責審計的系統(tǒng)管理員會對此進行核查。要想監(jiān)視相應的事件,則需要定期修改
/etc/security/config 文件。關(guān)于可監(jiān)視事件的完整列表,請參閱
參考資料 中的紅皮書《Accounting and auditing》。對確定要監(jiān)視的事件之后,可以通過其他文件定制監(jiān)視,例如:
/etc/sudoers/etc/ssh/sshd_config/etc/syslog.conf |
在 /etc/security/objects 文件中設置要監(jiān)視的特殊文件和系統(tǒng)特有的文件。
在 objects 文件中,可以指定應該監(jiān)視的文件(稱為對象),以及應該監(jiān)視讀、寫還是執(zhí)行操作。監(jiān)視 sudoers、sshd_config 和syslog.conf 文件的寫操作的典型設置如下:
/etc/sudoers.tmp: w = "SUDO_WRITE"/etc/syslog.conf: w = "SYSLOG_WRITE"/etc/ssh/sshd_config: w = "W_SSHD_CONFIG_IBM" |
前面示例中 objects 文件的輸出格式是:
full path name of file: < access mode> = "tag name" |
其中的 access mode 是 r(代表讀訪問)、w(代表寫訪問)和 x(代表執(zhí)行訪問)。tag name 是監(jiān)視的文件的唯一名稱。應該確保tag name 描述了指定的訪問模式。另外注意,每一行上只能有一個 access mode 條目。因此,如果要監(jiān)視 /etc/ssh/sshd_config 的讀寫訪問,則可以設置以下條目:
/etc/ssh/sshd_configw = "W_SSHD_CONFIG_IBM"r = "R_SSHD_CONFIG_IBM" |
對于寫訪問,我使用的標記名以 "W_" 開頭;對于讀訪問,標記名以 "R_" 開頭。這有助于在查看審計日志或?qū)徲媹蟾鏁r明確區(qū)分讀訪問和寫訪問。
為了讓審計系統(tǒng)了解如何將每個對象作為一條記錄輸出到審計日志中,需要使用 /etc/security/events 文件中的相應條目。
使用簡單的 printf 語句就足夠了。例如,要想記錄 /etc/ssh/sshd_config 和 /etc/security/audit/objects 文件中指定的標記名 W_SSHD_CONFIG_IBM,可以進行以下設置:
* /etc/ssh/sshd_configW_SSHD_CONFIG_IBM = printf "%s" |
在這個示例中,代碼行開頭是一個 '*',然后是監(jiān)視的文件的完整路徑名,接著是 objects 文件中指定的標記名,最后是一個 printf 語句,可輸出傳遞給的命令的字符串。
要想讓審計系統(tǒng)輸出所有已分析的、作為被監(jiān)視命令一部分的選項,則需要確保審計系統(tǒng)輸出了記錄的剩余部分。因此,在/etc/security/streamcmds 文件中要確保 auditpr 命令包含 '-v'。下面是一個示例:
/usr/sbin/auditstream | auditpr -v > /audit/stream.out & |
監(jiān)視的審計事件放在 /etc/security/config 文件中?稍谠撐募袆(chuàng)建包含要監(jiān)視的事件的類。config 文件的內(nèi)容如下所示。通常會將事件類分配給用戶,還指定默認分配給系統(tǒng)上的每個用戶的類。一個用戶可以屬于一個或多個類。注意,在 "general" 類中,我只監(jiān)視用戶屬性更改,例如密碼更改、組更改、chuser、rmuser、adduser 和 su 嘗試。而您的配置可能很不一樣。
# cat /etc/security/audit/config streammode = on binmode = offbin: trail = /audit/trail bin1 = /audit/bin1 bin2 = /audit/bin2 binsize = 25000 cmds = /etc/security/audit/bincmdsstream: cmds = /etc/security/audit/streamcmdsclasses: general = File_Write,PASSWORD_Change,USER_Change,USER_Remove,USER_Create,GROUP_Change,GROUP_Create,GROUP_Remove,USER_SU,PASSWORD_Flagsusers: default = general |
可以使用 lsuser 命令查看當前分配給用戶的審計類,您會看到審計類 general 被分配給所有用戶。在 config 文件的 users 部分中,指出了該類是分配給所有用戶的默認類。但是,正如前面提到的,一個用戶可以屬于多個類。
# lsuser -a auditclasses ALLroot auditclasses=generaldaemon auditclasses=generalbin auditclasses=generalsys auditclasses=generaladm auditclasses=generallpd auditclasses=generallp auditclasses=generalinvscout auditclasses=generalsnapp auditclasses=generalipsec auditclasses=generalftp auditclasses=generaldxtans auditclasses=generalukazap auditclasses=generaleuazap auditclasses=generalauazap auditclasses=generalbeazap auditclasses=generallaazap auditclasses=general….… |
要想啟動審計子系統(tǒng),請輸入以下命令:
要想停止審計子系統(tǒng),請輸入以下命令:
使用以下命令查看當前的設置,包括定義的類及其事件,以及系統(tǒng)上的可用事件和正在監(jiān)視的對象(首先要確認目前正在進行審計):
如果重新引導服務器或停止運行審計服務,那么重新啟動系統(tǒng)時會覆蓋 stream.out 審計日志。因此,一定要通過某種機制把當前的 stream.out 內(nèi)容保存并復制到新的文件中(稍后討論這個問題)。要想確保在重新引導系統(tǒng)時重新啟動審計,一定要在/etc/rc.tcpip 文件中添加以下行:
# start audit/usr/sbin/audit start 1>&- 2>&- |
如果重新引導服務器,則需要確保通過命令或腳本復制 stream.out 日志文件。這些命令應該放在 /etc/rc.tcpip 文件中審計啟動命令前面,以避免啟動審計時日志文件內(nèi)容被重寫。
審計日志記錄
當審計系統(tǒng)報告事件時,它會報告相關(guān)用戶最初的登錄 ID,而不是此用戶通過用戶 su 得到的 ID。這只適用于本地連接。對于通過 SSH 等遠程連接的用戶,則報告連接時使用的登錄 ID。AIX 審計系統(tǒng)并不知道建立 SSH 連接之前用戶 su 的所作所為。
關(guān)于系統(tǒng)上典型的審計日志文件,參見清單 1;它還顯示了記錄的追蹤部分:
清單 1. stream.out
event login status time command--------------- -------- ----------- ------------------------ -------------------------------USER_SU dxtans OK Mon Jan 10 19:05:13 2011 su rootPASSWORD_Change dxtans OK Mon Jan 10 19:06:27 2011 passwd alphaPASSWORD_Flags dxtans OK Mon Jan 10 19:06:33 2011 pwdadm alpha -cUSER_SU bravo FAIL Mon Jan 10 19:07:01 2011 su rootGROUP_Change dxtans OK Mon Jan 10 19:07:33 2011 chgroup admin users=dxtans,charliePASSWORD_Change root OK Mon Jan 10 19:08:31 2011 tsm charlieUSER_SU charlie OK Mon Jan 10 19:08:36 2011 su rootUSER_Change charlie OK Mon Jan 10 19:08:54 2011 chuser zulu rlogin=true |
仔細看一下清單 1。從前幾行可以看出,用戶 dxtans 通過用戶 su 變成了 root 用戶。然后,他更改了用戶 alpha 的密碼和 pwdadm 標志。因為我們讓審計系統(tǒng)輸出記錄的剩余部分,現(xiàn)在可以看到傳遞給 pwdadm 的命令選項是 'alpha -c'。如果不輸出記錄的剩余部分,就沒有這些信息。用戶 bravo 也試圖通過用戶 su 變成 root 用戶,但是失敗了。這可能是因為用戶 bravo 不知道密碼,或者由于不屬于 root 用戶的子組而沒有得到授權(quán)。在這個示例中,用戶 bravo 沒有得到訪問 root 用戶的授權(quán),因此這個操作是違規(guī)的。
注意,當輸出記錄的追蹤部分時,可在單獨的行上輸出這部分。在生成報告時,必須把記錄的這兩個部分連接起來,讓輸出符合報告的格式要求。這會讓報告以列的形式呈現(xiàn),awk 可以從這些列中提取信息。
準備生成報告
要想生成報告,第一個任務是取得 stream.out 的拷貝。在查看 stream.out 文件時您會發(fā)現(xiàn),對于某個文件執(zhí)行寫操作時,可能有多個條目。在記錄對 /etc/sudoers 文件的寫操作時,尤其可能出現(xiàn)這種情況。因此,一定要通過 uniq 處理文件,去掉重復的條目。然后,使用 sed 將記錄的兩個部分合并到同一行上,并且還需要生成報告的標題。
下面的代碼實現(xiàn)了上述目標。假設 stream.out 文件被解析為第一個參數(shù) ($1) ,產(chǎn)生的輸出重定向到 holdf 文件:
cat $1 | uniq > holdfmv holdf $1sed '1i\'$host' P-Series Audit Report on User Account Changes/command/a\ ---------------------------------------------------------$!N;s/\n/ /# pull in the last columns/ //g' $1 >holdf |
日志的內(nèi)容包含以下列格式:
- 第 1 列是實際的事件,例如 USER_Change。
- 第 2 列是用戶的登錄 ID。
- 第 3 列是執(zhí)行的命令的退出狀態(tài),值是 OK 或 FAIL。
- 第 4-8 列是事件的日期/時間,比如 Tue Jan 11 11:42:02 2011。
- 第 9 列是執(zhí)行的命令,例如 chuser。
- 第 10 列是傳遞給此命令的所有其他信息,也就是記錄尾部包含的信息,通常是傳遞的參數(shù)。
現(xiàn)在,我們可以提取日常審計報告需要的信息,只提取與自己的審計安全策略有關(guān)的信息。例如,監(jiān)視未授權(quán)的賬號切換,或者更改尚未通過事件票據(jù) (incident ticket) 或系統(tǒng)更改請求進行授權(quán)的用戶賬戶屬性。
注意,您可能不關(guān)心系統(tǒng)管理員通過用戶 su 得到的賬號,因為這可能是正常的管理工作。您可能不關(guān)心用戶是否更改了自己的密碼,但是當然可以要求由 root 用戶更改密碼,無論用戶 ID 是什么。完成信息提取之后,可以通過電子郵件把生成的報告發(fā)送給管理經(jīng)理或系統(tǒng)管理員,讓他們通過事件票據(jù)或更改請求來審查和證明該報告。
我發(fā)現(xiàn),對于希望滿足的每個條件,使用單獨的 awk 語句更便于管理。這樣更容易修改關(guān)于提取什么信息的規(guī)則或模式,尤其是當您不在時,可方便其他系統(tǒng)管理員修改規(guī)則。通過在 awk 語句中使用 NOT 操作符,可以指定不應該提取哪些記錄。然后,通過 AND 關(guān)系將腳本中包含的所有 awk 語句連接起來。例如,為了排除用戶由于失誤試圖通過 su 變成本身的事件,可以使用:
!($1 =="USER_SU" && $2 ==$10) |
為了不包含 root 用戶(他通過用戶 su 將用戶 ID 變成了 poppy),我們可以使用:
!($1=="USER_SU" && $2=="root" && $9=="su" && $10=="poppy" |
為了忽略用戶修改自己的密碼的事件,可以使用:
!($1==" ASSWORD_Change" && $2 == $10) |
通過 AND 關(guān)系將這些語句(和其他 awk 語句)連接起來,結(jié)果只產(chǎn)生了我們希望排除的記錄。例如:
awk '!($1 =="USER_SU" && $2 ==$10 &&!($1=="USER_SU" && $2=="root" && $9=="su" && $10=="poppy" &&!($1==" ASSWORD_Change" && $2 == $10) &&...more awk statements...... |
如果不關(guān)心任何用戶是否通過 su 變成另一個用戶,那么可以排除這些事件。例如,假設用戶 genrep1 是共用的用戶 ID,報告中不需要這些事件,則可以使用以下代碼排除這些事件:
!($1=="USER_SU" && $10=="genrep1" |
如果想基于模式搜索來忽略整個記錄,則可以使用以下搜索語句:
要忽略包含字符串 'xnpd' 的所有記錄,可以使用以下 awk 語句:
選出不希望每天報告的記錄或事件之后,可使用 awk END 塊語句輸出 "end of report"。要篩選 holdf 文件中的事件,可以使用以下語句:
awk '!($1 =="USER_SU" && $2 ==$10) &&!($1=="USER_SU" && $2=="root" && $9=="su" && $10=="poppy" &&!($1==" ASSWORD_Change" && $2 == $10) END {print "\t\t\t\t--- end of report ---"}' holdf |
生成報告之后,可以通過電子郵件將報告發(fā)送給系統(tǒng)管理員或經(jīng)理審查。
清單 2 給出一個腳本以及審計日志 stream.out 文件中可以忽略的事件。清單中包含的模式規(guī)則只作為演示示例。清單 2 包含的 awk 語句演示了如何對 stream.out 文件應用 awk 模式,可以根據(jù)自己的需要改進和定制它。生成報告之后,可通過電子郵件將它發(fā)送到郵件列表 rs6admins。
清單 2. auditfilter
#!/bin/sh# auditfilterif [ $# != 1 ] then echo "`basename $0` <audit_log>" exit 1fi if [ ! -f $1 ] then echo "file does not exist" exit 1 fiholdf=/tmp/holdfhost=$(hostname)# extract the date part of the filename for the reportreport=$(basename $1)# filename ie: audit0118.logdate_rep=$(echo $report | sed -e 's/audit//g' -e 's/.log//g')mth=$(echo $date_rep | cut -c 1,2)day=$(echo $date_rep | cut -c 3,4)datex="$day / $mth"# email list herelist="rs6admins "mailit2(){sendmail -t <<maydayTo listSubject:audit report on $hostContent-Type: text/htmlContent-Transfer-Encoding: 7bit<body><body bgcolor="#C0C0C0">Generated: `date`<br>Date of Audit : $datex<hr><br><pre>$(cat $1)</pre></body>mayday}cat $1 | uniq > $holdfmv $holdf $1# do header and join linessed '1i\ '$host' P-Series Audit Report on User Account Changes/command/a\ ---------------------------------------------------------$!N;s/\n/ /# get rid of the ** lines/-*//g# pull in the last column, these are spaces - adjust as required in seds/ //g' $1 >$holdf# filter outawk '!($1 =="USER_SU" && $2 ==$10) &&!($1=="USER_SU" && $2=="root" && $9=="su" && $10=="poppy" &&!($1==" ASSWORD_Change" && $2 == $10) &&!($1=="USER_SU" && $10=="operator" &&!($1=="USER_SU" && $10=="genrep1" &&!/xntpd/END {print "\t\t\t\t--- end of report ---"}' $holdf >$1.rep# cat $1.repmailit2 $1.rep |
清單 3 調(diào)用 auditfilter 腳本。auditfilter 腳本執(zhí)行完之后,生成兩個文件。一個包含格式化的審計報告,其文件名采用以下格式:
audit<month><day>.log.rep |
另一個是當前 stream.out 文件的拷貝,其文件名采用以下格式:
清單 3. auditroll
#!/bin/sh# auditrollOUTFILE=/audit/audit`date +%m%d`.log## Shut down auditing/usr/sbin/audit shutdownsleep 3## Move contents of capture filemv /audit/stream.out $OUTFILE## Restart auditing/usr/sbin/audit start## Kill off processes using the audit filefuser -k $OUTFILE## Filter contents of audit file/audit/auditfilter $OUTFILE |
仔細看一下清單 3,它使用 date 命令作為已復制的 stream.out 文件的文件名的一部分來指定新文件名。然后關(guān)閉審計,將 stream.out 文件轉(zhuǎn)移到新的文件 (OUTFILE),以生成新的審計報告文件。隨后,重新啟動審計;為這些天的審計活動創(chuàng)建一個新的 stream.out 文件。為了保證安全性,確保關(guān)閉審計之后沒有任何針對 OUTFILE 運行的進程,可以使用 fuser 終止這些進程。
在執(zhí)行 auditfilter 腳本時,它在與圖 1 相似的電子郵件中生成格式化的報告。
圖 1. 審計報告
可以在每個工作日執(zhí)行 auditroll 腳本,生成關(guān)于前幾天的審計活動的報告。
結(jié)束語
按照我的觀點,在 AIX 上使用審計是必須做的工作?梢酝ㄟ^審計工作監(jiān)視系統(tǒng)上與安全相關(guān)的事件。在企業(yè)環(huán)境中收集審計報告時,我建議最好將所有報告都整理為一個電子郵件以便審查。
關(guān)于作者
![]()
![]()
David Tansley 是一位自由作家。他有 15 年 UNIX 系統(tǒng)管理經(jīng)驗,最近 8 年使用 AIX。他喜歡打羽毛球和觀賞一級方程式賽車,但是最喜歡與妻子一起開著 GSA 摩托車旅行。
http://www.ibm.com/developerworks/cn/aix/library/au-audit_filter/index.html