.env の代わりに aws-vault で安全に環境変数を与える — Claude Code 時代の AWS 認証情報管理
AI エージェントがローカルファイルを直接読み書きする時代、.env に平文で認証情報を置くリスクが顕在化しています。前回の記事では、この問題の背景と複数のシークレット管理ツールを紹介しました。
本記事では、AWS を利用しているチームに向けて、aws-vault を使って .env と ~/.aws/credentials を完全に排除する具体的な手順を解説します。
aws-vault が解決する問題
~/.aws/credentials の平文問題
AWS CLI を使う開発者の多くは、~/.aws/credentials にアクセスキーを平文で保存しています。
| |
このファイルには2つのリスクがあります。
- Claude Code が読み取れる: AI エージェントがファイルシステムを探索する際、
~/.aws/credentialsのアクセスキーが LLM のコンテキストに載る可能性がある - 長期的な認証情報が漏洩する: アクセスキーには有効期限がなく、漏洩した場合は手動でローテーションするまで悪用され続ける
aws-vault のアプローチ
aws-vault は以下の2段階で問題を解決します。
- 暗号化保存: アクセスキーを
~/.aws/credentialsではなく、OS のキーストア(macOS Keychain 等)に暗号化して保存する - 一時認証の生成: AWS STS(Security Token Service)を使って、1時間で失効する一時認証情報を生成し、子プロセスに注入する
[従来]
~/.aws/credentials(平文) → AWS CLI / boto3 が直接読み取り
→ 長期キーがメモリに残る
[aws-vault]
macOS Keychain(暗号化) → aws-vault が STS で一時認証を生成
→ 子プロセスに環境変数として注入
→ 1時間で失効
セットアップ
インストール
| |
macOS では --cask 版が推奨されています。コード署名されているため、Keychain アクセス時の追加のパスワードプロンプトが少なくなります。
認証情報の登録
| |
この時点で ~/.aws/credentials にはキーが書き込まれません。Keychain に暗号化保存されます。
登録できたことの確認
| |
~/.aws/credentials を削除
既に ~/.aws/credentials に平文キーがある場合は、aws-vault に移行後に削除します。
| |
基本的な使い方
コマンド実行
| |
aws-vault exec は内部で以下を行います。
- Keychain からアクセスキーを取得
- STS の
GetSessionTokenAPI を呼び出し、一時認証情報を生成 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKENを環境変数として設定- 指定したコマンドを子プロセスとして実行
子プロセスが終了すれば、一時認証情報は環境変数とともに消えます。
サブシェルで作業
コマンドを指定せずに実行すると、認証情報が設定されたサブシェルが起動します。
| |
複数の AWS コマンドを連続して実行する場合に便利です。
AWS コンソールにブラウザでログイン
| |
ブラウザが開き、一時認証情報で AWS マネジメントコンソールにログインできます。IAM ユーザーのパスワードを入力する必要がありません。
~/.aws/config の設定
aws-vault は ~/.aws/config(設定ファイル)を読み取ります。認証情報(credentials)ではなく設定(config)であるため、平文のキーは含まれません。
基本設定
| |
MFA(多要素認証)の設定
IAM ユーザーに MFA を設定している場合、mfa_serial を追加します。
| |
| |
MFA コードを入力すると、セッションがキャッシュされます。セッションが有効な間(デフォルト1時間)は再入力不要です。
AssumeRole(ロール切り替え)の設定
開発環境と本番環境で異なる IAM ロールを使い分ける場合の設定です。
| |
| |
aws-vault が自動的に AssumeRole API を呼び出し、ロール切り替えを行います。
credential_process による AWS CLI との統合
aws-vault exec のラッパーなしで、通常の aws コマンドをそのまま使いたい場合は、credential_process を設定します。
| |
| |
この設定により、AWS SDK(boto3 等)が認証情報を必要とする際に aws-vault が自動的に呼び出されます。
macOS では --prompt osascript オプションを追加すると、Keychain のパスワード入力がネイティブダイアログで表示されます。
| |
Docker コンテナへの認証情報の受け渡し
ローカル開発で Docker コンテナ内のアプリケーションに AWS 認証情報を渡す方法です。
環境変数で渡す
| |
ただし、一時ファイルに認証情報が残るため、よりセキュアな方法を推奨します。
ECS ローカルエンドポイントで渡す(推奨)
aws-vault には、ECS コンテナが使う認証エンドポイントをローカルで再現する機能があります。
| |
この方法では、認証情報がファイルにも環境変数にも直接渡されません。コンテナ内の AWS SDK が HTTP 経由で一時認証情報を取得します。
キーローテーション
IAM のベストプラクティスでは、アクセスキーを90日ごとにローテーションすることが推奨されています。aws-vault ならコマンド一つで完了します。
| |
内部的には以下が行われます。
- 新しいアクセスキーを IAM に作成
- Keychain のキーを新しいものに更新
- 古いアクセスキーを IAM から削除
アプリケーションのシークレットとの組み合わせ
aws-vault は AWS 認証情報を守るツールです。アプリケーション固有のシークレット(データベースパスワード、API キー等)は、別途 AWS Secrets Manager から取得する構成が推奨されます。
一括注入スクリプト
| |
| |
この構成では以下の全てが平文ファイルから排除されます。
| 認証情報 | 保存場所 | 平文ファイル |
|---|---|---|
| AWS アクセスキー | macOS Keychain | なし |
| AWS 一時認証情報 | メモリ上のみ(1時間で失効) | なし |
| DB パスワード | AWS Secrets Manager | なし |
| 外部 API キー | AWS Secrets Manager | なし |
Makefile での統合
チーム全体で同じ方法を使えるよう、Makefile に定義しておくと便利です。
| |
| |
Claude Code との共存
deny 設定
Claude Code が AWS 関連の認証ファイルを読み取らないよう、プロジェクトの .claude/settings.json に deny ルールを追加します。
| |
aws-vault 環境で Claude Code を使う
Claude Code 自体も aws-vault の子プロセスとして起動できます。Claude Code が AWS リソースにアクセスする必要がある場合(例: S3 バケットの内容を確認する等)に有効です。
| |
ただし、Claude Code に AWS 認証情報を渡すこと自体がリスクになり得ます。必要な場合のみ使用し、通常は認証情報なしで起動することを推奨します。
トラブルシューティング
Keychain のパスワード入力が頻繁に求められる
macOS Keychain の「aws-vault」キーチェーンのロック時間を調整します。
- 「キーチェーンアクセス.app」を開く
- 左ペインで「aws-vault」キーチェーンを右クリック
- 「“aws-vault” の設定を変更」を選択
- 「操作がない状態が XX 分続いたらロック」の時間を調整
セッション期限切れ
デフォルトのセッション期限は1時間です。長時間の作業では、環境変数でカスタマイズできます。
| |
ただし、セッション時間を長くするほどセキュリティリスクは増加します。
–no-session オプション
一部の IAM 操作(アクセスキーのローテーション等)は一時認証情報では実行できません。その場合は --no-session を使いますが、長期キーがそのまま使われるためセキュリティリスクが高くなります。通常の開発では使用を避けてください。
| |
まとめ
- ~/.aws/credentials を廃止: aws-vault でアクセスキーを OS Keychain に暗号化保存し、平文ファイルを排除する
- 一時認証情報で作業: STS が生成する1時間で失効する認証情報のみを使い、漏洩リスクを限定する
- credential_process で透過的に統合:
aws-vault execのラッパーなしで、通常の AWS CLI や boto3 をそのまま使える - AssumeRole で環境分離: dev / stg / prod を IAM ロールで切り替え、本番アクセスには MFA を必須にする
- AWS Secrets Manager と組み合わせる: アプリケーションのシークレットは Secrets Manager に集約し、一括注入スクリプトで管理する
- Makefile でチーム標準化:
make server一つで安全にローカル開発サーバーを起動できる環境を整備する - Claude Code の deny 設定:
~/.aws/credentialsと.envへのアクセスを拒否し、多層防御を実現する
参考
- aws-vault - GitHub
- aws-vault Usage Guide
- aws-vaultの使い方 - atsum.in
- aws-vault について - Zenn
- VS Code Remote Containers で aws-vault を使う - dely Tech Blog
- aws-vaultの使い方と仕組み - Qiita
- AWS Vaultで端末内のAWSアクセスキー平文保存をやめてみた - DevelopersIO
- aws-vault のすすめ - sreake.com
- Claude Code 時代の .env 管理(関連 Gist)
- AWS Secrets Manager Documentation
- Using AWS Secrets Manager with ECS