日常の運用および保守では、elkを使用して、ビジネスアクセスログ、機器、およびソフトウェアの運用ログを一律に管理、保存、追跡、および分析します。日常の運用と保守の理想的なステータスは、ログのステータスをリアルタイムで監視し、異常なログが生成されたときに障害をすばやく特定するためにアラームイベントをアクティブに送信できることです。ただし、Elastic Open Source Basicバージョンにはオープンアラーム機能はありません。logstashを使用してzabbixに接続してアラームを発生させたり、サードパーティのプラグインElastalertを使用してアラームを発生させたりできます。次に、Elastalertツールを使用してログアラームを実装する方法を紹介します。
Elastalertは、Pythonに基づいてYelpによって開発されたELKログアラームプラグインです。Elastalertは、ElasticSearchのレコードを比較のためにチェックし、一致するルールのログに警告するようにアラームルールを構成します。 Elastalertは、Elasticsearchを2種類のコンポーネント(ルールタイプとアラート)で使用します。 Elasticsearchに定期的にクエリを実行し、データをルールタイプに渡します。ルールタイプは、一致するものがいつ見つかるかを決定します。一致が発生すると、そのアラートに対して1つ以上のアラートが提供され、これらのアラートは一致に基づいてアクションを実行します。これは一連のルールによって構成されます。各ルールは、クエリ、ルールタイプ、および一連のアラームを定義します。
Elastalertプロジェクトのオープンソースアドレス
https://github.com/Yelp/elastalert
Elastalertユーザーマニュアル
https://elastalert.readthedocs.io/en/latest/elastalert.html#overview
プラットフォームアーキテクチャ図

