CLIでAssumeRoleしてみる

Assume Roleについてなんとなく理解はしているつもりでしたが、 手元で動かしたことはなかったのでCLIでAssume Roleをしてみて理解を深めようと思います。

Assume Roleとは?

Returns a set of temporary security credentials that you can use to access AWS resources. These temporary credentials consist of an access key ID, a secret access key, and a security token. Typically, you use AssumeRole within your account or for cross-account access.
AWSのリソースにアクセスするための一時的なセキュリティ認証情報を返します。 これらの一時的な認証情報は「access key ID」「 secret access key」「security token」で構成されています。一般的にあなたのアカウントやクロスアカウントへのアクセスでAssumeRoleを使います。

docs.aws.amazon.com

つまりAssumeRoleとは、AWSのリソースにアクセスするための一時的なクレデンシャルを返す仕組みです。

動かしてみる

今回下記のような状況を想定してAssumeRoleしてみます。

  • とあるIAMユーザ(以下IAMユーザAとします)は自身のAWSアカウント内で、Action iam:ListPoliciesの実行が許可されていません。そのため aws iam list-policiesを実行しても失敗します。
  • IAMユーザAがiam:ListPoliciesの実行が許可されているIAMロールのAssumeRoleを実行し、一時的なクレデンシャルを受け取り、それを使用してaws iam list-policiesを実行します。

それでは必要なIAMポリシーやIAMロールをTerraformで作成していきます。

IAMポリシーとロールの作成

iam:ListPoliciesを許可するポリシーを作成します。

# iam:ListPoliciesを許可するポリシーのドキュメント
data "aws_iam_policy_document" "iam-list-policies-policy-document" {
  statement {
    sid = "IamListPoliciesPolicyDocument"
    effect = "Allow"
    actions = [
      "iam:ListPolicies"
    ]
    resources = ["*"]
  }
}

# iam:ListPoliciesを許可するポリシー
resource "aws_iam_policy" "iam-list-policies-policy" {
  name = "iam-list-policies-policy"
  policy = data.aws_iam_policy_document.iam-list-policies-policy-document.json
}

次にIAMロールの作成です。 次のポリシードキュメントは、作成するIAMロールを誰がAssumeRoleすることができるかを書いたものです。

# 誰にロールを引き渡すかを書いたポリシー
data "aws_iam_policy_document" "iam-test-role-policy-document" {
  statement {
    sid = "IamTestRolePolicyDocument"
    effect = "Allow"
    actions = [
      "sts:AssumeRole"
    ]
    principals {
      type = "AWS"
      identifiers = ["arn:aws:iam::000000000000:user/user_a"]
    }
  }
}

上記ポリシーを持ったIAMロールを作成します。

# ロールの作成
resource "aws_iam_role" "iam-list-policies-role" {
  name = "iam-test-role"
  assume_role_policy = data.aws_iam_policy_document.iam-test-role-policy-document.json
}

初めに作成したiam:ListPoliciesを許可するポリシーを上記IAMロールにアタッチします。

# ロールに`iam:ListPolicies`を許可するポリシーをアタッチ
resource "aws_iam_role_policy_attachment" "iam-list-policies-role-iam-list-policies-policy-attachment" {
  role       = aws_iam_role.iam-list-policies-role.name
  policy_arn = aws_iam_policy.iam-list-policies-policy.arn
}

以上でIAMユーザAがiam:ListPoliciesの実行可能なIAMロールiam-test-roleをAssumeRoleすることが可能になりました。

AWS CLIからAssumeRoleしてみる

初めにIAMユーザAで下記コマンドを実行してみます。

aws iam list-policies --profile user_a

ユーザAはiam:ListPoliciesが許可されていないので失敗します。

An error occurred (AccessDenied) when calling the ListPolicies operation〜

それでは次にIAMユーザAでAssumeRoleしてみます。 --role-session-nameは任意の文字列です。

aws sts assume-role --role-arn arn:aws:iam::000000000000:role/iam-test-role --role-session-name hoge --profile user_a

すると下記のように一時的なクレデンシャルが返却されます。

{
    "Credentials": {
        "AccessKeyId": "WWWWWWWWWW",
        "SecretAccessKey": "xxxxxxxxxx",
        "SessionToken": "yyyyyyyyyy",
        "Expiration": "2023-11-03T15:10:06+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "ZZZZZZZZZZ:hoge",
        "Arn": "arn:aws:sts::000000000000:assumed-role/iam-test-role/hoge"
    }
}

これを環境変数にセットして

export ACCESS_KEY_ID=WWWWWWWWWW
export SECRET_ACCESS_KEY=xxxxxxxxxx
export SESSION_TOKEN=yyyyyyyyyy

下記コマンドを実行すると、今回は成功しました!

aws iam list-policies

AssumeRoleしている状態を抜ける場合は、環境変数を破棄します。

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

AssumeRoleを用いて、許可されていないアクションを実行する流れを確認することができました。