[linux运维] 利用zabbix监控linux高危命令并发送告警(基于Zabbix 6)

之前写过一篇是基于zabbix 5.4的实现文章,但是不太详细,最近已经有两个小伙伴在zabbix 6上操作,发现触发器没有str函数,所以更新一下本文,基于zabbix 6

0x01 来看看效果

高危指令出发问题告警:

发出邮件告警:

通过历史记录回溯用户指令


0x02 如何实现命令记录?

1)Linux操作系统可以通过history命令查询执行的历史命令信息

2)BASH在每次显示PS1之前都会执行PROMPT_COMMAND定义的内容 -- 可以理解为,每次用户在命令行点击一个回车之后,PROMPT_COMMAND都会被执行一次

3)利用上面两个特性,就可以实现命令行的记录

实现:修改Linux系统的/etc/bashrc文件

复制代码
# 创建命令行记录文件
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
  fi
fi
# 定义PROMPT_COMMAND的内容为函数__set_prompt
export PROMPT_COMMAND=__set_prompt
# 定义PROMPT_COMMAND变量为只读变量
readonly PROMPT_COMMAND
# 定义最后一个history id
Last_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/bashrc使之生效。

查看记录是否成功


0x03 在Zabbix上配置监控

1)创建一个模板Linux_Securtiry

2)创建监控项Linuxshell

键值是:logrt[/var/log/cmd.log,,,,,,,,]

3)新建一个触发器(触发告警),添加表达式

4)监控项选择上面创建的监控项,功能选择find(),O为匹配模式,我们用like,和数据库中的like是一样的意思,V是需要匹配的值,结果为1,填完之后点插入即可。

插入之后就会生成一条表达式

复制代码
find(/Linux_Security/logrt[/var/log/cmd_log,,,,,,,,],,"like"," rm ")=1

如果要匹配多个命令,可以复制表达式,使用or连接,如:

复制代码
find(/Linux_Security/logrt[/var/log/cmd_log,,,,,,,,],,"like"," rm ")=1 or
find(/Linux_Security/logrt[/var/log/cmd_log,,,,,,,,],,"like"," touch ")=1 or 
find(/Linux_Security/logrt[/var/log/cmd_log,,,,,,,,],,"like"," vi ")=1

最后把问题时间生成模式设置为多重即可。

以下操作沿用5.4的配置,没有更新

5)配置一个发送邮件的动作


0x04 测试一下

执行命令

查看Zabbix告警

可以看到已经发送了邮件,啥时候发恢复邮件呢?等最后一条命令不是高危命令就执行恢复了。

查看告警邮件

选择问题,点击历史记录可以查看历史的命令记录

--完,我是运维少年,欢迎关注我的微信公众号~

相关推荐
深栈解码7 分钟前
JMM深度解析(三) volatile实现机制详解
java·后端
liujing1023292919 分钟前
Day04_刷题niuke20250703
java·开发语言·算法
阿巴~阿巴~20 分钟前
Linux基本命令篇 —— alias命令
linux·服务器·bash
Brookty22 分钟前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
能工智人小辰36 分钟前
二刷 苍穹外卖day10(含bug修改)
java·开发语言
DKPT36 分钟前
Java设计模式之结构型模式(外观模式)介绍与说明
java·开发语言·笔记·学习·设计模式
缘来是庄39 分钟前
设计模式之外观模式
java·设计模式·外观模式
好名字更能让你们记住我1 小时前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos
门思科技1 小时前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网
知其然亦知其所以然1 小时前
JVM社招面试题:队列和栈是什么?有什么区别?我在面试现场讲了个故事…
java·后端·面试