2008-12-08 15:50
實作bash bash history日志通過syslog遠端發送的方式很多,主要有以下3種:
1、在/etc/bashrc全局配置檔案添加
2、修改bash源碼
3、加載核心子產品
1,2方法隻是記錄與history類似的指令執行日志,無法記錄通過程式或者腳本執行指令。3方法一般通過攔截系統調用exec實作,可以記錄所
有通過exec系統調用的指令執行情況,但是無法記錄bash 内嵌指令的執行。另外在核心進行修改,需要考慮穩定性以及性能影響問題,測試時間較長。
//記錄指令日志到使用者目錄下的.history-timestamp目錄
export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y;
});user=$(whoami); echo $(date "+%Y-%m-%d %H:%M:%S"):$user:$msg:$(
who am i); } >> $HOME/.history-timestamp'
//記錄指令日志到syslog
});user=$(whoami); logger $(date "+%Y-%m-%d %H:%M:%S"):$user:$msg:$(who
am i); }'
2、修改bash源碼(lib/下)
通過給bash加patch也可以實作,網上可以查到的現成的patch都是針對特定bash版本的,如果剛好可以找到所須版本,使用配置會比較友善。
以下以bash-3.0.16為例,說明如何直接修改bash代碼實作。(lib/readline/history.c)
1) 代碼修改
history.c檔案中add_history (string)負責完成指令日志記錄,是以如果隻是想簡單的通過syslog遠端發送history,在此函數中添加遠端日志發送功能即可。下面紅色辨別代碼為添加部分
注:syslog日志記錄,目前使用者名,登入使用者名 終端 指令
/* Place STRING at the end of the history list. The data field
is set to NULL. */
void
add_history (string)
const char *string;
{
HIST_ENTRY *temp;
if (strlen(string)<600) {
syslog(LOG_LOCAL5 | LOG_INFO, "%s %s %s %s",getenv("LOGNAME"),getlogin(),ttyname(0),string);
}
else {
char trunc[600];
strncpy(trunc,string,sizeof(trunc));
trunc[sizeof(trunc)-1]='/0';
syslog(LOG_LOCAL5, LOG_INFO, "%s %s %s %s(++TRUNC)",getenv("LOGNAME"),getlogin(),ttyname(0), trunc);
if (history_stifled && (history_length == history_max_entries))
{
.............................
2)編譯 ./configure --prefix=/usr/local/bash-syslog-3.0.16;make;make install
3)建立測試帳号 useradd -s =/usr/local/bash-syslog-3.0.16/bin/bash simple
4) 以test帳号遠端登入,執行指令,然後su 到root,可在/var/log/message中看到類似日志:
Dec 9 18:58:26 hostname bash: simple liuruihong /dev/pts/0 exit
Dec 9 18:58:30 hostname bash: simple liuruihong /dev/pts/0 crontab -e
Dec 9 18:59:18 hostname bash: simple liuruihong /dev/pts/0 date
Dec 9 18:59:25 hostname bash: simple liuruihong /dev/pts/0 crontab -e
Dec 9 18:59:37 hostname bash: simple liuruihong /dev/pts/0 crontab -e
Dec 9 18:59:45 hostname bash: simple liuruihong /dev/pts/0 date
Dec 9 18:57:18 hostname bash: root simple /dev/pts/2 echo "ssssssss"
Dec 9 18:57:18 hostname bash: root simple /dev/pts/2 echo "llllllllllll"
Dec 9 18:57:18 hostname bash: root simple /dev/pts/2 exit
Dec 9 18:57:18 hostname bash: root simple /dev/pts/2 ls
http://www.securityfocus.com/tools/877
<a href="http://www.securityfocus.com/tools/1667">http://www.securityfocus.com/tools/1667</a>
注: script指令也可以
資源:
<a href="http://bugs.gentoo.org/attachment.cgi?id=57967&action=edit">http://bugs.gentoo.org/attachment.cgi?id=57967&action=edit</a>