Playbook (自動化)
Playbook は、セキュリティインシデントへの対応手順を組み立てる SOAR(Security Orchestration, Automation and Response)機能です。 ビジュアルフローエディタでノードを接続し、検知から照会、通知、起票までの処理フローを定義します。
外部システムの状態を変更する操作(通信遮断やケースのクローズなど)を、Playbook が無断で実行することはありません。 こうした書き込みは申請、承認、適用の順で承認制をとります1。
図: 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 ノード。Python / JavaScript コードエディタ
任意の Python / JavaScript コードを実行するノードです。
入出力:
input_data:前のノードの出力、またはトリガーデータを受け取る辞書env:環境変数にアクセスする辞書output:このノードの出力。次のノードのinput_dataとして渡される
コード例:
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 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 パスに分岐します。
True と False のそれぞれのパスに、別のノードを接続できます。
Loop ノード
リストの各要素に対して、配下のノードを繰り返し実行します。
Playbook フロー例
Playbook エディタ上でフローを構築する例を示します。
例 1: アラートトリアージ
新しいケースが作成されたとき、送信元 IP を脅威インテリジェンスで照会し、危険度に応じて通知とケース更新を行います。
[トリガー: ケース作成]
│
▼
[Action: IP レピュテーション照会]
AbuseIPDB で送信元 IP のスコアを確認
│
▼
[Condition: スコア > 80 ?]
│ │
True False
│ │
▼ ▼
[Action: [Action:
Slack に ログに
緊急通知] 記録のみ]
│
▼
[Action: ケースを
"In Progress" に更新]
構築手順:
- トリガーを「ケース作成」に設定します。
- Action ノード「IP チェック」を追加し、AbuseIPDB API を呼び出すコードを記述します。
- Condition ノード「高リスク判定」を追加し、
output = input_data['abuse_score'] > 80を設定します。 - True パスに「Slack 通知」Action ノードを接続します。
- True パスの続きに「ケース更新」Action ノードを接続します。
- 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 キーやシークレットは、環境変数として安全に管理します。
設定方法
- Playbook エディタの「環境変数」タブを開きます。
- キーと値を入力して保存します。
- コード内で
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 時間ごと
テスト実行
本番環境での実行前に、サンプルデータで動作を確認できます。
- 「テスト」タブを開きます。
- サンプル入力データを JSON で入力します。
- 「テスト実行」をクリックします。
- 各ノードの入出力結果を確認します。
図: テスト実行。サンプルデータ入力と各ノードの実行結果
実行履歴
| 項目 | 説明 |
|---|---|
| 実行 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 リファレンス を参照してください。
-
Action ノードに任意コードを書ける都合上、ユーザーが記述した外部 API 呼び出し自体は実行されます。製品として安全側に倒すのは、ケースのクローズや SOAR 連携先への書き込みといった、製品が仲介する破壊的操作の承認フローです。 ↩