graylogのアラートメールにhost addrやdest addrを乗せる

■ graylogのアラートメールにhost addrやdest addrを乗せる
graylogのアラートメールにfull messageを乗せる

□ backlog massage
https://community.graylog.org/t/problem-with-create-alerts/2411
Alerts→Manage conditions→メール送信用conditionを選択→condition detailsの「edit」を選択
「Message Backlog」を0以外に設定する(1で良い。設定した数だけmessageが出力される)
f:id:Saw84:20181206164605p:plain

□ メール本文の設定方法
##########
Alert Description: ${check_result.resultDescription}
Date: ${check_result.triggeredAt}
Stream ID: ${stream.id}
Stream title: ${stream.title}
Stream description: ${stream.description}
Alert Condition Title: ${alertCondition.title}
${if stream_url}Stream URL: ${stream_url}${end}

Triggered condition: ${check_result.triggeredCondition}
##########

${if backlog}Last messages accounting for this alert:
${foreach backlog message}${message}
Src_addr: ${message.fields.src_addr}
Dst_addr: ${message.fields.dst_addr}
Full message: ${message.fields.full_message}

${end}${else}
${end}

${foreach backlog message}から${end}${else}…の間に、
${message.fields.フィールド名}を設置することで、application_nameやdst_portといった項目の値をメールに載せることができる。

graylog→zabbixサーバへメール送信

■ graylogからzabbixサーバへテストメールを送信する
□ 参考記事
http://tweeeety.hateblo.jp/entry/2014/11/18/133508
https://qiita.com/shomatan/items/d48333db0d8385ec4460

□ /etc/hosts を使用する
zabbixサーバ、graylogサーバともに
# vi /etc/hosts
以下を追記

Postfixでメール送信する際に/etc/hostsを参照させる
zabbixサーバ、graylogサーバともに
# /etc/postfix/main.cf
以下を追記
smtp_host_lookup = native

postfixを再起動する
# /etc/init.d/postfix restart

□ zabbix側 iptables で25番ポートを許可する
# iptables -I INPUT 4 -p tcp --dport 25 -j ACCEPT

□ graylog管理画面からテストメールを送信する
Alerts→Manage condictionsから、condictionを新規作成/編集し、E-Mail Receiversにzabbixのメールアドレスを指定する

virtualbox上のzabbix applianceにメールを設定する(local)ubuntu16.04.5

virtualboxのzabbix appliance(ubuntu)にpostfixを入れてメールを送受信できるようにする

□ 参考サイト
https://qiita.com/mizuki_takahashi/items/1b33e1f679359827c17d

□ OSバージョン確認
# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"

□ hostname確認
# hostname

□ hostnameを恒久的に変更する
① # apt update
② # apt install -y dbus
③ # hostnamectl set-hostname <好きなhostname>
④ hostname変更確認
# hostnamectl

postfixインストール&設定
postfixのインストール
# apt-get install -y postfix
TUIが表示されるので「No configuration」を選択する
f:id:Saw84:20181203183133j:plain

② 「/etc/postfix/main.cf.proto」をコピーし「main.cf」を作成する
# cp/etc/postfix/main.cf.proto /etc/postfix/main.cf

postfixの設定を編集
# vi /etc/postfix/main.cf
# 78行目:コメント解除
mail_owner = postfix
 
# 96行目:コメント解除しホスト名指定
myhostname = zabbix.saw84
 
# 83行目:コメント解除しドメイン名指定
mydomain = graylogsaw84.jp

# 124行目:コメント解除
myorigin = $mydomain

# 138行目:コメント解除
inet_interfaces = all

# 189行目:追記
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 230行目:コメント解除
local_recipient_maps = unix:passwd.byname $alias_maps

# 274行目:自ネットワーク追記

mynetworks = 127.0.0.0/8, 10.0.2.0/24

# 410行目:コメント解除
alias_maps = hash:/etc/aliases

# 421行目:コメント解除
alias_database = hash:/etc/aliases

# 443行目:コメント解除 ( Maildir形式へ移行 )
home_mailbox = Maildir/

# 579行目:コメントにしてその下に追記
#smtpd_banner = $myhostname ESMTP $mail_name (@@DISTRO@@)
smtpd_banner = $myhostname ESMTP

