StackStormでBINDのアップデートをtwitterに通知する
注) BINDに関する有益な情報はありません。StackStormのピタゴラ遊び編です
概要: BINDの脆弱性情報が出た際に知らせる仕組みをStackStormで作ってみました
要求: (if)BINDの脆弱性情報が出たら(then)知らせて欲しい
仕様: (if)bind-announce MLに件名がCVE-で始まるメールが配信されたら(then)twitterで@メンションツイートを送る
StackStormのemail packと、twitter pack ... ではなく core.local のシェルコマンドで実装してみます。
しつこい注) StackStormを使う興味の無い方は、bind-announceのメールを携帯に転送すれば良いかと
全体設計
環境: CentOS7 + StackStorm 2.2
メール: postfix + dovecot
twitter操作: t(ruby) もしくは twitter gem
今回はピタゴラ遊びなのですべて1台のサーバー上に構築します。メールの確認もlocalhostへのimapなのでtls化は省略します。
StackStormのTrigger設定
StackStormのemail packをインストールします。
st2 pack install email
設定ファイルを編集します。
/opt/stackstorm/packs/email/config.yaml
--- imap_mailboxes: main: server: localhost port: 143 username: USERNAME password: PASSWORD folder: INBOX ssl: false max_attachment_size: 1024 attachment_datastore_ttl: 1800
USERNAMEとPASSWORDは適宜編集してください。
StackStormのemail packはメールの内容に対する条件設定が弱いので、「bind-announce宛に配信された、件名がCVE-で始まる」のような条件指定には他の仕組みを用います。StackStorm勉強会 #1ではSylpheedの仕分けを用いる方法を紹介しましたが、今回は条件に日本語も無いのでprocmailを使ってみます。
メール設定
dovecotの設定
dovecot.conf
protocols = imap pop3 lmtp listen = *, :: base_dir = /var/run/dovecot/ login_trusted_networks = 127.0.0.1/32
10-mail.conf
mail_location = maildir:~/Maildir
10-auth.conf
disable_plaintext_auth = no auth_mechanisms = plain
procmailの条件設定
ヘッダー条件はList-Idも検討しましたが、今回は手抜きでX-Original-Toでマッチさせました。
/home/mluser/.forward
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #username"
/home/mluser/.procmailrc
LOGFILE=$HOME/procmail.log MAILDIR=$HOME/Maildir/ DEFAULT=$MAILDIR LOCKFILE=$HOME/.lockmail :0 c *^X-Original-To: bind-announce@lists.isc.org *^Subject: CVE* ! user2@example.com
Twitter設定
dev.twitter.com でアプリの登録
専用のTwitterアカウント作成し、API操作用にアプリ登録を行います。
https://dev.twitter.com
に作成した専用のアカウントでログインし、上部メニューの[My Apps]へ進みます。
Name, Description, Website の三項目が必須なので入力します。WebsiteはBotの場合はあまり意味が無いので適当で良いと思います。
Twitter Developer Agreementを確認した上で同意のチェックを付けてから[Create your Twitter application]をクリックすることで登録が完了します。
作成したアプリの詳細ページで、まずはツイート書き込みを行う権限を追加します。
[Application Settings] - [Access level]を"Read and Write"に変更します。
次に、"Keys and Access Tokens"のタブでAPI Key情報を入手します。以下の4つの値が必要になります。
CLIツールのセットアップ
今回はruby実装のt (https://github.com/sferik/t) を用います。
gem install t
ツール(t)の認可を行います。最終的にtを使った操作はStackStormから実行するので、以下の認可設定はstanleyアカウントで行います。
t authorize
ブラウザでdev.twitterが立ち上がってきます。(リモートターミナルで行っている場合はX転送でブラウザが上がってきます)
先の手順でアプリの登録をおこなったさいに得た以下の情報を入力します。
Enter your API key: ここにConsumerKeyを入力 Enter your API secret: ここにはConsumerSecretを入力
すると今度はブラウザ上でtwitterサイトにPINコードが表示されるので、コマンドラインにその数字を入力します。
以上でtが使えるようになりました。アプリの登録情報は /home/stanley/.trc
に保存されます。
試しに自分のTwitterアカウント情報を表示してみましょう。
t whois @アプリ登録用に作成したTwitterアカウント
アカウント作成日時やアカウント名/表示名などが出れば成功です。
t update "Hello World"
で新規tweetができることも確認しておきます。
Tweetするスクリプトの作成
Triggerで検知したメールの件名が引数として渡されるので、$@で受け取って軽くエスケープ処理した上で
tを用いてtweetします。ついでに自分への@メンションツイートとします。
/home/stanley/script/tweet_chofuku.sh
#!/bin/bash # tweet_chouku.sh: This script tweets "cho-fuku" when CVE for BIND has announced." # ST2 trigger: email(imap) # ST" action: shell(core.local) ARGSUBJ=`printf %q "$@"` /usr/local/bin/t update "@自分が普段使っているアカウント $ARGSUBJ" exit
StackStormのRule, Action設定
StackStormのRuleを設定し、該当するメールを受信した後の動きを定義します。
Ruleのyamlファイルは設置ディレクトリに特に規定はありません。
--- name: 'bindcve_to_CLI_twitter' description: 'Tweets when CVE on BIND has announced.' enabled: True trigger: type: email.imap.message action: ref: 'core.local' parameters: cmd: /home/stanley/script/tweet_chofuku.sh {{trigger.subject}}
Rule定義ファイルの中の必須項目や設定項目については公式ドキュメントを参照してください。 https://docs.stackstorm.com/rules.html
一点だけ補足すると、一連の動作の中で変数の参照を行っています。届いたメールの件名をツイートするために、trigger部分で検知したメールが含まれるアウトプットから trigger.subject をaction部分で参照することで件名文字列の受け渡しを行っています。
作成したRuleを登録します。
# st2 rule create bindcve_to_CLI_twitter.yaml
一覧を確認して、以下のような表示があればRuleの作成は完了です。
動作例
@w4yh CVE-2017-3137: A response packet can cause a resolver to terminate pic.twitter.com/h9lOy0N5xr
— alertwatch (@AlertWatch53) 2017年4月13日
(ちょっと変更して、twitter gemを用いて画像とともにtweetしています)
追加したい処理
- ISCのサイトに詳細が出ていたらそのURLもtweetで知らせる
- 対象バージョン範囲を抜き出して該当環境の抽出
- といった処理をActionではなくWorkflowで流したい
今回使ったファイルはGitHub上にも置いてあります。
github.com