Guide

認証・IAM・セキュリティ

CRISIS API の認証方式、IAM(Identity and Access Management)の仕組み、セキュリティのベストプラクティスを解説します。

概要

CRISIS のアクセス制御は、以下の概念で構成されています。

Bearer トークン

すべての API リクエストに必要な認証手段

サービスアカウント

API 連携専用のアカウント。用途ごとに分離

CRN + パーミッション

リソースとアクションの組み合わせで権限を定義

ロール + IAM バインディング

パーミッションをロールにまとめ、対象にバインド

Workload Identity Federation

外部 IdP で認証し、静的トークン不要の CI/CD 連携を実現

Bearer トークン認証

すべての API リクエストには Authorization ヘッダに Bearer トークンを付与する必要があります。

Authorization: Bearer {access_token}

トークンが無効な場合は 401 UnauthorizedAUT-002, AUT-003, AUT-004)が返されます。 権限が不足している場合は 403 ForbiddenIAM-001)が返されます。

サービスアカウント

サービスアカウントは、お客様のシステムがプログラムから CRISIS API にアクセスするための専用アカウントです。 人間のユーザーアカウント(user_account)とは別の種別(service_account)として管理されます。

ライフサイクル

Web UI でサービスアカウントを作成

namestatusACTIVE)を指定します。用途がわかる名前を付けてください。

アクセストークンを発行

作成時のレスポンスにのみ access_token が含まれます。以降は確認できないため、安全に保管してください。

IAM でロールをバインド

必要最小限の CRN とパーミッションを設定します。

不要になったらトークンを削除

DELETE /service_accounts/{id}/access_tokens/{tokenId} で無効化します。

CI/CD ワークロード(GitHub Actions・Google Cloud Run など)からの連携には、静的トークンを使わず Workload Identity Federation の利用を推奨します。

役割分離の設計

サービスアカウントは用途ごとに分離し、それぞれに最小限の権限を付与してください。

  • ワークフローパブリッシュ専用 — organization.workflow_topic:publish
  • インシデント操作専用 — organization.incident:*
  • 資産管理専用 — organization.asset_item:*
  • ユーザー管理専用 — organization.user:*

Workload Identity Federation

Workload Identity Federation(WIF)を使うと、GitHub Actions・Google Cloud・Azure AD・AWS などの外部 OIDC IdP が発行する 短命 JWT を CRISIS アクセストークンと交換できます。 静的なアクセストークンをリポジトリや環境変数に保存する必要がなくなります。

静的トークン(従来)

  • アクセストークンを Secret Manager などのシークレット管理サービスに保存し、環境変数に設定して利用
  • 漏洩すると無期限に悪用されるリスク
  • 定期的なローテーションが必要

WIF による短命トークン

  • シークレット不要。IdP が自動で JWT を発行
  • 有効期限 1 時間。漏洩時の被害を限定
  • ローテーション不要

WIF の詳細なセットアップ手順・使用例は Workload Identity Federation ガイド を参照してください。

CRN(CrisisResourceName)

CRN は CRISIS プラットフォーム上のリソースを一意に識別するリソース名です。 すべてのリソースは CRN を持ち、IAM でアクセス制御の対象を指定する際に使用します。

形式

crn:crisis:{scope}:{organizationId}:{resourceType}/{resourceId}

// 特定の組織
crn:crisis:organizations:org-abc123

// 特定のインシデント
crn:crisis:organizations:org-abc123:incidents/inc-def456

// 特定のインシデントとそのサブリソースすべて(ワイルドカード)
crn:crisis:organizations:org-abc123:incidents/inc-def456<(/.*)?$>

// 組織内のすべてのインシデント
crn:crisis:organizations:org-abc123:incidents<(/.*)?$>

末尾の <(/.*)?$> は正規表現パターンで、指定リソースとそのサブリソース(イベント、フォーム、レポートなど)をすべて含みます。

パーミッション

パーミッションは サービス.リソース:アクション 形式で表現されます。 ロールに複数のパーミッションを含め、IAM でリソースにバインドすることで権限を付与します。

// パーミッション形式
^[a-z][a-z0-9_]*(?:\.[a-z0-9_]+)*:(?:list|get|update|delete|create|publish|fullaccess)$

// 例
organization.incident:create          // インシデントの作成
organization.incident:get             // インシデントの取得
organization.incident:list            // インシデント一覧の取得
organization.incident:update          // インシデントの更新
organization.incident:delete          // インシデントの削除
organization.workflow_topic:publish   // ワークフロートピックへのパブリッシュ
organization.user:list                // ユーザー一覧の取得
organization.service_account.access_token:create  // トークンの発行