# 654行目:追記
sendmail_path = /usr/sbin/postfix

# 659行目:追記
newaliases_path = /usr/bin/newaliases

# 664行目:追記
mailq_path = /usr/bin/mailq

# 670行目:追記
setgid_group = postdrop

# 674行目:コメント化
#html_directory =

# 678行目:コメント化
#manpage_directory =

# 683行目:コメント化
#sample_directory =

# 687行目:コメント化
#readme_directory =

# 最終行へ追記:送受信メールサイズを10Mに制限
message_size_limit = 10485760
# メールボックスサイズを1Gに制限
mailbox_size_limit = 1073741824
# 以下SMTP-Auth
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject

④ /etc/aliasesの権限付与とaliases.dbの作成
# chmod 775 -R /etc/aliases
# newaliases


smtp authに必要なIDとパスワードをやり取りするためのライブラリCyrus SASLをインストールする
# apt install sasl2-bin

⑤ devcotをインストールする
# apt install dovecot-imapd dovecot-pop3d

SMTP認証に使うSASLファイルの存在確認
# ls -la /etc/ssl/certs/ssl-cert-snakeoil.pem
# ls -la /etc/ssl/private/ssl-cert-snakeoil.key

SMTP認証に使うSASLの設定
# vi /etc/postfix/main.cf
最下部に追記
broken_sasl_auth_clients = yes

### TLSを使う場合の証明書と鍵ファイルの指定
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

smtp_use_tls = yes

#smtp_sasl_password_maps = hash:/etc/postfix/saslpass
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt

⑧ /etc/postfix/saslpass の作成
# vi /etc/postfix/saslpass
[smtp.gmail.com]:587 example@gmail.com:パスワード

⑨ /etc/postfix/saslpass.db の作成
パスワードを記入したファイルを、Postfixが読み込みやすい形式に postmap コマンドで変換する。変換後のファイル名には .db が付くが、設定ファイルで指定するファイル名は変換前のファイル名で良い。
# postmap /etc/postfix/saslpass

⑩ 設定反映のため、postfixを再起動する
# /etc/init.d/postfix restart

⑪ /etc/postfix/master.cfの編集
# vi /etc/postfix/master.cf
以下を追記
### Submission ポート (ポート番号 587) でも SMTP を受けるようにする
### sasl認証を有効にする

submission inet n       -       -       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
### smtpsを有効にする
### TLSのラッパーモードを有効にする
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes

SMTP認証ファイルパスディレクトリ作成
# mkdir -p /var/spool/postfix/private/
# touch /var/spool/postfix/private/auth
# chown postfix:postfix -R /var/spool/postfix/private/auth
# chmod 700 -R /var/spool/postfix/private/auth

dovecotの設定
# vi /etc/dovecot/dovecot.conf
以下を追記
### 利用するプロトコルを記載
### dovecot-imapdとdovecot-pop3dをインストールしたので imap pop3 を記載
protocols = imap pop3
### LISTENするアドレスを指定
listen = *

# vi /etc/dovecot/conf.d/10-mail.conf
以下を変更
### Postfixの設定に合わせてMaildir形式を指定
#mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location = maildir:~/Maildir

以下を追記:190行目付近
### dovecotプロセスが chroot することができるディレクトリの指定
valid_chroot_dirs = /home

以下を追記:330行目付近
### UIDLのフォーマットを指定
pop3_uidl_format = %08Xu%08Xv

# vi /etc/dovecot/conf.d/10-auth.conf
好みで以下を有効化
### SSL/TLS接続のみ有効にする場合はyes
disable_plaintext_auth = yes

以下を変更:100行目付近
### 認証時のパスフレーズ送信方式の指定
### 通信が暗号化されているので以下
#auth_mechanisms = plain
auth_mechanisms = plain login

# vi /etc/dovecot/conf.d/10-master.conf

