認証・シークレットの統一管理 (1 人法人 monorepo) — 3 モデル Deep Research 調査
調査日: 2026-05-30 (3 モデル完成版) 調査者: [email protected] 目的: clasp / Cloudflare Workers / GitHub Actions / macOS Keychain に散在する認証情報を単一ソース化し、「予告なく失効する認証」を撲滅するアーキテクチャを確定する 調査モデル: Claude Opus 4.7 (Managed Agents) / Gemini Deep Research (deep-research-preview-04-2026) / OpenAI o3-deep-research 個別結果: Claude / Gemini / OpenAI(補助: OpenAI partial) 設問原文: RQ-085 prompt
取得補正 (2026-05-30): Gemini は 3 連続失敗 (startup flaky, 成功率 ~29%) 後、Plan-then-Chain パターン改修 (PR #1179) の retry で full 5q を取得。OpenAI は original 5q が TPM 200K/min 上限に当たり slim 3q (Q1/Q3/Q4) で完走したため Q2・Q5 は OpenAI 欠落。Claude は 5q だが本文は session output 保存で、本リポには Executive Summary のみ。
0. 調査の動機
bizlp の認証情報は (a) clasp 用 ~/.clasprc.json + GitHub Secret CLASPRC_JSON、(b) Cloudflare wrangler secret / API token、(c) decision-pipeline の Basic 認証 (macOS Keychain decision-pipeline-auth)、(d) 各種 LLM API key と、複数箇所に散在している。clasp の invalid_grant による予告なきデプロイ失敗 (CLAUDE.md に「自律実行不可」と明記) と、「Deploy to GAS」CI の Requested entity was not found 失敗([[main_2026-05-30_bug_adr0089-partial-triage-gap]] §③)が顕在化しており、静的鍵の単一ソース化 + 失効 cred の撲滅を RQ-085 として 3 モデルに調査依頼した。
1. 調査設問
- 単一ソース化ツール: Doppler / Infisical (self-host 含む) / Google Secret Manager / Cloudflare Secrets Store を、GitHub Actions・ローカル shell・
wranglerの 3 消費者への同期カバレッジ / 1 人法人コスト / 構築・運用負荷 / ダウン時の blast radius で採点。 - OAuth 再認証の撲滅: Google OAuth consent screen の公開ステータス (Testing / Production / Internal) が refresh token 寿命に与える影響を定量化。service account (domain-wide delegation 含む) が Apps Script API / Sheets / Drive で user OAuth を置換できる条件。
- キーレス CI: GitHub Actions OIDC + Google Workload Identity Federation (+ scoped Cloudflare token) は長寿命 CI secret 撲滅に値するか。
claspデプロイと Workers デプロイ固有のハードブロッカー特定。 - 内部 Basic 認証の置換: CI / ローカルから呼ぶ内部 Cloudflare Worker の保護に Cloudflare Access service token vs Basic auth vs mTLS のどれが最善か。GitHub Actions 統合方法。
- 失効の事前検知: 破綻前に cred/token 失効を検知するパターン (canary / 失効スキャン / 定期 validation) と通知 (Slack / GitHub issue)。
2. 調査結果
2.1 Claude Opus 4.7 (Managed Agents) — 274s, $1.36 (5q)
5 つの決定的所見:
- clasp はキーレス CI の最大ブロッカー。Apps Script API は service account で動かない (Google docs + clasp 自身が確認) → CI に user OAuth refresh token を置く以外にない。
- 「予告なく失効」は consent screen の設定ミスがほぼ確実。External + "Testing" → refresh token は 7 日で失効。External + "In production" → 長寿命。100 ユーザー未満の個人利用は検証不要で「publish は 30 秒」。この 1 クリックがリスト中最高 ROI。
- Cloudflare デプロイは現状キーレス化不可 (Wrangler API に OIDC なし、
wrangler-action#402)。scoped・期限付き account-owned API token で blast radius を縮小。 - 内部 Basic 認証は Cloudflare Access service token に置換。Wrangler が
CLOUDFLARE_ACCESS_CLIENT_ID/_SECRETを native サポート。失効 1 週間前に CF が built-in alert。 - SoT はこの規模では native パターンが第三者ツールに勝る。Cloudflare Secrets Store (free beta, 100 secrets) + Google Secret Manager (6 versions + 10K ops 無料) + GitHub OIDC/WIF で完結。Doppler/Infisical は「1 つの GUI で全部見たい」時のみ正当化。
2.2 Gemini Deep Research — 565s, $1.12 (5q, full)
唯一の full 5q + 引用付き academic report。要点:
- Q1 SoT: Doppler (closed SaaS, 低運用負荷, Personal Configs でローカル汚染回避, 二重鍵戦略でゼロダウン rotation, Developer 無料=3 users/5 syncs/50 service tokens/240 read req/min) vs Infisical (OSS, self-host=Docker+PostgreSQL+Redis 3 層, PKI/Machine Identity/MCP 対応, Free=5 machine identities/3 projects がボトルネック)。solo は Doppler 推奨、OSS 厳守・動的シークレット・双方向 K8s 同期が要るなら Infisical。
- Q2/Q3 clasp: clasp v3.0 が ADC (
--use-adc/--adc) をサポート (v3.0 は TS コンパイルも廃止し Rollup 等へ移行)。制約 = service account は Apps Script を所有・API 有効化できないが、ユーザーが作成した script を SA の email に Editor 共有すればclasp push/deploy --adcが WIF 経由でキーレス動作。~/.clasprc.json不要。 - Q3 WIF: GitHub OIDC JWT → Google STS → attribute mapping/CEL 条件 (repo/branch 限定) → 短命 federated token で SA を impersonate。静的 SA JSON 鍵を撲滅。
- Q3 Cloudflare: Wrangler に OIDC なし (#402/#11434) → 長寿命 API token を least-privilege scope で。
- Q4 Basic auth: Cloudflare Access service token (
CF-Access-Client-Id/Secretヘッダ, policy=Service Auth) が CI に最適。mTLS は Root CA 発行が要る device レベル trust 用で solo には過剰。Zero Trust Free=50 users/1000 tunnels。 - Q5 失効検知: デプロイ前に provider の models 一覧 endpoint へ
Authorization: Bearerで GET → 200 で validate / 401・403 で pipeline を意図的に fail。Gemini は?key=query param。AI code review (PR-Agent) は構文レベルの security 違反検知に有効だが業務ロジック欠陥は不可。gemini-2.5-flash統合にAPI_KEY_INVALIDで OpenAI dummy key に誤 fallback して crash する既知バグ → 検証済みの primary key + model 環境変数固定を推奨。 - Cloudflare Secrets Store: Quicksilver で全エッジ伝播、
wrangler.tomlでstore_id+secret_nameを binding、RBAC で「bind 可・平文閲覧不可」を分離。全プラン 100 secrets。
2.3 OpenAI o3-deep-research — 395s, $0.98 (slim 3q: Q1/Q3/Q4)
original 5q が TPM 上限超過のため Q2/Q5 を除いた slim 3q で完走。
- Q1 SoT: Doppler / Infisical / Google Secret Manager / Cloudflare Secrets Store を 4 観点で比較表化。Doppler/Infisical (第三者 vault) を中央集権 vault として推奨 (全消費者を 1 ワークフローで網羅)。GSM は Google エコシステムなら可だが CF/ローカル同期に手間。CF Secrets Store は CF 内専用で多プラットフォーム共有を解決しない。
- Q3 keyless CI: GitHub OIDC → Google WIF は should-have (SA JSON 鍵を即撲滅)。Cloudflare は OIDC なしで scoped token を維持。clasp はハードブロッカー: user OAuth のみ・SA 不可で persistent token が必要、再認証は既知の手動ステップとして計画せよ。
- Q4 Basic auth: Cloudflare Access service token に置換 (should-have)。mTLS は overkill (nice-to-have)。
- 優先度: Must=中央 secrets ツール採用 / Should=GH OIDC+WIF・CF scoped token・Basic auth 置換 / Nice=clasp OAuth 等の残存 quirk の自動化。
3. サマリー (3-vendor 統合結論)
3.1 3 者一致点
- 秘密情報を単一 vault に集約する (散在 .env / Keychain / wrangler secret / GitHub Secret を解消)。ツールは Doppler (低運用) か Infisical (OSS/self-host)。
- GitHub OIDC + Google Workload Identity Federation で Google Cloud 向け CI をキーレス化 — 静的 SA JSON 鍵の撲滅は should-have。
- Cloudflare はキーレス化不可 (Wrangler に OIDC 未対応
#402) → least-privilege scope の長寿命 API token を維持。 - 内部 Basic 認証は Cloudflare Access service token に置換 (
CF-Access-Client-Id/Secretヘッダ)。mTLS は solo には過剰。
3.2 不一致・温度差
| 論点 | Claude | OpenAI | Gemini |
|---|---|---|---|
| clasp キーレス化 | ❌ ハードブロッカー (SA 不可) | ❌ ハードブロッカー (SA 不可) | ✅ clasp v3 ADC で可 (script を SA に Editor 共有 → --adc) |
| SoT ツールの第一候補 | native 優先 (CF Secrets Store + GSM + OIDC)、第三者は GUI 目的のみ | 第三者 vault 優先 (Doppler/Infisical) | Doppler 優先 (solo)、要件次第で Infisical |
| Q2/Q5 のカバー | Q2 consent screen を最重要視 | (slim で欠落) | Q2 は clasp ADC 経由 / Q5 pre-flight + AI review を詳述 |
- 最大の不一致 = clasp。Claude/OpenAI は「SA が Apps Script を所有・API 有効化できない」点を根拠にブロッカーと断定。Gemini は同じ制約を認めつつ、ユーザー作成 script を SA に Editor 共有 +
clasp --adcで迂回できるとする (OpenAI も「共有で可能かもしれないが複雑」と示唆していた経路を Gemini が具体化)。両立し得る: 「SA 所有は不可」は事実、「共有 + ADC でキーレス deploy 可」も clasp v3 で事実。→ bizlp で要実機検証 (clasp バージョン・ADC flag・SA 共有)。 - SoT の温度差: Claude は bizlp が既に Cloudflare/Google 寄りな点で native パターンを推す。OpenAI/Gemini は「1 操作で全環境に伝播」を重視し第三者 vault を推す。→ コスト 0 を最優先するなら native、運用 UX を優先するなら Doppler free。
3.3 bizlp 向け結論 (推奨アクション・ROI 順)
- 【最高 ROI・即時】Google OAuth consent screen を "In production" に publish (Claude Q2)。External+Testing の 7 日失効が clasp
invalid_grantの有力原因。1 クリックで refresh token 長寿命化。まずこれを検証。 - 【高 ROI・要検証】clasp v3 ADC キーレス化 (Gemini Q3)。script を GCP SA に Editor 共有 → GitHub OIDC+WIF +
clasp push/deploy --adc。成功すればCLASPRC_JSONsecret を撲滅でき、「Deploy to GAS」CI のRequested entity was not found失敗 ([[main_2026-05-30_bug_adr0089-partial-triage-gap]] §③) の恒久解にもなり得る。Claude/OpenAI が「不可」とした論点なので 実機 PoC で可否を確定してから採用判断。 - 【高 ROI】decision-pipeline の Basic 認証を Cloudflare Access service token に置換 (3 者一致)。
CF-Access-Client-Id/Secretヘッダ方式は sub サンドボックスからも叩ける ため、[[project_sub_cannot_reach_audit_api]] (Keychain Basic 認証を sub が復号できない問題) の解消にも直結。 - 【should】GitHub OIDC + Google WIF で clasp 以外の Google API 呼び出しをキーレス化。
- 【should】Cloudflare API token を least-privilege scope に絞る (OIDC は未対応のため token は残す)。
- 【SoT 決定】: コスト 0 最優先なら native (Cloudflare Secrets Store + Google Secret Manager + GitHub OIDC)。運用 UX 優先なら Doppler Developer (無料)。1 人法人・既存スタックが Cloudflare/Google 寄りな点を踏まえると native 寄りが第一候補だが、Keychain/wrangler/GH Secret を 1 GUI で一元化したい場合は Doppler を評価。
- 【nice】pre-flight 失効検知 (Gemini Q5): デプロイ前に Anthropic/Gemini key を models endpoint で GET → 401 なら pipeline fail + GitHub issue 起票。
次アクション: 上記 1・2 (clasp 系) を ADR 起案候補とし、Pipeline 経由で起案する。3 (Access service token) は [[project_sub_cannot_reach_audit_api]] の解消とセットで優先検討。
4. コスト
| Provider | Model | Elapsed | Cost (USD) | prompt |
|---|---|---|---|---|
| Claude | claude-opus-4-7 (managed-agent) | 274.2s | $1.36 | original 5q |
| Gemini | deep-research-preview-04-2026 | 565.2s | $1.12 | original 5q (Plan-then-Chain retry) |
| OpenAI | o3-deep-research | 395.3s | $0.98 | slim 3q (TPM 上限回避) |
| 合計 | $3.46 |
(参考: Gemini は 3 連続失敗後の retry 取得。失敗分のコストは [[gemini-dr-zombie-detection]] / tmp/gemini-investigation-2026-05-30.md を参照。)