使用ElastAlert配置ELK堆栈警报

欢迎来到我们的教程,该教程如何使用ElastAlert配置ELK堆栈警报。 ELK Stack使您能够收集,处理/解析,索引和可视化各种系统数据,它也可以配置为在发生各种事件时发出警报。警报功能使您可以监视数据中的更改或异常,并在满足某些事件条件的情况下执行必要的响应操作。 ELK堆栈支持警报,但它可以作为付费订阅使用,您需要许可证才能使用。还提供30天试用版。好吧,在本教程中,我们将使用Elasticsearch X-Pack警报功能ElastAlert的开源替代方案。

ElastAlert 将是 可靠,高度 模块化的,并且容易 建立配置。它通过将Elasticsearch与两种类型的组件(规则类型和警报)结合使用。定期查询Elasticsearch,并将数据传递到规则类型,该规则类型确定何时找到匹配项。发生匹配时,将为该警报提供一个或多个警报,这些警报将根据匹配采取行动。这由一组规则配置,每个规则定义一个查询,一个规则类型和一组警报。

ElastAlert包含几种具有常见监视范例的规则类型:

  • “匹配Y时间有X个事件的地方”(frequency 类型)
  • “当事件发生率增加或减少时进行匹配”(spike 类型)
  • “在Y时间内少于X个事件时进行匹配”(flatline 类型)
  • “当某个字段与黑名单/白名单匹配时匹配”(blacklistwhitelist 类型)
  • “匹配与给定过滤器匹配的任何事件”(any 类型)
  • “当某个字段在一段时间内具有两个不同的值时进行匹配”(change 类型)

当前,ElastAlert内置了对以下警报类型的支持:

  • 命令
  • 电子邮件
  • 吉拉
  • OpsGenie
  • 社交网络
  • 嘻哈
  • 松弛
  • 电报
  • GoogleChat
  • 除错
  • 践踏
  • 蜂巢

使用ElastAlert配置ELK堆栈警报

在Linux中安装ElastAlert

如上所述,对ElastAlert的安装有很多要求。 需求页面。这些包括;

  • 弹性搜索
  • ISO8601或Unix带时间戳的数据
  • Python 3.6
  • 点,请参阅requirements.txt
  • Ubuntu 14.x上的软件包:python-pip python-dev libffi-dev libssl-dev

安装和设置Elastic / ELK堆栈

根据上述要求,要使用ElastAlert安装和配置ELK堆栈警报,您需要启动并运行ELK / Elastic堆栈。请按照下面的链接安装和设置ELK /弹性堆栈。

在Ubuntu 20.04上安装ELK Stack

在CentOS 8上安装ELK Stack

在Docker容器上部署单节点弹性堆栈集群

在Fedora 30 / Fedora 29 / CentOS 7上安装Elastic Stack 7

在Ubuntu 18.04 / Debian 9.8上安装Elastic Stack 7

当然,收集的日志数据带有时间戳。

在Linux上安装Python 3

在本演示中,我们将在运行于CentOS 8系统上的弹性堆栈服务器上安装ElastAlert。请注意,您也可以将Elastalert安装在要从中运送日志的客户端上。

根据上述要求,ElastAlert需要Python 3.6。在CentOS 8上,您可以通过执行以下命令安装Python 3.6(如果尚未安装);

dnf install python36 python3-devel

有关其他发行版,请参阅有关安装Python 3.6的相应文档。

在Linux上安装PIP

同样,对于运行Python 3的CentOS 8系统,您可以通过执行以下命令来安装PIP。

dnf install python3-pip

有关安装PIP的详细信息,请参阅您的操作系统发行版。

同样,您需要安装GNU Compiler Collection(gcc);

dnf install gcc

您可能需要安装 开发工具,它提供了全面的构建工具,但安装GCC就足够了。

安装ElastAlert

一旦安装了ElastAlert的要求到位,您现在可以通过简单地克隆其Github存储库并按以下方式安装来安装ElastAlert的最新发行版;

git clone https://github.com/Yelp/elastalert.git /opt/elastalert
cd /opt/elastalert
pip3 install "setuptools>=11.3" -U
python3 setup.py install

您也可以使用PIP安装Elastalert。

pip3 install elastalert

安装Elasticsearch ElastAlert模块

接下来,安装ElastAlert Elasticsearch模块(适用于ES版本5及更高版本)。

pip3 install "elasticsearch>=5.0.0"
cd ~

