Linux History安全问题【保存记录防止删除】+完善Linux/UNIX审计 将每一个shell命令记入日志

 

2011-09-27 22:11:51|  分类: rhel5_033|举报|字号 订阅html

 
 
Linux History安全问题【保存记录防止删除】 - zhuzhu - 五事九思  (大连Linux主机维护)
 
Linux利用PROMPT_COMMAND实现审计功能

这个系统审计,记录什么用户,在什么时间,作了什么操做。 而后将查到的信息记录到一个文件里。node

一. 配置linux

 

1. 在/etc/profile 文件的最后,添加以下2行代码:typescript

 

 

 

export HISTORY_FILE=/var/log/`date ‘+%Y%m’`.log shell

export PROMPT_COMMAND=’{ date “+%Y-%m-%d %T ##### $(who am i |awk “{print \$1\” \”\$2\” \”\$5}”)  #### $(history 1 | { read x cmd; echo “$cmd”; })”; } >> $HISTORY_FILE’ 安全

添加完成保存退出。这样任何操做命令都会在/var/log/日期.log中看到。还能够本身定义目录或者文件。让别人找不到 只容许本身看。只须要修改bash

 

export HISTORY_FILE=/var/log/`date ‘+%Y%m’`.log  这个记录就可服务器

/etc/profile: 此文件为系统的每一个用户设置环境信息,当用户第一次登陆时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.app

 

[root@node1 ~]#. /etc/profile 或者   [root@node1 ~]#source /etc/profile函数

 使更改生效,若是没有报错说明成功了。

 验证日志里面是否有数据

 [root@node1 ~]# more /var/log/201107.log

2011-07-21 17:29:08 ##### root pts/2 (192.168.23.250)  #### . /etc/profile

能够看到里面已经有数据。

 还可使用

 PROMPT_COMMAND=’{ date “+%Y-%m-%d %T ##### USER:$USER IP:$SSH_CLIENT PS:$SSH_TTY #### $(history 1 | { read x cmd; echo “$cmd”; })”; } >>$HISTORY_FILE’

命令不同可是结果是同样的。

 

 

编者按:为了确保服务器的安全,保留shell命令的执行历史是很是有用的一条技巧。然而,shell虽然有历史功能,可是这个功能并不是针对审计的目的而设计,所以很容易被用户篡改或是丢失。本文介绍的步骤可以帮助你将每一个shell命令记入日志(你能够将本文和bash history logging攻防一文参考着阅读,看看攻防双方的思路有何不一样)。本文做者David Douthitt是一位经验丰富的UNIX和Linux系统管理员,曾作过Linux发行版的打包工做,也是《Advanced Topics in System Administration》和《GNU Screen: A Comprehensive Manual》两本书的做者。如下为正文:

将用户执行的每一个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

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会话结束时加以更新。这个命令会把上一个命令附加到磁盘上的历史文件。

最后,建立一个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

在Ubuntu 10.10中,我获得了来自ksh93的这个输出:

# echo ${.sh.version}  Version JM 93t+ 2009-05-01

若是审计功能开启,特征字符串(JM)还会有字母A(开启审计功能),可能还有字母L(开启针对用户的审计功能)。IBM DeveloperWorksMusings of an OS Plumber都刊有介绍Korn Shell审计的出色文章。

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)去除了。

上述信息也能够在shell以外获取。好比有两个命令:lastcomm(来自Ubuntu Main软件仓库中的acct程序包)和auditctl(来自Ubuntu Universe软件仓库中的auditd程序包)。另外, Linux Journal在2002年刊发过一篇关于Linux进程统计的好文章。另外还有rootsh和snoopylogger这两个程序包,只是二者都不在Ubuntu软件仓库中。Rootsh比如是typescript的执行版本,而snoopylogger是你能够添加到用户环境的系统库。(这些方法有许多来自在serverfault.com上所提的一个问题,请参阅这个帖子。)

相关文章
相关标签/搜索