aws-vault とは
AWS の AK/SK を安全に保存・利用するための OSS ソフトウェアです。
OS の安全なキーストアに AK/SK を格納して管理することができます。
aws-vault は AWS の STS というサービスを利用し、GetSessionToken または AssumeRole API コールを介して一時的な Credential を生成して使用します。
これは短時間で失効するため、Credential が漏えいするリスクが低減されます。
aws-vault のインストール
MacOS の Homebrew を使用する場合は以下のコマンドを使ってインストールします。
$ brew install --cask aws-vault
他にも Windows 等の環境に合わせたインストール方法があるので、自身の環境に合わせた方法でインストールしてください。
IAM ユーザ作成
IAM リソースの作成権限をもつ IAM ユーザで AWS コンソールへログインします。
IAM のサービス画面へ移動して、<ユーザー>タブから<ユーザーの追加>をクリックします。
任意のユーザー名を入力し、AK/SK(AccessKey と SecretAccessKey)の作成のため、<アクセスキー - プログラムによるアクセス>の項目をチェックしてください。
<次のステップ>をクリックします。
<既存のポリシーを直接アタッチ>を選択し、”AdministratorAccess”のポリシーを選択してアタッチします。
※あらかじめ Terraform で作成したいリソースが決まっている場合は最低限の権限を持つポリシーを作成するのがベストプラクティスです。(あまりそういったケースはないでしょう)
最後の確認画面まで<次のステップ>をクリックします。(タグの作成は任意です)
最後に<ユーザーの作成>をクリックします。
ユーザが作成されたら AK/SK の情報を控えておきます。
MFA 設定
先ほど作成した IAM ユーザへ MFA 設定を行います。
MFA は人によって使用する MFA デバイスが異なりますし、
まさか AWS を使用していて Root ユーザに MFA 設定をしたことがない不届き者はいないと思いますので詳細な手順は割愛します。
好きな方法で MFA 設定をしてください。
MFA 設定ができたら MFA デバイスの ARN(arn:aws:iam::<アカウント ID>:mfa/<IAM ユーザー名> )を控えておきます。
ちなみに MFA 設定をしないと aws-vault を使用して作成した一時的な Credential を使用して IAM リソースの作成ができません。
aws-vault 設定 (IAM ユーザ)
PC のターミナルを開き、以下のコマンドを実行します。
IAM ユーザ作成時に控えておいた AK/SK の情報を入力します。
sample の部分は任意の Credential 名です。
$ aws-vault add sample
Enter Access Key ID: XXXXXXXXXXXXXXXXXXXX
Enter Secret Access Key:
Added credentials to profile "sample" in vault
その後、以下のコマンドを実行し、”~/.aws/config” を編集します。
上記の作業によって profile が追加されているはずです。
mfa_serial を追加して MFA 設定時に控えておいた MFA デバイスの ARN を入力します。(下記は例です)
$ vi ~/.aws/config
[profile sample]
region=ap-northeast-1
output=json
mfa_serial=arn:aws:iam::000000000000:mfa/Terraform
これで IAM Credential の設定は完了です。
動作確認(CLI 実行)
以下のコマンドを実行します。
sample は上記の IAM ユーザの aws-vault 設定で指定した Credential 名と同じです。
Mac の場合はキーチェーンのパスワードを求められるので入力します。
MFA を求められるので MFA コードを入力します。
$ aws-vault exec sample
Enter MFA code for arn:aws:iam::000000000000:mfa/Terraform:
認証が成功したら(特に成功した旨のメッセージは出ないです)
適当な AWS CLI を実行してみましょう。
設定に問題なければ実行できるはずです。
例
$ aws s3 ls
2022-08-12 19:09:19 bucket-xxxxxxxxxx
2022-08-25 16:38:47 bucket-yyyyyyyyyy