DEEP DIVE · 04

APIキー運用
完全ガイド

ワークショップ Part 1 で扱う『6原則』の各原則を400字で深掘り。プロバイダ別設定、Secret Manager 連携、漏洩時15分プレイブック、役員承認で見る KPI まで。

WHY · 01

なぜキー配置が経営課題なのか

💡 Ctrl+P (Cmd+P) で「6 原則 カード」が 1 ページ印刷されます。

API キーは、もはや「開発者の管理項目」ではなく「取締役会が把握すべきリスクアセット」だ。一本のキーが GitHub に漏れるだけで、海外の攻撃者が数時間のうちに数百万円規模の API 利用費用を積み上げる実例が、国内外で 2024 年以降、月単位で観測されている。OpenAI・Anthropic・Google いずれも、漏洩キーの自動検知と緊急失効を組み込んでいるが、それが動く前に請求が発生し得る。加えて、キーの背後にあるのは顧客データ — 請求情報ではなく、信頼の損失がより深い。

MIXI のように複数エージェント(CEO / CFO / CTO 等)を運用する構成では、キーが 1 本ではなく 4 本、10 本と増える。それらがチャット欄・Slack・Notion に散在した瞬間、統制は崩壊する。逆に、「チャット欄に貼らない」「.env 経由」「.gitignore 確認」「定期ローテーション」「最小権限」「本番/開発分離」という 6 原則を役員自身が口に出せるようになれば、現場の規律は一段引き締まる。本ガイドはそのための運用知識を、役員が 20 分で把握できる粒度で整理したものである。

THE SIX PRINCIPLES

6原則 — 各原則を深掘り

Principle 01

原則1: チャット欄に貼らない

API キーをチャット欄に貼った瞬間、そのキーは「LLM プロバイダの入力ログ」に乗る。OpenAI・Anthropic・Google いずれも、商用プランでは原則として入力データをモデル学習に使わないと明言しているが、運用ログ・安全分類・障害調査のために一定期間保持される。つまり、キーを誰かの画面に表示した瞬間に、第三者のサーバー上に痕跡が残る可能性を受け入れたことになる。さらに社内 Slack や Notion に貼られれば、Workspace admin の検索範囲に入り、退職者の履歴からも引ける。経営者が自分で試す場合こそ、この習慣は例外を作らない。Claude Code で「.env を作って」と頼むときも、値そのものはターミナルで echo せず、エディタで直接記入する。「キーの文字列を肉眼で見ない、画面に出さない、LLM に渡さない」 — この三重の禁則が最初のゲートである。国内実例として、2024 年に某スタートアップの役員がデモ中にチャット欄へキーを貼り、直後に異国からの高レート呼び出しで数十万円の請求が発生した事案が Twitter で観測されている。

経営者向けの一言: 「画面に出さない・LLM に渡さない」を、役員自身が口に出して宣言する。部下は上司の所作を真似る。
Principle 02

原則2: .env ファイル経由

業界標準として、API キーはソースコードに書かず、環境変数または .env ファイルに分離する。Python・Node.js・Go のいずれの主要フレームワークも、dotenv 系ライブラリ経由で起動時に読み込む前提でできている。ファイルはプロジェクトルート直下に置き、アプリは起動時に process.env.OPENAI_API_KEY のような形で参照する。これによりコード本体にキーが登場しなくなり、同僚にリポジトリを共有しても、チャットログを貼っても、キーが漏れない。ai-executive でも同様で、4 本のキー(OPENAI_API_KEY / OPENAI_API_KEY_CEO / OPENAI_API_KEY_CFO / OPENAI_API_KEY_CTO) は .env に記述する。ワークショップでは、Claude Code に「.env を作って、キーは後で私が手で入れる」と頼むことで、値を LLM に渡さずにテンプレートだけ生成させる。典型的な .env は下記のとおり。

# .env  (git 管理外)
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxx
OPENAI_API_KEY_CEO=sk-proj-yyyyyyyyyyyyyyyy
OPENAI_API_KEY_CFO=sk-proj-zzzzzzzzzzzzzzzz
OPENAI_API_KEY_CTO=sk-proj-wwwwwwwwwwwwwwww

対になる .env.example はキー名だけを列挙し、値は空欄。こちらはコミット可。新メンバーが「何を埋めれば動くか」を一目で把握できる。

経営者向けの一言: 「コードにキーを書いたことがあるか」を開発チームに聞くだけで、組織の成熟度が可視化される。
Principle 03

原則3: .gitignore 確認必須

