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

 
 
 
Linux利用PROMPT_COMMAND实现审计功能

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

一. 配置

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

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}”)  #### $(history 1 | { read x cmd; echo “$cmd”; })”; } >> $HISTORY_FILE’

添加完成保存退出。这样任何操作命令都会在/var/log/日期.log中看到。还可以自己定义目录或者文件。让别人找不到 只允许自己看。只需要修改

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

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

[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上所提的一个问题,请参阅这个帖子。)

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

  1. 删除文件夹下面的文件的shell命令

    首先看我的文件所在目录 我想删除位于desktop下面的helloBox中的react-hello-dimple中的package.json文件,我们注意一下时间是4月18号 shell命令如下 $ ...

  2. 详细记录登录过程的用户、IP地址、shell命令以及详细操作时间

    将下面的代码添加到/etc/profile #history USER_IP=`>/dev/null|awk '{print $NF}'|sed -e 's/[()]//g'` HISTDIR= ...

  3. Linux history时间用户ip设置

    Linux history时间用户ip设置        在使用linux服务器的时候发生一些不知道谁操作的问题,google一下说history命令可以查看到历史记录,用过之后发现还是不够详细,再g ...

  4. LINUX之根目录介绍、普通目录创建、删除、复制、移动、权限管理命令记录

    (一)Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令:ls / /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot:这里存放的是启动Linux时使用的 ...

  5. Linux基础(学习过程记录)

    常用快捷键:Tab:使用Tab键来进行命令补全,补全目录.补全命令参数Ctrl+c键来强行终止当前程序Ctrl+d 键盘输入结束或退出终端Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行Ctrl+ ...

  6. linux下用户操作记录审计环境的部署记录

    通常,我们运维管理人员需要知道一台服务器上有哪些用户登录过,在服务器上执行了哪些命令,干了哪些事情,这就要求记录服务器上所用登录用户的操作信息,这对于安全维护来说很有必要.废话不多说了,下面直接记录做 ...

  7. linux history 命令详解

    linux history 命令详解 显示命令执行时间 linux shell 具有history 功能,即会记录已经执行过的命令,但是默认是不显示命令的执行时间,命令的执行时间,history 已经 ...

  8. 数据仓库002 - 复习Linux shell命令 - echo bash_profile bashrc which命令的理解 alias history

    1.echo 打印 . echo 的作用是在屏幕上打印输出内容,与文件和持久化可以理解为没有丝毫关联.如:在屏幕上打印“ echo 的作用是打印文字! ” 实例1:输出系统的环境变量名称 $PATH ...

  9. 面试问题记录 二 (数据库、Linux、Redis)

    面试问题记录 二 (数据库.Linux.Redis) 前言 接着上次的面试问题记录,在最后还有几道问的数据结构方面的知识点要补充 还是那句话:如果文中解释有明显错误,劳烦请及时指正我,在这不胜感激!! ...

随机推荐

  1. Codeforces Beta Round #97 (Div. 1) B. Rectangle and Square 暴力

    B. Rectangle and Square 题目连接: http://codeforces.com/contest/135/problem/B Description Little Petya v ...

  2. hihocoder #1299 : 打折机票 线段树

    #1299 : 打折机票 题目连接: http://hihocoder.com/problemset/problem/1299 Description 因为思念新宿的"小姐姐"们, ...

  3. JavaScript将具有父子关系的原始数据格式化成树形结构数据(id,pid)

    前几天遇到一个树型组件(类似树形菜单)数据格式化的问题,由于后台把原始查询的数据直接返回给前端,父子关系并未构建,因此需要前端JS来完成,后台返回的数据和下面的测试数据相似. var data=[ { ...

  4. redis的搜索组件 redis-search4j

    redis-search4j是一款基于redis的搜索组件. 特点 1.基于redis,性能高效 2.实时更新索引 3.支持Suggest前缀.拼音查找(AutoComplete功能) 4.支持单个或 ...

  5. Word文档中的语法高亮显示代码

    有时候我们程序员也需要在word文档里面显示代码,但是直接复制过去 不好看,格式也不太对,这里给大家分享一个Word文档中的语法高亮显示代码的方法 http://www.planetb.ca/synt ...

  6. spring mvc接收数组

    (一)前言 对于springmvc接收数组的问题啊,我试验过几次,但是了有时候成功了,有时候失败了,也不知道为啥的,然后现在又要用到了,所以打算具体看看到底怎么回事,但是了我实验成功了顺便找了好多资料 ...

  7. 使用C#中的out关键字,用世界杯演绎

    今年的世界杯好看至极,充满着故事性.戏剧性.无论你平常踢不踢球,也不管你是否懂球,你总能从中获得些许的情感释放.世界杯似乎超越了足球本身,成为世界各地人们的"情感总和",一场场比赛 ...

  8. 将数据处理逻辑集中到一处进行管理,逐步实现真正有效的 MVC 分层结构

    将数据处理逻辑集中到一处进行管理,逐步实现真正有效的 MVC 分层结构.

  9. 使用 CoreTelephony 框架获取当前网络运营商

    CoreTelephony 获取运营商信息,需通过 CoreTelephony.Framework 中的 CTTelephonyNetworkInfo 和 CTCarrier 对象获取,这些都在iOS ...

  10. style="visibility: hidden"和 style=“display:none”之间的区别

    style=“display:none” 隐藏页面元素: <html> <head> <script type="text/javascript"&g ...