Elastic:使用 ElastAlert 发送邮件通知

ElastAlert 是一个简单的框架,用于从 Elasticsearch 中的数据中发出异常,尖峰或其他感兴趣模式的警报。我们可以在地址 ElastAlert - Easy & Flexible Alerting With Elasticsearch — ElastAlert 0.0.1 documentation找到它的使用说明。在今天的教程中,我将一步一步地介绍如何搭配环境,并从Elasticsearch发送通知给电子邮件。在我之前的教程 “Elastic:使用ElastAlert发送通知” 中,我相信地介绍了如何发送通知到 Slack 中。

为了说明问题的方便,我的环境如下:

在我的环境中,我使用iMac电脑运行 Elasticsearch 及 Kibana,而在另外一个虚拟机上运行我们的 Filebeat。Filebeat 把 Ubuntu 机器里的 syslog 传入到 Elasticsearch 中供分析,同时 ElastAlert 周期性地从 Elasticsearch 中获取数据,并依据制定的规则来发送通知。

准备工作

安装 Elasticsearch

我们可以按照 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 介绍的那样安装好我们的 Elasticsearch。不过由于我们需要使我们的 Elasticsearch 被另外一个虚拟机所见,在这里我们需要对我们的 Elasticsearch 进行配置。首先使用一个编辑器打开在 config 目录下的 elasticsearch.yml 配置文件。我们需要修改 network.host 的 IP 地址。在你的 Mac 及 Linux 机器上,我们可以使用:

$ ifconfig

来查看到我们的机器的 IP 地址。针对我的情况,我的机器的 IP 地址是:192.168.0.100。我们在 config/elasticsearch.yml 中配置:

network.host: 0.0.0.0
discovery.type: single-node

在上面,我们把 network.host 设置为0.0.0.0。这样 Elasticsearch 将会和本机器的所有的网路接口绑定,也就是说它即可以被 localhost:9200 访问,也可以同时被 192.168.0.100:9200所访问。我们也必须在 elasticsearch.yml 的最后加上 discovery.type: single-node,表明我们是单个 node。

等修改完我们的 IP 地址后,我们保存 elasticsearch.yml 文件。然后重新运行我们的 Elasticsearch。我们可以在一个浏览器中输入刚才输入的IP地址并加上端口号 9200。这样可以查看一下我们的 Elasticsearch 是否已经正常运行了。

安装 Kibana

我们可以按照 “如何在Linux,MacOS 及 Windows上 安装 Elastic 栈中的 Kibana” 中介绍的那样来安装我们的 Kibana。由于我们的 Elasticsearch 的 IP 地址已经改变,所以我们必须修改我们的 Kibana 的配置文件。我们使用自己喜欢的编辑器打开在 config 目录下的 kibana.yml 文件,并找到 server.host。把它的值修改为自己的电脑的IP地址。针对我的情况是:保存我们的 kibana.yml 文件,并运行我们的 Kibana。

server.host: "192.168.0.100"

同时在浏览器的地址中输入自己的 IP 地址及5601端口:

如果配置成功的话,我们就可以看到上面的画面。

安装 Ubuntu 虚拟机 

这个不在我的这个教程之内。在网上我们可以找到许多的教程教我们如何安装 Ubuntu 虚拟机。最简单的办法就是参照我之前的文档 “Vagrant 入门教程” 来启动一个 Ubuntun 18.04 的虚机。

安装 Filebeat

我们想在 Ubuntu 机器上安装我们的 Filebeat 来手机 system log 信息。我们首先打开我们的 Kibana。点击左上角的 Kibana 图标:

点击 “Add log data” 按钮:

然后点击 “System logs

由于 Ubuntu 是 debian 系统,我们选择 DEB。安装上面的步骤一步一步地进行安装。在配置 filebeat.yml 时,我们需要把我们的 IP 地址输入到相应的地方:

output.elasticsearch:
  hosts: ["http://192.168.0.100:9200"]
  username: "elastic"
  password: "123456"
setup.kibana:
  host: "192.168.0.100:5601"

上面是我的配置情况。如果你已经配置安全,你需要设置 username 及 password。否则你不需要做任何配置。你可以根据自己的实际的 IP 地址进行配置。当我们成功地启动 filebeat 服务后,我们可以通过如下的命令来检查我们的服务是否已经成功运行:

sudo systemctl status filebeat

安装 ElastAlert

我们可以参考链接 Running ElastAlert for the First Time — ElastAlert 0.0.1 documentation 来安装 ElastAlert。在这里我们使用 python3 来运行 ElastAlert。首先我们需要在我们的 Ubuntu 上安装 python3

我们安装如下的步骤进行安装:

1) 下载 elastalert 源码:

git clone https://github.com/Yelp/elastalert.git

2)安装模块:

我们进入到上面下载项目的根目录中,并打入如下的命令:

sudo apt-get install -y python3
sudo pip3 install "setuptools>=11.3"
sudo python3 setup.py install
sudo pip3 install -U PyYAML

根据 Elasticsearch 的版本,您可能需要手动安装正确版本的 elasticsearch-py。

Elasticsearch 5.0+:

sudo pip3 install "elasticsearch>=5.0.0"

Elasticsearch 2.X:

sudo pip3 install "elasticsearch<3.0.0"

这样我们的安装工作就完成了。

配置 ElastAlert

配置文件

我们可以在 ElastAlert 源码文件的根目录下找到一个叫做 config.yaml.example 的文件:

我们可以把这个文件修改为 config.yaml 文件:

mv config.yaml.example config.yaml

我们使用我们喜欢的编辑器打开这个文件,并修改这个文件:

