[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告警

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

查看告警邮件

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

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

相关推荐
Jason_zhao_MR5 小时前
Linux与采集MCU通信为什么我们用了双SPI
linux·arm开发·单片机·嵌入式硬件·嵌入式
草莓熊Lotso5 小时前
【Redis 初阶】特殊数据类型、渐进式遍历与数据库操作生产指南
linux·网络·数据库·redis·tcp/ip·缓存·bootstrap
λqaq75 小时前
Redis 数据库基础:安装、5 大核心数据类型与常用命令
linux·数据库·redis·python·缓存
BioRunYiXue5 小时前
科研干货 | IC50全面解读:概念解析、实验设计与数据分析要点
java·开发语言·javascript·人工智能·算法·数据挖掘·数据分析
边境悍匪5 小时前
蜗牛学苑 Java 智能体学习 Day34|AOP 进阶、权限思维导图复盘
java·开发语言·spring boot·学习
天天被压力5 小时前
【零依赖量化数据实战 #31】沪深A实时盘口全景:逐笔·全盘实时·最新价·历史逐笔
java·人工智能·python
SamDeepThinking5 小时前
HashMap 分组操作的演进:从三次查找到一次调用
java·后端·程序员
CS_Zero5 小时前
Ubuntu 22.04挂载新硬盘
linux·运维·ubuntu
oushaojun25 小时前
深入 Linux 动态链接:so 库构建与运行逻辑(转)
linux
Zane19945 小时前
自己写一个 java.lang.String,为什么永远替换不掉 JDK 那个
java·后端