コンテンツにスキップ

Playbook (自動化)

Playbook は、セキュリティインシデントへの対応手順を組み立てる SOAR(Security Orchestration, Automation and Response)機能です。 ビジュアルフローエディタでノードを接続し、検知から照会、通知、起票までの処理フローを定義します。

外部システムの状態を変更する操作(通信遮断やケースのクローズなど)を、Playbook が無断で実行することはありません。 こうした書き込みは申請、承認、適用の順で承認制をとります1

Playbook エディタの全体画面 図: Playbook ビジュアルフローエディタ。ノードの接続でワークフローを構築


Playbook の基本概念

ノードタイプ

Playbook は 3 種類のノードを接続してワークフローを構築します。

タイプ API type 値 説明
Action 1 処理を実行するノード。Python / JavaScript コードを記述
Condition (If/Else) 2 条件分岐ノード。True パスと False パスに分岐
Loop 4 繰り返し処理ノード。リストの各要素に対して処理を実行

トリガータイプ

Playbook の実行を開始するトリガーです。

トリガー API type 値 説明
手動実行 UI または API から直接実行
Webhook 外部システムからの HTTP POST
スケジュール 104 cron 形式での定期実行
ケース作成 新しいケースが作成された時に自動実行

ノードの詳細

Action ノード

Action ノードのコードエディタ 図: Action ノード。Python / JavaScript コードエディタ

任意の Python / JavaScript コードを実行するノードです。

入出力:

  • input_data:前のノードの出力、またはトリガーデータを受け取る辞書
  • env:環境変数にアクセスする辞書
  • output:このノードの出力。次のノードの input_data として渡される

コード例:

import requests

response = requests.post(
    env['SLACK_WEBHOOK_URL'],
    json={
        "text": f":rotating_light: セキュリティアラート\n"
                f"タイトル: {input_data['title']}\n"
                f"重要度: {input_data['severity']}\n"
                f"送信元: {input_data['src_ip']}"
    }
)
output = {"status_code": response.status_code}
import requests

ip = input_data['src_ip']
response = requests.get(
    f"https://api.abuseipdb.com/api/v2/check",
    params={"ipAddress": ip, "maxAgeInDays": 90},
    headers={"Key": env['ABUSEIPDB_API_KEY']}
)
result = response.json()['data']
output = {
    "ip": ip,
    "abuse_score": result['abuseConfidenceScore'],
    "is_malicious": result['abuseConfidenceScore'] > 80,
    "country": result['countryCode'],
    "total_reports": result['totalReports']
}
import requests

query = """
from `firewall_logs`
filter action == "DENY"
filter __time > now - 1hours
group src_ip (aggregate { cnt = count this })
sort {-cnt}
take 10
"""
# CSIRT-Pro の検索 API を呼び出して結果を受け取る
output = {"query": query}
import smtplib
from email.mime.text import MIMEText

msg = MIMEText(f"アラート: {input_data['title']}\n詳細: {input_data['description']}")
msg['Subject'] = f"[CSIRT-Pro] {input_data['severity']} アラート"
msg['From'] = env['SMTP_FROM']
msg['To'] = env['ALERT_RECIPIENT']

with smtplib.SMTP(env['SMTP_HOST'], int(env['SMTP_PORT'])) as server:
    server.starttls()
    server.login(env['SMTP_USER'], env['SMTP_PASS'])
    server.send_message(msg)

output = {"sent_to": env['ALERT_RECIPIENT']}

Condition ノード

output の値が Truthy であれば True パスに、Falsy であれば False パスに分岐します。

# スコアが 80 以上なら True パスへ
output = input_data['abuse_score'] > 80

True と False のそれぞれのパスに、別のノードを接続できます。

Loop ノード

リストの各要素に対して、配下のノードを繰り返し実行します。

# 複数の IP アドレスに対して繰り返し処理
output = input_data['ip_list']  # ["10.0.0.1", "10.0.0.2", "10.0.0.3"]

Playbook フロー例

Playbook エディタ上でフローを構築する例を示します。

例 1: アラートトリアージ

新しいケースが作成されたとき、送信元 IP を脅威インテリジェンスで照会し、危険度に応じて通知とケース更新を行います。

[トリガー: ケース作成]
[Action: IP レピュテーション照会]
  AbuseIPDB で送信元 IP のスコアを確認
[Condition: スコア > 80 ?]
    │          │
   True       False
    │          │
    ▼          ▼
[Action:    [Action:
 Slack に     ログに
 緊急通知]    記録のみ]
[Action: ケースを
 "In Progress" に更新]

構築手順:

  1. トリガーを「ケース作成」に設定します。
  2. Action ノード「IP チェック」を追加し、AbuseIPDB API を呼び出すコードを記述します。
  3. Condition ノード「高リスク判定」を追加し、output = input_data['abuse_score'] > 80 を設定します。
  4. True パスに「Slack 通知」Action ノードを接続します。
  5. True パスの続きに「ケース更新」Action ノードを接続します。
  6. False パスに「ログ記録」Action ノードを接続します。

例 2: 定期脅威ハンティング

5 分ごとにファイアウォールのブロックログを集計し、異常な IP アクティビティを洗い出します。

[トリガー: スケジュール (*/5 * * * *)]
[Action: ログ検索 (PRQL)]
  直近 5 分のブロック IP を集計
[Condition: 異常 IP あり?]
    │          │
   True       False
    │          │
    ▼          ▼
[Loop:      (終了)
 各 IP に
 対して処理]
[Action: 各 IP を
 脅威 DB で照会]
[Condition: 脅威あり?]
   True
