Carpe Diem

備忘録

IAMユーザを持っていたらVaultにログインできるようにする

概要

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を使用しました。

christina04.hatenablog.com

動作確認

vaultはaws-sdk-goを使っているので、自分のIAMユーザで

  1. 環境変数AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを設定している
  2. ~/.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

のように怒られます。

ソース