◉ANTIGRAVITY LABEN
記事一覧/Agents & Manager
◈ Agents & Manager/2026-07-13中級

エージェントに API キーを安全に渡す — 実行時の環境変数注入とログ漏洩の遮断

デプロイ用トークンが無人ランのログに残っていた反省から、実行の瞬間だけ環境変数を注入する起動ラッパー、出力から鍵を消すマスキングフィルタ、コミット前の二段スキャンゲートという3つの遮断層を実装した手順と、導入後に変わったことをまとめました。

Antigravity386セキュリティ14エージェント74シークレット管理3環境変数4

✦ プレミアム記事

無人ランのログを翌朝に見返していたとき、標準出力の一行が目に留まりました。デプロイ用のトークンが、そのままの形でログファイルに残っていたのです。エージェント自身は何も間違っていません。私が渡し方を間違えていました。

秘密情報の事故は、たいてい「盗まれた」のではなく「うっかり書き残した」ところから起きます。リポジトリにコミットしてしまう。ログに吐き出してしまう。エージェントのコンテキストに紛れ込み、そのまま外部モデルへ送られてしまう。個人開発でアプリを運用している私自身、この一件までは注入の作法を軽く見ていました。以下では、Antigravity のエージェントに鍵を渡すときの漏洩経路を三つに分けて塞ぐ構成を、本番運用でそのまま使っている形のまま整理します。

漏洩はどこで起きるのか

まず経路を分けて考えると、対策の重複と抜けがなくなります。私が実際に踏んだもの、踏みかけたものを表にしました。

漏洩経路典型的な原因この構成での対策
リポジトリ.env をコミット、コード例に実キーを直書きgitignore + 実行時注入
ログ・標準出力エージェントがコマンド結果をそのまま出力マスキングフィルタ
エージェントのコンテキスト鍵を含むファイルを読み込ませ、モデルへ送信読込対象からの除外

三つは別々の対策が要ります。gitignore はログを守りませんし、マスキングはリポジトリを守りません。順に見ていきます。

1. 実行の瞬間だけ注入する起動ラッパー

秘密情報を「ファイルに書いて置いておく」のをやめ、「実行するときだけ環境変数に載せる」方針にします。鍵の保管場所は OS のキーチェーンでも、権限を絞った .secrets.env でも構いません。要点は、エージェントのプロセスにだけ渡し、シェル履歴やリポジトリには残さないことです。

次のラッパーは、gitignore 済みの秘密ファイルを読み、必要なキーだけを export してエージェントを起動します。読み込んだ後すぐにプロセスを差し替えることで、後続のシェルへ意図せず継承されるのを防ぎます。

#!/usr/bin/env bash
# run-agent.sh — 秘密情報を実行時だけ注入してエージェントを起動する
set -euo pipefail
 
SECRETS_FILE="${HOME}/.config/antigravity/.secrets.env"
 
# 権限チェック: 本人だけが読める状態でなければ拒否する
if [ "$(stat -c '%a' "$SECRETS_FILE")" != "600" ]; then
  echo "拒否: $SECRETS_FILE の権限は 600 にしてください" >&2
  exit 1
fi
 
# 必要なキーだけを許可リストで抜き出す(全 env を丸ごと渡さない)
ALLOWED="DEPLOY_TOKEN API_KEY DB_URL"
 
env_args=()
while IFS='=' read -r key value; do
  [[ "$key" =~ ^#.*$ || -z "$key" ]] && continue
  for a in $ALLOWED; do
    if [ "$key" = "$a" ]; then
      env_args+=("$key=$value")
    fi
  done
done < "$SECRETS_FILE"
 
# env で一時的に付与。呼び出し元のシェルには残らない
exec env "${env_args[@]}" antigravity agent run "$@"

肝は許可リスト方式です。秘密ファイルに書かれた全変数を無条件に渡すと、いつの間にか増えた鍵まで一緒に流れます。「このランに必要なキーはこれだけ」と明示することで、注入する情報の範囲を自分の理解の範囲に留められます。私はこの許可リストを、ランの種類ごとに分けて管理することを推奨します。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦秘密情報を平文で残さず、実行の瞬間だけ環境変数として注入する Bash 起動ラッパー
✦GitHub や Google API の鍵形状を伏せ字にする Node 製マスキングフィルタの実装
✦pre-commit と pre-run の二段で漏洩を検出するスキャンゲート
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ Agents & Manager2026-10-16
エージェントに .zip を渡す前に、.git を除いて 29 MB を 15 MB にし、秘密情報の警告 28 件を見分けました
Antigravity アプリ v2.23.0 で .zip を添付できるようになりました。自分のリポジトリを実際に固めて .git の重さと秘密情報検査の誤検知を数え、除外・検査・マニフェストを一度に行う Python スクリプトの全文を残します。
◈ Agents & Manager2026-09-08
/boost が「検証済み」と返してきたとき、その worktree に何が無かったのかを先に数えています
Antigravity の /boost は使い捨ての隔離ワークツリーでテストを走らせます。手元のビルドが git に入っていないファイルへ依存していると、その検証は別の木の上で通ります。ずれを先に数える手順を書き残します。
◈ Agents & Manager2026-09-06
エージェントの定期実行で、失敗より先に「走らなかった」を疑うようになりました
定期実行の台帳は成功率100%のまま、夕方の枠だけが二週間走っていませんでした。期待発火表と実行台帳を突合して欠落を出す監査を、cron 展開・終了コード・台帳の書き方の実測とあわせて書き残します。