先讲讲这个需求是怎么出来的。在做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命令,在用户每次输入完命令回车时,产生一条命令操作日志,其它方法以后再进行讨论。要实现这一点,需要以下条件:
用户每次在命令行输入命令后回车,产生一条日志; 日志中需要包含操作时间、操作用户、操作命令等关键信息;
修改/etc/bashrc文件。 vi/etc/bashrc 在文件最后加入以下内容(蓝色),将其中的192.168.100.90替换为资源的IP:
# Add content in /etc/bashrc
# Log bash user login and command history
up_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]+/)'`" )
then
up_client_ip=`awk '/'$up_client_ip'/ {print$1}' /etc/hosts`
fi
up_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;
fi
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; }'
readonly up_client_ip
readonly up_nowtime
readonly 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; }'
--
<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"