.env を分離しても、それが .gitignore に登録されていなければ意味がない。git add で誤ってコミットされ、push した瞬間に、GitHub Secret Scanning がキーを検出して自動的にプロバイダへ通報し、キーは失効 — というのが幸運なケースで、悪運な場合は攻撃者のスキャナーが先にキーを拾う。リポジトリを public に切り替えた瞬間、過去コミット全てが露出することも忘れてはならない。必須の確認は 3 ステップ。(1) .gitignore.env が含まれているか、(2) git status.env が untracked に表示されるか、(3) 既にコミット済みの場合は git rm --cached .env で追跡解除。GitHub Secret Scanning は public repo に対して無償で動作し、OpenAI / Anthropic / AWS / Stripe など主要プロバイダのキー形式を自動検出する。Push protection を有効化すれば、コミット時点でキー含むコミットをブロックできる。

# .gitignore (最低限)
.env
.env.local
.env.*.local
*.pem
secrets/

実例として、2024 年に国内某アプリ企業が OpenAI キーをコミットし、GitHub Secret Scanning が自動検知、OpenAI 側で即座に失効されたが、その間の約 20 分間に攻撃者が別キーで試行する予兆ログが残ったという事例がある。検知体制は整っているが、絶対ではない。

経営者向けの一言: 「GitHub Secret Scanning の通知先は誰か」を IT 責任者に確認する。アドレスが退職者や空欄なら、通知は届いていない。
Principle 04

原則4: 定期ローテーション

キーは作った瞬間から「いずれ漏れる前提」で扱う。推奨頻度は 90 日ごと、加えて漏洩検知・退職者発生・委託先変更のタイミングで即時ローテーション。急な入れ替えでサービス停止を起こさないために、段階的ローテーション手順を運用 SOP に明文化する。手順は 5 ステップ: (1) 新キー生成 → Secrets Manager に保存、(2) アプリの環境変数を新キーで更新し、カナリアトラフィックで動作確認、(3) 7 日間並行運用(旧キーも有効)、(4) 旧キー無効化、(5) 月次レビュー時に廃止確認とログ突合。クラウド Secret Manager を使っていれば、バージョニング機能で新旧キーの切り替えがフラグ一つで行える。ローテーションが「手順化されていれば、現場は怖がらなくなる」— これは工事現場の安全 KY と同じで、経営者が年間スケジュールに組み込むだけで規律が持続する。役員承認で見る KPI は 2 つ: 過去 12 ヶ月のローテーション完遂率(目標 100%)最長キー寿命(目標 90 日以内)

経営者向けの一言: 「最後にキーを回したのはいつか」を四半期レビューの定番質問にする。答えられない組織は、静かにリスクを溜めている。
Principle 05

原則5: 最小権限

一つのキーで複数の用途を兼ねないこと。ai-executive のように「4 エージェント=4 キー」が理想で、1 エージェントが乗っ取られても他が無事、という Blast Radius(被害半径)の最小化を狙う。OpenAI では Organization 内で「Project」単位の API キーが作れ、Project ごとにモデル制限・月次上限・IP 制限・許可エンドポイントを細かく設定できる。Anthropic Console でも Workspace 単位で支出上限と権限境界を引ける。AWS IAM と同じ思想で、キーごとに「できること」を狭める。本番キーに管理者権限、開発キーに読み取り権限、CI/CD キーに特定モデルのみ呼び出し可、という設計が筋。さらに 未使用キーは即廃止、使っていないキーは「将来何かに使うかも」で残さない(忘れた頃に漏れる)。Anthropic / OpenAI いずれも、キー毎の最終利用日時をダッシュボードで確認できる。30 日間未使用 = 廃止候補、を運用ルール化する。

経営者向けの一言: 「1 キー=1 用途」を契約条件並みの厳密さで扱う。例外要望は必ず稟議に載せる。
Principle 06

原則6: 本番/開発キー分離

本番キーと開発キーを絶対に混ぜない。これは「銀行の金庫と財布を分ける」のと同じ話で、間違って開発コードが本番キーを掴むと、壁打ちで十数万トークンを溶かすケースが発生する。命名規則で視覚的に分離するのが最も確実で、推奨テンプレは {env}-{service}-{role}-{YYYYMMDD}。例として prod-oai-ceo-20260421 / dev-oai-ceo-20260421 / workshop-20260421-demo 等。プレフィックスだけで本番か開発か見分けがつく。加えて、環境変数名も PROD_OPENAI_API_KEYDEV_OPENAI_API_KEY のように分離し、アプリ側は環境フラグで読み分ける。ワークショップや一過性のデモには、その日のための使い捨てキーを前日に作り、終了後 24h 以内に revoke する運用が理想。本日のワークショップで配布するキーもこの方式で、終了と同時に無効化される。こうしたフローが定着すると、「いま手元にあるキーは本番か、デモか、個人の開発用か」を迷うことがなくなる。

経営者向けの一言: 命名規則テンプレを印刷して IT 部門の壁に貼る。規律は視覚化されて初めて定着する。
DEPLOYMENT UX

Web UI vs dotfile (.env) — どちらで入力させるか

