调用钉钉机器人API接口将堡垒机安全运维告警消息单发给运维人员
1、原场景如下
在堡垒机运维时的安全告警是通过钉钉webhook机器人发送到钉钉群
比如某个运维人员操作了passwd命令,这时钉钉群里有如下告警
(图片点击放大查看)
安全运维工程师在收到钉钉群里的告警消息后,先通过告警里面的人员信息钉钉中查到这个运维人员,然后手动将告警转发给这个运维人员提醒该运维人员
2、需求
在思考能否将告警消息直接通过机器人将告警消息单独发送这个操作了passwd的运维人员,这样能做到立马自动通知
3、探索过程
在查看钉钉机器人的API文档后
https://open.dingtalk.com/document/orgapp/chatbots-send-one-on-one-chat-messages-in-batches
(图片点击放大查看)
(图片点击放大查看)
有了一些思路
HTTP请求格式如下
POST /v1.0/robot/oToMessages/batchSend HTTP/1.1 Host:api.dingtalk.com x-acs-dingtalk-access-token:asdasdasdasd Content-Type:application/json { "robotCode" : "dingxxxxxx", "userIds" : [ "manager1234" ], "msgKey" : "sampleMarkdown", "msgParam" : "{\"text\": \"hello text\",\"title\": \"hello title\"}" }
难点主要在于userIDs这个参数获取和msgParam告警文本消息(markdown格式)如何通过GrayLog告警模块构造出来
在Github上搜索graylog时,找到了一个可能实现这个功能的graylog插件
https://github.com/airbus-cyber/graylog-plugin-logging-alert
(图片点击放大查看)
实现的过程比较痛苦,反复调试与试错了一个星期,最终搞定了
4、实现的大致步骤
下面简单说一下具体的实现步骤
1、下载Graylog4.2版本对应的graylog-plugin-logging-alert插件包并安装
rpm -ivh graylog-plugin-logging-alert-4.1.2-1.noarch.rpm systemctl restart graylog-server
重启graylog-server服务生效
(图片点击放大查看)
2、修改Logging Alert Notification的配置
Update Logging Alert Notification Configuration
(图片点击放大查看)
这里我用逗号,来分隔,为了方便后面构造json格式请求body
(图片点击放大查看)
3、新建一下Logging Alert类型的告警通知
robotCode来自
Body Template内容如下
(图片点击放大查看)
POST-BODY{"robotCode": "dingeXXXXXXXdmzd" ${if backlog && backlog[0]} "userIds":["${backlog[0].fields.userIDnumber}"] "msgKey": "sampleMarkdown" "msgParam": "{\\"title\\": \\"${event_definition_title} \\" \\"text\\": \\"## [堡垒机告警信息] \\r### <font color=#FF0000> 告警描述:${event_definition_description}</font> \\r##### <font color=#FF0000>告警产生时间</font>:${backlog[0].timestamp} \\r##### <font color=#67C23A>告警详细情况</font>:<font color=#FF0000>员工:${backlog[0].fields.user} </font>通过堡垒机登录<font color=#FF0000>${backlog[0].fields.resource}</font>于<font color=#FF0000>${backlog[0].fields.timestamp}</font>时间点执行了passwd命令操作,具体操作命令见告警原始日志中command内容 \\r##### <font color=#67C23A>告警服务器名称</font>:<font color=#FF0000>${backlog[0].fields.resource}</font> \\r##### <font color=#67C23A>告警服务器的IP</font>:${backlog[0].fields.targetIP} \\r##### <font color=#67C23A>告警原始日志</font>:${backlog[0].message} \\" }" ${end}}
4、在原来推送到Webhook机器人的告警下再加上Logging Alert类型
还是保留之前钉钉群里的webhook机器人告警,两种告警并行
(图片点击放大查看)
5、在Graylog服务器编写一下日志监控的shell脚本
(图片点击放大查看)
(图片点击放大查看)
脚本内容如下monitor_alertjson_sendtodingdingrobot.sh
#!/bin/bash send_dingtalk_robot(){ Token=`curl -s -X POST 'https://api.dingtalk.com/v1.0/oauth2/accessToken' -H 'Content-Type: application/json' -d '{"appKey": "请根据自己的环境自行补充","appSecret": "请根据自己的环境自行补充"}' | jq -r .accessToken` curl -s -X POST 'https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend' -H 'Content-Type: application/json' -H "x-acs-dingtalk-access-token:$Token" -d@/tmp/message.json } logfile="/var/log/graylog-server/server.log" outputfile="/tmp/message.json" keyword="POST-BODY" # 实时监控日志文件 tail -n 0 -f "$logfile" | while read -r line; do if [[ $line == *"$keyword"* ]]; then # 提取关键字后面的内容 content=$(echo "$line" | awk -F"$keyword" '{print $2}') # 存储到文件 echo "$content" > "$outputfile" echo "已提取并保存内容到 $outputfile" send_dingtalk_robot echo "已发送钉钉机器人" fi done
6、执行监控脚本
当触发了告警时/var/log/graylog-server/server.log中会出现[LoggingAlert] POST-BODY的日志
监控脚本会自动提取后输出到/tmp/message.json,然后调send_dingtalk_robot函数自动发送出来
(图片点击放大查看)
(图片点击放大查看)
最终的效果如下 钉钉机器人通过单聊的方式将告警通知给该运维人员
当然只是简单实现了这个功能,后续还需要继续优化该脚本