システムからの警報メールをElasticsearchで可視化する


システムが発行する警報メールがあるのだが、量が多くメーラーで逐一見るのが辛くなってきた。
Elasticsearchにログとして登録して検索、分析できるようにしようと思う。

環境

遊びで立てていたElasticsearch環境があったので、これを利用。
バージョンとかは以下。
構築方法とかは省略。

elasticsearch.noarch                   6.4.0-1  
filebeat.x86_64                        6.4.0-1  
kibana.x86_64                          6.4.0-1   
logstash.noarch                        1:6.4.0-1   

作戦

メールを受けるプラグインを探したところimapのプラグインがあったのでこれを利用。
Logstash-imap input plugin

警報メールの送信先用に1つアドレスを切ってそのアドレスに送られたメールをElasticsearchに蓄積する。

やってみる

Logstashのconfファイルをいじる。
host、port、user、passwordあたりはメールサーバへの接続情報なので、特に迷わないはず。
メールBOXが溢れるのは嫌なので、deleteをtrueにして受信したメールをリモートから削除する。
check_intervalで受信行為の間隔を60秒に設定。
あと気になるところがあるとすればfetch_count(何件ずつ取得するか)、folder(受信ボックスの指定。デフォルトINBOX)くらいか。

input {
  imap {
    host => "pop3.xxxxx.jp"
    port => 993
    user => "[email protected]"
    password => "test-password"
    check_interval => 60
    delete => true
  }
}

警報内容はメール本文に記載されているのでこれをパース。
本文はmessageに格納されるので、良い感じに。
この例は構文の解析を/etc/logstash/patternsファイルに外だしで定義しているので、
これだけ真似しても動きません。messageに本文入るんだな。くらいで。
今回は使ってないですが、件名はsubjectに入るもよう。

filter {
  grok {
    patterns_dir => ["/etc/logstash/patterns"]
    match => { "message" => "%{ALARM_PATTERN}" }
  }
  date {
    match => ["time", "MMM d HH:mm:ss", "MMM dd HH:mm:ss"]
    timezone => "UTC"
    target => "@timestamp"
  }
  if "_grokparsefailure" in [tags] { drop {} }
}

できた。

おまけ

folderで指定するのって本当にINBOXでいいの?
と思ったので、メールサーバにsshして確認したときのメモ。
INBOXで大丈夫そう。

openssl s_client -connect pop3.xxxxx.jp:993 -crlf -quiet
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2017 Double Precision, Inc.  See COPYING for distribution information.
a01 login test@xxxxxxxx.co.jp test-password
a01 OK connected to proxy server.
a01 list "" "*"
* LIST (\Marked \HasNoChildren) "." "INBOX"
a01 OK LIST completed
a02 select "INBOX"
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited
* 1 EXISTS
* 1 RECENT
* OK [UIDVALIDITY 556500305] Ok
* OK [MYRIGHTS "acdilrsw"] ACL
a02 OK [READ-WRITE] Ok