调用钉钉机器人API接口将堡垒机安全运维告警消息单发给运维人员
在堡垒机运维时的安全告警是通过钉钉webhook机器人发送到钉钉群
比如某个运维人员操作了passwd命令,这时钉钉群里有如下告警

(图片点击放大查看)
安全运维工程师在收到钉钉群里的告警消息后,先通过告警里面的人员信息钉钉中查到这个运维人员,然后手动将告警转发给这个运维人员提醒该运维人员
在思考能否将告警消息直接通过机器人将告警消息单独发送这个操作了passwd的运维人员,这样能做到立马自动通知
在查看钉钉机器人的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

(图片点击放大查看)
实现的过程比较痛苦,反复调试与试错了一个星期,最终搞定了
下面简单说一下具体的实现步骤
rpm -ivh graylog-plugin-logging-alert-4.1.2-1.noarch.rpm
systemctl restart graylog-server
重启graylog-server服务生效

(图片点击放大查看)
Update Logging Alert Notification Configuration

(图片点击放大查看)
这里我用逗号,来分隔,为了方便后面构造json格式请求body

(图片点击放大查看)
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}}
还是保留之前钉钉群里的webhook机器人告警,两种告警并行

(图片点击放大查看)

(图片点击放大查看)

(图片点击放大查看)
脚本内容如下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
当触发了告警时/var/log/graylog-server/server.log中会出现[LoggingAlert] POST-BODY的日志
监控脚本会自动提取后输出到/tmp/message.json,然后调send_dingtalk_robot函数自动发送出来

(图片点击放大查看)

(图片点击放大查看)
最终的效果如下 钉钉机器人通过单聊的方式将告警通知给该运维人员

当然只是简单实现了这个功能,后续还需要继续优化该脚本
欢迎加入GrayLog微信群进行交流讨论

原文作者:WalkingCloud;如有侵权,请联系管理员删除。