software version
elastalert:0.2.0
Python 3.6.8
elastic 6.8
Centos 8.1.1911
install software
dnf install -y wget gcc openssl-devel epel-release git
dnf install -y python3 python3-devel
install elastalert
mkdir -p /app/
git clone https://github.com/Yelp/elastalert.git
cd /app/elastalert/
pip3 install "setuptools>=11.3"
pip3 install -r requirements.txt
# バージョンに応じて選択
# pip3 uninstall elasticsearch
# pip3 install "elasticsearch<7,>6"
python3 setup.py install
** elastalert構成ファイル**
. egrep -v "*#|^$" config.yaml
rules_folder: example_rules
run_every:
minutes:1
buffer_time:
minutes:15
es_host:192.168.99.185
es_port:9200
es_username: elastic
es_password:******
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
alert_time_limit:
days:2
フィールドパラメータの説明
rules_folder:ElastAlertがルール構成ファイルをロードする場所。実行_every:ElastAlertはどのくらいの頻度でElasticsearchにクエリを実行しますか?
buffer_time:リクエストの時間フィールドの範囲を設定するために使用されます。デフォルトは15分です。
Es_host: elasticsearch host ip
Es_port: elasticsearch port
writeback_index:ElastAlertがデータを保存するインデックスの名前です
writeback_alias:エイリアス
alert_time_limit:失敗したアラートの再試行ウィンドウ
**elastalert-create-index **を作成します
ElastAlertがクエリとアラートに関する情報とメタデータをElasticsearchに保存できるように、elasticsearchでインデックスを作成するために使用されます。監査の場合、テストは非常に役立ちます。elastalertを再起動しても、アラートのカウントと送信には影響しません。
elastalert-create-index --config config.yaml
作成インデックス名を表示
curl -u elastic:xxxxx -XGET http://192.168.99.185:9200/_cat/indices |grep elastalert |sort -n
elastalert_status_status
ElastAlertは、elastalert_statusを使用して、クエリの繰り返しを回避するために、最初に開始されたときにクエリを実行する時間範囲を決定します。ルールごとに、最も近い終了時刻からクエリが開始されます。含める:
ElastAlertルールタイプ
any,blacklist,whitelist,change,frequency,spike,flatline,new_term,cardinality 。
any:一致する限りアラーム。
ブラックリスト:compare_keyフィールドのコンテンツは、ブラックリスト配列のすべてのコンテンツと一致します。
ホワイトリスト:compare_keyフィールドの内容はどれもホワイトリスト配列の内容と一致できません。
変更:同じquery_key条件の下で、compare_keyフィールドの内容は時間枠内で変更されます。
頻度:同じquery_key条件の下で、時間枠範囲内の例外を除外したnum_eventsがあります。
スパイク:同じquery_key条件で、spike_heightを超える前後の2つの時間枠でのデータ量の差の比率。その中で、spike_type-up、down、両方を使用して、特定の上下方向を設定できます。また、threshold_refを使用して前のサイクルで必要なデータ量の下限を設定し、threshold_curを使用して現在のサイクルで必要なデータ量の下限を設定することもできます。データ量が下限よりも小さい場合、トリガーされません。
フラットライン:時間枠の範囲内で、データの量がしきい値を下回っています。
new_term:最大terms_size(デフォルトは50)以外のデータは、fieldsフィールドが新しく表示される前にterms_window_size(デフォルトは30日)の範囲内になります。
カーディナリティ:同じquery_key条件で、時間枠内のcardinality_fieldの値がmax_cardinalityを超えるか、min_cardinalityよりも低くなります
警告ルールの例
example_rules /でさまざまなタイプのルールの例を見つけてください。
**example_spike.yaml **は、「スパイク」ルールタイプの例です。これにより、特定の期間内の平均イベント率が特定の係数で増加することを警告できます。この例では、過去2時間にフィルターに一致するイベントが過去2時間のイベント数の3倍になると、電子メールアラートを送信します。
**example_frequency.yaml **は、「頻度」ルールタイプの例であり、一定期間内に特定の数のイベントが発生したときにアラートを出します。この例では、指定されたフィルターに一致する50個のドキュメントが4時間以内に表示されたときに、電子メールを送信します。
**example_change.yaml **は、「変更」ルールタイプの例であり、2つのドキュメントのフィールドが変更されたときにアラートを出します。この例では、2つのドキュメントの「username」フィールドが同じで「country_name」フィールドの値が異なる場合、アラートメールが24時間以内に送信されます。
**example_new_term.yaml **は、「新しい用語」ルールタイプの例であり、1つ以上の新しい値が1つ以上のフィールドに表示されたときにアラートを出します。この例では、ログインログの例で新しい値( "username"、 "computer")が検出されると、電子メールが送信されます。
アラートルールを構成する
es_host:192.168.99.185
es_port:9200
es_username: elastic
es_password:******
name: networklogs-alert
type: frequency
index: networklogs-*
num_events:1
timeframe:
minutes:10
filter:- query:
query_string:
query:"count: Failed"
alert:-"email"
email:-"[email protected]"
smtp_host: smtp.qq.com
smtp_port:25
from_addr: [email protected]
smtp_auth_file:/app/elastalert/elastalert/example_rules/email_auth.yaml
alert_subject:"ネットワークデバイスの操作ログが異常です"
alert_text_type: alert_text_only
alert_text:|
ネットワークデバイスの操作ログが異常です
> time:{}>hostname:{}>count:{}>source:{}
alert_text_args:-"@timestamp"- hostname
- count
- source
ルールパラメータの概要
# Elasticsearchマシン
es_host:192.168.99.185
# Elasticsearchポート
es_port:9200
# sslリンクを使用するかどうか
# use_ssl: True
# elasticsearchが認証されている場合は、ユーザー名とパスワードを入力します
# es_username: username
# es_password: password
# ルール名は一意である必要があります。一意でない場合、エラーが報告されます。この定義が完了すると、アラームメールのタイトルになります。
name: xx-xx-alert
# 同じクエリで周波数が設定され、2つの条件を満たす必要があります_キー条件の下で、時間枠範囲にnumがあります_イベントは例外を除外しました
type: frequency
# インデックスを指定し、定期的なマッチングをサポートし、複数のインデックスをサポートします。問題がある場合は、直接アクセスしてください。*それも可能です。インデックス: es-nginx*,winlogbeat*
# 出発時刻
num_events:5
# そしてnum_イベントパラメータの関連付け。これは、アラームが4分以内に5回トリガーされることを意味します
timeframe:
minutes:4
# アラームルール、elasticsearchクエリステートメント、サポートANDを組み合わせるために使用されます&またはなど。フィルタ:- query:
query_string:
query:"message:error OR Error"
# アラームモード、共通メールボックスアラーム、ネイルアラーム
alert:-"email"
# アラームメールボックスのアドレス,複数指定できます。 Eメール:-"[email protected]"-"[email protected]"
# アラームメールボックス用のSmtpサーバー
smtp_host: smtp.126.com
# アラームメールボックスのSmtpポート
smtp_port:25
# 認証情報を追加の構成ファイルに書き込む必要があり、ユーザーとパスワードの2つの属性が必要です
smtp_auth_file:/app/elastalert/elastalert/example_rules/email_auth.yaml
from_addr:****@qq.com
メールアカウント認証情報
# /app/elastalert/elastalert/example_rules/email_auth.yaml
user:"[email protected]"
password:"******"
elastalertルールをテストする
elastalert-test-rule example_rules/network.yaml

