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. 王彪-20162321-Java程序设计与数据结构2nd-第十周学习总结

    学习目标 讨论有向图和无向图 定义带权图并讨论它们的应用 定义图的广度优先遍历和深度优先遍历 定义最小生成树 讨论图的实现策略 书中图的基本定义 图是由结点及结点间的连接组成的,结点称为顶点,结点间的 ...

  2. hdu 2732 最大流 **

    题意:题目是说一个n*m的迷宫中,有每个格子有柱子.柱子高度为0~3,高度为0的柱子是不能站的(高度为0就是没有柱子)在一些有柱子的格子上有一些蜥蜴,一次最多跳距离d,相邻格子的距离是1,只要跳出迷宫 ...

  3. ZeptoLab Code Rush 2015 A. King of Thieves 暴力

    A. King of Thieves Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/526/pr ...

  4. CodeForces 128D Numbers 构造

    D. Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  5. Oil Deposits 搜索 bfs 强联通

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  6. Linux中文件/文本的中文乱码解决方法

    Linux显示在Windows编辑过的中文就会显示乱码是由于两个操作系统使用的编码不同所致.Linux下使用的编码是utf8,而Windows使用的是gb18030.因此,解决Linux打开txt/c ...

  7. MySQL Innodb 存储引擎学习篇

    master thread的县城优先级别最高.其内部由几个循环(loop)组成:主循环(loop).后台循环(background loop).刷新循环(flush loop).暂停循环(suspen ...

  8. Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)

    Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...

  9. Tasker 模拟重复点击按钮

    http://stackoverflow.com.80bola.com/questions/21544271/android-tasker-app-advance-input-shell-comman ...

  10. 光速 React

    光速 React Vixlet 团队优化性能的经验教训 在过去一年多,我们 Vixlet 的 web 团队已经着手于一个激动人心的项目:将我们的整个 web 应用迁移到 React + Redux 架 ...