0

有很多关于问题根源的问题没有答案,所以我想更深入地说明我的问题,希望能得到一些关于如何实现它的想法。

警告: InfluxDB 新手在这里,所以请多多包涵。

所以,我的根本问题是你不能在 InfluxQL 中按字段分组,因为字段没有被索引。但是,只要我明白我必须写下一些字段才能在 InfluxDB 中获得一行,它就不能只包含标签。

这个想法是通过解析日志条目并生成可以稍后由 Chronograph 绘制的测量值来从 Postfix 日志中收集失败的登录尝试。

原始日志条目是这样的:

Nov 18 06:30:55 moonshine postfix/smtps/smtpd[11656]: warning: unknown[1.2.3.4]: SASL LOGIN authentication failed: UGFzc3dvcmQ6

此日志条目生成以下测量值(在 InfluxDB 线路协议中):

smtp_failed_login,host=moonshine,path=/var/log/mail.log,program=postfix/smtps/smtpd source_ip="1.2.3.4" 1574301125000000000

您可以看到 Telegraf 将客户端的 IP 转换为字段。只是因为我认为我在这里需要一些领域,而 IP 是这里最好的申请人。

只要我了解文档,Telegraf 的输入解析器不能一次制作标签和字段,我必须决定哪个去哪个地方。

我想在 Chronograph 中创建多个图表的目标,基于 1)在选定的时间间隔内生成了多少失败的日志条目和 2)制作图表 - 和警报 - 如果某个 IP 达到关于失败登录的限制以触发警报消息和也采取行动。它有点类似于 Fail2Ban,但我也很想获得图表,因为有时失败的登录操作是有效的。

我只是不知道如何查询 2) 并对 1) 有一些基本的想法。如果有人可以帮助我提供有关如何编写这些查询或如何更改我的架构以实现目标的指示,我将非常感激。

4

1 回答 1

1

您的架构看起来不太好。source_ip应该是tag,因为你会想用它来分组+创建常量field,例如value=1。然后:

1.) 在选定的时间间隔内生成了多少失败的日志条目:

SELECT COUNT(value) 
FROM <measurement>
WHERE <time condition>

2.) IPs,在选定的时间间隔内已达到定义的限制(此处使用子查询,它可能具有更好的单个查询等效项):

SELECT * FROM (
  SELECT COUNT(value) 
  FROM <measurement>
  WHERE <time condition>
  GROUP BY "source_ip"
) WHERE count_value > <failed-login-limit>

查询 ^^ 不准备用于复制和粘贴测试。他们可能需要一些开发,所以请检查 InfluxDB 文档以获得正确的语法。

于 2019-11-22T16:26:13.837 回答