AWS SSO管理者がユーザーの作成するIAMロールの権限を制限する方法

AWS SSO 管理者が AWS アカウント利用者に対して、 IAM ロールを作成する際に指定したポリシーを Permissions Boundary に割り当てることを強制することで権限を制限する方法を紹介します。
2022.02.21

ユーザーを一元的に管理する AWS SSO の管理者と AWS アカウントの利用者が分かれている場合に、利用者が IAM ロール 作成時に付与できる権限を制限したい場合があります。

本ブログでは、利用者に対して IAM ユーザーの作成を禁止する次のシナリオを想定し、解決策の一つとして Permissions boundary を用いて IAM ロール作成時に付与できる権限を制限する方法を紹介します。

  • AWS SSO 管理者がユーザーを一元的に管理する
  • AWS SSO 管理者は利用者にユーザーを払い出し、IAM ユーザーの作成権限は与えない
  • AWS SSO 管理者は利用者に対して IAM ロールの作成を許可するが、IAM ユーザーを作成する権限の付与は許可しない


実現イメージ

AWS SSO 管理者は AWS アカウントに IAM ユーザーの作成を禁止した Permissions boundary 用のポリシーを作成しておき、AWS アカウント利用者が Permissions boundary 用ポリシーがアタッチされていない IAM ロールを作成することを禁止することで実現します。


設定するポリシー

Permissions boundary 用ポリシーとアクセス権限セットのポリシーを説明します。

なお、今回設定するポリシーは動作テスト用に作成していますので、本番環境では適切な設定をご検討ください。

Permissions boundary 用ポリシー

設定しているポリシーの概要は次の通りです。

  • 全てのアクションを許可
  • IAM ユーザーと IAM グループの作成、更新、削除を禁止
  • 指定した Permissions boundary を設定していない IAM ロールの作成禁止
  • 指定した Permissions boundary を IAM ロールから削除することを禁止
  • 指定した Permissions boundary のポリシーの更新、削除を禁止
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:CreateUser",
                "iam:CreateLoginProfile",
                "iam:CreateAccessKey",
                "iam:UpdateUser",
                "iam:DeleteUser",
                "iam:CreateGroup",
                "iam:UpdateGroup",
                "iam:DeleteGroup",
                "iam:AddUserToGroup",
                "iam:RemoveUserFromGroup",
                "iam:AttachUserPolicy",
                "iam:DetachUserPolicy",
                "iam:PutUserPolicy",
                "iam:DeleteUserPolicy",
                "iam:AttachGroupPolicy",
                "iam:DetachGroupPolicy",
                "iam:PutGroupPolicy",
                "iam:DeleteGroupPolicy"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:CreateRole",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:PutRolePermissionsBoundary"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam::111122223333:policy/test-permissions-boundary"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:DeleteRolePermissionsBoundary"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam::111122223333:policy/test-permissions-boundary"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:CreatePolicyVersion",
                "iam:DeletePolicy",
                "iam:DeletePolicyVersion",
                "iam:SetDefaultPolicyVersion"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:policy/test-permissions-boundary"
            ]
        }
    ]
}

全てのアクションを許可するルールを入れている理由は、Permissions boundary と Identity-based policy の両方で許可されているアクションの権限が与えられるためです。Permissions boundary が Deny のルールだけでは全てのアクションが拒否されてしまいます。

引用元:Permissions boundaries for IAM entities - AWS Identity and Access Management

AWS SSO アクセス権限セット

AWS SSO のアクセス権限セットに設定するポリシーを説明します。

今回の例では、アクセス権限セットには次の 2 つのポリシーをアタッチします。

  • AWS 管理ポリシー「AdministratorAccess」
  • カスタムアクセス権限ポリシー

カスタム権限ポリシーは Permissions boundary から全てのアクションを許可するルールを除いたものと同様としています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "iam:CreateUser",
                "iam:CreateLoginProfile",
                "iam:CreateAccessKey",
                "iam:UpdateUser",
                "iam:DeleteUser",
                "iam:CreateGroup",
                "iam:UpdateGroup",
                "iam:DeleteGroup",
                "iam:AddUserToGroup",
                "iam:RemoveUserFromGroup",
                "iam:AttachUserPolicy",
                "iam:DetachUserPolicy",
                "iam:PutUserPolicy",
                "iam:DeleteUserPolicy",
                "iam:AttachGroupPolicy",
                "iam:DetachGroupPolicy",
                "iam:PutGroupPolicy",
                "iam:DeleteGroupPolicy"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:CreateRole",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:PutRolePermissionsBoundary"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam::111122223333:policy/test-permissions-boundary"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:DeleteRolePermissionsBoundary"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam::111122223333:policy/test-permissions-boundary"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:CreatePolicyVersion",
                "iam:DeletePolicy",
                "iam:DeletePolicyVersion",
                "iam:SetDefaultPolicyVersion"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:policy/test-permissions-boundary"
            ]
        }
    ]
}


設定方法

設定してみます。

まず、利用者に権限を与える AWS アカウントに Permissions boundary 用ポリシーを作成します。作成方法はカスタマー管理ポリシーを作成するときと同様です。

ポリシーの名前は「test-permissions-boundary」としました。

次に、AWS SSO のアクセス権限セットとして「TestAccess」を作成しました。

AWS 管理ポリシーにおいて「AdministratorAccess」を選択し、カスタムアクセス権限ポリシーを設定します。

作成したアクセス権限セット「TestAccess」をグループ(ユーザー)に割り当てます。

以上で設定は完了です。

ここからは動作を確認します。

アクセス権限セット「TestAccess」でサインインしたテスト用ユーザーで IAM ユーザーを作成してみたところ、ポリシー通り IAM ユーザーの作成は拒否されました。

次に、Permissions boundary として「test-permissions-boundary」をアタッチしていない状態で IAM ロールを作成してみます。

作成を拒否されました。

Permissions boundary として「test-permissions-boundary」をアタッチして IAM ロールを作成してみます。

作成に成功しました。

動作確認のために作成した IAM ロールの信頼関係を編集し、スイッチロールして IAM ユーザーを作成できるか確認してみます。

同一アカウント内のスイッチロールの設定は次のブログを参照ください。

意図した通り、IAM ユーザーの作成が拒否されました。

AWS アカウントの利用者が作成した IAM ロールにおいても IAM ユーザーの作成を禁止できていることを確認できました。


さいごに

AWS SSO 管理者が AWS アカウント利用者の作成する IAM ロールの権限を制限する方法を紹介しました。

各 AWS アカウントで事前に Permissions boundary 用の IAM ポリシーを作成しておく必要があるため、実際に活用するときは CloudFormation で作成を自動化する等の検討も必要になります。また、本ブログでは 1 つのアカウントに限定したポリシーになっているため、複数のアカウントに対して展開できるようにポリシーの検討も必要になりそうです。


参考資料

Permissions boundaries for IAM entities - AWS Identity and Access Management