API キーを利用者に入れてもらう手段は 2 つあります:

  1. dotfile 直接編集 — ターミナルや IDE で .env を開いて、OPENAI_API_KEY=sk-... のように書き込む。エンジニア向け標準。
  2. Web UI 設定画面 — アプリに /settings のような画面を持たせ、password input にペーストさせる。アプリが裏で .env に書く。

本ワークショップでは (2) Web UI 方式を採用。理由:

観点dotfileWeb UI
Windows 環境での摩擦ドットファイル非表示、パス複雑、エディタ起動ゼロ。ブラウザ1枚で完結
非エンジニアの UXターミナル/エディタ操作が必要企業 SaaS と同じ password フィールド
画面共有リスクエディタで値が見えてしまうpassword input で目視困難
原則 2 (.env 経由)直接書き込み裏で同じ .env に書き込み (仕組み同一)
原則 3 (.gitignore)人が覚えていないと抜けるSave 時にアプリが自動確認・追記
原則 4 (ローテーション)手動で編集専用ボタンで UX 化
原則 6 (本番/開発分離)別ファイル / 別環境dev/prod タブで UI 分離
Validation起動して初めてエラーに気づくSave 時に OpenAI test call で即確認
監査ログファイル書き込みのみWho / When / Which key changed を記録可
結論: 非エンジニアが触るツールでは Web UI がほぼ常に優。dotfile は CI / 本番デプロイなど自動化場面に限定。開発者専用ツールなら dotfile で十分。

Web UI 実装の最小要件チェックリスト

  • <input type="password"> + show/hide 切替
  • ✅ Save 時に各キーを validation (プロバイダ API の軽量呼び出し)
  • ✅ 保存後のキーはマスク表示 (末尾 4 文字のみ)
  • ✅ アプリが .env に原子的書き込み (rename trick)
  • ✅ アプリが .gitignore を起動時チェック、足りなければ追記
  • ✅ ローテーションボタン (新キー validate → 旧キー置換)
  • ✅ localhost のみ受付 (外部から設定画面にアクセスできないように)
  • ✅ 保存時の権限を chmod 600 に
  • ✅ 監査ログ (誰がいつどのキーを変更したか、値本体は除く)
  • ✅ 起動時にキー未設定なら /settings に自動リダイレクト

アンチパターン

  1. キー値を <input type="text"> で表示 — 画面共有・録画・目視で漏れる
  2. フロントエンドにキーを渡す — ブラウザ JS / DevTools / メモリダンプ経由で盗まれる。必ずバックエンドで保持
  3. Save 時 validation 省略 — 不正キーが保存され、運用時に初めて気づく
  4. ログに full key を出力 — 原則 1 違反、事故の温床
  5. リモートから /settings にアクセス可 — 誰でもキー書き換えられる。localhost 限定必須
  6. Save 後リロード必須 — UX 悪化 + キー反映タイミングが曖昧になる。in-memory cache 即反映が正解
ai-executive は上記 10 要件 すべて実装 している前提で deep-ai-executive.html の仕様書を書いています。Claude Code Desktop で生成した app の Settings 画面が 1 つでも欠けていたら追加実装を指示してください。
PROVIDER SETUP

プロバイダ別設定方法

主要 4 プロバイダの管理画面パス・環境変数名・スコープ設定機能を並べる。ai-executive は OpenAI 前提だが、将来 Anthropic / Google / Azure へ切り替える場合の参照表として。

プロバイダ 管理画面 環境変数名 スコープ設定
OpenAI platform.openai.com → Settings → API keys → Create (Project scope) OPENAI_API_KEY Project / Model / IP allow / 月次上限
Anthropic console.anthropic.com → Settings → API Keys → Workspace 選択 ANTHROPIC_API_KEY Workspace / 支出上限 / Admin vs Member
Google AI Studio / Vertex aistudio.google.com / console.cloud.google.com → IAM & Admin → Service Accounts GOOGLE_API_KEY / GOOGLE_APPLICATION_CREDENTIALS IAM ロール / Project / リージョン指定
Azure OpenAI portal.azure.com → Azure OpenAI resource → Keys and Endpoint AZURE_OPENAI_API_KEY + AZURE_OPENAI_ENDPOINT Deployment 毎 / RBAC / Private Endpoint

いずれも API キーは 1 度表示されたら再表示できないため、生成時点で Secret Manager 等に保存すること。見失った場合は再生成が基本方針。

SECRET MANAGER

Secret Manager 連携

キーを .env に置くのは「開発者の手元」までで十分だが、本番・CI/CD・チーム共有では Secret Manager に昇格させる。主要 4 手段の使い分け。

AWS Secrets Manager

  • Lambda / EC2 / ECS から IAM ロール経由で動的取得
  • 自動ローテーション機能(Rotation Lambda)を組める
  • 監査は CloudTrail に集約