使用ElastAlert配置ELK堆栈警报

现在,您可以配置ElastAlert进行ELK堆栈警报。

首先,ElastAlert(根据我们克隆其Github存储库的安装方法)附带示例配置文件, /opt/elastalert/config.yml.example

重命名此配置文件,删除.example后缀。

cp /opt/elastalert/config.yaml{.example,}

配置文件受到高度注释。默认情况下,它没有注释和空行。

rules_folder: example_rules
run_every:
  minutes: 1
buffer_time:
  minutes: 15
es_host: elasticsearch.example.com
es_port: 9200
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
alert_time_limit:
  days: 2
  • rules_folder 是ElastAlert从中加载规则配置文件的位置,在我们的例子中是 /opt/elastalert/example_rules
  • run_every 是ElastAlert多久查询一次Elasticsearch的时间。
  • buffer_time 是查询窗口的大小,从每个查询运行的时间开始向后延伸。
  • es_host 是Elasticsearch集群的地址,ElastAlert将在其中存储有关其状态,查询运行,警报和错误的数据。每个规则还可以使用不同的Elasticsearch主机进行查询。
  • es_port 是对应于的端口 es_host
  • writeback_index 是ElastAlert将在其中存储数据的索引的名称。我们稍后将创建此索引。
  • alert_time_limit 是失败警报的重试窗口。

为Elasticsearch节点定义地址和端口;

打开ElastAlert配置文件进行编辑;

vim /opt/elastalert/config.yaml

我们在默认配置文件中唯一要更改的是ES的IP地址和端口。

ss -altnp | grep :9200
LISTEN   0        128        [::ffff:192.168.57.30]:9200                *:*
...
# The Elasticsearch hostname for metadata writeback
# Note that every rule can have its own Elasticsearch host
es_host: 192.168.57.30

# The Elasticsearch port
es_port: 9200
...

如果您的ES配置了SSL / Authentication,请确保在ElastAlert配置文件上设置各自的详细信息。

保存并退出配置。

这就是我们的配置文件的样子;

less /opt/elastalert/config.yaml
rules_folder: /opt/elastalert/example_rules
run_every:
  minutes: 1
buffer_time:
  minutes: 15
es_host: 192.168.57.30
es_port: 9200
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
alert_time_limit:
  days: 2

在Elasticsearch上创建ElastAlert索引

在Elasticsearch上创建一个ElastAlert索引,以使其能够存储有关其查询和警报的信息和元数据。

elastalert-create-index
Elastic Version: 7.8.1
Reading Elastic 6 index mappings:
Reading index mapping 'es_mappings/6/silence.json'
Reading index mapping 'es_mappings/6/elastalert_status.json'
Reading index mapping 'es_mappings/6/elastalert.json'
Reading index mapping 'es_mappings/6/past_elastalert.json'
Reading index mapping 'es_mappings/6/elastalert_error.json'
New index elastalert_status created
Done!

如果遇到错误, AttributeError: module 'yaml' has no attribute 'FullLoader',在创建ElastAlert ES索引时,您可以重新安装PyYAML;

sudo pip3 install --ignore-installed PyYAML

创建索引后,如果您在堆栈管理> Elasticsearch>索引管理下导航至Kibana,则应该能够看到此类索引;

使用ElastAlert配置ELK堆栈警报
创建ElastAlert规则和警报

根据我们的设置,ElastAlert规则位于 /opt/elastalert/example_rules 目录。

ls /opt/elastalert/example_rules/ -1
example_cardinality.yaml
example_change.yaml
example_frequency.yaml
example_new_term.yaml
example_opsgenie_frequency.yaml
example_percentage_match.yaml
example_single_metric_agg.yaml
example_spike_single_metric_agg.yaml
example_spike.yaml
jira_acct.txt
ssh-repeat-offender.yaml
ssh.yaml

ElastAlert支持以下类型的规则: 规则类型 页面以及如上概述的各种警报通道类型 ElastAlert警报 页。

在此设置中,我们将测试一些规则类型,并使用电子邮件进行提醒。

多个失败的SSH登录名的ELK堆栈电子邮件警报

如果您查看示例规则目录下的内容,则我们有SSH规则文件, /opt/elastalert/example_rules/ssh.yaml

在此设置中,我们使用Filebeat从端点收集日志。如果在端点上发生5次以上的登录尝试失败,我们将通过邮件提醒您。因此,下面是没有注释行的示例SSH配置;

