Zenn
🔑

AssumeRoleで特定のグループに属する人のみIAMの操作ができるようにする

2025/03/21に公開

やりたいこと

特定のIAMグループに属する人のみ、Assumeできるロールを作りたい

ユースケース

このグループに属している人のみ、IAM関連の設定ができる
このグループに属している人のみ、Aプロダクトに関連するAWSリソースの設定ができる
などなど

やり方

「このグループに属している人のみ、IAM関連の設定ができる」を例に

作るもの

IAMグループ

IAMの操作のみを許可するグループを作る(iam-admin)

IAMロール

①権限用IAMロール(iam-operation-auth-role)
実行用IAMロールをAssumeするための権限用ロール
②実行用IAMロール(iam-operation-role)
IAM周りの操作を行うための実行用ロール

ポリシー

①権限用IAMロールをAssumeするためのポリシー(iam-operation-auth-role-assume-policy)
②実行用IAMロールをAssumeするためのポリシー(iam-operation-role-assume-policy)
③IAM操作を許可するためのポリシー(iam-operation-policy)
※③はAWS管理のポリシーを使ってもOK

手順

STEP1: ポリシーを作成する

①権限用IAMロールをAssumeするためのポリシーを作成する
こんな感じ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "iam-operation-auth-role-assume-policy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/iam-operation-auth-role"
        }
    ]
}

②実行用IAMロールをAssumeするためのポリシーを作成する
こんな感じ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "iam-operation-role-assume-policy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/iam-operation-role"
        }
    ]
}

③IAM操作をするためのポリシーを作成する
こんな感じ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "iam-operation-policy",
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:ListPolicyVersions",
                "iam:ListInstanceProfilesForRole",
                "iam:ListRolePolicies",
                "iam:TagRole",
                "iam:UpdateRoleDescription",
                "iam:DeletePolicy",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:AttachRolePolicy",
                "iam:TagPolicy",
                "iam:CreatePolicy",
                "iam:DetachRolePolicy",
                "iam:ListAttachedRolePolicies",
                "iam:UpdateRole",
                "iam:UpdateAssumeRolePolicy",
                "iam:CreatePolicyVersion"
            ],
            "Resource": [
                "arn:aws:iam::<AWS_ACCOUNT_ID>:role/*",
                "arn:aws:iam::<AWS_ACCOUNT_ID>:policy/*"
            ]
        }
    ]
}

STEP2: IAMロールを作成する

①権限用IAMロール(iam-operation-auth-role)を作成する
■信頼関係
プリンシパルにIAMグループは指定できないので、rootを指定する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "iam-operation-auth-role-trust-policy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

■許可ポリシー
②実行用IAMロールをAssumeするためのポリシー(iam-operation-role-assume-policy)を付与する

これによって権限用IAMロール(iam-operation-auth-role)を持っていれば、実行用IAMロールを引き受けられるようになる

②実行用IAMロール(iam-operation-role)を作成する
■信頼関係
プリンシパルに①権限用IAMロール(iam-operation-auth-role)を指定することで、権限用IAMロールを持ったものでしか実行用IAMロールを引き受けることができないようにする

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "iam-operation-role-trust-policy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/iam-operation-auth-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

■許可ポリシー
③IAM操作をするためのポリシー(iam-operation-role-assume-policy)を付与する

これによって実行用IAMロール(iam-operation-role)を持っていれば、IAM操作ができるようになる

STEP3: IAMグループを作成する

IAM操作権限を付与したいユーザをこのグループに所属させる

■許可ポリシー
①権限用IAMロールをAssumeするためのポリシー(iam-operation-auth-role-assume-policy)を付与する

これによって、権限用IAMロールを引き受けることができ、その結果、実行用IAMロールを引き受け、IAM操作を行うことができる

なぜこんなに複雑になるのか

IAMロールの信頼ポリシーのPrincipalにはIAMグループを指定できないから
IAM ロールの信頼ポリシー (Trust Policy) の Principal には、IAM ユーザ、IAM ロール、AWS サービス、AWS アカウント (root) などを指定できるが、IAM グループは指定できない

なので特定のグループに属する人のみ実行できるロールを付与するケースでは
グループに権限用IAMロールをAssumeできるポリシーをアタッチし
その権限用IAMロールを持つIAMエンティティからのみAssumeが可能な実行用IAMロールを作成する必要がある

直接IAMグループにポリシーをアタッチすれば良くない?

✅ IAM グループに直接ポリシーをアタッチ
→ 永続的な権限を持つ(IAM ユーザーに直接適用)
→ IAM ユーザーが Identity Center へのアクセスを継続的に持つ
→ IAM ユーザーの権限管理が複雑になる可能性がある

✅ IAM ロールを使ったチェーン(AssumeRole を経由)
→ 一時的な権限で Identity Center への操作を許可
→ デフォルトの IAM ユーザーの権限を最小限に抑えられる
→ 特定の操作をするタイミングで権限を昇格させられる

項目 IAM グループに直接ポリシーをアタッチ IAM ロールチェーン (AssumeRole)
権限の持続性 常に Identity Center への権限を持つ 必要なときのみ一時的に権限を得る
セキュリティ 不要なときでも権限があるためリスクがある 必要なときだけ AssumeRole できるため、最小権限の原則(PoLP)を適用しやすい
運用のしやすさ 一度設定すれば簡単だが、権限管理が難しい 多少手間だが、セキュリティが向上
MFA との組み合わせ IAM グループに MFA を強制するのが難しい AssumeRole 時に MFA を要求できる
セッション管理 永続的な権限 AssumeRole で取得した一時的な権限(最大 12 時間)

「実行したいときはスイッチロールして行ってね」の運用の方がセキュリティ的には良さそう

やってみたがロールチェーンできない問題に直面

AWSマネジメントコンソールでは、スイッチロールを多段で実行できないらしい
https://repost.aws/ja/knowledge-center/iam-role-chaining-limit

解決策

マルチセッションサポートをオンにするといける
https://docs.aws.amazon.com/ja_jp/awsconsolehelpdocs/latest/gsg/multisession.html

Discussion

ログインするとコメントできます