gc-vault: 安全な GCP 認証ラッパー
Claude Code の Bash ツールから実行する場合は 「Claude Code から実行する手順(必読)」 に従うこと。サンドボックス解除と 1Password の認証の二段階防御で運用する。
いつ使うか
ユーザーが以下のような操作を求めたとき、本スキルを適用する:
gcloud/gcloud storage/bqの実行(gsutilはgc-vaultの認証経路では動作しない、後述)- Terraform
googleprovider を使うterraform plan/apply - GCP の Client Libraries を使うスクリプト(Ruby / Python / Go 等)の起動
cloud-sql-proxy等の補助ツール起動
Claude Code から実行する手順(必読)
プロファイルの確認
利用可能なプロファイル名はユーザーが ~/.config/gc-vault/config.toml で定義している。プロファイル名を agent 側で把握していない場合は、以下の読み取りコマンドで確認する(サンドボックス内で動作する)。
gc-vault list
プロファイルの選び方
ユーザーの要求文に明示的な profile 名が含まれていない限り、agent は推測で profile を決めない。gc-vault list で利用可能な一覧を取得し、ユーザーに選択を促す。ユーザーの言葉遣い(「dev」「production」等)から推測することはしない(誤って本番に対して操作するリスクを避けるため)。
選択を促す具体的な方法は profile の件数で分岐する:
- 2 件以上の場合:
AskUserQuestionツールで選択肢を提示するか、平文で一覧を出して選んでもらう - 1 件のみの場合:
AskUserQuestionは最低 2 選択肢を要求するため使えない。平文で「このプロファイル<profile>で実行してよいですか?」と確認し、肯定応答を得てから進める。読み取り系コマンド(gcloud ... list/describe等)なら、確認文中に実行予定のコマンドも併記するとやり取りが減る
手順
Bash ツール呼び出しに dangerouslyDisableSandbox: true を指定して gc-vault exec <profile> -- <command> を実行する。
Bash ツール呼び出し:
command: gc-vault exec <profile> -- gcloud sql instances list
dangerouslyDisableSandbox: true
実行時に発生するユーザー操作:
- Bash 承認プロンプト(Claude Code 側)— サンドボックス解除を伴う実行をユーザーが承認
- 1Password の認証プロンプト(1Password アプリ)— bootstrap SA キーへのアクセスを生体認証で承認
この 2 段階により、agent が意図しない gc-vault exec を呼ぼうとしても、ユーザーが少なくともどちらかで止められる。
1Password の認証が毎回要求される理由
通常、op CLI は「ターミナルセッション」単位で 1 回 1Password の認証を要求し、セッション内(10 分間 / 操作のたびに延長)は再認証なしで動作する(公式仕様)。しかし Claude Code の Bash ツールは各呼び出しごとに独立したプロセスを spawn するため、1Password 側からは 毎回別セッション として扱われ、結果的にすべての gc-vault exec で 1Password の認証が要求される。
これは 1Password / Claude Code どちらの明示的な設定でもなく、両者のプロセスモデルの相互作用から生じる挙動。1Password 設定で実現するものではない。
将来 Claude Code がプロセスを再利用するようになる、あるいは 1Password がセッション判定ロジックを変更する等で「毎回 1Password の認証」が省略される可能性がある。Bash 承認プロンプトを通過した後に 1Password の認証プロンプトが出ない場合は、防御層が 1 段に減っているため、ユーザーに警告して挙動の変化を共有すること。
1Password の認証が頻繁で煩わしい場合
連続して多数の GCP 操作が必要な場面では、毎回の Bash 承認 + 1Password の認証が運用上重くなる。その場合は、ユーザーに 「別ターミナルで gc-vault shell <profile> を起動し、そこから claude を立ち上げる」 運用(README「代替運用」を参照)への切り替えを提案する。この運用なら起動時の 1Password の認証は 1 回で済み、Claude Code 内では gcloud を直接実行できる(credentials がセッション中露出するトレードオフあり)。
切り替えの目安: 同じセッションで 3 件以上の gc-vault exec が見込まれる場合、または既に何度か実行してユーザーから「面倒」「重い」等の反応があった場合。
コマンドを組み立てる際のルール
--projectフラグは付けない(gc-vaultがCLOUDSDK_CORE_PROJECTを自動セットする)- 1 回の
gc-vault execで複数の処理を&&等で連結しない(複合コマンドにすると Bash 承認の粒度が粗くなり、ユーザーが意図を読み取りにくくなるため) - 連続して多数のコマンドが必要な場合でも、1 コマンド = 1
gc-vault execを保つ gsutilは使わずgcloud storageを使う(gsutilはCLOUDSDK_AUTH_ACCESS_TOKENもGOOGLE_APPLICATION_CREDENTIALSも認証ソースとして直接読まないため、gc-vault exec経由では 401 Anonymous caller になる。gcloud storage ls/cp/rsync等が代替)
NG
- サンドボックス有効のまま
gc-vault execを呼ぶ(opがデスクトップアプリに到達できず失敗する) gcloud sql instances listのようにgc-vaultを経由しない呼び出し(クレデンシャルがないため失敗、または個人アカウントを誤用する)~/.claude/settings.jsonのsandbox.network.allowUnixSocketsへの追加を提案する(実機検証で複数ソケット + 追加の IPC 経路の許可が必要と判明、設定がフラジャイル。gc-vaultリポジトリの README「採用しないアプローチ」参照)
いつ使わないか
- kubectl (GKE):
gke-gcloud-auth-pluginが独自フローのため非対応 - firebase CLI: 独自認証
提案するコマンドの作り方
ユーザーから「 の Cloud SQL インスタンスを確認したい」などの要望があったら:
OK: gc-vault exec <profile> -- gcloud sql instances list(dangerouslyDisableSandbox: true 付き)
NG: gcloud sql instances list --project=<project>(クレデンシャルがないため失敗)
その他の例:
gc-vault exec <profile> -- gcloud projects describe "$CLOUDSDK_CORE_PROJECT"
gc-vault exec <profile> -- gcloud run services list
gc-vault exec <profile> -- gcloud storage ls gs://my-bucket/
gc-vault exec <profile> -- bq ls
gc-vault exec <profile> -- terraform plan
gc-vault exec <profile> -- bin/rails console
環境変数
gc-vault がセットする環境変数:
CLOUDSDK_AUTH_ACCESS_TOKEN: gcloud 系 CLI 用の短命トークンCLOUDSDK_CORE_PROJECT: profile のproject値GOOGLE_APPLICATION_CREDENTIALS: SDK / Terraform 用のimpersonated_service_account形式 ADC JSON のパスGCP_VAULT_ACTIVE_PROFILE: 現在のプロファイル名(プロンプト表示等)
注意事項
- アクセストークンは 30 〜 60 分で失効。長時間プロセス(cloud-sql-proxy 等)は SDK 側の自動更新(ADC 経由)に依存
- 1Password デスクトップアプリが起動・unlock されている必要がある(
gc-vaultが内部でopCLI を呼び出すため) gcloud auth loginでの個人アカウント認証は 使わない方針。既存の credentials はgcloud auth revoke --all+gcloud auth application-default revokeで削除可能- Claude Code のサンドボックスは
opCLI が 1Password デスクトップアプリと通信する経路(複数の Unix ソケット等)を遮断する。そのためgc-vault execの呼び出しにはdangerouslyDisableSandbox: trueが必須 - 1Password の認証が毎回要求される挙動が将来変化した場合(プロンプトが省略される等)、防御層が一段減るためユーザーに伝える
- ツール本体: https://github.com/zenn-dev/gc-vault