🔐

aws-vault について

2023/12/06に公開

この記事は Systemi(株式会社システムアイ) Advent Calendar 2023 の6日目の記事です。

https://qiita.com/advent-calendar/2023/systemi23

これはなに?

aws-vaultというAWSの認証情報を安全にローカルに保管し、コマンドラインで使用できるツールがあるので、その紹介や使い方、ここが良かったよといった内容の記事です。
前提として macOS で利用しているため、その他のOSだとうまくいかないことがあるかもしれません。

aws-vault
https://github.com/99designs/aws-vault

aws-vaultとは?

すでにいくつも紹介されているサイトがありますので詳しくは省きますが、
AWSの認証情報を安全に取り扱い、またコマンドラインで使いやすいツールです。

aws-cli を使ってAWSに接続する際、以下のようなコマンドで認証情報を登録できます。
ただ登録された認証情報は平文でローカルに保存されています。

aws configure --profile hoge

登録した認証情報は以下のディレクトリにcredentialsという名称で保存されています。

cd ~/.aws
ls -l
.rw------- kawairyo staff 1.4 KB Fri Jun  9 15:10:16 2023 config
.rw------- kawairyo staff 342 B  Fri Jun  9 14:43:57 2023 credentials

中身はこんな感じで保存されています。

❯ cat ~/.aws/config
[hoge]
region=ap-northeast-1
output=json

❯ cat ~/.aws/credentials
; https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html
[hoge]
aws_access_key_id = *********************
aws_secret_access_key = *********************

config の方に AWS コマンド接続時の設定、credentials の方に ACCESS_KEY_ID と SECRET_ACCESS_KEY が保存されています。

この credentials の内容を各 OS が備わっている鍵管理システム側で保管し、透過的に使用できるのが aws-vault となります。(管理システムは任意のものも使えます)

対応済み鍵管理システム:https://github.com/99designs/aws-vault#vaulting-backends

平文だと何が危険か

ローカルマシンに保存されているファイルなので安全に見えますが

  • 他人が勝手に使用される
  • 悪意のあるソフトウェアによって読み取られ外部の第三者に送られる

など、平文であることで生じる危険性はいくつもあります。
参考:https://www.scsk.jp/sp/sysdig/blog/container_security/aws.html

そういった脅威にさらされても暗号化してあれば 2 次被害は軽減できます。

aws-vault のインストール方法

aws-vault は各種パッケージマネージャーで提供されているためインストールは楽だと思います。

macOS

brew install --cask aws-vault

Windows

choco install aws-vault
scoop install aws-vault

Other

こちらから直接ダウンロードしてインストールも可能です。
https://github.com/99designs/aws-vault/releases

そのほかのインストールはこちらに記載があります。
https://github.com/99designs/aws-vault#installing

使い方

正常にインストールできたら認証情報の登録などしていきます。

認証情報の登録(add)

認証情報の登録は下記のようなコマンドで実行します。(aws configure と似て、プロファイル名を指定します)

aws-vault add hoge

~/.aws/config 内のプロファイル名と一致させる必要があります。

登録情報の確認(list)

情報が登録されると次のコマンドで以下のように登録状況を確認できます。

❯ aws-vault list
Profile                  Credentials              Sessions
=======                  ===========              ========
default                  default                  -
hoge                     hoge                     -

aws-vault を使った接続・操作(exec)

aws-vault の認証情報を使用して AWS に接続する場合は以下のコマンドで実行します。
(実行時に鍵管理システムからマスターパスワードの入力を求められます。)

aws-vault exec [credential name] -- [command] ...

aws-vault exec hoge -- aws s3 ls

接続ができた場合は ~/.aws/credentials ファイルの内容は削除してよいでしょう。

exec で任意のコマンド実行時に AWS の認証情報を展開した上で実行することができます。
行っている事自体はコマンド実行時に環境変数に AWS の認証情報を付与しているだけです。

❯ aws-vault exec hoge -- env | grep -e "AWS"
AWS_VAULT=hoge
AWS_REGION=ap-northeast-1
AWS_DEFAULT_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=*******************
AWS_SECRET_ACCESS_KEY=*******************
AWS_SESSION_TOKEN=*******************

またコマンドを指定しない場合は sub shell が起動されます。"aws-vault exec 〜" を毎回入力するのが煩わしい場合はこちらの方法もいいでしょう。

例(ちょっとプロンプトに色々付加されちゃってますが)

~ on ☁️  (ap-northeast-1)
❯ aws-vault exec hoge
Starting subshell /bin/zsh, use `exit` to exit the subshell

~ on ☁️  hoge (ap-northeast-1) [57m9s]

AWS 認証情報を削除(remove)

不要になった認証情報は以下のコマンドで削除できます。

aws-vault remove hoge

※戻せないので気をつけてください。

アクセスキー、シークレットアクセスキーのローテーション(更新)

セキュリティ要件などでアクセスキーを一定間隔で更新する必要がある場合は次のコマンドで処理できます。

aws-vault rotate hoge

その他のテクニック

aws コマンドでも同じ様にしたい(credential_process)

~/aws/config に credential_process を加えることで、aws-vault で使うのと同じ様に鍵管理システムから認証情報を用いて接続できます。

~/.aws/config

[hoge]
region=ap-northeast-1
output=json
credential_process = aws-vault export --format=json hoge

credential_process で認証処理をバイパスできます。
処理内容としては aws-vault でプロファイルを指定し、認証情報を環境変数に展開するために "export" コマンドを実行しています。(読み取れるように JSON で展開)

これを記載することで、aws コマンドでも aws-vault と同様のことができるようになります。

aws s3 ls --profile hoge

MFA(2段階認証)を利用する場合

awsコマンドの認証時にMFAを利用する場合は ~/.aws/config の対象プロファイルに mfa_serial を加えることで、aws-vault利用時にMFAでの認証も処理できるようになります。

~/.aws/config

[hoge]
region=ap-northeast-1
output=json
mfa_serial = arn:aws:iam::111111111111:mfa/hoge

mfa_serial には、AWSのマネジメントコンソールで登録したMFA鍵のARNを指定します。

これを記載することで、aws-vault実行時にMFAのコード入力が聞かれるようになります。

都度マスターパスワードを入力したくない

認証情報のセッションが切れると都度マスターパスワードを入力する必要があります。
それが煩わしい場合は aws-vault のオプション "--no-session" を用いることで回避できます。

aws-vault exec hoge --no-session -- ...

またセッション時間の指定も可能です。

aws-vault exec hoge --duration=2h

ただ漏洩時のリスクは上がるので、基本的にはセッションを用いるほうがよいでしょう

良かった点

こんなところですかね。
使用してよかった点は

  • 認証情報が一元管理されているため、どの情報か把握しやすい
  • 環境変数が自動展開されるため、terraform など使うときに便利
  • 平文で保存していないことの安心感がある(案件で使用している場合)

逆に不安なところは

  • OS のキーマネージャーに依存しているのでバックアップなどが不安

ですかね。
鍵のローテーションなどもあるのですが、まだ使用して時間が経っていないので、
その辺りも必要になったら記事をアップデートしようと思います。

Discussion