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

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的设置.

[[email protected] ~]#. /etc/profile 或者   [[email protected] ~]#source /etc/profile

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

验证日志里面是否有数据

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

时间: 2024-11-08 13:10:35

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

个人-linux中如何批量创建和删除用户的方法(不需要shell脚本)

创建:1.echo {01..03}|xargs -n1|sed -rn 's#(.*)#useradd stu\1;echo 12345|passwd --stdin stu\1#gp'|bash echo stu{01..03}|xargs -n1|sed -rn 's#(.*)#useradd &;echo 123456|passwd --stdin &#gp'|bash 删除:echo stu{01..03}|xargs -n1|sed -rn 's#(.*)#userdel -r

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

将下面的代码添加到/etc/profile #history USER_IP=`who -u am i 2>/dev/null|awk '{print $NF}'|sed -e 's/[()]//g'` HISTDIR=/usr/share/.history if [ -z $USER_IP ] then USER_IP=`hostname` fi if [ ! -d $HISTDIR ] then mkdir -p $HISTDIR chmod 777 $HISTDIR fi if [ ! -

Shell命令学习 之,sort,unique 文件简单排序去除重复记录

经常会碰到文件里有重复记录的场景,要么去除重复记录,要么统计下重复记录数,这些简单的功能可以通过shell命令里的sort,uniq组合实现, 比如文件a.txt记录如下 test,test1,test2 test test1 test2 test,test1,test2 abcd edfg abcd ddddd 去除重复行: sort a.txt |uniq abcd ddddd edfg test test,test1,test2 test1 test2 查找非重复行 [[email pro

Linux History&man

(一).第一周作业 1).Linux常见发行版本以及区别 debian: ubuntu,mint slackware:SUSE Linux Enterprise Server (SLES) OpenSuse桌面 redhat: RHEL: RedHat Enterprise Linux每18个月发行一个新版本CentOS:兼容RHEL的格式中标麒麟:中标软件Fedora:每6个月发行一个新版本 ArchLinux:轻量简洁 Gentoo:极致性能,不提供传统意义的安装程序摘自CSDN:Linux

linux history历史记录命令详解

一.什么是history在bash功能中,它能记忆使用过的命令,这个功能最大的好处就是可以查询曾经做过的举动!从而可以知道你的运行步骤,那么就可以追踪你曾下达过的命令,以作为除错的工具! 二.History的保存那么命令记录在哪里呢?在家目录内的 .bash_history 里! 不过,需要留意的是,~/.bash_history 记录的是前一次登陆以前所运行过的命令,而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中! 查

Linux认证用Syslog记录UNIX和Windows日志的方法

Linux认证用Syslog记录UNIX和Windows日志的方法,在网络中安排一台专用的日志服务器来记录系统日志是一个比较理想的方案.本文以FreeBSD下的syslog为例,介绍如何利用freebsd的syslogd来记录来自UNIX和windows的log信息. 在比较大规模的网络应用或者对安全有一定要求的应用中,通常需要对系统的日志进行记录分类并审核,默认情况下,每个系统会在本地硬盘上记录自己的日 志,这样虽然也能有日志记录,但是有很多缺点:首先是管理不便,当服务器数量比较多的时候,登陆

linux系统添加swap虚拟内存与删除配置方法

兄弟连Linux培训教程 linux系统添加swap虚拟内存与删除配置(www.lampbrother.net) 1.swap概述 Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中.这样,系统总是在物理内存不够时,才进行Swap交换. 其实

linux下的c语言编程删除文件夹

刚刚在学习开始做新项目的时候,学长布置了一项任务,就是在给定一个目录下,要将这个目录下一个星期之前的目录包括里面的文件全部删除,只保留这一个星期内的.百度了好久的资料,终于完成,记录一下防止忘记.(注:文件夹名称默认为日期格式,如20140716) #include<dirent.h> #include<sys/types.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #i

Linux下部署docker记录(1)-Volume使用

之前部署了Linux下部署docker记录(0)-基础环境安装,接下来看看Docker Volume的使用. Docker volume使用1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享.数据卷可以在多个容器之间共享.2)创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然你也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,你就可以在其他容器中通过--volumes-froms参数来挂载该数