この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ユーザーを一元的に管理する 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