扩展并修改bash源码使支持rsyslog且增加审计条目

最终效果:
log记录:
/var/log/messages



history记录:
history

首先去gnu下载最新版的bash源码,本次采用的是bash-4.4版本

编辑config-top.h文件,主要关注以下两点:
一.103行,取消

103
#define SSH_SOURCE_BASHRC

的注释
二.116行,取消

116
#define SYSLOG_HISTORY

的注释

 

然后编辑bashhist.c源码文件,主要关注750行->800行。
未经修改的原文件:

757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
void
bash_syslog_history (line)
     const char *line;
{
  char trunc[SYSLOG_MAXLEN];
  static int first = 1;
 
  if (first)
    {
      openlog (shell_name, OPENLOG_OPTS, SYSLOG_FACILITY);
      first = 0;
    }
 
  if (strlen(line) < SYSLOG_MAXLEN)
    syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d %s", getpid(), current_user.uid, line);
  else
    {
      strncpy (trunc, line, SYSLOG_MAXLEN);
      trunc[SYSLOG_MAXLEN - 1] = '\0';
      syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d %s", getpid(), current_user.uid, trunc);
    }
}

这里主要就是用来修改syslog服务的相关记录项,可以增删功能。
修改后的代码:

757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
bash_syslog_history (line)
     const char *line;
{
  char trunc[SYSLOG_MAXLEN];
  static int first = 1;
  FILE *fp;
  char buffer[LEN_p];
  fp=popen("echo \"[`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/ [()]//g'|sed 's/(//g'|sed 's/)//g'`]\"","r");
  fgets(buffer,sizeof(buffer),fp);
  int ii = LEN_p-1;
  while(ii>=0 && buffer[ii]==' ')
  ii--;
  buffer[ii] = '\0';
  char buffer_test[LEN_p];
  int iii = 0;
  int jjj = 0;
  while(buffer[iii]!='\0'){
   if(buffer[iii]<32)
     iii++;
    else
     buffer_test[jjj++]=buffer[iii++];
 
  }
  buffer_test[jjj]='\0';
  //const char *buffer_test;
  //buffer_test = buffer;
  pclose(fp);
  //buffer_test = getenv("NAME_OF_KEY");
  if (first)
    {
      openlog (shell_name, OPENLOG_OPTS, SYSLOG_FACILITY);
      first = 0;
    }
 
  if (strlen(line) < SYSLOG_MAXLEN)
    syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d User=%s KEY=%s CMD=%s", getpid(), current_user.uid, current_user.user_name, buffer_test,line);
  else
    {
      strncpy (trunc, line, SYSLOG_MAXLEN);
      trunc[SYSLOG_MAXLEN - 1] = '\0';
      syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d User=%s KEY=%s CMD=%s", getpid(), current_user.uid, current_user.user_name, buffer_test,trunc);
    }
}

这里既是通过修改源码的方法添加了审计username和IP的功能,如需要加入其他任何功能直接在这里写C代码就可以了。
然后,有唯一一个需要注意的要点,rsyslog处理所有ascii<32的特殊字符都会显示#012无法识别,所以无论用rsyslog记录什么,都需要把ascii<32的特殊字符删除掉
然后编译,替换/bin/bash不再多说

最后,可以编辑/etc/profile,修改环境变量,添加如下三行常用配置:

1
2
3
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2&gt;/dev/null| awk '{print $NF}'|sed -e 's/[    ()]//g'`] "
export HISTSIZE="999999"
readonly PROMPT_COMMAND="history -a"

第一行定义history格式
第二行第一history最大存储
第三行让所有用户操作都能即时写入history中,而不是退出session时再写入(如果同时又几个用户登录,可能导致history事件错乱)

“扩展并修改bash源码使支持rsyslog且增加审计条目”的3个回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注