概要
HashiCorp Vaultのデフォルトのログインはトークンですが、これだと漏れた時など管理しにくいのでAWSのIAMユーザ情報を元にログインできるようにします。
前提
ログインするメンバーはAWSのIAMユーザを持つ
環境
- Vault 0.10.3
IAM Roleの作成
EC2上に起動してるVault ServerがIAMリストにアクセスできるよう、IAM Roleを作成します。
分かりやすくvault
と言う名前にしましょう。
arnはarn:aws:iam::{AWSアカウントID}:role/vault
となるはずです。
ポリシー
ドキュメントにある通りの権限を付与します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:GetRole", "ec2:DescribeInstances", "iam:GetInstanceProfile", "iam:GetUser" ], "Resource": "*" } ] }
信頼関係
EC2からのアクセスのみ許可します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
Vaultの設定
aws authを有効化します
$ vault auth enable aws
先程作ったIAM Roleを使うように設定します。
$ vault write auth/aws/config/client \ bound_iam_role_arn=arn:aws:iam::{AWSアカウントID}:role/vault
IAMユーザを登録します。
bound_iam_principal_arn
には自分のIAMユーザのarnを設定します。
$ vault write auth/aws/role/tsuji_jumpei \ auth_type=iam \ bound_iam_principal_arn=arn:aws:iam::{AWSアカウントID}:user/tsuji_jumpei \ policies=admin
policies
には前回作ったpolicyを使用しました。
動作確認
vaultはaws-sdk-goを使っているので、自分のIAMユーザで
- 環境変数
AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
を設定している ~/.aws/credentials
を持っている
のどちらかをしていれば認証できます。
また当然ですがログインに関してはvaultのpolicyは必要ないです(そもそもログインできていないのでpolicyの紐付けもできないので)
ではログインしてみます。
$ vault login -method=aws Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token. Key Value --- ----- token c3b9459c-30a2-eca7-6fcf-59bb2afa8559 token_accessor 2d9544ed-c5fd-7e98-9509-723813427bbb token_duration 768h token_renewable true token_policies ["admin" "default"] identity_policies [] policies ["admin" "default"] token_meta_auth_type iam token_meta_canonical_arn arn:aws:iam::{AWSアカウントID}:user/tsuji_jumpei token_meta_client_arn arn:aws:iam::{AWSアカウントID}:user/tsuji_jumpei token_meta_client_user_id xxxx token_meta_inferred_aws_region n/a token_meta_inferred_entity_id n/a token_meta_inferred_entity_type n/a token_meta_account_id AWSアカウントID
ログインできました。
クレデンシャルの設定が無いと
$ vault login -method=aws Error authenticating: failed to retrieve credentials from credential chain: NoCredentialProviders: no valid providers in chain. Deprecated. For verbose messaging see aws.Config.CredentialsChainVerboseErrors
のように怒られます。