APIキー運用
完全ガイド
ワークショップ Part 1 で扱う『6原則』の各原則を400字で深掘り。プロバイダ別設定、Secret Manager 連携、漏洩時15分プレイブック、役員承認で見る KPI まで。
なぜキー配置が経営課題なのか
💡 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 分で把握できる粒度で整理したものである。
6原則 — 各原則を深掘り
原則1: チャット欄に貼らない
API キーをチャット欄に貼った瞬間、そのキーは「LLM プロバイダの入力ログ」に乗る。OpenAI・Anthropic・Google いずれも、商用プランでは原則として入力データをモデル学習に使わないと明言しているが、運用ログ・安全分類・障害調査のために一定期間保持される。つまり、キーを誰かの画面に表示した瞬間に、第三者のサーバー上に痕跡が残る可能性を受け入れたことになる。さらに社内 Slack や Notion に貼られれば、Workspace admin の検索範囲に入り、退職者の履歴からも引ける。経営者が自分で試す場合こそ、この習慣は例外を作らない。Claude Code で「.env を作って」と頼むときも、値そのものはターミナルで echo せず、エディタで直接記入する。「キーの文字列を肉眼で見ない、画面に出さない、LLM に渡さない」 — この三重の禁則が最初のゲートである。国内実例として、2024 年に某スタートアップの役員がデモ中にチャット欄へキーを貼り、直後に異国からの高レート呼び出しで数十万円の請求が発生した事案が Twitter で観測されている。
原則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 はキー名だけを列挙し、値は空欄。こちらはコミット可。新メンバーが「何を埋めれば動くか」を一目で把握できる。
原則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 分間に攻撃者が別キーで試行する予兆ログが残ったという事例がある。検知体制は整っているが、絶対ではない。
原則4: 定期ローテーション
キーは作った瞬間から「いずれ漏れる前提」で扱う。推奨頻度は 90 日ごと、加えて漏洩検知・退職者発生・委託先変更のタイミングで即時ローテーション。急な入れ替えでサービス停止を起こさないために、段階的ローテーション手順を運用 SOP に明文化する。手順は 5 ステップ: (1) 新キー生成 → Secrets Manager に保存、(2) アプリの環境変数を新キーで更新し、カナリアトラフィックで動作確認、(3) 7 日間並行運用(旧キーも有効)、(4) 旧キー無効化、(5) 月次レビュー時に廃止確認とログ突合。クラウド Secret Manager を使っていれば、バージョニング機能で新旧キーの切り替えがフラグ一つで行える。ローテーションが「手順化されていれば、現場は怖がらなくなる」— これは工事現場の安全 KY と同じで、経営者が年間スケジュールに組み込むだけで規律が持続する。役員承認で見る KPI は 2 つ: 過去 12 ヶ月のローテーション完遂率(目標 100%) と 最長キー寿命(目標 90 日以内)。
原則5: 最小権限
一つのキーで複数の用途を兼ねないこと。ai-executive のように「4 エージェント=4 キー」が理想で、1 エージェントが乗っ取られても他が無事、という Blast Radius(被害半径)の最小化を狙う。OpenAI では Organization 内で「Project」単位の API キーが作れ、Project ごとにモデル制限・月次上限・IP 制限・許可エンドポイントを細かく設定できる。Anthropic Console でも Workspace 単位で支出上限と権限境界を引ける。AWS IAM と同じ思想で、キーごとに「できること」を狭める。本番キーに管理者権限、開発キーに読み取り権限、CI/CD キーに特定モデルのみ呼び出し可、という設計が筋。さらに 未使用キーは即廃止、使っていないキーは「将来何かに使うかも」で残さない(忘れた頃に漏れる)。Anthropic / OpenAI いずれも、キー毎の最終利用日時をダッシュボードで確認できる。30 日間未使用 = 廃止候補、を運用ルール化する。
原則6: 本番/開発キー分離
本番キーと開発キーを絶対に混ぜない。これは「銀行の金庫と財布を分ける」のと同じ話で、間違って開発コードが本番キーを掴むと、壁打ちで十数万トークンを溶かすケースが発生する。命名規則で視覚的に分離するのが最も確実で、推奨テンプレは {env}-{service}-{role}-{YYYYMMDD}。例として prod-oai-ceo-20260421 / dev-oai-ceo-20260421 / workshop-20260421-demo 等。プレフィックスだけで本番か開発か見分けがつく。加えて、環境変数名も PROD_OPENAI_API_KEY と DEV_OPENAI_API_KEY のように分離し、アプリ側は環境フラグで読み分ける。ワークショップや一過性のデモには、その日のための使い捨てキーを前日に作り、終了後 24h 以内に revoke する運用が理想。本日のワークショップで配布するキーもこの方式で、終了と同時に無効化される。こうしたフローが定着すると、「いま手元にあるキーは本番か、デモか、個人の開発用か」を迷うことがなくなる。
Web UI vs dotfile (.env) — どちらで入力させるか
API キーを利用者に入れてもらう手段は 2 つあります:
- dotfile 直接編集 — ターミナルや IDE で
.envを開いて、OPENAI_API_KEY=sk-...のように書き込む。エンジニア向け標準。 - Web UI 設定画面 — アプリに
/settingsのような画面を持たせ、password input にペーストさせる。アプリが裏で.envに書く。
本ワークショップでは (2) Web UI 方式を採用。理由:
| 観点 | dotfile | Web 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 実装の最小要件チェックリスト
- ✅
<input type="password">+ show/hide 切替 - ✅ Save 時に各キーを validation (プロバイダ API の軽量呼び出し)
- ✅ 保存後のキーはマスク表示 (末尾 4 文字のみ)
- ✅ アプリが
.envに原子的書き込み (rename trick) - ✅ アプリが
.gitignoreを起動時チェック、足りなければ追記 - ✅ ローテーションボタン (新キー validate → 旧キー置換)
- ✅ localhost のみ受付 (外部から設定画面にアクセスできないように)
- ✅ 保存時の権限を chmod 600 に
- ✅ 監査ログ (誰がいつどのキーを変更したか、値本体は除く)
- ✅ 起動時にキー未設定なら
/settingsに自動リダイレクト
アンチパターン
- キー値を
<input type="text">で表示 — 画面共有・録画・目視で漏れる - フロントエンドにキーを渡す — ブラウザ JS / DevTools / メモリダンプ経由で盗まれる。必ずバックエンドで保持
- Save 時 validation 省略 — 不正キーが保存され、運用時に初めて気づく
- ログに full key を出力 — 原則 1 違反、事故の温床
- リモートから /settings にアクセス可 — 誰でもキー書き換えられる。localhost 限定必須
- Save 後リロード必須 — UX 悪化 + キー反映タイミングが曖昧になる。in-memory cache 即反映が正解
プロバイダ別設定方法
主要 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 連携
キーを .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 }}
漏洩時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 | 責任者確定 | 新キー生成・展開開始 + ローテーションスケジュール確定 | 復旧計画 |
[email protected] · Security Issue HackerOne anthropic-vdp。OpenAI は help.openai.com からチケット、重大インシデントはアカウントマネージャー直通。
MIXI 社内運用推奨テンプレート
ここまでの原則を MIXI 社内の具体的な運用ルールに落とす。IT 責任者が稟議書に貼れる粒度で整理。
命名規則
形式: {env}-{service}-{role}-{YYYYMMDD}
prod-oai-ceo-20260421dev-oai-cfo-20260421workshop-20260421-democi-oai-deploy-20260421
プレフィックス + 日付で、視認性と検索性を両立。
ローテーション cadence
- 本番キー: 90 日毎(四半期末)
- 開発キー: 180 日毎
- ワークショップ/デモキー: イベント終了後 24h 以内に revoke
- 退職者発生: 当日中に全該当キーを回転
カレンダー登録必須、自動化できるものは Rotation Lambda へ。
監査ログ月次レビュー
- キー生成・削除履歴の差分確認
- 異常コールパターン(地理/レート/エラー率)
- 30 日未使用キーのリストアップ → 廃止判断
- Secret Scanning 通知ログの突合
月次情報セキュリティ定例で役員承認。
緊急連絡系統
- 検知者 →
#security-alerts - セキュリティ責任者 → 当番 Dev リード
- Dev リード → プロバイダ Support
- 15 分後: 経営報告(CTO/CISO)
- 24h 後: 事後レビュー会議
連絡先はエスカレーションカードに印刷、各責任者の机上に常備。
教育タッチポイント
- 新入社員オンボーディング: 6原則の 15 分講義
- 年次全社セキュリティ研修に組み込み
- 四半期ごとの KY ミーティングで最新事例共有
- 役員向け: 本ワークショップを年 1 回再演
ルールより文化、文化より口癖。役員が口に出せば現場に伝わる。
- Anthropic Trust Center
- Privacy Center
- Claude Help Center
- Claude API Documentation
- Claude Code Docs
- Anthropic Legal Docs
- Security Report — HackerOne
- Zero Data Retention — Claude Code Docs
- Set up Single Sign-On (SSO)
- Restrict Access with IP Allowlisting
- GitHub Secret Scanning
- OpenAI API keys — Authentication
- AWS Secrets Manager Documentation