aws secretsmanager get-secret-value \
  --secret-id prod/openai/ceo \
  --query SecretString --output text

1Password (Business / Teams)

  • 人間のチームが共有するのに最適 — Share 権限を役職単位で細かく設定
  • 1Password CLI (op) でローカル開発機に注入可能
  • アクセスログは管理者ダッシュボードで月次レビュー
export OPENAI_API_KEY=$(op read "op://Shared/OpenAI-CEO/credential")

Doppler

  • 環境変数をクラウドで一元管理 → CI/CD・本番・開発を一貫した UI で配布
  • GitHub Actions との統合が最もスムーズ
  • プロジェクト横断のダッシュボードで棚卸しが効く
doppler run -- npm start

GitHub Secrets (Actions 向け)

  • リポジトリ設定 → Secrets and variables → Actions
  • ワークフローから ${{ secrets.OPENAI_API_KEY }} で参照
  • Environment 分離で本番/ステージング別の承認フローを組める
env:
  OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
選択ガイド: AWS インフラがメインなら Secrets Manager / 役員・法務など非エンジニアも触るなら 1Password / スタートアップの素早い構築なら Doppler / GitHub Actions で完結するなら GitHub Secrets。複数併用も現実的で、MIXI では「人間チーム共有 = 1Password、本番アプリ = AWS Secrets Manager、CI/CD = GitHub Secrets」の 3 層構成を推奨。
INCIDENT RESPONSE

漏洩時15分プレイブック

以下のいずれかを検知したら「インシデント」と判定し、15 分以内にアクション開始する。API キー誤コミット / GitHub Secret Scanning 検知 / 異常なコスト増(前週比 5 倍以上)/ 予期しない地理的位置からの呼び出し / プロンプトインジェクション疑い / 未承認ツール実行。

時刻 実行者 アクション 成果物
T+0 検知者 インシデント報告(Slack #security-alerts) 簡潔な報告文
T+3 セキュリティ責任者 Anthropic / OpenAI サポートにエスカレーション サポートチケット ID
T+5 Dev リード 疑わしいキーを Console から即座に revoke / disable キー無効化確認
T+7 監査者 過去 24h の API ログ抽出・異常検査(誰が何を呼んだか) ログ分析レポート
T+10 セキュリティ責任者 全チーム向け更新 + 経営報告判断 リスク評価
T+15 責任者確定 新キー生成・展開開始 + ローテーションスケジュール確定 復旧計画
連絡先: Anthropic Support support.anthropic.com · Abuse Report [email protected] · Security Issue HackerOne anthropic-vdp。OpenAI は help.openai.com からチケット、重大インシデントはアカウントマネージャー直通。
MIXI INTERNAL

MIXI 社内運用推奨テンプレート

ここまでの原則を MIXI 社内の具体的な運用ルールに落とす。IT 責任者が稟議書に貼れる粒度で整理。

命名規則

形式: {env}-{service}-{role}-{YYYYMMDD}

  • prod-oai-ceo-20260421
  • dev-oai-cfo-20260421
  • workshop-20260421-demo
  • ci-oai-deploy-20260421

プレフィックス + 日付で、視認性と検索性を両立。

ローテーション cadence

  • 本番キー: 90 日毎(四半期末)
  • 開発キー: 180 日毎
  • ワークショップ/デモキー: イベント終了後 24h 以内に revoke
  • 退職者発生: 当日中に全該当キーを回転

カレンダー登録必須、自動化できるものは Rotation Lambda へ。

監査ログ月次レビュー

  • キー生成・削除履歴の差分確認
  • 異常コールパターン(地理/レート/エラー率)
  • 30 日未使用キーのリストアップ → 廃止判断
  • Secret Scanning 通知ログの突合

月次情報セキュリティ定例で役員承認。

緊急連絡系統

  1. 検知者 → #security-alerts
  2. セキュリティ責任者 → 当番 Dev リード
  3. Dev リード → プロバイダ Support
  4. 15 分後: 経営報告(CTO/CISO)
  5. 24h 後: 事後レビュー会議

連絡先はエスカレーションカードに印刷、各責任者の机上に常備。

教育タッチポイント

  • 新入社員オンボーディング: 6原則の 15 分講義
  • 年次全社セキュリティ研修に組み込み
  • 四半期ごとの KY ミーティングで最新事例共有
  • 役員向け: 本ワークショップを年 1 回再演

ルールより文化、文化より口癖。役員が口に出せば現場に伝わる。

役員承認で見る 3 KPI: (1) 過去 12 ヶ月のキーローテーション完遂率(目標 100%) · (2) 最長キー寿命(目標 90 日以内) · (3) 30 日超未使用キー数(目標 0 本)。この 3 つを四半期レビューに載せれば、組織は静かに締まっていく。