ElastAlert是一个简单的框架,用于从Elasticsearch中的数据中发出异常,尖峰或其他感兴趣模式的警报。我们可以在地址https://elastalert.readthedocs.io/en/latest/elastalert.html找到它的使用说明。在今天的教程中,我将一步一步地介绍如何搭配环境,并从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
我们可以参考链接https://elastalert.readthedocs.io/en/latest/running_elastalert.html来安装我们的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的terminal中打入如下的命令:
-
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】https://easyengine.io/tutorials/linux/ubuntu-postfix-gmail-smtp/
转载:https://blog.csdn.net/UbuntuTouch/article/details/105473542