LoginSignup
5
1

More than 1 year has passed since last update.

aws-vaultでTerraform環境を安全に使う

Last updated at Posted at 2021-08-16

背景

今後、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を作成するサンプルで試してみます。

aws.tf
provider "aws" {
  region = var.region
}

resource "aws_instance" "example" {
  ami = lookup(var.amis, var.region)
  instance_type = var.instance_type
}

variables.tf
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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1