アクションの種類

アクション説明
list一覧取得
get詳細取得
create作成
update更新
delete削除
publish配信(ワークフロートピック用)
fullaccessインシデント管理用の特殊アクション。メンバー未割り当てのインシデントへのアクセスと全フォーム回答の閲覧を許可

fullaccess を持たない場合は、メンバーとして割り当てられたインシデントのみ参照でき、フォーム回答も自身が回答したものに限定されます。

ロール

ロールは、パーミッションをまとめたものです。CRISIS には 2 種類のロールがあります。

種類説明エンドポイント
システムロールCRISIS が提供する定義済みロール。変更・削除不可GET /iam/roles
カスタムロール組織ごとに自由に作成できるロールPOST /organizations/{orgId}/iam/roles

カスタムロールの作成例:

// カスタムロール: ワークフローパブリッシュのみ
POST /organizations/{orgId}/iam/roles

{
  "name": "Workflow Publisher",
  "description": "ワークフロートピックへのパブリッシュのみ許可",
  "policies": [
    {
      "permission_id": "organization.workflow_topic:get",
      "effect": "allow",
      "description": "ワークフロートピックの参照を許可"
    },
    {
      "permission_id": "organization.workflow_topic:publish",
      "effect": "allow",
      "description": "ワークフロートピックへのパブリッシュを許可"
    }
  ]
}

IAM バインディング

IAM バインディングは、「誰が」「どのリソースに」「どのロールで」アクセスできるかを定義します。 ユーザー、グループ、サービスアカウントのそれぞれに対して設定します。

// サービスアカウント IAM の設定例
PUT /organizations/{orgId}/service_accounts/{saId}/iam

{
  "bindings": [
    {
      "resource": "crn:crisis:organizations:org-123:workflow_topics<(/.*)?$>",
      "role_id": "role-workflow-publisher"
    }
  ]
}

対象別の IAM エンドポイント

GET/PUT /users/{userId}/iam — ユーザーの IAM
GET/PUT /groups/{groupId}/iam — グループの IAM
GET/PUT /service_accounts/{saId}/iam — サービスアカウントの IAM
GET/PUT /incidents/{incidentId}/iam — インシデント単位の IAM

インシデント単位の IAM

インシデントごとに IAM を設定し、特定のインシデントに対するアクセス権を個別に制御できます。 これにより、対策本部のメンバーだけが特定のインシデント内のリソース(イベント、フォーム、レポートなど)にアクセスできるようになります。

PUT /organizations/{orgId}/incidents/{incidentId}/iam

{
  "bindings": [
    {
      "role_id": "role-incident-responder",
      "user_ids": ["user-001", "user-002"],
      "group_ids": ["group-hq"]
    }
  ]
}

認証ポリシー

組織の認証ポリシーを GET/PUT /organizations/{orgId}/iam/authentication_policy で管理できます。 ログイン方式や多要素認証の要件を制御します。

password_login_enabled — パスワードログインの有効/無効(デフォルト: true)
password_self_reset_enabled — ユーザー自身によるパスワードリセットの許可(デフォルト: false)
password_reset_token_expires_in_seconds — パスワードリセットトークンの有効期限: 60〜2,592,000 秒(デフォルト: 900 秒)
enforce_mfa — 多要素認証(MFA)の強制(デフォルト: false)
totp_enabled — TOTP(時間ベースワンタイムパスワード)の有効/無効(デフォルト: true)
webauthn_enabled — WebAuthn(パスワードレス認証)の有効/無効(デフォルト: true)
magic_link_enabled — マジックリンク認証の有効/無効

セキュリティプラクティス

  • 最小権限の原則 — サービスアカウントごとに必要最小限の CRN とロールのみを付与
  • アカウントの分離 — 用途ごとにサービスアカウントを分離し、1 アカウント 1 用途を徹底
  • トークンの安全な保管 — Secret Manager 等を使用し、ソースコードや環境変数への埋め込みを回避
  • CI/CD では WIF を優先 — GitHub Actions・Google Cloud など OIDC 対応環境では、静的トークンの代わりに Workload Identity Federation を利用することで、シークレット管理が不要になります
  • 不要なトークンの即時削除 — 使用しなくなったアクセストークンは速やかに無効化

次のステップ