graylogから受けたメールを元にzabbix senderを叩くシェルの改修

■ graylogから受けたメールからzabbix senderを叩くシェル改修

#!/bin/bash

# Graylogから受け取ったメールから、zabbix senderを叩く
MAIL_ORIGINAL="/test01/mail_original_$$.txt"
MAIL_NIHONGO="/test01/mail_nihongo_$$.txt"
FOR_ZABBIX_SENDER="/test01/test_mail03.txt"     # !!テスト用注意!!
DELIMITER_CUSTOMER="=_=_=_=_=_="
DELIMITER_ADMIN="-_-_-_-_-_-"

# メールを1行ずつ読み込み、test_mail01.txtに書き出す。test_mail02.txtに日本語化したものを書き出す
while read LINE
do
echo "$LINE" >> "$MAIL_ORIGINAL"
done
nkf -mQ "$MAIL_ORIGINAL" > "$MAIL_NIHONGO"

# 顧客用メール内容
# test_mail02.txtの、=_=_=_=_=_=の間に書かれた情報を取得する(改行が入ったまま)
MAIL2LINE1=`grep -na -E "^$DELIMITER_CUSTOMER" "$MAIL_NIHONGO" | sed -e 's/:.*//g'`
MAIL2LNUM1=`echo $MAIL2LINE1 | awk '{print $1}'`        #開始行
MAIL2LNUM2=`echo $MAIL2LINE1 | awk '{print $2}'`        #終了行
# test_mail02.txtから、開始行~終了行の内容を抜き出す
MAIL2INFO2=`sed -n "$MAIL2LNUM1","$MAIL2LNUM2"p "$MAIL_NIHONGO"`
echo "$MAIL2INFO2" > "$FOR_ZABBIX_SENDER"

# admin用メール内容
# test_mail02.txtの、-_-_-_-_-_-の間に書かれた情報を取得する
# 取得した値の改行を|に変換する
MAIL2INFO1=`cat "$MAIL_NIHONGO" | awk -v ORS='|' '1;END{printf"\n"}' | awk -F "$DELIMITER_ADMIN" '{print $2}' | sed -e s/^/"$DELIMITER_ADMIN"/g -e s/$/"$DELIMITER_ADMIN"/g`
echo "$MAIL2INFO1" >> "$FOR_ZABBIX_SENDER"

MAIL2INFO3=`cat "$FOR_ZABBIX_SENDER"`
zabbix_sender -z 127.0.0.1 -s 105graylog_Ubuntu -k zstestitem02 -o "$MAIL2INFO3"

rm "$MAIL_ORIGINAL" "$MAIL_NIHONGO"


■ 解説
ファイルパス、文字列等は変数へ格納
awk -F の後の値は変数として認識してほしいので、'ではなく"でくくっている
MAIL2LNUM1とMAIL2LNUM2は""でくくるとうまく動かなくなる

zabbix regsub関数について

■ やること
① 顧客向けにメールを整形する

■ 使用する環境
kali linux
[101]Snort(Ubuntu)
[105]graylog(Ubuntu)
[107]zabbix(Ubuntu)

■ 参考URL
https://www.fl-ops.com/mori-dojo/archives/106
https://www.zabbix.com/documentation/3.2/manual/config/macros/macro_functions

■ 整形したいメール本文
{ITEM.VALUE1}に含まれる文字列
#ERROR!
検知日時: 2019-01-20T14:33:41.448Z
ホスト名: ubuntu-snort
アプリケーション名: snort
検知種別: Potentially Bad Traffic
検知内容: ”ICMP_detection”
送信元アドレス: 192.168.56.101
送信元ポート: 0
送信先アドレス: 192.168.56.1
送信先ポート: 0
プロトコル: ICMP
#ERROR!
_-_-_|timestamp: 2019-01-20T14:33:41.448Z|host_name: ubuntu-snort|application_name: snort|classification: Potentially Bad Traffic|description: ”ICMP_detection”|src_addr: 192.168.56.101|src_port: 0|dst_addr: 192.168.56.1|dst_port: 0|protocol: ICMP|process_id: 1220|Facility: local0|level: 6|priority: 6|Generator_id: 1|signature_id: 1000000|Signature_revision_id: 0|Full message: <134>0 2019-01-20T23:33:41.448411+09:00 ubuntu-snort snort 1220 - - [1:1000000:0] ”ICMP_detection” [Classification: Potentially Bad Traffic] [Priority: 6] {ICMP} 192.168.56.101 -> 192.168.56.1|_-_-_

