syslog-ng实时日志监控

566 阅读3分钟

1、需求

出于服务器安全原因,需要实时检测Ubuntu服务器登录失败的用户登录信息并且发送到slack,试过以下几种办法

1)python脚本去定时检测日志文件当中的失败信息,但是这样检测有个缺点就是需要判断日志产生的时间,要避免重复发送提醒信息,还有需要给python脚本单独做守护进程或者是定时任务

2)将日志文件转发出来,比如通过promtail发送日志文件信息到loki,然后再利用Granfa的的alert功能定时检测日志文件当中的关键字然后发送警告,但是这样不是很友好,不可以将日志文件的关键字的信息发送出来,只能偏向监控统计告警

3)利用loki结合Prometheus的Alertmanager,原理是在loki当中配置关键字检索,然后发送到Alertmanager,配置较为繁琐

4)利用脚本语言定时扫描loki日志,通过api定时去扫描日志并且做时间判断筛选,loki的第三方脚本api封装包其实不是很多,不建议;假如是elk架构另外的话是不可以操作服务器配置的话可以考虑去扫描es的日志数据做关键字日志监控

5)利用syslog-ng,syslog-ng 是一个开源的日志管理工具,它可以收集、处理和传输日志信息。它支持多种协议和格式,可以从多种来源收集日志信息,并将其传输到多种目的地,以下是它的优点

  • 高效的日志处理:syslog-ng 可以快速地处理大量的日志信息。
  • 灵活的配置:syslog-ng 提供了丰富的配置选项,可以满足各种不同的需求。
  • 安全性:syslog-ng 支持多种安全协议,可以确保日志信息在传输过程中的安全性。
  • 可扩展性:syslog-ng 支持多种插件和模块,可以方便地扩展其功能。

2、Ubuntu安装syslog-ng

1.  打开终端并更新软件包列表:

sudo apt-get update

2.  安装 syslog-ng 软件包:

sudo apt-get install syslog-ng

3.  安装完成后,syslog-ng 服务将自动启动。您可以使用以下命令检查其状态:

sudo service syslog-ng status

4.  syslog-ng 的配置文件位于 `/etc/syslog-ng/syslog-ng.conf`。可以根据需要编辑此文件来配置 syslog-ng。
5.  在修改配置文件后,需要重启 syslog-ng 服务以使更改生效:

sudo service syslog-ng restart

3、监控日志文件

1、安装并配置 syslog-ng 软件包,用于监控 /var/log/auth.log 文件中的登录失败信息。您可以在 /etc/syslog-ng/conf.d/ 目录下创建一个新交件,内容如下:

filter f_authfail { (facility(auth, authpriv) and match("Failed password")) or (facility(auth, authpriv) and match("Disconnected from authenticating")); };
destination d_slack { program("/root/task/slack.sh"); };
log { source(s_src); filter(f_authfail); destination(d_slack); };

这个配置会监控 auth.log 文件中包含Failed password”文本的消息,并将其转发到 /root/task/slack.sh 脚本 2、.在 /root/task/slack.sh 路径下创建个脚本,用于通过 Slack APl token 和用户名发送通知到 Slack。下面是一个示例脚本,它使用 Slack APl token 和用户名向Slack 频道发送消息:

#!/bin/bash
  
SLACK_API_TOKEN="xxxxx"
SLACK_CHANNEL_ID="xxxx"
SLACK_USERNAME="xxxxx"

read MESSAGE

ipAddr=$(ip addr show | grep inet | grep -v inet6 | grep '/24' | awk '{print $2}' | awk -F '/' '{print $1}')
list=("Failed password" "Disconnected from authenticating")

found=0
for item in "${list[@]}"; do
  if [[ $MESSAGE == *"$item"* ]]; then
    found=1
    break
  fi
done

if [[ $found -eq 1 ]]; then
  echo "Substring found in full string"
  curl -X POST -H 'Content-type: application/json' \
  -H "Authorization: Bearer $SLACK_API_TOKEN" \
  --data "{\"channel\":\"$SLACK_CHANNEL_ID\",\"text\":\"$MESSAGE $ipAddr\",\"username\":\"$SLACK_USERNAME\"}" \
  https://slack.com/api/chat.postMessage
else
  echo "Substring not found in full string"
fi

3、配置完成,重启服务即可

sudo service syslog-ng restart

以下是效果图

image.png 4、不生效排查

1)、排查syslog-ng是否启动

2)、通过一下命令检查文件是否执行正常、是否有权限

echo "Test message" | /root/task/slack.sh
# 假如没权限的话赋予权限
chmod +x  /root/task/slack.sh