我们可以根据自己的 IP 地址来进行修改。如果我们对 Elasticsearch 做了安全设置,我们同时也需要填写用户名及密码:

做完上面的修改后,我们保存 config.yaml 文件。

配置Elasticsearch

ElastAlert 将有关其查询和警报的信息和元数据保存回 Elasticsearch。 这对于审核和调试很有用,它使 ElastAlert 可以重新启动并完全从中断处恢复。 ElastAlert 不需要运行,但强烈建议使用。

首先,我们需要通过运行 elastalert-create-index 并按照说明为 ElastAlert 创建要写入的索引。我们进入到 ElastAlert 的源码根目录,并打入如下的命令:

elastalert-create-index

创建 rule

每个规则都定义要执行的查询,触发匹配的参数以及每个匹配要触发的警报列表。 我们将使用 example_rules/example_frequency.yaml 作为模板。我们删除其中一些不需要的项目,最终的文件是这样的:

example_frequency.yaml

# Alert when the rate of events exceeds a threshold

# (Optional)
# Elasticsearch host
es_host: 192.168.0.100

# (Optional)
# Elasticsearch port
es_port: 9200

# (OptionaL) Connect with SSL to Elasticsearch
#use_ssl: True

# (Optional) basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword

# (Required)
# Rule name, must be unique
name: a simple test for email notification

# (Required)
# Type of alert.
# the frequency rule type alerts when num_events events occur with timeframe time
type: frequency

# (Required)
# Index to search, wildcard supported
index: filebeat-*

# (Required, frequency specific)
# Alert when this many documents matching the query occur within a timeframe
num_events: 3

# (Required, frequency specific)
# num_events must occur within this amount of time to trigger an alert
timeframe:
  hours: 4

# (Required)
# A list of Elasticsearch filters used for find events
# These filters are joined with AND and nested in a filtered query
# For more info: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html
filter:
- term:
    process.name: "JUSTME"

# (Required)
# The alert is use when a match is found
alert:
- "email"

# (required, email specific)
# a list of email addresses to send alerts to
email:
- "YourGmailAddress@gmail.com"

在上面请修改:

  • es_host 为自己的 Elasticsearch IP 地址
  • es_port 为自己的 Elasticsearch 口地址
  • index: filebeat-* 设置 filebeat 为我们的观察索引
  • 同时我们使用一个 filter。它检查 process.name 是否为 JUSTME 字符串。如果是,并且在1个小时(timeframe)里出现3次(num_events),那么将触发通知。
  • alert: 设置为 email
  • email: 设置为自己的 email 地址

测试 rule

运行 elastalert-test-rule 工具将测试您的配置文件是否成功加载并在过去的24小时内以调试模式运行它:

elastalert-test-rule example_rules/example_frequency.yaml

运行ElastAlert

我们使用Python来直接运行Elastalert:

python3 -m elastalert.elastalert --verbose --rule example_frequency.yaml 

这样我们的 Elastalert 已经被成功运行起来了。我们在这个时候可以打开我们的 Kibana 来监视 filebeat-* 索引,如果在一个小时内有三次 process.name 信息有 JUSTME 字样,那么我们就会在我们的邮件里收到通知。

配置邮件

为了测试,我们使用 gmail 邮件通知。我们必须进行如下的安装:

打开 2-factor 安全

我们可以在自己的邮件中打开 2 factor 验证。可以参阅链接

安装 postfix

sudo apt-get install postfix mailutils libsasl2-2 ca-certificates libsasl2-modules

打入上面的命令来进行安装 postfix。然后,我们打开如下的文档进行配置:

sudo vi /etc/postfix/main.cf

main.cf

#relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CApath = /etc/ssl/certs
smtpd_tls_CApath = /etc/ssl/certs
smtp_use_tls = yes
"/etc/postfix/main.cf" 53L, 1745C  

请注意上面被修改的部分:

接着我们需要创建上面所示的文档 /etc/postfix/sasl_passwd。

sudo vi /etc/postfix/sasl_passwd

然后把下面的文字放进去:

[smtp.gmail.com]:587    YourGmailAccount@gmail.com:xxxx xxxx xxxx xxxx

请注意: 在上面放置自己的 Gmail 邮件地址,在上面的 xxxx xxxx xxxx xxxx 部分是你在生成 2-factor 时生成的访问邮箱的密码。它是16个字母的密码。你可以在地址https://myaccount.google.com/apppasswords 去设置。

等我们完整设置后,我们在 Ubuntu 的t erminal 中打入如下的命令:

sudo chmod 400 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl restart postfix

为了验证我们的邮件的配置是否成功,我们可以打入如下的命令来进行验证:

echo "Testing" | mail -s "Test Email" YourEmailAccount@gmail.com
sudo postqueue -p

通过 sudo postqueue -p 命令,我们可以查看当前的邮件发送是否没有发送出去。如果发送出去,应该显示的是 empty 状态。我们可以通过:

sudo postqueue -f

来flush这个队列,以进行重新的发送。我们也可以通过如下的命令来删除队列中的所有未被发送的邮件:

postsuper -d mail_queue_id
postsuper -d ALL

一旦上面的配置以已经完成,我们重新在另外一个 terminal 中打入如下的几条信息:

那么在我们运行下面命令的的 terminal 中:

python3 -m elastalert.elastalert --verbose --rule example_frequency.yaml 

我们可以看到如下的输出:

从上面我们可以看出来有一个邮件的通知已经发送出去了。我们可以查看我们的邮件:

打开我们的邮件,我们可以看到:

显然,我们的邮件通知是成功了。

参考:

【1】Configure Postfix to Use Gmail SMTP on Ubuntu

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值