■ zabbixのタグ機能を使用し、{ITEM.VALUE1}から必要な部分だけ抜き出す
① {ITEM.VALUE1}に対してregsub(iregsubでも可)関数を使用することで、
{ITEM.VALUE1}に含まれる文字列の中から任意の物を抜き出せる

② regsub関数について
{{ITEM.VALUE1}.iregsub("正規表現", \0)}
正規表現に該当した値を抜き出す

{{ITEM.VALUE}.regsub("…(\S*)…(\S*)\.$", \2)}
→ 括弧でくくった値のうち、2番目を抜き出す

{{ITEM.VALUE1}.iregsub("^[^(=_=_=_=_=_=)]", \0)}
→ エラー(何も出力されない)

{{ITEM.VALUE1}.iregsub("^_-_-_.*", \0)}
→ エラー(何も出力されない)

{{ITEM.VALUE1}.iregsub("_-_-_.*", \0)}
→ 「_-_-_」を含む、そこから先の文字列全てを抜き出す

{{ITEM.VALUE1}.iregsub("=_=_=_=_=_=(\s.*)+", \0)}
→ 全ての文字列を抜き出す

{{ITEM.VALUE1}.iregsub("=_=_=_=_=_=(\s.*)+\s=_=_=_=_=_=", \0)}
→ エラー(何も出力されない)

{{ITEM.VALUE1}.iregsub("=_=_=_=_=_=(\s.*)+=_=_=_=_=_=", \0)}
→ エラー(何も出力されない)

{{ITEM.VALUE1}.iregsub("=_=_=_=_=_=(\s.*:.*)+", \0)}
→ 最初の=_=_=_=_=_=と、次の=_=_=_=_=_=の手前まで抜き出す

{{ITEM.VALUE1}.iregsub(@regex_mail_for_customer, \0)}
→ グローバル正規表現と合わせてみる。エラー(何も出力されない)

{{ITEM.VALUE1}.iregsub("@regex_mail_for_customer", \0)}
→ グローバル正規表現と合わせてみる。エラー(何も出力されない)

③ zabbixのタグでregsubを用いる場合
先頭256文字しか評価されない

snortの検知ルールを自動更新する(pulledpork)

snortのバージョン
snort-2.9.12.tar.gz

snortの起動確認
snort -T -c /etc/snort/snort.conf
Snort successfully validated the configuration!
Snort exiting
と表示されればOK

snortにアカウント登録しておく
Snort - Network Intrusion Detection & Prevention System

■oinkcodeを取得しておく
ログインする
公式サイト右上の自分のログインメールアドレスをクリック
右側メニュー「Oinkcode」をクリックすると、oinkcodeが表示される


■ pulledporkを使用してsnortルールを自動更新する
参考URL
https://www.unix-power.net/networking/post-758

① pulledporkをダウンロードする
https://github.com/shirkdog/pulledpork
# git clone https://github.com/shirkdog/pulledpork.git

② etc/pulledpork.confの編集

