FortiGateからチャットへメッセージを送る方法
今回は大人気ファイアウォールのFortiGateを使った方法を紹介します。 FortiGateの場合、イベントの通知としては、メールやFortiAnalyzerがありますが、前回に引き続きチャットへのメッセージ投稿方法をご紹介します。
目標: FortiGateから直接Cisco Webex Teamsへメッセージを送信する
今回はSlackではなく、Cisco Webex Teamsを使った方法です。 Slackはよく技術系サイトでの連携方法が掲載されていますが、Webexとなるとそれほど掲載も多くないので参考にしていただければと思います。
環境
今回は以下のような環境で紹介します。
- FortiGate FortiOS6.2.3
- Cisco Webex Teams (要デベロッパーログイン)
FortiGate Automation
FortiGateのAutomation(v6.0以上)にはセキュリテイファブリックの機能の一部に自動制御機能が用意されています。 Automationアクションの中にWebhookがあるので、これを使えば直接Webex Teamsへメッセージを投稿できるという仕組みです。
Cisco WebEx Teams
Webex Teamsへメッセージを投稿するために、Webexのデベロッパーアカウント(無料)が必要です。 デベロッパー環境では、Teamsで必要となるAPIの情報を収集するために必要です。 今回はFortiGateから直接APIを使ってチャットへのメッセージ投稿をする方法となるため、ForiGateからメッセージ投稿に必要な情報をセットします。 また、Teamsへメッセージを投稿する際は、ユーザー自身からのメッセージ投稿ではなく、Botが投稿するような形で実現したいと思います。
手順
Cisco WebEXの準備
用意するのは、通知を受け取るスペース、Botです。 メッセージをFortiGateから投稿するための、スペースのIDとBotのアクセスキーを利用します。
FortiGateからお知らせを受け取るためのスペースを作ります。
Webexに通知を受けたいスペースを作ります。既存のスペースでも構いません。ボットを作ります。
ボットを作るためにはCisco WebEX for developerへアクセスします。
右上の自身のアイコンから、"My Web Apps"に入り新しいAppを作成します。
Bot Name, Bot Username, Icon, Descriptionを記入、選んでBotの作成を行います。
すると、Botのアクセスキーが発行されるので、そのキーをコピーしてメモ帳などに貼り付けましょう。(このトークンは非常に重要です。大切に保管しましょう。)Webex Teamsの情報を収集する
Cisco Webex for DevelopersのDocumentationにアクセスします。
左のペインの"API Reference"にアクセスするとSwaggerが使えます。Cisco Webex上の必要となるAPIの各種情報を取得することができます。
投稿する先のスペースのルームID(roomId)を取得
API Reference→Rooms→GET List Rooms→ HeaderのAuthorizationをたどると自分が利用しているルームの一覧が表示されるので、そこから今回投稿する先のスペースのid
の値をコピーしてメモ帳に保存します。
スペースへBotを追加
Teamsのアプリに戻って対象のスペースへユーザー追加から作成したBotを追加して下さい。ユーザーはBot名で探せば表示されます。
ここまでがWebexの作業です。次は取得した情報でメッセージを投稿できるかのテストを実施します。
Postmanを使ったメッセージ投稿テスト方法
PostmanはAPIを使った開発をする際に非常に役立つツールです。先程取得した情報を使い、Webexへメッセージを投稿できるか見てみましょう。
- Postmanの起動
Postメソッドに設定し、https://api.ciscospark.com/v1/messages
Headersの内容としては
Content-Type
として、application/json
Authorization
として、Bearer {ボットのAccess Key}
と入力します。
Bodyには、以下のように記載します。
Webexのメッセージ投稿に必要なbody要素は、"roomId"
と"text"
が最低限必要です。
※ルームIDのスペルに注意(アルファベットのアイは大文字)
これでSendを押すと、指定したスペースにボットからのメッセージが投稿されていればOKです。
FortiGate Automationの設定
Security Fabric→Automationへ移動し、新規作成します。
TriggerはFortiOS Event Logを選択し、適当なイベントを選択します。ActionはWebhookを選択します。
Webhookへ記入する情報については、先程Postmanで確認したとおりです。
※HTTPとHTTPSを間違えないでください。
Protocol: HTTPS
Method: POST
URI: https://api.ciscospark.com/v1/messages
Port: 443
HTTP bodyはPostmanでテスト記入したbodyと同じようにJSON形式で記入します。
メッセージ本文にはイベントの情報をダイナミックに記載するために、メッセージ変数を使うと便利です。%%msg%%
を使っています。
{
"roomId": {ルームID},
"text" : "アラート通知する内容"
}
HTTP Header Postmanと同様に以下2つの入力とします。
Content-type : application/json
Authorization : Bearer {ボットのアクセスキー}
実装のテスト
準備が整いましたので、あとはトリガーとなるイベントがFortiGate上で発生すると自動的にTeamsへメッセージが通知されます。
今回の例では、管理者ログインをトリガーとしたので、FortiGateにWeb、GUIなどでアクセスすれば以下のようにメッセージが通知されるはずです。
メッセージを無事に受信できればとりあえず設定完了です。メッセージの表示の仕方は、Text形式やMarkdown形式などさまざまな方法にも対応しているので、チューニングしてみてください。
もしメッセージが届かない場合は、ヘッダーやボディの内容を再度確認してください。また、FortiGateの変数が間違っていたり、記載の方法が間違っていてもメッセージが生成されないのでTry&Errorを繰り返してみてください。
まとめ
ゲートウェイはセキュリティやネットワークの集約ポイントになるので、いち早くイベントを受け取って、ネットワーク全体のトラブルの兆候を把握することは大切です。
今まで通り、メールやSyslogを使ってもいいですが、ちょっとしたイベントならチャットで受けたり、他のアプリへのトリガーとしてもWebhookを使うことができます。
なお今回の方法はCisco Webex Teamsでの実施例ですが、もちろんSlackやMicrosoft Teamsでも可能です。
大まかなしくみがわかると、いろんなサービスをつなげてみたくなりますので、ぜひトライしてみてはいかがでしょうか?
次回も異なる方法でチャットへのメッセージ投稿の例を考えてみたいと思います。
ネットワーク装置からチャットへメッセージを投稿
著者紹介
SB C&S株式会社
ICT事業本部 技術本部 第3技術部
宮本 世華
釣りが好きです。