在对linux系统进行操作的时候经常多开好几个ssh窗口,执行很多命令,如果操作内容很多,时间一久就会忘记,很有必要把每一次的操作记录保存下来用于日后查看;还有一种情况就是多人协作的场景,经常会出现不同人在同一台服务器上同时操作,操作的内容互相影响,这时也非常需要有一个审计日志,可以很方便的查看哪个用户做了什么操作,执行了什么命令。
以下是记录 bash 命令日志的参考方法,借此可以实现Linux系统上记录用户操作的审计日志
1、编辑/etc/profile文件,在结尾增加如下代码:
#vi /etc/profile
#set user history
USER=`whoami`
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]; then
USER_IP=`hostname`
fi
if [ ! -d /var/log/history/${LOGNAME} ]; then
mkdir -p /var/log/history/${LOGNAME}
chown -R ${LOGNAME}:${LOGNAME} /var/log/history/${LOGNAME}
chmod 300 /var/log/history/${LOGNAME}
fi
export HISTTIMEFORMAT='%F %T '
export HISTORY_FILE="/var/log/history/${LOGNAME}/bash_history"
export PROMPT_COMMAND='{ msg=$(history 1 | { read x y z; echo $z; });echo $(date +"%Y-%m-%d %H:%M:%S") [$USER@$LOGNAME@$USER_IP `pwd` ]" $msg" >> $HISTORY_FILE; }'
chmod 300 /var/log/history/${LOGNAME}目的是防止创建的日志文件被删除
read x y z; echo $z;这里取变量$z的原因是因为linux系统默认的history命令的输出结果第一列是行号 第二列是执行的命令,由于没有时间不知道啥时候执行的,不太方便排查问题,于是前期通过在/root/.bashrc文件中增加一行代码的方式,增加了一列用来显示时间,于是命令本身变成了第三列,也就是第三个变量。
export HISTTIMEFORMAT='%F %T '
这里为了方便就把这一行代码也放在了上述shell脚本的第12行。这样就不用单独去修改/root/.bashrc文件了。
2、执行如下命令,使配置生效
# source /etc/profile
3、验证
退出ssh,再登陆,查看bash_history文件是否有内容
#cat /var/log/history/${LOGNAME}/bash_history
4、简化操作
cat << "EOF" >> /etc/profile
#set user history
USER=`whoami`
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]; then
USER_IP=`hostname`
fi
if [ ! -d /var/log/history/${LOGNAME} ]; then
sudo mkdir -p /var/log/history/${LOGNAME}
sudo chown -R ${LOGNAME}:${LOGNAME} /var/log/history/${LOGNAME}
sudo chmod 300 /var/log/history/${LOGNAME}
fi
export HISTORY_FILE="/var/log/history/${LOGNAME}/bash_history"
export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });echo $(date +"%Y-%m-%d %H:%M:%S") [$USER@$LOGNAME@$USER_IP `pwd` ]" $msg" >> $HISTORY_FILE; }'
EOF
5、使用问题记录
实际使用发现上述方法有几点不足:
1、用户使用非root用户登录,然后sudo su之后的操作没有记录,这在审计时是非常严重的问题。
2、history日志保留在本地,一旦系统崩溃,操作记录也就无法查询了。
=========================================================================
6、所有用户的shell history保留在另外一台服务器上
这里有一个新的工具hishtory,可以将所有用户的shell history保留在另外一台服务器上,安装使用都很简单。
Getting Started
To install hishtory
on your first machine:
curl https://hishtory.dev/install.py | python3 -
At this point, hishtory
is already managing your shell history (for bash, zsh, and fish!). Give it a try by pressing Control+R
and see below for more details on the advanced search features.
Then to install hishtory
on your other computers, you need your secret key. Get this by running hishtory status
. Once you have it, you follow similar steps to install hiSHtory on your other computers:
curl https://hishtory.dev/install.py | python3 - hishtory init $YOUR_HISHTORY_SECRET
Now if you press Control+R
on first computer, you can automatically see the commands you've run on all your other computers!
参考链接:
Bash Shell 中的 PROMPT_COMMAND - Jamin Zhang
https://www.jianshu.com/p/293661239c02
GitHub - ddworken/hishtory: Your shell history: synced, queryable, and in context
=========================================================================
history命令则更侧重于记录用户在命令行界面中的历史操作。它本质上是将用户输入的命令记录到syslog日志中,主要用于简单记录用户的命令操作历史。然而,history方式存在一些局限性,例如容易被修改或绕过,记录的信息相对简单且缺乏上下文信息,无法记录shell脚本内的操作或非登录操作等。
7、Auditd提供了更全面、详细的系统审计功能,适用于安全审计和合规性检查等场景。
apt -y install auditd
auditctl -l
# 编辑如下文件
/etc/audit/rules.d/audit.rules
# 根据系统位数选择增加以下规则
-a always,exit -F arch=b64 -S execve -k execve_tracking //记录64位系统的所有用户的shell命令
-a always,exit -F arch=b32 -S execve -k execve_tracking //记录32位系统的所有用户的shell命令
augenrules --load
auditctl -l
service auditd restart
ausearch -k execve_tracking
aureport -i -x --start today
参考文档
audit.rules(7) - Linux manual page
来自 <https://www.cnblogs.com/wangguishe/p/17285807.html>
ubuntu20.04 Auditd使用教程(监控所有用户命令输入记录,包括常用命令、运行脚本、pip安装、apt安装等)(操作监控、输入监控、命令监控、操作日志、命令日志、history命令)