linux下面有好多shell,常见的有 /bin/bash、/bin/sh、/bin/csh、/bin/tcsh、/bin/ksh,而我们最常用bash,因为它提供了history功能,帮助我们更好的与系统交互。但本文主要讲解的是如何更加熟悉的了解别的用户包括黑客都在你的系统上做了什么操作,通常(bash)这些操作默认都会保存到~/.bash_history 文件中,但如果这些用户不想给你留下操作记录,就会想办法把自己的操作从history中删除,比如最后输入 history -c 操作,本文将从用户行为的操作记录来谈linux安全问题。
试验环境: redhat 5.4 32 位
shell : bash
默认情况下,在用户操作完毕退出后,bash是把当前用户的操作以覆盖~/.bash_history 的形式写入到此文件中,所以此时,如果用户调用history -c 退出后,那么管理员则什么都看不到,所以这时我们就要想办法把用户的操作记录给保存下来。
方法一:
首先,执行下面命令给.bash_history文件加上只能追加的形式进行记录
chattr +a /home/peter/.bash_history
lsattr /home/peter/.bash_history
然后,执行下面指令,修改bash以追加的方式忘给.bash_history文件中写入内容
shopt -s histappend
最后,调用下面指令使操作命令实时写入到.bash_history 文件中
PROMPT_COMMAND =" history -a;$PROMPT_COMMAND "
注意:上面两条命令写到/etc/profile 和/etc/bashrc文件最后即可
关于shopt命令的介绍请看http://blog.csdn.net/chaofanwei/article/details/11991963
方法二:
利用 PROMPT_COMMAND 命令进行用户行为的记录
PROMPT_COMMAND命令就是在用户执行本指令前调用的命令,可以在set环境中查看改变量,如下
图1 PROMPT_COMMAND 命令
操作:修改/etc/profile 和/etc/bashrc文件,在文件的最后加上以下两句话
export HISTORY_FILE=/var/log/`date '+%Y%m'`.log
#export PROMPT_COMMAND=' date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") $PWD $(history 1 | sed "s/^[ 0-9]*//g" ) " >> /var/log/ht/ht'
export PROMPT_COMMAND=' date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") $PWD $(history 1 | sed "s/^[ 0-9]*//g" ) " >> $HISTORY_FILE'
注意:一定要给$HISTORY_FILE'设置相应的权限,要不一般用户无法正确记录命令,而是会提示权限不足的问题,所以一定要修改这个文件的权限,使一般用户也能够写入。
最后,确保历史变量设置合理、无法更改。
这些历史变量包括最重要的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
HISTTIMEFORMAT是bash shell的扩展,将在历史文件中提供时间戳。
对于bash shell来说,你需要更改历史的一些标准选项:
shopt -s cmdhist #设置cmdhist将把多行命令放入到单单一个历史行
shopt -s histappend #设置histappend将确保被添加到历史文件,而不是像通常的做法那样覆盖历史文件。
另外对于bash shell来说,还要设置PROMPT_COMMAND:
PROMPT_COMMAND="history -a"
typeset -r PROMPT_COMMAND
这是由于bash shell实际上把历史写入到内存中,历史文件仅在shell会话结束时加以更新。这个命令会把上一个命令附加到磁盘上的历史文件。
最后,当然也可借助系统审计功能,具体请看我之前发表的文件http://blog.csdn.net/chaofanwei/article/details/11830543