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を使います。
つまり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を用いて、許可されていないアクションを実行する流れを確認することができました。