AWS SSO管理者がユーザーの作成するIAMロールの権限を制限する方法
ユーザーを一元的に管理する 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