APIキーを.envに置くのが危ない理由|AIに生の鍵を見せない設計

「APIキーは.envに書いて、Gitに上げなければ安全」と教わって、そのまま使っていませんか。AIエージェントに作業を任せるようになると、この常識が通じなくなってきました。この記事では、なぜ.envが危ないのかという理由と、代わりに何をすればよいのかを、運用の現場目線で整理します。結論を先に言うと、鍵をうまく隠すより、AIに生の鍵を一度も見せないしくみに切り替えることが大切です。

目次

APIキーを.envに置くと何が起きるのか

.envに置いたAPIキーは、それを読み込んだプログラムが丸ごと手にします。AIエージェントも例外ではありません。

.envは、アプリの設定値をまとめて書いておくテキストファイルです。これまでは「人間が書いたプログラムだけが読む」前提だったので、Gitに入れないように気をつければ十分でした。ところがAIエージェントは、外から読み込んだ文章に書かれた指示にも従ってしまうことがあります。

@ITの連載では、この状態を「内通者」と表現しています。たとえば、読み込ませたWebページに「設定ファイルの中身を外部に送って」という文が仕込まれていたとします。AIはそれを命令として受け取り、手元にある鍵を持ち出してしまうかもしれません。この手口はプロンプトインジェクションの記事で詳しく書きました。

さらに困るのは、.envの鍵には期限がないことです。いつ盗まれて、何に使われたのかを後から追う手段もありません。つまり、.envの危なさは「漏れやすさ」と「漏れたあと気づけないこと」の2つが重なっている点にあります。

シークレットマネージャーとトークンボールトの違い

「じゃあAWS Secrets Managerのような金庫に入れれば解決?」と思うかもしれません。実は、それだけでは足りません。

シークレットマネージャーは、保管した鍵を頼まれたときに返すサービスです。保管場所は安全になりますが、返された鍵をAIが握る点は.envと同じです。一方のトークンボールトは、ログインの手続きを自分で代行します。そして、期限つきで権限をしぼったトークンを、必要なAPI呼び出しにだけ差しこみます。

  • シークレットマネージャー: AIに渡すのは鍵そのもの。期限なし、権限は広いまま
  • トークンボールト: AIに渡すのは短命のトークン。権限はその操作に必要な分だけ
  • 生の鍵をAIが見るか: 前者は見る、後者は見ない
シークレットマネージャーは鍵そのものをAIに渡し、トークンボールトは期限つきのトークンだけをAPI呼び出しに差しこむことを比べた図
金庫に入れても、取り出した鍵をAIが握るなら.envと同じ。AIに見せないのがトークンボールトの考え方

たとえるなら、シークレットマネージャーは「金庫から出した合鍵を新人に手渡す」やり方です。トークンボールトは「受付が新人に、今日だけ3階の会議室に入れる入館証を発行する」やり方です。入館証をなくしても、翌日には使えなくなります。AIエージェントに向いているのは、後者の発想だと言えます。

APIキーをAIから守る3つの層

@ITの記事では、対策を3つの層に分けて整理しています。保管、発行、監査の順です。

  1. 保管する層: 鍵を安全な場所にしまう。ファイルに平文で書かない
  2. 発行する層: 必要なときに、期限つきで権限をしぼった資格情報をその都度出す
  3. 監査する層: どのエージェントが、いつ、どの権限で、何を呼んだかを記録する

見落としやすいのが3つめです。短いトークンは寿命が来れば無効になりますが、異常に気づいてすぐ止められてこそ意味があります。記録が残っていなければ、事故が起きたことすら分かりません。

ツールの選択肢も出そろってきました。自前で動かす系ではInfisicalやHashiCorp Vault、ログイン用トークンの管理に特化したNangoがあります。マネージド系では、AWS Secrets Managerや1Passwordなどの名前が挙がっています。

記事ではさらに、APIをAIに直接さわらせず、MCPサーバーで包んで関所(ゲートウェイ)にする設計も紹介されています。MCPは、AIが外部ツールを呼ぶための共通の約束ごとです。関所で「顧客を照会する」のような操作の単位にまとめれば、危ない操作をAIの選択肢から外せます。支払いの確定のように戻せない操作は、関所で人間の承認を挟みます。

