最终效果:
log记录:
/var/log/messages
首先去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>/dev/null| awk '{print $NF}'|sed -e 's/[ ()]//g'`] " export HISTSIZE="999999" readonly PROMPT_COMMAND="history -a" |
第一行定义history格式
第二行第一history最大存储
第三行让所有用户操作都能即时写入history中,而不是退出session时再写入(如果同时又几个用户登录,可能导致history事件错乱)
我日,彭总不亏是全国pythone第一人,技术博客吊炸天,在下是服的
彭总,快更新文章啊!!!!!!!
dalao,dalao