长亭百川云 - 文章详情

Unix系统记录用户登录及操作日志配置——Linux篇 Bourne-Again Shell

安全实践

86

2024-07-13

先讲讲这个需求是怎么出来的。在做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

上述配置包含了“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; })\"

这个就是通过history获取操作命令的方法了。

  • 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下的配置。 其中的变量可以根据实际需要自定定义。

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2