history记录ip用户时间等,linux操作审计,命令行审计

history记录ip用户时间等,linux操作审计,命令行审计

由于最近服务器经常出现系统文件被改动,但通过history溯源只能查看到对应的命令,不知道具体是谁操作的。于是基于PROMPT_COMMAND实现了一个审计功能。好了废话不多说直接上代码。

cat >> /etc/profile << 'EOF'
CMD_LOG_DIR=/cmdlog
if [ ! -d $CMD_LOG_DIR ] ; then
    mkdir -p $CMD_LOG_DIR
    chmod 777 $CMD_LOG_DIR
fi
#设置history大小
HISTSIZE=40000
#多会话避免冲突
shopt -s histappend
export CMD_LOG_FILE="$CMD_LOG_DIR/.history.cmdlog"
if [ ! -f $CMD_LOG_FILE ] ; then
    "#cmdlog" >> $CMD_LOG_FILE
    chmod 777 $CMD_LOG_FILE>>/dev/null
fi
export PROMPT_COMMAND='{  date "+$(history 1 |awk "{print \$1}") ##### %Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(pwd) #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >> $CMD_LOG_FILE'
EOF

cat >> /etc/bashrc << 'EOF'
alias cmdlog='cat $CMD_LOG_FILE'
EOF

source /etc/profile
source /etc/bashrc

使用方法

拷贝并粘贴至命令行

[root@node1 ~] cat >> /etc/profile << 'EOF'
> CMD_LOG_DIR=/cmdlog
> if [ ! -d $CMD_LOG_DIR ] ; then
>     mkdir -p $CMD_LOG_DIR
>     chmod 777 $CMD_LOG_DIR
> fi
> #设置history大小
> HISTSIZE=40000
> #多会话避免冲突
> shopt -s histappend
> export CMD_LOG_FILE="$CMD_LOG_DIR/.history.cmdlog"
> if [ ! -f $CMD_LOG_FILE ] ; then
>      >>  $CMD_LOG_FILE
>     chmod 777 $CMD_LOG_FILE>>/dev/null
> fi
> export PROMPT_COMMAND='{  date "+$(history 1 |awk "{print \$1}") ##### %Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(pwd) #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >> $CMD_LOG_FILE'
> EOF
[root@node1 ~] 
[root@node1 ~] cat >> /etc/bashrc << 'EOF'
> alias cmdlog='cat $CMD_LOG_FILE'
> EOF
[root@node1 ~]
[root@node1 ~] source /etc/profile
[root@node1 ~] source /etc/bashrc
[root@node1 ~]

接下来就可以使用 cmdlog命令进行查看审计日志了

[root@node1 ~] cmdlog
#cmdlog
356 ##### 2022-05-24 13:36:42 ##### root pts/1 (192.168.4.208) #### /data/es #### source /etc/profile
357 ##### 2022-05-24 13:36:42 ##### root pts/1 (192.168.4.208) #### /data/es #### source /etc/bashrc
357 ##### 2022-05-24 13:36:44 ##### root pts/1 (192.168.4.208) #### /data/es #### source /etc/bashrc
358 ##### 2022-05-24 13:36:49 ##### root pts/1 (192.168.4.208) #### /data/es #### cmdlog
359 ##### 2022-05-24 13:37:02 ##### root pts/1 (192.168.4.208) #### / #### cd ../../
360 ##### 2022-05-24 13:37:13 ##### root pts/1 (192.168.4.208) #### / #### cat /etc/profile
361 ##### 2022-05-24 13:37:17 ##### root pts/1 (192.168.4.208) #### / #### ls

改进

使用了几天后发现以上脚本会产生很多重复记录,以下是做了对应的修改

cat >> /etc/profile << 'EOF'
CMD_LOG_DIR=/cmdlog
if [ ! -d $CMD_LOG_DIR ] ; then
    mkdir -p $CMD_LOG_DIR
    chmod 777 $CMD_LOG_DIR
fi
#设置history大小
HISTSIZE=40000
#多会话避免冲突
shopt -s histappend
export CMD_LOG_FILE="$CMD_LOG_DIR/.history.cmdlog"
if [ ! -f $CMD_LOG_FILE ] ; then
    "#cmdlog" >> $CMD_LOG_FILE
    chmod 777 $CMD_LOG_FILE>>/dev/null
fi
export PROMPT_COMMAND='
if [ $(history 1 |awk "{print \$1}") != $(tail -n 1 $CMD_LOG_FILE |awk "{print \$1}") ]; then
    date "+$(history 1 |awk "{print \$1}") ##### %Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(pwd) #### $(history 1 | { read x cmd; echo "$cmd"; })" >> $CMD_LOG_FILE
fi
if [ $(history 1 |awk "{print \$1}") == $HISTSIZE ];then
    history -c
fi
'
EOF


版权声明:本文为qq_40331154原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。