[Action: ケース自動作成]
[Action: エスカレーション通知]

例 3: Webhook 連携による外部アラート取り込み

外部の監視ツール(Datadog、PagerDuty など)からの Webhook を受信し、CSIRT-Pro にケースを起票します。

[トリガー: Webhook]
  外部ツールから POST リクエスト受信
[Action: ペイロード正規化]
  外部フォーマットを CSIRT-Pro 形式に変換
[Condition: 重要度が Critical?]
    │          │
   True       False
    │          │
    ▼          ▼
[Action:    [Action:
 緊急ケース   通常ケース
 作成 +       作成]
 SMS 通知]

例 4: IOC のブロック申請

新しいケースに含まれる IOC(IP アドレス)を抽出し、ファイアウォールへのブロックを処理します。 外部機器の状態を変える操作は承認制のため、適用前に承認が必要です。

[トリガー: ケース作成]
[Action: IOC 抽出]
  ケースの内容から IP アドレスを抽出
[Condition: IOC が見つかった?]
   True
[Loop: 各 IOC に対して]
[Action: ファイアウォール API でブロック]
[Action: ブロック結果をケースにコメント追加]

環境変数

Playbook 内で使用する API キーやシークレットは、環境変数として安全に管理します。

設定方法

  1. Playbook エディタの「環境変数」タブを開きます。
  2. キーと値を入力して保存します。
  3. コード内で env['KEY_NAME'] としてアクセスします。

環境変数の設定画面 図: 環境変数タブ。API キーやシークレットの管理

よく使う環境変数の例

キー 用途
SLACK_WEBHOOK_URL Slack 通知用 Webhook URL
ABUSEIPDB_API_KEY AbuseIPDB API キー
VIRUSTOTAL_API_KEY VirusTotal API キー
SMTP_HOST メールサーバーホスト
SMTP_USER メールサーバーユーザー
SMTP_PASS メールサーバーパスワード
FIREWALL_API_URL ファイアウォール管理 API
FIREWALL_API_TOKEN ファイアウォール API トークン

セキュリティ

環境変数はサーバーサイドで暗号化されて保存されます。UI 上では値がマスクされ、読み取りはできません。


スケジュール設定 (cron)

スケジュールトリガーは cron 形式で指定します。

# 書式: 分 時 日 月 曜日
*/5 * * * *     # 5 分ごと
0 * * * *       # 毎時 0 分
0 0 * * *       # 毎日 0:00
0 9 * * 1-5     # 平日 9:00
0 */6 * * *     # 6 時間ごと

テスト実行

本番環境での実行前に、サンプルデータで動作を確認できます。

  1. 「テスト」タブを開きます。
  2. サンプル入力データを JSON で入力します。
  3. 「テスト実行」をクリックします。
  4. 各ノードの入出力結果を確認します。

テスト実行画面 図: テスト実行。サンプルデータ入力と各ノードの実行結果


実行履歴

項目 説明
実行 ID 各実行に割り当てられる一意の ID
ステータス pending / running / success / failed
開始時刻 実行開始日時
終了時刻 実行完了日時
ログ 各ノードの実行ログと出力
エラーメッセージ 失敗時の詳細エラー

実行履歴画面 図: 実行履歴。ステータス、時刻、ログの一覧


編集申請と承認フロー

Playbook の変更は保存しても即時反映されず、編集申請 → 承認 → 反映の流れで適用されます。 誤った変更がケースの自動処理にそのまま反映されるのを防ぐ仕組みです。

申請から反映までの状態

状態 説明
承認待ち(pending) 編集申請が作成され、承認を待っている
反映済(applied) 承認され、Playbook に適用された
却下(rejected) 承認者が却下した(理由を付けられる)
取下げ(cancelled) 申請者が自分で取り下げた

承認は申請者本人以外が行います

自分が出した編集申請を、自分で承認することはできません(権限分離)。 申請の承認・却下は、申請者とは別のユーザーが行います。

影響プレビュー

編集申請を作成すると、その変更が直近のケースにどう影響するかが事前に表示されます。

  • 変更前後のノードの差分
  • 適用後に自動処理の対象となるケース件数(適用前との差分つき)
  • 対象になるケースのサンプル(先頭数件)
  • 適用前後の絞り込み条件

このルール変更でいくつのケースが自動処理されるようになるかを、申請と承認の前に確認できます。

アクセス方法

  • Playbook エディタの保存操作から、編集申請を作成します。
  • ケース画面のツールバーからも「Playbook Editor を開く」「Playbook 編集申請の一覧・承認」を利用できます(ケース管理)。
  • AI チャットに Playbook の作成・修正を依頼すると、AI が変更案を編集申請として提出します(ケース内 AI 機能)。

編集申請の作成・一覧・承認・却下・取下げは API からも操作できます(Playbook API リファレンス)。


バージョン管理

Playbook は変更のたびにバージョンが自動記録されます。

  • 過去のバージョンの閲覧
  • 特定のバージョンへの復元
  • バージョン間の差分確認

バージョン管理画面 図: バージョン管理。過去バージョンの閲覧と復元


Playbook のマージ

2 つの Playbook を統合できます。 マージ元のノードがマージ先に追加されます。


API からの操作

Playbook の管理と実行は REST API からも行えます。 詳細は Playbook API リファレンス を参照してください。


  1. Action ノードに任意コードを書ける都合上、ユーザーが記述した外部 API 呼び出し自体は実行されます。製品として安全側に倒すのは、ケースのクローズや SOAR 連携先への書き込みといった、製品が仲介する破壊的操作の承認フローです。