实现bash bash history日志通过syslog远程发送的方式很多,主要有以下3种:
1、在/etc/bashrc全局配置文件添加
2、修改bash源码
3、加载内核模块
1,2方法只是记录与history类似的命令执行日志,无法记录通过程序或者脚本执行命令。3方法一般通过拦截系统调用exec实现,可以记录所 有通过exec系统调用的命令执行情况,但是无法记录bash 内嵌命令的执行。另外在内核进行修改,需要考虑稳定性以及性能影响问题,测试时间较长。
1、在/etc/bashrc全局配置文件添加
//记录命令日志到用户目录下的.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
export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });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
3、加载内核模块
http://www.securityfocus.com/tools/877
http://www.securityfocus.com/tools/1667
注: script命令也可以
资源: