在Unix系统用户登录、操作命令日志配置方法-引言一文中,已经格式化了登录日志,如下:
<13>bashuser: type="2" time="2011-06-29 10:44:03" src_ip="192.168.14.83" dst_ip="192.168.99.243" primary_user="" secondary_user="bashuser"operation="" content="login successful" authen_status="Success" log_level="1" sessionid="12182"
在每次用户登录时产生日志;
日志中需要包含登录时间、源IP地址、目的IP地址、登录用户、sessionid这些关键信息的值;
第1条,可以利用unix系统提供的logger命令产生日志,如下为Linux系统下的logger说明:
我们可以在系统上进行测试,在命令行输入以下内容:
[root@RHEL2 ~]# logger -p user.notice "this is a logger test"
监控日志,可以看到日志被记录在了/var/log/messages下面(默认配置了/etc/syslog.conf)
所以,我们只需要把logger命令放在用户每次登录时必须加载的配置文件里,就可以记录日志了。Linux系统下shell为bash的用户,每次登录时(login shell)的启动文件有/etc/profile、/.bash_profile 、/.bashrc、/etc/bashrc,考虑到要记录每个用户的登录日志以及配置的便捷,可以加到/etc/profile或者/etc /bashrc文件中。我们以加到/etc/bashrc文件为例。
现在我们需要做的是将logger -p user.notice "this is a logger test"中引号的内容替换为我们需要的信息。包括登录时间、源IP地址、目的IP地址、登录用户、sessionid这些关键信息。为了方便引用,我们定义变量:
登录时间:up_nowtime=`(date -d now +"%Y-%m-%d%T")`
源IP地址:up_client_ip=`(who am i|cut -d\( -f2|cut-d\) -f1)`
目的IP:直接写主机IP,可以不用命令获取;
登录用户:命令whoami的值;
sessionid:变量$$的值;
到此,我们的logger命令如下,我们定义的事件级别是user.notice。
logger -p user.notice -- class=\"HOST_LOGIN\" type=\"2\" time=\"$up_nowtime\" src_ip=\"$up_client_ip\" dst_ip=\"192.168.56.102\" primary_user=\"\" secondary_user=\"$(whoami)\" operation=\"\" content=\"login successful\" authen_status=\"Success\" log_level=\"1\" session_id=\"$$\"
将完整内容加到/etc/bashrc文件末尾:
# Add content in /etc/bashrc
现在通过ssh、telnet、rlogin登录测试,监控日志文件,可以看到已经成功的将日志记录在了/var/log/messages文件中。后续,只需要配置/etc/syslog.conf,将user.notice级别日志发送到日志服务器。
以上,就是配置登录日志记录的基本思路,但是在实际环境中,需要考虑很多因素,如下:
不同shell的用户,启动的配置文件不一样,那么需要配置的文件也不一样,如何选择;
通过本地登录的情况,会不会记录日志、格式有没有变化、是否需要排除;
获取源IP地址的命令,获取到的IP地址是否为IP格式(有可能是主机名、0.0.0.0或者为空等);
用户之间进行su、su -切换时的情况,是否需要记录日志以及是否能正确记录日志;
crontab定时任务里配置了自动登录情况时的问题;
同时,以上几点都需要在不同的操作系统、不同shell情况下加以变化。我已经总结了HP-UX、Linux、Solaris、AIX、SuSe Linux系统上不同shell(sh、bash、ksh、csh、tcsh)用户的登录以及不同shell用户之间进行su、su -切换时的配置,以下是在各种情况下是否能够按照配置记录登录日志的测试结果,供大家研究:
每个shell有两个用户1和2(如 bash1\bash2为两个shell为bash的用户);
shell一栏区分不同shell用户的情况,包括sh、bash、csh、ksh、tcsh;
操作一栏均为用户1执行的操作,以bash1用户为例分别为:
bash1用户登录系统;
bash1用户执行bash命令;
bash1用户使用su bash2命令切换到bash2用户;
bash1用户使用su - bash2命令切换到bash2用户;
是否需要登录日志:标明该种情况是否需要产生登录日志,以bash用户为例,对于上述四种情况分别为:登录(是)、执行bash命令(否)、su bash2切换用户(是)、su -bash2切换用户(是);
登录日志是否存在:对应上述“是否需要登录日志”,描述实际测试的结果是否符合预期。
以下表格中标黄的部分即是说明测试结果不符合预期的情况:包含以下两种:
需要产生登录日志但是测试不能产生登录日志(如Linux ksh环境);
不需要产生登录日志但是产生了登录日志(很少见,测试的几个shell只有AIX csh是这样);
以下为在各个系统上测试的最终结果,供大家参考:
以上测试结果使用的操作系统版本和shell版本如下所示:
表格1 系统及shell版本
序号
主机类型
系统版本
shell
bash
sh
ksh
csh
tcsh
HP-UX
B.11.31
GNU bash, version 4.1.9(1)
POSIX .2
—
Solaris
5.9
5.10
GNU bash, version 3.00.16(1)
tcsh 6.12.00 (Astron) 2002-07-23
Redhat Linux
5.4
GNU bash, version 3.2.25(1)
同bash
93s+ 2008-01-31
同tcsh
tcsh 6.14.00 (Astron) 2005-03-25
AIX
6.1
5.3
GNU bash, version 3.2.16(1)
SUSE Linux
11
GNU bash, version 3.2.39(1)
同bash
93s+ 2008-01-31
同tcsh
tcsh 6.15.00 (Astron) 2007-03-03
各操作系统用户登录日志测试结果如下:
表格2 登录日志测试结果
序号
主机类型
系统版本
shell
bash
sh
ksh
csh
tcsh
HP-UX
B.11.31
YES
YES
YES
YES
—
Solaris
5.9、5.10
YES
YES
YES
YES
YES
Redhat Linux
5.4
YES
YES
YES
YES
YES
AIX
6.1、5.3
YES
YES
YES
YES
—
SUSE Linux
11
YES
YES
YES
YES
YES
以上讲的是如何产生我们需要的登录日志,但是在实际项目操作中,需要根据实际情况进行不同的选择,以下为需要考虑的一些点:
综合考虑系统的syslog配置,定义合适的facility和severity,文中我们定义的是user.notice。
选择合适的启动文件,如对bash来说,这些启动文件/etc/profile、/etc/bashrc、/.bash_profile、/.bash_login、~/.profile如何选择,是需要考虑的。这也是为什么在上面测试过程中我们要测试用户登录过程、执行bash命令、执行su、su -命令这些场景,必须清楚在这些过程中执行的启动文件顺序。
遇到最多的问题是获取源IP地址的问题,需要根据实际情况灵活变化。
以上各操作系统下各个shell环境下的配置均有完善的文档,感兴趣的朋友可以联系我。