セキュリティとデータの取り扱い
対象読者: 導入検討企業の情報システム・セキュリティ担当者。 本書は「データはどこに・何を保存し・誰が見られ・どう守るか」への回答集です。 実装者向けの詳細境界は docs/development/SECURITY.md、アーキテクチャは docs/development/ARCHITECTURE.md を参照。 記載は 2026 年 10 月の実装に基づきます。「予定」と明記した項目は未実装です。
本製品は Web とメールで申請・承認ができる、実行・台帳管理サービスです。Slack は任意で連携できます。 現時点の提供形態は貴社専用環境 (シングルテナント) で、Docker Compose により貴社が指定する VPS / クラウド上に構築します。マルチテナント SaaS 提供は予定 (Phase 4) であり、本書はシングルテナント構成を前提とします。
Slack ──(Socket Mode: 外向き接続のみ)──> Bot ──┐ ├── PostgreSQL (専用環境内、外部非公開)ブラウザ ──(HTTPS)──> Web (Next.js) ────────────┘ │ ├──> LLM API (任意・設定時のみ) ├──> Google Workspace Admin SDK (任意・接続時のみ) └──> AWS IAM Identity Center (任意・接続時のみ)2. 保存するデータ
Section titled “2. 保存するデータ”| 分類 | 内容 | 保存先 | 保持期間 |
|---|---|---|---|
| 組織・利用者 | 表示名、メール、上長関係、ロール、表示言語、連携時のSlack ID・外部IdPのID | PostgreSQL | 利用期間中 |
| 申請・承認 | 申請内容 (フォーム入力値)、実行プラン、承認ステップと承認者、承認時刻 | PostgreSQL | 利用期間中 (削除は貴社判断) |
| スタンプ (L0) | 承認リアクションが付いた Slack メッセージの本文、投稿者、チャンネル、permalink | PostgreSQL | 同上 |
| 宣言 (L1) | 宣言本文、上長、期限、拒否理由 | PostgreSQL | 同上 |
| 発行物台帳 | 発行されたリソースの識別子 (例: メールアドレス、権限セット ARN)、所有者、コスト、期限、回収記録、実行証跡 | PostgreSQL | 同上 |
| 監査ログ | 全操作のイベント (追記専用) | PostgreSQL | 同上。削除・更新不可 |
| セッション | Cookieには不透明なID、DBには利用者・期限・失効・接続情報 | ブラウザ・PostgreSQL | 絶対期限は既定14日、無操作期限は既定8時間 |
| AI 利用量 | 利用者ごとの日次回数のみ | PostgreSQL | 同上 |
保存しないもの
Section titled “保存しないもの”- AI への問い合わせ本文: LLM 補助 (申請の入口で「何をしたいか」を自由文で入力する機能) の入力本文は、ログにもデータベースにも保存しません。記録するのは回数のみです
- Slack のメッセージ全般: 承認リアクションが付いたメッセージだけを記録します。チャンネル全体の購読・保存はしません
- 利用者のパスワード: メールのリンクまたはIdPを使い、本製品独自のパスワードは持ちません
- Google / AWS の払い出し先クレデンシャル: アカウント作成時の初期パスワード等は保存せず、実行結果の識別子のみを台帳に残します
3. 認証と認可
Section titled “3. 認証と認可”| 項目 | 内容 |
|---|---|
| Web ログイン | メールのリンク、Slack OIDC、設定済みの外部OIDC・SAML 2.0接続。OIDCはstate・nonce・署名・issuer・Audience・有効期限、SAMLはアサーションの署名・issuer・Audience・Destination・Recipient・有効期限と再利用を検証 |
| 利用者の登録 | 組織の招待・メールドメイン・接続設定を検証。外部IDは組織に束縛し、管理者への初回の紐付けは本人のログインを要求 |
| 管理者権限 | 製品のowner / adminがロールを管理。Slackを使わない管理者も登録でき、最後のownerは降格できない |
| 組織分離 | データアクセスを組織IDに束縛し、別組織のアクセスをテスト。テナント別DBと鍵による分離は未実装 |
| 承認者の正当性 | 各段の承認者・承認グループ・有効な代理関係を製品内の利用者IDで検証 |
| セッション | CookieはHttpOnly・SameSite=Lax・本番Secure。絶対期限は既定14日、無操作期限は既定8時間、IDは変更系操作で24時間ごとに回転 |
| CSRF | 変更系 API は Origin ヘッダーの完全一致を要求 |
| レート制限 | 認証系 10 分 20 回、その他 1 分 120 回。IP とセッションで別々に消費 |
4. 承認と実行の一致保証 (本製品固有の統制)
Section titled “4. 承認と実行の一致保証 (本製品固有の統制)”承認者が見た「実行プラン」と、実際に実行される内容が一致することを暗号学的に保証します。
- 申請時に実行プランを正規化 JSON として固定し、SHA-256 ハッシュを保存
- 各承認ステップは「承認時点のプランハッシュ」を記録
- 実行時、全承認ステップのハッシュと現在のプランのハッシュが一致しない場合は実行を拒否し、監査ログに
plan.hash_mismatchを残す - 期限到来による自動回収 (権限剥奪) も同じ一致検証を通す。一致しない場合は自動実行せず、担当者への手順書タスクに切り替える
AI 補助はカタログの下書きと申請の入口の推薦のみに使われ、承認済みプランの内容を変更する経路は存在しません。
5. 監査ログ
Section titled “5. 監査ログ”- 追記専用: アプリケーションは監査テーブルに対して INSERT のみ行います。UPDATE / DELETE の経路はコードに存在しません
- 網羅範囲: 申請作成・取消、承認・却下、プラン作成、ハッシュ不一致、実行開始・成功・失敗・フォールバック、手動完了、発行物の作成・回収・期限回収、カタログ変更、メンバー・承認グループ変更、宣言の作成・確定・拒否、スタンプの記録・昇格、表示言語変更
- エクスポート: 管理者は Web から期間指定 (最大 366 日、最大 10 万件) で CSV を取得可能。CSV は数式インジェクション対策済み、レスポンスは no-store
- PII の扱い: 監査ログの payload には関連 ID と要約のみを格納し、メールアドレス等はリソース識別子以外には含めません
6. 外部サービスとの通信 (副処理者)
Section titled “6. 外部サービスとの通信 (副処理者)”| 接続先 | 必須 | 送信するデータ | 目的 |
|---|---|---|---|
| Slack | 任意 | メッセージ投稿、モーダル表示、ユーザー情報取得 | 通知と操作の追加経路。BotはSocket Modeで外向きに接続 |
| メール配送 | Web・メール構成で必要 | 宛先、ログインのリンク、通知本文 | ログインと申請・承認の通知。SMTPなど配備時に設定した配送先を使用 |
| 外部IdP | 任意 | OIDCまたはSAMLの認証リクエストと接続テスト | 組織に設定したIdPでのログイン |
| LLM API (Anthropic、AWS、OpenAI互換) | 任意 | 利用者の自由文入力 + カタログ一覧 (タイトル・説明・項目名) | 申請の入口での推薦、カタログ下書き。障害・未設定・利用上限時はキーワード提案、ドラフトは利用不可 |
| Google Workspace Admin SDK | 任意 | 作成するアカウントの氏名・メール | Google アカウント自動発行 |
| AWS IAM Identity Center | 任意 | 対象ユーザー、アカウント ID、権限セット | 権限の自動付与・期限回収 |
| Microsoft Graph | 任意 | 利用者・グループ・ライセンスの識別子 | Entra IDの利用者作成と権限・ライセンスの変更 |
- LLMへの送信はプロバイダを設定した場合だけ発生します。AWSの経路はIAM資格情報を使い、APIキーを必要としない構成もあります
- LLM への入力本文は本製品側で保存しません (§2)。ベンダー側の保持ポリシーはベンダーの規約に従います
- 日本国内リージョン要件がある場合、AWS 上の Claude (ap-northeast-1) を選択できます。詳細は docs/development/LLM-PROVIDERS.md
7. 接続用クレデンシャルの管理
Section titled “7. 接続用クレデンシャルの管理”| クレデンシャル | 保管 | 権限の最小化 |
|---|---|---|
| Slack Bot Token / App Token | 環境変数 (貴社環境の .env、リポジトリには含まれない) |
必要スコープのみ (メッセージ投稿、リアクション読取、ユーザー情報、コマンド) |
| Google サービスアカウント鍵 | 環境変数 | ドメイン全体の委任は admin.directory.user スコープのみ。委任先管理者は専用アカウントを推奨 |
| AWS 認証情報 | 環境変数 (IAM ロール / 一時クレデンシャル推奨) | 最小 IAM ポリシーを docs/development/AWS-IDENTITY-CENTER.md に定義 (CreateAccountAssignment / DeleteAccountAssignment / ListUsers 等に限定) |
| LLM API キー | 環境変数 | 日次利用上限を製品側で設定可能 |
| セッション暗号鍵 | 環境変数 | 32 バイト以上のランダム値 |
顧客登録OIDC接続のclient secretは、現在も組織・接続に束縛した封筒暗号化でDBに保存します。暗号鍵は配備側で管理します。Google・Microsoftの配備側のシークレットやクラウド接続の資格情報は、環境変数または配備基盤の秘密値管理を使います。マルチテナント提供と組織別の鍵分離は未実装です。
8. 通信と保存の暗号化
Section titled “8. 通信と保存の暗号化”- 通信: ブラウザ〜Web は TLS 終端 (貴社のリバースプロキシ)。Slack / Google / AWS / LLM への通信はすべて HTTPS。Bot〜Slack は WebSocket over TLS
- 保存: PostgreSQL は Docker 内部ネットワークのみに公開し、ホスト外部へポートを開きません。ディスク暗号化は貴社のホスティング基盤 (VPS / EBS 等) の機能を利用します
- バックアップ: 日次
pg_dump(custom format)、直近 7 世代を保持。保存先は貴社環境内のボリューム。外部へのバックアップ転送は行いません (必要な場合は貴社側で暗号化のうえ転送)
9. 可用性と運用
Section titled “9. 可用性と運用”| 項目 | 内容 |
|---|---|
| 構成 | Docker Compose (PostgreSQL / マイグレーション / Bot / Web / バックアップ)。BotとWebは非rootユーザーで実行 |
| ヘルスチェック | Bot は /healthz を公開し、Compose の再起動ポリシーで自動復旧 |
| 常駐ジョブ | なし。期限処理はイベント・画面参照時に冪等に評価するため、ジョブ基盤の障害点がありません |
| スキーマ変更 | バージョン管理されたマイグレーションを起動時に適用 (schema_migrations で冪等) |
| 依存の脆弱性 | CI で npm audit を実行し、High 以上が 1 件でもあればビルド失敗 |
| 復旧手順 | バックアップからの復元手順を docs/operations/OPERATIONS.md に記載 |
10. データの削除・返却
Section titled “10. データの削除・返却”- 利用終了時: シングルテナント構成のため、貴社環境ごと削除することで全データが消去されます。事前に
pg_dumpで全データを返却可能 - 個別削除: 監査ログは追記専用のため、個別レコードの削除は製品機能として提供しません。法的要請による削除は、貴社がデータベース管理者権限で実施できます (手順を個別に提供)
- Slack メッセージ: 元メッセージが Slack 側で削除されても、記録済みのスタンプレコードは監査目的で保持されます
11. セキュリティ質問票への簡易回答
Section titled “11. セキュリティ質問票への簡易回答”| 質問 | 回答 |
|---|---|
| データの保存場所は | 貴社が指定する環境 (国内 VPS / AWS 東京リージョン等) |
| マルチテナントか | いいえ (現時点)。貴社専用環境 |
| 認証方式は | メールのリンク、Slack OIDC、設定済みの外部OIDC・SAML 2.0接続。独自パスワードなし |
| 多要素認証は | 接続するIdPの設定に従う。メールのリンクではIdPのMFAを利用しない |
| 管理者権限の付与方法は | 製品の owner / admin がロールを管理する。最後の owner は降格できない |
| 監査ログの改ざん防止は | 追記専用。アプリケーションに更新・削除経路なし |
| 通信の暗号化は | 全経路 TLS |
| 保存データの暗号化は | ホスティング基盤のディスク暗号化に依存 |
| バックアップは | 日次、7 世代、貴社環境内 |
| 外部への個人情報送信は | メール送信先と、接続を設定した外部サービス。Slack・Google・AWS・LLM・IdPへの送信は設定に応じる |
| AI へのデータ送信は | 任意機能。送信内容は自由文入力とカタログ定義のみ。本文は本製品側で非保存 |
| 脆弱性診断の実施は | 未実施 (予定: 初回商用契約前に第三者診断) |
| SOC 2 / ISMS は | 未取得 (予定: 有償顧客 5 社到達時に着手判断) |
| 侵害時の通知は | 検知から 72 時間以内に貴社担当者へ通知 (契約書に明記) |
| ソースコードの監査は | 個別 NDA のもとリポジトリの閲覧に応じます |
12. 今後の予定 (ロードマップ上の統制強化)
Section titled “12. 今後の予定 (ロードマップ上の統制強化)”| 項目 | トリガー |
|---|---|
| マルチテナント化と組織別クレデンシャルの暗号化保管 | 課金意思 2 社 |
| Microsoft Entra ID コネクタ | 実装済み。接続先の設定と実環境での確認が必要 |
| 第三者脆弱性診断 | 初回商用契約前 |
| 監査ログの外部 SIEM 転送 (Datadog / Splunk 等) | 顧客要望 1 社 |
| SAML 2.0接続 | 実装済み。管理者が接続テスト後に有効化。ドメイン検証・JIT・SSO必須化とユーザー統合も実装済み |
本書に関するお問い合わせ: Flying Village 株式会社
13. 組織のアクセス制限
Section titled “13. 組織のアクセス制限”管理者は /ws/settings/security で IP 許可リスト (IPv4 / IPv6 CIDR) とメールドメインを設定できます。
空欄 / null は制限なしです。IP 制限は認証済み API、監査・台帳・メンバー・レポートの CSV、添付ダウンロード、ポータルとワークスペースに適用します。
保存時に現在の接続元を含まない IP 設定は would_lock_out (400) として拒否します。
IP 認可に使う X-Forwarded-For は、運用者が信頼プロキシを設定した場合だけ採用します。
TRUSTED_PROXY_CIDRS: カンマ区切りのプロキシ CIDR。右端から信頼ホップを除き最初の非信頼 IP を採用。全ホップが信頼済みなら最左。TRUSTED_PROXY_HOPS: 正の整数 n。右から n 番目の IP を採用。CIDR 設定がある場合はそちらが優先です。- 両方未設定、不正設定・不正 IP・ホップ不足は導出不能。IP 制限が有効なら 403。x-real-ip は認可には使用しません。
必ずリバースプロキシが XFF を上書き、または検証済み接続元を末尾に追加する構成にし、Next.js への直接アクセスをネットワークで遮断してください。
HOPS を使う場合は全経路のホップ数を固定してください。設定値だけではプロキシ自体を認証できません。
監査 admin.ip_denied には申告 IP と導出 IP を区別して記録します。従来のログイン履歴 IP は申告値です。
メールドメインは大文字小文字を無視した完全一致で、サブドメイン・ワイルドカードを含めません。
招待は混在リストも全件拒否し、マジックリンクの不許可ドメインにはトークンを発行しません。
ログイン start の成功応答は登録状況・ドメイン許可状況を明かさず、既存レート制限も維持します。
設定更新とロール・代理変更は admin.* で監査記録を追加します。
14. 監査 CSV のチェーン検証
Section titled “14. 監査 CSV のチェーン検証”監査 CSV の末尾2列は prev_sha256, sha256 です。
各行の最初の7列 (id, event, entity, actor, slack_user_id, payload, created_at) を CSV デコードした文字列配列のまま
JSON.stringify したものが正規形です。数式無害化の先頭アポストロフィも含め、payload を再解析しません。
UTF-8 の sha256(prev_sha256 + "\n" + canonical) を計算し、最初の prev_sha256 は空文字です。
npm run verify:audit -- <file> で検証でき、成功時は OK: N rows、不一致時は行番号 (ヘッダ=1、複数行セルは1レコード) と理由を表示して exit 1 になります。
これは鍵を使わないハッシュチェーンです。偶発的な改変・途中行の変更や削除を検出しますが、チェーン全体の再計算や末尾切り詰め、発行者の真正性は検証しません。
取得時のファイルと最終ハッシュ・件数を別の信頼できる場所に保管してください。
添付ファイルは設定した保存先に保存します。取得に申請の閲覧権限を適用しますが、ウイルススキャンは行いません。
SSOの必須化と非常口
Section titled “SSOの必須化と非常口”管理者はDNSのTXTレコードでドメインを検証し、接続ごとに自動登録(JIT)を設定します。JITは既定で無効で、作成するロールはmember固定です。メール先行の振り分けとJITは検証済みドメインだけを使います。必須化には有効な接続と管理者本人のSSOログインが必要です。
必須化するとメールとSlackのログインを停止し、所有者のメールログインだけを非常口として残します。非常口の利用と通常のログインは監査へ追記します。最後の有効な接続の無効化には、先に必須化の解除が必要です。既存セッションは維持します。
ユーザー統合と承認の本人確認
Section titled “ユーザー統合と承認の本人確認”管理者ロールを含むユーザー統合は所有者だけが行います。メール・外部ID・Slack IDが統合先の入口になるため、統合元・統合先・統合後のロールを確認します。申請者本人と無効化済み利用者は承認できません。統合で申請者と承認者が同じ人となった場合も、自己承認を拒否します。
SSO必須化中は最後の使えるSSOログイン方法を削除できません。所有者のメールは非常口として残します。DNSドメインの操作とログイン拒否の理由は、秘密値を含めず監査へ記録します。