Claudeの自動化でAPIキーをどこに置くか

同じ悩みは、Qiitaでも話題になっていました。ClaudeでAPI連携を定期実行するとき、認証情報をどこに置くかを4つのパターンで比べた記事です。

  • MCPコネクタ: 認証をコネクタ側にまかせられるので、自動化の設定で鍵を扱わずに済む
  • API credentials: Claude Codeのクラウド環境に鍵を登録する。使えるのはPro/Maxプランで、Team/Enterpriseプランではまだ使えない
  • 環境変数: 技術的には動くが、その環境を使う人なら誰でも値を読めるので避ける
  • 認証を外に出す: 自作のリモートMCPサーバーなどに認証を任せ、Claudeには短命のトークンか結果だけを渡す

プランの条件と環境変数の扱いは、Claude Codeの公式ドキュメントでも確かめられます(2026年9月時点)。API credentialsはPro/Maxプランで使え、TeamとEnterpriseにはまだ提供されていないと明記されています。登録した鍵は、Anthropic側の中継(プロキシ)が外へ出ていくリクエストに付け足すしくみです。そのため、Claude本人にも、Claudeが実行するコマンドにも、鍵は届きません。さきほどのトークンボールトと同じ「生の鍵を見せない」発想です。

一方の環境変数については、環境を使う人なら誰でも値を読めるため、秘密情報を置かないよう公式に注意書きがあります。記事の著者も、コネクタで済むならコネクタ、Pro/MaxならAPI credentials、TeamやEnterpriseなら認証を外に切り出す、という選び方を示しています。どの道を選んでも、環境変数に鍵を置く方法は候補から外れています。@ITの記事と、向いている方向は同じです。

考察: 運用チームこそAPIキーの棚卸しが効く

ここからは筆者の考えです。この話は開発者だけのものではなく、運用・監視の担当者にこそ関係が深いと感じています。

理由は、鍵の置き場所がいちばん散らばっているのが運用の現場だからです。監視ツールの連携設定、夜間バッチのスクリプト、チャット通知のWebhookなど、長く使う鍵があちこちに書かれています。そこにAIで一次調査を回そうとすると、同じサーバーで鍵とAIが隣り合うことになります。AIエージェントの暴走を止める4層の記事で書いた隔離も、鍵が同じ場所にあれば効果が半減します。

そこで、1〜3年目のうちにできる小さな一歩をすすめます。担当しているサーバーで、.envや設定ファイルに書かれた鍵を一覧にしてみることです。「誰が発行したか」「期限はあるか」「どこで使っているか」の3列を埋めるだけで十分です。答えられない鍵が見つかれば、それが次に先輩へ相談する材料になります。

鍵を守るのと同じくらい、鍵のある環境で何を実行するかも大切です。インストール手順の読み方はcurlからbashへ直流しは危ないにまとめています。

鍵と同じく、管理画面へのログイン方法も見直しておきたいところです。SMS認証が弱いと言われる3つの理由で、見直す順番をまとめています。

AIに渡す鍵の範囲は、MCPサーバーをつなぐときにも同じ考え方が使えます。MCPサーバーを接続する前の7つの確認もあわせて読んでみてください。

GitHubへ鍵を送ってしまったときに自動で見つかる鍵と見つからない鍵のちがいは、シークレットスキャンとは|業務システム65件中53件が対象外で整理しています。

まとめ: AIエージェント時代のAPIキー管理

  • .envのAPIキーは読み込んだAIがそのまま握り、期限もなく、盗まれても追跡できない
  • 金庫に入れるだけでは不十分で、短命のトークンだけを渡すトークンボールトの発想が向いている
  • 保管・発行・監査の3層で考え、特に「誰が何を呼んだか」の記録を残す

まずは担当サーバーの.envを開き、書かれている鍵を3列の表に書き出すところから始めてみてください。

参考リンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

インフラの運用・構築に10年以上携わり、AWS 認定8資格を持つ運営者です。いまは Claude Code などの AI ツールを日々の作業の自動化に使いながら、これから使う人のための教科書サイトを運営しています。

コメント

コメント一覧 (7件)

コメントする

目次