Empowered by expect

希望は体力

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化は省略します。

f:id:w4yh:20170320193157j:plain

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つの値が必要になります。

  • Consumer Key
  • Consumer Secret
  • Access Token
  • Access Token Secret
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ファイルは設置ディレクトリに特に規定はありません。

bindcve_to_CLI_twitter.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の作成は完了です。
f:id:w4yh:20170321235809j:plain

動作例


(ちょっと変更して、twitter gemを用いて画像とともにtweetしています)

追加したい処理

  1. ISCのサイトに詳細が出ていたらそのURLもtweetで知らせる
  2. 対象バージョン範囲を抜き出して該当環境の抽出
  3. といった処理をActionではなくWorkflowで流したい

今回使ったファイルはGitHub上にも置いてあります。
github.com