将用户执行的每个shell命令记入日志比最初想象的要来得困难。shell的历史功能原本旨在帮助用户使用以前用过的命令。我们都知道这种使用场合:你刚输入了一个长长的字段,可是拼错了一个字符。shell的历史让你可以改正这一个字符,而不必输入其余的所有字符。 然而, shell历史很难满足审计的目的。换言之,它不是为了确保系统安全而设计的。 对于bash shell来说,问题显得尤其困难,因为该shell的目的是,不管用什么办法,尽可能为用户简化生活——所以,它拥有所有的“花哨功能”(bells and whistles)。必须顾及所有这些多种功能,并且防止对历史文件进行更改。 Korn shell比较简单,使得保护shell的历史比较容易。 如果想要严加保管这些shell的历史,需要执行一系列的步骤。 首先,锁定shell的历史文件本身。更改它的属性,末尾只添加chattr +a .sh_history或chattr +a .bash_history。这样一来,就不可能删除或更改文件中的数据,连用户都无法改变属性——只有root用户才能改变。 其次,确保历史变量设置合理、无法更改。这些历史变量包括最重要的HISTFILE、HISTCOMMAND和HISTIGNORE。要做到这一点,使用shell的typeset命令,带-r选项,这使得指定的变量拥有只读属性。良好的操作规范是使所有历史环境变量都变为只读,比如: export HISTCONTROL= export HISTFILE=$HOME/.bash_history export HISTFILESIZE=2000 export HISTIGNORE= export HISTSIZE=1000 export HISTTIMEFORMAT=“%a %b %Y %T %z ” typeset -r HISTCONTROL typeset -r HISTFILE typeset -r HISTFILESIZE typeset -r HISTIGNORE typeset -r HISTSIZE
typeset -r HISTTIMEFORMAT
对于bash shell来说,你需要更改历史的一些标准选项: shopt -s cmdhist #设置cmdhist将把多行命令放入到单单一个历史行 shopt -s histappend
#设置histappend将确保被添加到历史文件,而不是像通常的做法那样覆盖历史文件。
PROMPT_COMMAND=“history -a”
typeset -r PROMPT_COMMAND
最后,创建一个SIGDEBUG陷阱,将命令发送到系统日志(syslog)。VMware的ESXi借助自己版本的ash shell已经具有这样的功能。简而言之,应创建一个把当前命令记入日志(从历史文件获取)的函数,然后用logger命令,把它发送到系统日志。这一步在bash shell和Korn Shell中都适用。 这些步骤有些冗长,不过在新版的bash和ksh中有一些新的功能特性,让这一切变得极其容易。GNU Bash在4.1版中添加了记入到系统日志中的功能,只需要编译shell的时候开启该功能即可激活。 自推出ksh93以来,Korn Shell就一直具有审计功能。类似bash 4.1,用户审计是一项编译时功能。想看看你所用的ksh93版本是否安装了审计功能,可以执行下列命令中的某一条: echo ${.sh.version}
echo $KSH_VERSION
# echo ${.sh.version}
Version JM 93t+ 2009-05-01
Bash shell含有审计功能的可能性也比较小。Ubuntu 10.10上的bash是4.1.5(1)版本。 对于仍在使用C shell(以及尤其是tsch)的用户,tcsh有一个变种名为“tcsh-bofh”,它支持记入到系统日志中。遗憾的是,tcsh-bofh并没有得到长期的维护。早在2010年1月,tcsh-bofh的FreeBSD端口就从FreeBSD端口树(port tree)去除了。 (责任编辑:IT) |