aws-vault のバックエンドを keychain から passage に変えた
随分前に aws-vault の紹介記事を書きましたが、今回その backend について、ずっと使っていた keychain から passage に変更したのでメモを残しておきます。
※今回の手順は Secure Enclave が使える macOS を前提にしています。
免責事項 (Disclaimer)
一応セキュリティに絡む話題なので、書かれた内容を実践する際は自己責任でお願いいたします。
aws-vault について
詳しくは記事を見てほしいですが、 AWS の IAM クレデンシャルを安全にパソコン内に保管・利用する仕組みを提供するツールです。1
aws-vault はクレデンシャルのセキュアな配置先として、macOS ではデフォルトで Keychain Access (keychain backend) を使います。Keychain Access は macOS 固有の機能ですが、設定を変えることで他の配置先を backend として選択可能です。
今回は移行先として passage を採用することにしました。2

そもそもなんで移行したか
keychain も最初は不便には思っていませんでした。しかし、ことあるごとにパスコードを入力させられる(TouchID や Apple Watch による解除ができない)事に不便に感じるようになった為です。3
また最近、AI にも AWS コマンドを操作させる事が増えてきた為、以前の様に人間オンリーの時と運用を変えたいと言うのもきっかけの一つです。
尚、passage を採用した理由としては、age がバックエンドにある事、またそれによって Secure Enclave を使ったセキュアな鍵を作れると言う点が魅力に感じた為です。ちなみに passage と age の作者は同一人物です。
passage への移行手順
まず必要なツールである age, age-plugin-se をインストールします。 以下は Homebrew の例:
brew install age age-plugin-se
また passage もインストールします。こちらは Homebrew に公開されていないので、直接 repo を clone して make します:
cd /tmp
git clone https://github.com/FiloSottile/passage
cd passage
# 以下の様な PREFIX にすると Homebrew のディレクトリの中にインストールされる
make install PREFIX="$(brew --cellar)/passage/$(git describe --tags)"
brew link passage
# 存在確認。 `/opt/homebrew/bin/passage` と表示されれば成功。
command -v passage
次に passage のディレクトリを作ります。
mkdir ~/.passage && chmod 0700 ~/.passage
次に暗号化に使う age の鍵を作ります。
# Secure Enclave 用の鍵。こっちを基本使う。
age-plugin-se keygen -o ~/.passage/identities
# バックアップ用の通常の鍵。パスフレーズをつける。
age-keygen -o /tmp/identities.raw
cat /tmp/identities.raw | age -p -a > ~/.passage/identities_pp
※一応軽く age-plugin-se について解説しておきます。作られる鍵は age-keygen とほぼ同じなんですが、こちらを使って作られた鍵は作った端末の Secure Enclave の認証が必要になります。簡単に言うとその端末からしか使えない鍵になるので、万が一秘密鍵が外部に漏れても暗号文を復号されるリスクが通常の鍵ペアに比べて抑えられます。4
なお、この age-plugin-se の生成オプションでは復号の際に常に生体認証(あるいはパスコード)の入力が必須となるので、 PC を直接操作されてもそのまま利用する事はできません。
また、鍵を2つ作成する理由ですが、メインで使用する鍵はこの端末でしか利用できないため、万が一に備えて、パスフレーズ付きの秘密鍵でも復号できるようにしています。(AWS 側で再発行できるなどの理由で)不要であれば2つ目の鍵は不要です。今回は追加したので、どちらの鍵も使えるよう age recipient ファイルを作っておきます:
# なお、保存先は ~/.passage/store ではなく ~/.aws/vault とする。
mkdir -p ~/.aws/vault
chmod 0700 ~/.aws/vault
# それぞれの公開鍵から recipient ファイル作成
{
age-keygen -y ~/.passage/identities
age-keygen -y /tmp/identities.raw
} > ~/.aws/vault/credentials/.age-recipients
# 2つ目の生の鍵は削除
/tmp/identities.raw
あとは aws-vault に設定するだけです。コマンドオプションでも設定できますが、毎回入力するのは大変なので環境変数を使います。私はログインシェル以外でも使いたいので .zshenv に定義しました。
AWS_VAULT_BACKEND=passage
AWS_VAULT_PASS_PASSWORD_STORE_DIR=/Users/issei/.aws/vault
AWS_VAULT_PASS_PREFIX=credentials
こうすると、IAM の永続キーや SSO の OIDC トークン、STS から取得したセッショントークンが先ほど作った鍵で暗号化された上でファイルとして格納されます。
トークンを取り出す時は常に生体認証(私は Apple Watch を使っています)が使え、大変体験が良くなりました。
なお、 ~/.aws/vault/credentials には .age-recipients がある為、自動的にこのファイルを使って暗号化が行われます。特定の鍵単体で暗号化を行うのではなく、登録されている鍵のどれでも復号できるようになります。もし端末を変えた場合はパスフレーズ付きの鍵の方で復旧を行います(手順は割愛)。
さらに発展させた運用
余談ですが、aws-vault 本体に feat: support separate session keyrings and Passage identity files と言うプルリクを送っています。今回紹介した passage 連携において更に使いやすくする為の機能を追加しています。こちらはつい最近マージされたので、この機能を使った運用の紹介を次回しようと思います。
おまけ: 1Password が最初の候補だったが諦めた
1Password も aws-vault の backend として使えます。要件も十分なのですが、配置先がクラウドなので遅いです。個人的には割と耐えられない速度感だったので採用しませんでした。興味ある方は
クラスメソッドさんが記事書いてるのでそちらへ。
- 最近では Identity Center の利用が主流になってきて永続的なクレデンシャルを使うことも減ってきましたが、執筆時の2026年10月時点でデフォルトの
aws ssoコマンドは OIDC トークンを平文でローカルに保存する為、まだまだ aws-vault の役目は終わっていなそうです(それ以前にaws-vault execやaws-vault loginがかなり便利なので仮に平文問題が解決しても使い道はある)。
また、aws-vault は一時期開発が停滞していたのですが org が ByteNess に変わってからはまた頻繁にメンテや機能追加などされる様になりました。 ↩︎ - pass の age バックエンドバージョン (pass は GnuPG バックエンド)。ちなみにどっちもただの bash スクリプトで、ファイルシステムを使った秘密ストレージツールです。 ↩︎
biometricsオプションがありますが、こちらは keyring を開ける時にしか使えず、item の読み書きには引き続きパスコードの入力が必要です。 ↩︎- 余談ですが、 Secure Enclave を使ってSSH の鍵を生成する事も可能です。https://www.mizdra.net/entry/2026/08/07/101542 ↩︎
コメントを残す