Elastic:使用ElastAlert發送郵件通知

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:
- "[email protected]"

在上面請修改:

  • 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    [email protected]: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" [email protected]
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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章