認証・IAM・セキュリティ
CRISIS API の認証方式、IAM(Identity and Access Management)の仕組み、セキュリティのベストプラクティスを解説します。
概要
CRISIS のアクセス制御は、以下の概念で構成されています。
すべての API リクエストに必要な認証手段
API 連携専用のアカウント。用途ごとに分離
リソースとアクションの組み合わせで権限を定義
パーミッションをロールにまとめ、対象にバインド
外部 IdP で認証し、静的トークン不要の CI/CD 連携を実現
Bearer トークン認証
すべての API リクエストには Authorization ヘッダに Bearer トークンを付与する必要があります。
Authorization: Bearer {access_token}
トークンが無効な場合は 401 Unauthorized(AUT-002, AUT-003, AUT-004)が返されます。
権限が不足している場合は 403 Forbidden(IAM-001)が返されます。
サービスアカウント
サービスアカウントは、お客様のシステムがプログラムから CRISIS API にアクセスするための専用アカウントです。
人間のユーザーアカウント(user_account)とは別の種別(service_account)として管理されます。
ライフサイクル
Web UI でサービスアカウントを作成
name と status(ACTIVE)を指定します。用途がわかる名前を付けてください。
アクセストークンを発行
作成時のレスポンスにのみ 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 — ユーザーの IAMGET/PUT /groups/{groupId}/iam — グループの IAMGET/PUT /service_accounts/{saId}/iam — サービスアカウントの IAMGET/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 を利用することで、シークレット管理が不要になります
- 不要なトークンの即時削除 — 使用しなくなったアクセストークンは速やかに無効化