#	vi /tmp/pulledpork/pulledpork/etc/pulledpork.conf			
		rule_path=/usr/local/etc/snort/rules/snort.rules		
		→	snortのルールファイルの場所が合っているか確認	
			snortのルールファイルの場所は「/etc/snort/rules/」で、	
			「snort.rules」が無いので新たに作成する	
			#	touch /etc/snort/rules/snort.rules
		→	以下のように書き換え	
			rule_path=/etc/snort/rules/snort.rules	
				
		local_rules=/usr/local/etc/snort/rules/local.rules		
		→	以下のように書き換え	
			local_rules=/etc/snort/rules/local.rules	
				
		sid_msg=/usr/local/etc/snort/sid-msg.map		
		→	snortの各種confファイルの場所は「/etc/snort/」で、	
			「sid-msg.map」が無いので新たに作成する	
			#	touch /etc/snort/sid-msg.map
		→	以下のように書き換え	
			sid_msg=/etc/snort/sid-msg.map	
				
		snort_path=/usr/local/bin/snort		
		→	以下のように書き換え	
			snort_path=/usr/sbin/snort	
				
		config_path=/usr/local/etc/snort/snort.conf		
		→	以下のように書き換え	
			config_path=/etc/snort/snort.conf	
				
		distro=FreeBSD-8-1		
		→	以下のように書き換え	
			distro=Ubuntu-12-04	
				
		black_list=/usr/local/etc/snort/rules/iplists/default.blacklist		
		→	「/etc/snort/rules/iplists/default.blacklist」が無いので新たに作成する	
			#	mkdir /etc/snort/rules/iplists
			#	touch /etc/snort/rules/iplists/default.blacklist
		→	以下のように書き換え	
			black_list=/etc/snort/rules/iplists/default.blacklist	
				
		IPRVersion=/usr/local/etc/snort/rules/iplists		
		→	以下のように書き換え	
			IPRVersion=/etc/snort/rules/iplists	
				
		snort_control=/usr/local/bin/snort_control		
		→	「/usr/sbin/snort_control」が無いので新たに作成する	
			#	touch /usr/sbin/snort_control
		→	以下のように書き換え	
			snort_control=/usr/sbin/snort_control	
				
		# snort_version=2.9.0.0		
		→	以下のように書き換え	
			snort_version=2.9.12.0	
			※	https://www.snort.org/oinkcodes
				上記URLに記載されているサンプルURLに「29120」と書かれているので最後尾の.0は必須
				
		rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz|<oinkcode>		
		→	「<oinkcode>」の部分に自分のoinkcodeを代入	
				
		rule_url=https://snort.org/downloads/community/|community-rules.tar.gz|Community		
		→	存在せず、エラーになるのでコメントアウトしておく	
				
		rule_url=https://snort.org/downloads/community/|opensource.gz|Opensource		
		→	存在せず、エラーになるのでコメントアウトしておく	


③ 実行テスト
# perl /tmp/pulledpork/pulledpork/pulledpork.pl -c /tmp/pulledpork/pulledpork/etc/pulledpork.conf
→ /var/log/sid_changes.logにログが吐き出されているか確認
/etc/snort/rules/iplists/default.blacklistにIPリストが記載されていることを確認

④ cloneに登録する
https://www.server-memo.net/tips/crontab.html
# crontab -e
以下を追記
* 15 * * * perl /tmp/pulledpork/pulledpork/pulledpork.pl -c /tmp/pulledpork/pulledpork/etc/pulledpork.conf

zabbix sender で、graylogからのメールの内容をzabbixに送信する

■ やること
zabbix sender の -oオプションで受け取る値に、graylogからのメールの内容を入れる

■ zabbixサーバに、メールのエンコードのためのコマンドをインストールする
# apt install nkf

■ メールエンコードのためのコマンド
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
の時、
# nkf -mQ メールファイル名 > test01.txt

■ graylogからのアラートメールをもとに、zabbix senderコマンドを生成する(シェルを書く)
□ graylog アラートメールの内容(エンコード済)
----------
検知日時: 2018-12-07T13:54:06.117Z
ホスト名: ubuntu-snort
アプリケーション名: snort
検知種別: Potentially Bad Traffic
検知内容: ”ICMP_detection”
送信元アドレス: 192.168.56.105
送信元ポート: 0
送信先アドレス: 192.168.56.107
送信先ポート: 0
プロトコル: ICMP
process_id: 1290
Facility: local0
検知レベル: 6
優先度: 6
Generator_id: 1
シグネチャ番号: 1000000
Signature_revision_id: 0
Full message: <134>0 2019-01-11T20:32:06.060812+09:00 ubuntu-snort snort 1255 - - [1:1000000:0] ”ICMP_detection” [Classification: Potentially Bad Traffic] [Priority: 6] {ICMP} 192.168.56.105 -> 192.168.56.107
----------