vim /opt/elastalert/example_rules/ssh.yaml
name: Sample SSH Rule
type: frequency
num_events: 3
timeframe:
  minutes: 1
filter:
- query:
    query_string:
      query: "event.type:authentication_failure"
index: filebeat-*
realert:
  minutes: 1
query_key:
  - source.ip
include:
  - host.hostname
  - user.name
  - source.ip
include_match_in_root: true
alert_subject: "SSH Bruteforce Attacks Detected on {}"
alert_subject_args:
  - host.hostname
alert_text: |-
  Multiple SSH failed logins detected on {}.
  Details of the event:
          - User: {}
          - Source IP: {}
alert_text_args:
  - host.hostname
  - user.name
  - source.ip
alert:
  - email:
     from_addr: "[email protected]"
     email: "[email protected]"
alert_text_type: alert_text_only

上面在索引filebeat- *上搜索认证失败事件类型。然后,如果在一分钟内发现三个失败的登录尝试,它将发送警报。确保为事件设置正确的索引名称和正确的搜索字符串。

完成更改后,保存并退出文件。

注意,要使电子邮件警报起作用,您需要配置SMTP进行电子邮件中继。您可以查看以下指南,在Ubuntu / Fedora上设置Postfix。

将Postfix配置为在Ubuntu 20.04上使用Gmail SMTP

将Postfix配置为在Ubuntu 18.04上使用Gmail SMTP

在Fedora 29上将Postfix配置为仅发送SMTP服务器

测试ElastAlert规则

配置规则后,您需要测试它是否确实有效。 ElastAlert提供了一个名为 elastalert-test-rule 用于验证配置的规则。

该脚本安装在/ usr / local / bin下;

which elastalert-test-rule
/usr/local/bin/elastalert-test-rule

例如,要测试上述SSH规则,请导航至

elastalert-test-rule --config /opt/elastalert/config.yaml /opt/elastalert/example_rules/ssh.yaml

该脚本显示类似于以下内容的输出;

INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
            To send them but remain verbose, use --verbose instead.
Didn't get any results.
INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
                To send them but remain verbose, use --verbose instead.
1 rules loaded
INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts
INFO:elastalert:Queried rule SSH abuse (ElastAlert 3.0.1) - 2 from 2020-12-01 21:13 EAT to 2020-12-01 21:14 EAT: 0 / 0 hits

Would have written the following documents to writeback index (default is elastalert_status):

elastalert_status - {'rule_name': 'SSH abuse (ElastAlert 3.0.1) - 2', 'endtime': datetime.datetime(2020, 12, 1, 18, 14, 56, 92899, tzinfo=tzutc()), 'starttime': datetime.datetime(2020, 12, 1, 18, 13, 55, 492899, tzinfo=tzutc()), 'matches': 0, 'hits': 0, '@timestamp': datetime.datetime(2020, 12, 1, 18, 14, 56, 416136, tzinfo=tzutc()), 'time_taken': 0.08273959159851074}

如您所见,我们的Filebeat索引中当前匹配有SSH失败事件, INFO:elastalert:Queried rule SSH abuse (ElastAlert 3.0.1) - 2 from 2020-12-01 21:13 EAT to 2020-12-01 21:14 EAT: 0 / 0 hits

我将模拟多个失败的ssh事件并重新运行脚本。

elastalert-test-rule --config /opt/elastalert/config.yaml /opt/elastalert/example_rules/ssh.yaml
INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
            To send them but remain verbose, use --verbose instead.
Didn't get any results.
INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent.
                To send them but remain verbose, use --verbose instead.
1 rules loaded
INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:04 EAT to 2020-12-01 22:05 EAT: 5 / 5 hits
INFO:elastalert:Alert for Sample SSH Rule at 2020-12-01T22:05:06+03:00:
INFO:elastalert:Multiple SSH failed logins detected on solr.
Details of the event:
        - User: gen_t00
        - Source IP: 192.168.57.1



Would have written the following documents to writeback index (default is elastalert_status):

silence - {'exponent': 0, 'rule_name': 'Sample SSH Rule.192.168.57.1', '@timestamp': datetime.datetime(2020, 12, 1, 19, 5, 17, 14585, tzinfo=tzutc()), 'until': datetime.datetime(2020, 12, 1, 19, 6, 17, 14577, tzinfo=tzutc())}