### imapでの接続ポートの指定
### SSL/TLSのみ使う場合はimapsのみで良い
service imap-login {
inet_listener imap {
#port = 143
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
}
### imapでの接続ポートの指定
### SSL/TLSのみ使う場合はimapsのみで良い
service pop3-login {
inet_listener pop3 {
#port = 110
port = 0
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
### 認証用ソケットファイルへのアクセス権設定
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}

# vi /etc/dovecot/conf.d/10-ssl.conf
以下のコメントアウトを解除:6行目付近
### SSL/TLSを有効化
ssl = yes

以下を変更:12行目付近
### SSL/TLSで利用する証明書の設定
### (別途作成の必要あり)
ssl_cert =

VirtualBox上のcoreOSにdocekerを立ててzabbixを入れる

■ 参考サイト
https://server-network-info.blogspot.com/2017/08/15docker-zabbix-server-34.html
https://usado.jp/spdsk/2018/03/19/post-3450/

virtualboxにcoreOSをインストールする準備
ダウンロードサイト
https://coreos.com/os/docs/latest/booting-with-iso.html

② coreOSのための仮想サーバを作成
1 VirtualBoxマネージャで[新規]アイコンをクリック
2 仮想マシンの作成ダイアログの[名前]、[タイプ]、[バージョン]を入力して[次へ]をクリック
[名前]任意の名前を入力
[タイプ]Linux
[バージョン] Oracle(64-bit)
3 [メモリサイズ]を設定して[次へ]をクリック
今回は4096MBに設定
4 [仮想ハードディスクを作成する]をチェックして[作成]をクリック
5 [VDI(VirtualBox Disk Image]をチェックして[次へ]をクリック
6 [可変サイズ]をチェックして[次へ]をクリック
7 [サイズ]を設定して[作成]をクリック
今回は20GBに設定

③ 仮想サーバのネットワーク設定
画像のように設定
f:id:Saw84:20181127142216p:plain
f:id:Saw84:20181127142225p:plain

④ 仮想サーバのディスク設定
ストレージーストレージデバイス「空」を選択。①ダウンロードサイトで入手したisoイメージを「光学ドライブ」から選択し「OK」を押下する
f:id:Saw84:20181127142254p:plain

⑤ 起動する


■ ユーザcoreにパスワードを設定し、sshで接続できるようにする
① ユーザ一覧を表示する
$ cat /etc/passwd
ユーザ「core」がいることを確認
② ユーザ「core」のパスワードを設定する
$ sudo passwd core
③ ついでにrootのパスワードも設定する
$ sudo passwd root
④ opensslの暗号化パスワードを記載したcloud-config.ymlを作成
ユーザはcoreのまま
(作業ディレクトリは/home/core)
$ openssl passwd -1 > cloud-config.yml
ssh-keygenでssh-authorized-keys用のキーを作成してcloud-config.ymlに貼り付け
$ ssh-keygen -t rsa
→ Enter file in which to save the key(/home/core/.ssh/id_rsa): /home/core/.ssh/id_rsa
パスワードは任意の文字列を入力
$ cat ~/.ssh/id_rsa.pub >> ./cloud-config.yml
⑥ cloud-config.ymlを編集

#cloud-config		
users:		
- name: core		
passwd: 1行目に書かれていた文字列		
groups:		
- sudo		
- docker		
ssh-authorized-keys:		
- "ssh-rsa 生成されていた文字列"		

yml記法は表記が厳格なので要注意
以下のコマンドでバリデーションチェックできる
coreos-cloudinit -validate="true" -from-file="/home/core/cloud-config.yml"
⑦ CoreOSをインストール
$ sudo coreos-install -d /dev/sda -C stable -c cloud-config.yml
⑧ 一度サーバをシャットダウンし、ディスク割り当てを除去する
f:id:Saw84:20181127142718p:plain

⑨ 起動し、ネットワーク設定を行う
Gatewayを確認する
$ route -n
→ enp0s3のGatewayをメモしておく

IPを固定する。この時Gatewayはenp0s3のものを設定する
$ sudo vi /etc/systemd/network/static.network

[Match]
Name=enp0s8

[Network]
Address=192.168.56.106
Gateway=10.0.2.1
DNS=8.8.8.8

$ sudo systemctl restart systemd-networkd
$ ip a
設定したIPアドレスが反映されているか確認する
⑩ coreosのアップデート
$ sudo update_engine_client -update
TeraTerm等からsshで接続する


■ coreOS上にDockerを立てる
参考サイト
https://qiita.com/japboy/items/ca00baeaf0acada31235
http://tasuten.hatenablog.com/entry/2014/10/07/233344
pingで疎通を確認する
# ping 8.8.8.8
② Docker Hubでアカウントを作成する
https://hub.docker.com/
③ Dockerイメージの取得
Docker Hubへログインする
# docker login
→ IDとPasswordを入力する


■ zabbix4.0をdockerで動かす
参考サイト
https://qiita.com/zembutsu/items/32f27fa8136b86620baf
https://hub.docker.com/r/zabbix/zabbix-web-nginx-pgsql/
http://docs.docker.jp/engine/reference/run.html
https://qiita.com/picapica/items/cb84d6f23504ee2c7d06
docker stop $(docker ps -a -q)
docker rm $(docker ps -aq)
① docker上にmysqlコンテナを立てる
# docker run --name mysql-server -t -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="任意のPW" -e MYSQL_ROOT_PASSWORD="任意のPW" -d mysql:5.7 --character-set-server=utf8 --collation-server=utf8_bin
② docker上にjava-gatewayコンテナを立てる
# docker run --name zabbix-java-gateway -t -d zabbix/zabbix-java-gateway:latest
③ zabbix-server-mysqlコンテナを立てる
# docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="①のPW" \
-e MYSQL_ROOT_PASSWORD="①のPW" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
④ zabbix-web-nginx-mysqlコンテナを立てる
# docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="①のPW" \
-e MYSQL_ROOT_PASSWORD="①のPW" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest

【日本語訳】Create items and triggers in Zabbix based on Graylog stream alerts

github.com
Create items and triggers in Zabbix based on Graylog stream alerts
GraylogのStreamからのアラートに基づいて、Zabbixのitemとtriggerを生成する。

This application bridges the gap between graylog and zabbix.
このアプリケーションは、graylogとzabbixの間の橋渡しをします。
Its goal is to create and update items in zabbix based on alerts in graylog.
このアプリケーションの目的は、Graylogのアラートに基づいてzabbix内のアイテムを作成および更新することです。
There is no data going from zabbix to graylog.
zabbixからgraylogへのデータの流れはありません。

How to use
・ bin/app.pl listens for callbacks from graylog
bin/app.pl はgraylogからのコールバックを待ち受けます。
・ bin/heartbeat.pl runs approx. every minute to update the heartbeat item in zabbix
bin/heartbeat.pl は、zabbixのハートビートアイテムを更新するたびにほぼ実行されます。
・ bin/discovery.pl runs approx. every minute to add/remove graylog streams in zabbix
bin/discovery.plは、zabbixでGraylogストリームを追加/削除するたびに、ほぼ実行されます。

Configuration is passed by setting the APP_CONFIG environment variable to a valid JSON-object.
設定は、APP_CONFIG環境変数を有効なJSONオブジェクトに設定することによって渡されます。
You can find an example inside this repository.
このリポジトリ内にサンプルがあります。
Pass MOJO_VERBOSE=1 to show command execution details.
コマンド実行の詳細を表示するには「MOJO_VERBOSE = 1」を渡します。

How to build
Simply type make.
make コマンドを叩く。

How to configure Graylog
Assuming our application is running at https://example.com.
このアプリケーションがhttps://example.comで動作していると仮定します。
Configure Graylog to send alerts to https://example.com/alert/{severity} where {severity} is one of warning or critical.
https://example.com/alert/{severity}にアラートを送信するようにGraylogを設定します。{severity}は警告(warning)またはクリティカル(critical)のいずれかです。

シェルスクリプト+rsyslog+graylogで死活監視

■ 死活条件
監視対象のサイトにアクセスできない状態が5分間続いたらアラートをあげる

■ 監視対象
自分で用意したOWASP BWA

■ 監視する側の設定(ubuntu)
① 監視対象にwgetを投げ、ステータスを取得するシェルスクリプトを設置する
□ 参考サイト
http://www.voodoomarketing.net/2007/07/post-313/

□	shikatu-shell.sh								
#!/bin/bash							
cd /var/log						
ADDRESS=http://192.168.56.aaa/						
MESSAGE=`wget --spider -nv $ADDRESS 2>&1`						
RESULTCODE=`echo $MESSAGE | grep -c "200 OK"`						
if [ $RESULTCODE -ne 1 ];						
then						
  logger -is -p user.info -t shikatu $MESSAGE						
fi						

□ shikatu-shell.shの解説
ADDRESS=http://192.168.56.aaa/
監視対象のアドレス
MESSAGE=`wget --spider -nv $ADDRESS 2>&1`
wgetでファイルのダウンロードをしない。詳細メッセージを出力しない。出力されたメッセージをMESSAGE変数に格納する
RESULTCODE=`echo $MESSAGE | grep -c "200 OK"`
MESSAGEに「200 OK」が含まれている数を数える
if [ $RESULTCODE -ne 1 ];
数えた結果が1以外だったら
logger -is -p user.info -t shikatu $MESSAGE
syslogに出力する。
-i: プロセスIDを出力
-s: 標準エラー出力にも出力
-p: 優先度設定
-t: タグ文字列設定
以下のような文言がsyslogに出力される。出力される場所は/var/log/syslog
Nov 23 16:11:01 ubuntu-snort shikatu[3592]: http://192.168.56.102a/ wget: ホストアドレス `192.168.56.102a' を解決できませんでした。

□ 作成したシェルスクリプトがcrontabから実行できるように権限を与える
# chmod 770 shikatu-shell.sh

② crontabを設定する
□ crontabが有効であるか確認する
# /etc/init.d/cron status

□ 1分に1回、①で作ったシェルスクリプトを実行するように設定する
# crontab -e
以下を追記
*/1 * * * * /root/test1/shikatu-shell.sh

③ rsyslogの設定
□ # /etc/rsyslog.conf
以下を追記
*.* @@192.168.56.105:10514;GRAYLOGRFC5424

□ rsyslogを再起動する
# service rsyslog restart


■ graylogの設定
① Streamを作成する
② Streamにルールを追加する
→ Field application_name must match exactly shikatu
③ pipelineを作成する
①で作成したStreamと紐づける
④ Alertを作成する
・ Condictionの設定
f:id:Saw84:20181123164604p:plain
f:id:Saw84:20181123164613p:plain

・ Notificationの設定
f:id:Saw84:20181123164657p:plain

これで、監視対象のサイトに毎分接続を試み、5分以上接続できない状態が続いたら、アラートメールが飛んでくるようになる。

httpのステータスを取ってくるシェルスクリプト

□ # shikatu-shell.sh

#!/bin/bash	
				
cd /var/log	
HNAME=`hostname`	
ADDRESS=http://192.168.56.102a/	
MESSAGE=`wget --spider -nv $ADDRESS 2>&1`	
RESULTCODE=`echo $MESSAGE | grep -c "200 OK"`	
DAY=`env LC_ALL=c date`	
DAYLOG=`echo $DAY | cut -f 2-4 --delim=" "`	
				
if [ $RESULTCODE -ne 1 ];	
then	
  echo  "$DAYLOG $HNAME shikatu[$$]: $ADDRESS is dead: $MESSAGE" >> /var/log/syslog	
fi	

□以下のようなログが出力される
Nov 23 00:18:53 ubuntu-snort shikatu[8354]: http://192.168.56.aaa/ is dead: wget: ホストアドレス `192.168.56.aaa' を解決できませんでした。

□ shikatu-shell.shの解説
HNAME=ホスト名
ADDRESS:監視対象のURL
MESSAGE=`wget --spider -nv $ADDRESS 2>&1`
wgetでファイルのダウンロードをしない。詳細メッセージを出力しない。出力されたメッセージをMESSAGE変数に格納する
RESULTCODE=`echo $MESSAGE | grep -c "200 OK"`
MESSAGE変数に入っているものが200 OKだったらカウント+1する
DAY=`env LC_ALL=c date`
英語で実行時の年月日時を表示する
DAYLOG=`echo $DAY | cut -f 2-4 --delim=" "`
月日時表示をsyslogと一緒にするために整形する
echo "$DAYLOG $HNAME shikatu[$$]: $ADDRESS is dead: $MESSAGE" >> /var/log/syslog
(カウントが1じゃなかったら、つまり200 OK以外だったら)
以下のフォーマットのような文言を/var/log/syslogに出力する
Nov 22 22:48:01 ubuntu-snort shikatu[4554]: http://192.168.56.102a/ is dead: wget: ホストアドレス `192.168.56.aaa' を解決できませんでした。
$$
自分のプロセスID