天天看點

通過syslog遠端發送bash 指令日志

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&amp;action=edit">http://bugs.gentoo.org/attachment.cgi?id=57967&amp;action=edit</a>