elastalert_status - {'rule_name': 'Sample SSH Rule', 'endtime': datetime.datetime(2020, 12, 1, 19, 5, 16, 979897, tzinfo=tzutc()), 'starttime': datetime.datetime(2020, 12, 1, 19, 4, 16, 379897, tzinfo=tzutc()), 'matches': 1, 'hits': 5, '@timestamp': datetime.datetime(2020, 12, 1, 19, 5, 17, 15185, tzinfo=tzutc()), 'time_taken': 0.012313127517700195}

正如您在上面看到的,在一分钟之内有5个事件;

INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 21:30 EAT to 2020-12-01 21:31 EAT: 5 / 5 hits

活动详细信息(电子邮件正文):

Multiple SSH failed logins detected on solr.
Details of the event:
        - User: gen_t00
        - Source IP: 192.168.57.1

使用–help选项查看可以使用的脚本参数。

elastalert-test-rule --help

运行ElastAlert

确认查询运行正常后,就可以运行ElastAlert。 ElastAlert可以通过监控程序或Python作为守护程序运行。

您还可以使用elastalert二进制文件在标准输出上运行它, /usr/local/bin/elastalert

例如,您对规则目录中定义的所有规则运行ElastAlert。

/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml

指定特定的规则文件;

/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml --rule /path/to/rules-file.yaml

例如

/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml --rule /opt/elastalert/example_rules/ssh.yaml
1 rules loaded
INFO:elastalert:Starting up
INFO:elastalert:Disabled rules are: []
INFO:elastalert:Sleeping for 59.99993 seconds
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:01 EAT to 2020-12-01 22:16 EAT: 8 / 8 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:16 EAT to 2020-12-01 22:31 EAT: 0 / 0 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:31 EAT to 2020-12-01 22:46 EAT: 0 / 0 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 22:46 EAT to 2020-12-01 23:01 EAT: 0 / 0 hits
INFO:elastalert:Queried rule Sample SSH Rule from 2020-12-01 23:01 EAT to 2020-12-01 23:12 EAT: 0 / 0 hits
INFO:elastalert:Sent email to ['[email protected]']
INFO:elastalert:Ignoring match for silenced rule Sample SSH Rule.192.168.57.1
INFO:elastalert:Ran Sample SSH Rule from 2020-12-01 22:01 EAT to 2020-12-01 23:12 EAT: 0 query hits (0 already seen), 2 matches, 1 alerts sent

在此设置中,我们将ElastAlert作为服务运行;

cat > /etc/systemd/system/elastalert.service << 'EOL'
[Unit]
Description=ELK Stack ElastAlert Service
After=elasticsearch.service
 
[Service]
Type=simple
WorkingDirectory=/opt/elastalert
ExecStart=/usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml
 
[Install]
WantedBy=multi-user.target
EOL

重新加载系统配置;

systemctl daemon-reload

启动并启用服务以在启动时运行;

systemctl enable --now elastalert

检查状态;

systemctl status elastalert
● elastalert.service - ELK Stack ElastAlert Service
   Loaded: loaded (/etc/systemd/system/elastalert.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2020-12-01 23:18:47 EAT; 38s ago
 Main PID: 7340 (elastalert)
    Tasks: 12 (limit: 17931)
   Memory: 43.9M
   CGroup: /system.slice/elastalert.service
           └─7340 /bin/python3 /usr/local/bin/elastalert --verbose --config /opt/elastalert/config.yaml

Dec 01 23:18:59 elastic.kifarunix-demo.com elastalert[7340]: INFO:elastalert:Queried rule SSH abuse - reapeat offender from 2020-12-01 22:31 EAT to 2020-12-01 22:46 EAT: 0>
Dec 01 23:18:59 elastic.kifarunix-demo.com elastalert[7340]: INFO:elastalert:Queried rule Event spike from 2020-12-01 23:16 EAT to 2020-12-01 23:18 EAT: 0 / 0 hits
...

要与ElastAlert Python一起运行,请参阅 运行ElastAlert

模拟事件并验证是否通过邮件发送和接收任何警报;

使用ElastAlert配置ELK堆栈警报

这标志着我们教程的结尾,该教程介绍了如何通过电子邮件通过ElastAlert配置ELK堆栈警报。随意探索其他警报渠道。

参考

首次运行ElastAlert

其他教程

使用ELK Stack监视Linux系统指标

在ELK堆栈上可视化WordPress用户活动日志

在ELK堆栈上处理和可视化ModSecurity日志

Sidebar