如何实现命令记录?如何监控?
还在用 logrt匹配 rm、mv、wget?升级 7.0 后突然失效了?别慌,这篇给你讲透新姿势。
一、为什么要监控高危命令?
运维最怕什么?手滑 rm -rf /、误操作 mv覆盖重要文件、被入侵者悄悄 wget下载恶意脚本……
一旦发生,轻则服务挂掉,重则数据丢失。所以实时监控并告警高危命令,是每个运维团队的刚需。
传统做法:
Linux运维必备!历史命令安全审计记录+IP源+用户等
一、脚本实现审计前提:追加Linux系统的/etc/profile文件
#-----监控命令行高危命令---------------# 创建命令行记录文件log_file=/var/log/cmd.log# 如果是root的话就创建文件if [[ $UID -eq 0 ]];then # 判断文件是否存在,不存在就创建 if [ ! -f $log_file ] then touch $log_file chmod 777 $log_file chattr +a $log_file fifi# 定义PROMPT_COMMAND的内容为函数__set_promptexport PROMPT_COMMAND=__set_prompt# 定义PROMPT_COMMAND变量为只读变量readonly PROMPT_COMMAND# 定义最后一个history idLast_Hit_Num=`history 1 | awk '{print $1}'`__set_prompt (){ local EXIT=$? # 定义命令执行的结果 # 获取本次命令执行的history id export Cur_HIT_NUM=`history 1 | awk '{print $1}'` # 如果本次执行的命令和上次执行的命令一样,则id没有变化,不需要进行记录 # 如果这里不处理,空白回车也会导致记录,记录的值就是上次执行的命令 if [[ $Cur_HIT_NUM -ne $Last_Hit_Num ]];then # 判断命令是否执行成功 if [[ $EXIT -ne 0 ]];then echo "执行时间:$(date '+%y-%m-%d %T') 用户:$(who am i | awk "{print \$1\" \"\$2\" \"\$5}") 当前目录:$(pwd) 执行命令:$(history 1 | sed 's/^[ \t]*//g' | cut -d " " -f2-) 执行失败" >>$log_file else echo "执行时间:$(date '+%y-%m-%d %T') 用户:$(who am i | awk "{print \$1\" \"\$2\" \"\$5}") 当前目录:$(pwd) 执行命令:$(history 1 | sed 's/^[ \t]*//g' | cut -d " " -f2-) 执行成功" >>$log_file fi fi # Cur_Hit_Num赋值给Last_Hit_Num export Last_Hit_Num=$Last_Hit_Num return $EXIT}#---------------------------------
退出用户重新登录,或者source一下/etc/profile使之生效。
查看记录是否成功
键值是:logrt[/var/log/cmd.log,,,,,,,,]{LinuxGeneralTemplate:logrt[/var/log/cmd.log,,,,,,,,].str( rm )}=1or {LinuxGeneralTemplate:logrt[/var/log/cmd.log,,,,,,,,].str( mv )}=1
最后测试一下
执行命令:rm /tmp/test.log
键值:
log.count[/var/log/cmd.log,rm|mv|wget]
触发表达式:
{你的主机名:log.count[/var/log/cmd.log,rm|mv|wget].last()}>0
{你的主机名:log.count[/var/log/cmd.log,rm|mv|wget].min(10m)}=0