アラートルールを実行する
python3 -m elastalert.elastalert --verbose --rule example_rules/network.yaml
メールアラート
電子メールアラートモジュール構成ファイル
alert:-"email"
email:-"[email protected]"
smtp_host: smtp.qq.com
smtp_port:25
from_addr: [email protected]
smtp_auth_file:/app/elastalert/elastalert/example_rules/email_auth.yaml
alert_text_type: alert_text_only
aalert_text:|
ネットワークデバイスの操作ログが異常です! ! !
> time:{}>hostname:{}>count:{}>source:{}
alert_text_args:-"@timestamp"- hostname
- count
- source
メール認証情報
使用されるパスワードは、メールボックスにログインするためのパスワードではなく、メールボックスのメールボックス認証コードです。
# /app/elastalert/elastalert/example_rules/email_auth.yaml
user:"[email protected]"
password:"******"

ディンギングアラーム
Dingdingアラームプラグインのインストール
wget https://github.com/xuyaoqiang/elastalert-dingtalk-plugin/archive/master.zip
unzip master.zip
cd elastalert-dingtalk-plugin-master
pip3 install pyOpenSSL==16.2.0
pip3 install setuptools==46.1.3
cp -r elastalert_modules /app/elastalert/
Dingdingアラームモジュール構成ファイル
alert:-"elastalert_modules.dingtalk_alert.DingTalkAlerter"
dingtalk_webhook:"https://oapi.dingtalk.com/robot/send?access_token=xxxxxx"
dingtalk_msgtype:"text"
alert_subject:"ネットワークデバイスの操作ログが異常です"
alert_text_type: alert_text_only
alert_text:|
ネットワークデバイスの操作ログが異常です
> time:{}>hostname:{}>count:{}>source:{}
alert_text_args:-"@timestamp"- hostname
- count
- source

systemctlはバックグラウンドで実行されます
elastalert01.service
# vim /usr/lib/systemd/system/elastalert01.service
[ Unit]
Description=elastalert01
After=elastalert01.service
[ Service]
Type=simple
User=root
Group=root
Restart=on-failure
PIDFile=/usr/local/elastalert01.pid
WorkingDirectory=/app/elastalert
ExecStart=/usr/local/bin/elastalert --config /app/elastalert/config.yaml --rule /app/elastalert/example_rules/network1.yaml
ExecStop=/bin/kill -s QUIT $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
[ Install]
WantedBy=multi-user.target
elastalert02.service
# vim /usr/lib/systemd/system/elastalert02.service
[ Unit]
Description=elastalert02
After=elastalert02.service
[ Service]
Type=simple
User=root
Group=root
Restart=on-failure
PIDFile=/usr/local/elastalert02.pid
WorkingDirectory=/app/elastalert
ExecStart=/usr/local/bin/elastalert --config /app/elastalert/config.yaml --rule /app/elastalert/example_rules/network.yaml
ExecStop=/bin/kill -s QUIT $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
[ Install]
WantedBy=multi-user.target
**elastalert01.service **を開始します
systemctl start elastalert01.service
systemctl enable elastalert01.service
elastalertプロセスを表示
ps -ef |grep elastalert