■ zabbixサーバでメールを受信した際、実行されるシェルスクリプト
シェルスクリプトの詳細
メールを1行ずつ読み込み、test_mail01.txtに書き出す。
test_mail01.txtを日本語化してtest_mail02.txtに書き出す。
test_mail02.txtの改行をパイプ(|)に変換し、----------を区切り文字として、graylogからのアラートメールの内容部分だけを取り出す。
取り出した文字列を全て、zabbix sender の-oオプションに渡す。

シェルスクリプト

#!/bin/bash
			
# test_mail01 ファイルを空にする
: > /test01/test_mail01.txt
			
# メールを1行ずつ読み込み、test_mail01.txtに書き出す。test_mail02.txtに日本語化したものを書き出す
while read LINE
do
	echo "$LINE" >> /test01/test_mail01.txt
done
nkf -mQ /test01/test_mail01.txt > /test01/test_mail02.txt
			
# test_mail02.txtの、----------の間に書かれた情報を取得する
MAIL2INFO=`cat /test01/test_mail02.txt | awk -v ORS='|' '1;END{printf"\n"}' | awk -F '-{10}' '{print $2}'`
echo "$MAIL2INFO" > /test01/test_mail03.txt
			
zabbix_sender -z 127.0.0.1 -s 105graylog_Ubuntu -k zstestitem02 -o "$MAIL2INFO"
logger HELLO zabbix sender

zabbixで障害発生時にメールを送るための設定

■ zabbix側の設定①
メールそのものの設定
□ メディア(Email)の設定
① 管理ーメディアタイプを選択
② デフォルトで登録されている「Email」を選択
③ 「SMTPサーバ」の欄に「127.0.0.1」と記述する
localhostのままでは名前解決できなかった
/var/log/zabbix/zabbix_server.logでエラーを確認
④ 「更新」ボタンを押下する

□ メールを受信可能な権限を持つユーザグループの設定
ユーザグループの作成
① 管理ーユーザグループーユーザグループの作成
② グループ名を設定する
~権限を設定する~
③ ①で遷移した画面の「権限」タブを選択
④ 「選択」ボタンを押下し、全てのホストグループを選択する
⑤ メールは「表示」に分類されるので「表示のみ」を選択
⑥ 追加リンクを押下する
⑦ 追加ボタンを押下する
f:id:Saw84:20190110164522p:plain

□ メール受信可能なユーザグループに所属するユーザを作成する
① 管理ーユーザーユーザの作成
エイリアスを設定する(エイリアス=ユーザ名)
~権限を設定する~
③ 「グループ」に「ユーザグループの作成」で作成したグループを選択する
④ パスワードを設定する
~メディアを設定する~
⑤ メディアタブを選択する
⑥ タイプ「Email」を選択
送信先メールアドレスを入力し「有効」にチェックを入れる
⑧ 「追加」ボタンを押下する

■ zabbix側の設定②
□ トリガーの設定
トリガーに起因してメールを送信するという設定をするため、トリガーを作成する
① 設定ーホストを選択
② 監視対象の「ホスト」の「トリガー」を選択
※ 今回は[105]graylog(Ubuntu)を選択
③ 「トリガーの作成」ボタンを押下
④ トリガー名を記入し、条件式の「追加」ボタンを押下
⑤ 作成済みのアイテム「zabbix senderテストアイテム」を選択
※ アイテムを制作した回の記事


⑥ 以下の画像のとおり設定し「挿入」ボタンを押下
f:id:Saw84:20190110164550p:plain
※ 結果の値「0」を渡すと障害として検知されるように設定している
⑦ 深刻度[軽度の障害、重度の障害、致命的な障害]等の中から選択(後のアクションの設定で使用する)
⑧ 「有効」にチェックを入れ「追加」ボタンを押下

□ アクションの作成
条件に該当するトリガーが発生したとき、アクションを起こす設定をする
① 設定ーアクションーアクションの作成
② 名前を記入し、新規条件欄を以下のように設定する
f:id:Saw84:20190110164613p:plain
※ トリガーの深刻度が、「トリガーの設定⑦」で設定した深刻度に該当するように設定する
③ 「追加」ボタンを押下

