Unix系统记录用户登录及操作日志配置——Linux篇 Bourne-Again Shell
2020-5-29 08:37:13 Author: mp.weixin.qq.com(查看原文) 阅读量:0 收藏

先讲讲这个需求是怎么出来的。在做SOC、审计、4A项目中,要考虑在不过堡垒机的情况下(即绕行堡垒)如何保证日志审计的完整性。这些要求在运营商提出来前,其实本来就是题中应有之义,但是运营商提的要求里也只有绕行堡垒时候的登录日志。操作日志是偶尔看到一个文章中,bash下可以通过PROMPT_COMMAND将操作命令记录到日志中,当时确实见猎心喜,萌发了研究在各个操作系统下记录用户操作命令日志的想法。同时在一个项目中,客户也提出了记录操作命令日志的要求,当时同事是通过另外一种方法实现的。在此之前,也在网上搜索过Linux系统下记录操作命令的一些方法,只是没有下定决定去研究。现在,正好借项目机会,重新进行完整的研究。

以下内容均是在2011年完成,当时参阅了大量的资料,进行了大量测试,有些过程内容早已散失,最终留下了完整的配置参考手册和详细的测试结果,但是中间过程的尝试积累的经验已经没有了。最终的文档包含了Soralis、Linux、AIX、HP-UX、SuSe Linux系统,以及这些系统下的Bourne-Again Shell、POSIX Shell、Bourne Shell、Korn Shell、C Shell(csh\tcsh)下的配置。涉及系统较多,本文以Redhat Linux系统为例,讲讲各个shell下的配置。

实际上有多种方式可以实现记录操作命令到日志中,本文所讲的方法是同时结合logger命令,在用户每次输入完命令回车时,产生一条命令操作日志,其它方法以后再进行讨论。要实现这一点,需要以下条件:

  1. 用户每次在命令行输入命令后回车,产生一条日志;
  2. 日志中需要包含操作时间、操作用户、操作命令等关键信息;
也就是说我们需要系统提供一种方式,可以在用户输入命令回车后,执行我们需要的命令,来产生我们需要的日志。对于Linux来说,要区分不同的shell。我们主要考虑Bourne-Again Shell(sh、bash)、Korn Shell(ksh)、C Shell(csh、tcsh)的情况。因为在Linux下sh是指向bash的,csh是指向tcsh的,但对于其他Unix系统未必一样。
Bourne-Again Shell
很幸运,对于bash,我们找到了PROMPT_COMMAND变量。这里需要说说PROMPT_COMMAND是做什么用的,看看在bash shell里的解释:
PROMPT_COMMAND
Bash shell executes the content of the  PROMPT_COMMAND just before displaying the PS1 variable.
就是说,在显示PS1变量的提示符前,会先执行PROMPT_COMMAND变量(关于PS1, PS2, PS3, PS4,PROMPT_COMMAND这些变量的含义,请大家自行查阅资料)。我们的思路就是,在PROMPT_COMMAND变量中,引用logger命令,通过logger命令产生日志,日志包含我们所需的字段信息。最终的配置如下:
修改/etc/bashrc文件。
vi/etc/bashrc
在文件最后加入以下内容(蓝色),将其中的192.168.100.90替换为资源的IP
# Add content in /etc/bashrc# Log bash user login and command historyup_client_ip=`(who am i|cut -d\( -f2|cut-d\) -f1)`if ( test -z "`echo $up_client_ip|awk'($1 ~/[0-9]+.[0-9]+.[0-9]+.[0-9]+/)'`" )thenup_client_ip=`awk '/'$up_client_ip'/ {print$1}' /etc/hosts`fiup_nowtime=`(date -d now +"%Y-%m-%d%T")`if [ "`who -m|awk '{print $1}'`"= "`whoami`" ] && [ "$0" = "bash" ] ;then               echo >/dev/null;      else               logger -p user.notice --class=\"HOST_LOGIN\" type=\"2\"time=\"$up_nowtime\" src_ip=\"$up_client_ip\"dst_ip=\"192.168.100.90\" primary_user=\"\"secondary_user=\"$(whoami)\" operation=\"\"content=\"login successful\" authen_status=\"Success\"log_level=\"1\" session_id=\"$$\" 2>/dev/null;fiexport PROMPT_COMMAND='{ logger -puser.notice -- class=\"HOST_COMMAND\" type=\"3\"time=\"$(date -d now +"%Y-%m-%d %T")\"src_ip=\"$up_client_ip\" dst_ip=\"192.168.100.90\" primary_user=\"\"secondary_user=\"$(whoami)\" operation=\"$(history 1 | { read xy; echo $y; })\" content=\"command\"authen_status=\"\" log_level=\"1\" session_id=\"$$\"2>/dev/null; }'readonly up_client_ipreadonly up_nowtimereadonly PROMPT_COMMAND

上述配置包含了“Unix系统用户登录、操作命令日志配置方法-(一)”文中登录日志的配置,其中操作日志的记录配置如下:

export PROMPT_COMMAND='{ logger -puser.notice -- class=\"HOST_COMMAND\" type=\"3\"time=\"$(date -d now +"%Y-%m-%d %T")\"src_ip=\"$up_client_ip\" dst_ip=\"192.168.100.90\" primary_user=\"\"secondary_user=\"$(whoami)\" operation=\"$(history 1 | { read xy; echo $y; })\" content=\"command\"authen_status=\"\" log_level=\"1\" session_id=\"$$\"2>/dev/null; }'
释义如下:
  • logger -p user.notice
产生日志的facility和severity为user.notice
  • --

非常重要,在没加它之前,执行中出现很多错误,翻阅了很多资料最终才找到。看看logger命令里的解释:
--        End the argument list. This is to allow the message to start with a  hyphen (-).
  • operation=\"$(history 1 | { read xy; echo $y; })\"
  • readonly
声明定义的变量为只读,防止用户登录进来后取消变量,导致不能记录。
  • 在记录登录日志的时候,使用了if作了判断,保证了当用户使用bash命令切换shell的时候不会记录登录日志。
最后发到日志服务器的日志记录如下:
<13>bashuser: type="3" time="2011-06-29 10:44:03" src_ip="192.168.14.83" dst_ip="192.168.100.90" primary_user="" secondary_user="bashuser" operation="uname -a" content="command" authen_status="" log_level="1" sessionid="12182"
Bourne-Again Shell到此结束,后续讲Redhat Linux下Korn Shell下的配置。 其中的变量可以根据实际需要自定定义。

文章来源: https://mp.weixin.qq.com/s?__biz=MzI5NzAzMDg0NA==&mid=2650697975&idx=1&sn=5737cbbf2fdb71d9898577512b3e4249&chksm=f4b19524c3c61c325eeaf042049205b2eafe65d8594cdad5039c47701e8360645335af905b39&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh