背景
今後、Terraformを使っていくわけですが、調べていくとTerraformは公式にAssumeRoleへの対応をしていますが、MFAへの対応はされていないそうです。
また毎回、aws stsを利用して一時的なクレデンシャルを取得して作業は有効期限などあって大変だったり、通常 ~/.aws/credentials にアクセスキーを保存しますが、平文で保存しているためディスクが盗難にあった場合に少し怖わかったりと管理方法に懸念事項があります。
aws-vault は KeyChain にアクセスキーを保存するので、ディスクが暗号していない場合でも安心して使えます。ということで、aws-vaultをセットアップしてみました。
検証環境
- Microsoft Windows 10 Pro
- Git for windows 2.25.1
- aws-cli 2.0.3
- Chocolatey 0.10.15
- aws-vault v5.3.2
chocolateyをインストール
powershellを管理者権限で開いてインストール
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
aws-vaultをインストール
powershellでインストール
choco install aws-vault
確認
Git bashを開いている場合はアプリを再起動したのち、コマンドが実行できるか確認
$ choco --version
0.10.15
$ aws-vault --version
v5.3.2
configファイルを以下のように設定します。
検証環境はAssume Roleを設定していないのでコメントアウトしておきます。
$ vi ~/.aws/config
[default]
region = ap-northeast-1
[profile mfa]
region=ap-northeast-1
mfa_serial=arn:aws:iam::XXXXXXXXXXXX:mfa/test_ichimura # MFAしている端末
#role_arn=arn:aws:iam::XXXXXXXXXXXX:role/Role # Assume Roleを想定しているロール
source_profile=default
またaws configureするとできる~/.aws/credentialsは使わないので空にしておけばよいです。
以下のようになっていることを確認します。
$ aws s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
Access Keys、Secret Access Keyをaws-vaultに登録
この設定を行うことで、
credentialsにAccess Keys、Secret Access Keyを直接記述することは不要になります。
$ aws-vault add default
Enter Access Key ID: AKXXXXXXXXXXXXXXXXXX
Enter Secret Access Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Added credentials to profile "default" in vault
$ aws-vault exec mfa -- aws s3 ls
Enter token for arn:aws:iam::431708598374:mfa/test_ichimura: 689021
2020-03-26 18:16:37 cloudfrontcachetest1
$ aws-vault ls
Profile Credentials Sessions
======= =========== ========
default default -
mfa - 1585537646 (mfa)
登録するとwindows資格情報に情報が保存されます。
このため平文でcredentialファイルや環境変数にセットするなどの必要がないため安全です。
認証ができているか確認
AMIからEC2を作成するサンプルで試してみます。
provider "aws" {
region = var.region
}
resource "aws_instance" "example" {
ami = lookup(var.amis, var.region)
instance_type = var.instance_type
}
variable "region" {
description = "AWS region to host your network"
default = "us-east-1"
}
variable "instance_type" {
default = "t2.micro"
}
variable "amis" {
default = {
"us-east-1" = "ami-08fde2f5d23ea87aa"
}
}
$ aws-vault exec mfa -- terraform init
$ aws-vault exec mfa -- terraform plan
$ aws-vault exec mfa -- terraform apply
Acces keys、Secret Acceess keyを記述しなくても、MFA設定しているアカウントでEC2が作成できています。
余談
こちらaws-vaultにloginコマンドを使うとログインした状態でマネジメントコンソールが開きます。
$ aws-vault login default
これだけでも効率的ですね。
追記
IAMを扱う際はsession情報を渡さないように(--no-session)しないといけないと以下の現象になりました。
https://github.com/99designs/aws-vault/issues/260
aws-vault exec test_env --no-session -- terraform apply
参考
https://labs.septeni.co.jp/entry/2018/01/12/113000
https://tech.smartcamp.co.jp/entry/2019/03/13/113021
https://qiita.com/kangaechu/items/cb8f68e3866ee5af71c8