■ zabbixの設定確認
作成したアイテム
graylog→zabbix
https://blog.hatena.ne.jp/Saw84/saw.hateblo.jp/edit?entry=10257846132681294333
の値が「0」の時、障害として検知されるか確認する
① 監視データー障害ページを開いておく
② アイテムの値が0になるようにコマンドを叩く
例:zabbix_sender -z 127.0.0.1 -s 105graylog_Ubuntu -k zstestitem02 -o 0
③ 以下のように表示されることを確認
f:id:Saw84:20190110164716p:plain
※ 深刻度が設定したものになっているか、アクション欄送信先ユーザが設定したユーザになっているか、ステータスが「送信済」になっているか
エラーが発生している場合/var/log/zabbix/zabbix_server.log等を参照し、エラー内容を確認する
④ 実際にメールが届いているか確認する
※ サーバ上の対象のユーザのメールディレクトリから確認する

graylogのアラート(mail)をzabbixで取り込む準備

■graylogのアラート(mail)をzabbixで取り込みたい

□ ログインID:パスワード
https://www.zabbix.com/documentation/4.0/manual/appliance
appliance:zabbix

□ zabbix アクションの作成
https://blog.apar.jp/zabbix/979/

ping監視を設定
https://blog.apar.jp/zabbix/1173/#check

□ Timezone設定(Zabbix のグラフの時間を修正する)
# dpkg-reconfigure tzdata
→ Asia Tokyo を選択

# vi /etc/php/7.0/apache2/php.ini
→ date.timezone = ‘Asia/Tokyo’
# sudo service apache2 restart
# vi /etc/apache2/conf-available/zabbix.conf
(vi /etc/apache2/conf-enabled/zabbix.conf)
php_value date.timezone Asia/Tokyo

□ zabbix sender
zabbix senderの具体的な使い方
http://pocketstudio.jp/log3/2015/01/07/howto-use-zabbix-sender/
zabbix sender man page
https://www.zabbix.com/documentation/4.0/manpages/zabbix_sender

■ graylogアラート(mail)をzabbix sender を使用してzabbixサーバへ送る
f:id:Saw84:20181206232242p:plain

■ zabbix senderで値を送信する
□ zabbix senderから値を受け取るアイテムを作成しておく
タイプ:zabbixトラッパー
キー:zabbix sender コマンドでも指定するので判りやすいものを設定
f:id:Saw84:20181206232355p:plain

□ zabbixサーバからコマンドを叩く
zabbixサーバからzabbix senderを使用し、自分自身に値を送信する
# zabbix_sender -z 127.0.0.1 -s 105graylog_Ubuntu -k zstestitem01 -o 1
-z zabbixサーバのIPアドレス
-s (送信元の)ホストネーム…zabbixに登録してあるホストの「ホスト名」の値
-k アイテムのキーの値
-o 送信する値。データ型はアイテムのデータ型項目で設定する。
スペースを含むときは""で囲む。 -o "値 値"


■ /etc/aliases
rootでメールを受信した際に、スクリプトを実行する設定を書く
参考サイト
http://success.tracpath.com/blog/2009/08/07/%E3%83%A1%E3%83%BC%E3%83%AB%E5%8F%97%E4%BF%A1%E3%81%A7%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/

① メール専用のユーザを作成する
# useradd -m zsaw01
mailをユーザのホームディレクトリ/Maildir で受信する設定にしているので、ユーザ作成と同時にホームディレクトリを作成する。
# passwd zsaw01

② テスト用シェルを作成する
実行すると/var/log/syslog にhelloと書き込む。
http://tech.clickyourstyle.com/articles/195
# /test01/test01.sh
#!/bin/bash
logger HELLO

権限を付与しておく
# chmod 775 -R /test01/test01.sh

③ メール受信時に②が実行されるように /etc/aliases に設定を記述する
# vi /etc/aliases
以下を追記
zsaw01: |"/bin/bash /root/test01/test01.sh"
# newaliases

④ シェルの中身をzabbix senderに変更する
# /test01/test01.sh
以下のように書き換える
zabbix_sender -z 127.0.0.1 -s 105graylog_Ubuntu -k zstestitem02 -o 3