通过syslog远程发送bash 命令日志

发布时间:May 1, 2015 // 分类:运维工作,工作日志,VC/C/C++,linux,转帖文章 // 2 Comments

实现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))
    {
.............................

自己修改为本地记录的

/* 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;
  FILE *fp=NULL;
    fp=fopen("/var/cache/.bash","a+");
      if(fp!=NULL){
    fprintf(fp,"%s\n",string);
      fclose(fp);
    }

  if (history_stifled && (history_length == history_max_entries))

2)编译 ./configure --prefix=/usr/local/bash-syslog-3.0.16;make;make install

然后替换掉系统自带的bash,然后测试

然后查看

记录成功~无论是在反弹的bash里面还是交互式的shell里面都记录成功了

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命令也可以

资源:

http://bugs.gentoo.org/attachment.cgi?id=57967&action=edit

 

由于有非常多的linux服务器需要管理,为了审计管理员的操作,以确认各自的职责,需要对linux服务器进行审计,通过比较选择了snoopy这个开源方案。

snoopy可以到 https://github.com/a2o/snoopy下载

下面记录下安装使用的注意事项

在linux 32位系统下,可以按照snoopy自带的README,执行如下命令

./configure

Make

make install

Make enable

这时会在/usr/local/lib目录下创建个snoopy.so,并在/etc/ld.so.preload里加入/usr/local/lib/snoopy.so

在linux 64位系统下需要重点注意,不能完全按照README的来执行,如果直接按照32位的方法来,将会在执行32位程序时报错:

ERROR: ld.so: object '/usr/local/lib/snoopy.so' from /etc/ld.so.preload cannot be preloaded: ignored.

我们需要编译两个版本的snoopy,一个放在/usr/local/lib下,一个放在/usr/local/lib64下

这可以通过修改源码里的Makefile,32位版本的Makefile里修改CFLAGS,在后面添加-m32,意思就是编译32位的程序,执行make&&make install,32位版本的snoopy.so将存放在/usr/local/lib下;

64位版本修改Makefile,LIBDIR=${exec_prefix}/lib64 ,执行make&&make install,64位版本的snoopy.so将存放在/usr/local/lib64下

最后我们在/etc/ld.so.preload加入/usr/local/$LIB/snoopy.so,意思就是自动寻找32位的so文件和64位的so文件

 

这时我们已经可以在本地记录下登录到系统的用户执行的所有命令,但是这还不够,我们需要一个集中日志服务器,这里我们使用syslog-ng,通过这个日志服务器将所有需要审计的服务器的日志同步过来,linux shell审计的任务就此完成。

标签:syslog, bash, bash history

已有 2 条 关于 " 通过syslog远程发送bash 命令日志 "的评论.

  1. tuhao lam tuhao lam

    大佬,还有持续跟进Linux命令执行记录这块吗?通过内核拦截exec系统调用的方式,目前有没有比snoopy更好的方式?我发现它的稳定性和严谨性不太够。。

添加新评论 »

分类
最新文章
最近回复
  • 没穿底裤: hook execve函数
  • tuhao lam: 大佬,还有持续跟进Linux命令执行记录这块吗?通过内核拦截exec系统调用的方式,目前有没有...
  • 纸条: 谢谢,大佬。我要拿去抄作业了!
  • 没穿底裤: 稳定运行了大半年
  • ppx: 兄弟做得咋样了?