💡 本文所述所有 “SSO” 均指代 “AWS IAM Identity Center”
背景描述
下图展示了多租户 ECAM 模型的结构(End customer account model)
参考文档 —— AWS 合作伙伴如何确定组织中的 AWS 支持计划: How AWS Partners can determine AWS Support plans in an organization | AWS Cloud Operations & Migrations Blog
在多租户 ECAM 架构下,成员账户只能创建 SSO 账户实例。在 SSO 账户实例中,只能创建用户、用户组、应用程序。在账户实例中创建的用户只能访问特定的 SAML 2.0 或 OAuth 2.0 应用程序。
仅在 Payer 的 SSO 实例中可以进行 SSO 权限集 (PermissionSet) 的管理,允许 SSO 用户登录进 AWS 控制台,并通过 IAM Policy 限制其访问权限。
下图展示了 SSO 组织实例和账户实例的控制台的区别(左为组织实例,右为账户实例)
参考文档 —— IAM Identity Center 的账户实例: IAM身份中心的账户实例 - AWS IAM Identity Center
实现手段
参考文档 —— 在 AWS IAM Identity Center 中委托权限集管理和帐户分配: Delegating permission set management and account assignment in AWS IAM Identity Center | AWS Security Blog
在 Payer 中创建一个 IAM Policy,授予目标 IAM 实体对于 SSO、Organization 等的读取权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSSSOReadOnly",
"Effect": "Allow",
"Action": [
"iam:ListPolicies",
"organizations:DescribeOrganization",
"organizations:DescribeAccount",
"organizations:ListParents",
"organizations:ListChildren",
"organizations:ListAccounts",
"organizations:ListRoots",
"organizations:ListAccountsForParent",
"organizations:ListOrganizationalUnitsForParent",
"organizations:ListDelegatedAdministrators",
"sso:Describe*",
"sso:Get*",
"sso:List*",
"sso:Search*",
"sso-directory:DescribeDirectory",
"access-analyzer:ValidatePolicy",
"signin:ListTrustedIdentityPropagationApplicationsForConsole"
],
"Resource": "*"
},
{
"Sid": "PermissionSet",
"Effect": "Allow",
"Action": [
"sso:CreatePermissionSet",
"sso:DeletePermissionSet",
"sso:ProvisionPermissionSet",
"sso:AttachManagedPolicyToPermissionSet",
"sso:AttachCustomerManagedPolicyReferenceToPermissionSet"
],
"Resource": "arn:aws:sso:::permissionSet/<ssoins-1234567abcdefg>/<ps-1234567abcdefg>"
},
{
"Sid": "UserAndGroup",
"Effect": "Allow",
"Action": [
"sso-directory:DescribeUsers",
"sso-directory:DescribeUser",
"sso-directory:SearchUsers",
"sso-directory:CreateUser",
"sso-directory:DeleteUser",
"sso-directory:EnableUser",
"sso-directory:DisableUser",
"sso-directory:UpdateUser",
"sso-directory:UpdateUserName",
"sso-directory:UpdateMfaDeviceForUser",
"sso-directory:DeleteMfaDeviceForUser",
"sso-directory:ListGroupsForUser",
"sso-directory:ListMfaDevicesForUser",
"sso-directory:GetUserPoolInfo",
"sso-directory:DescribeUserByUniqueAttribute",
"sso-directory:DescribeGroups",
"sso-directory:ListGroupsForMember",
"sso-directory:SearchGroups",
"sso-directory:CreateGroup",
"sso-directory:DescribeGroup",
"sso-directory:IsMemberInGroup",
"sso-directory:ListMembersInGroup",
"sso-directory:AddMemberToGroup",
"sso-directory:DeleteGroup",
"sso-directory:RemoveMemberFromGroup",
"sso-directory:UpdateGroup",
"sso-directory:UpdateGroupDisplayName"
],
"Resource": ""
},
{
"Sid": "CreateAccountAssignment",
"Effect": "Allow",
"Action": [
"sso:CreateAccountAssignment",
"sso:DeleteAccountAssignment"
],
"Resource": [
"arn:aws:sso:::instance/<ssoins-1234567abcdefg>",
"arn:aws:sso:::permissionSet/<ssoins-1234567abcdefg>/*",
"arn:aws:sso:::account/<linked-account-id>"
]
}
]
}
在 Payer 中创建一个 IAM Role 给 LinkedAccount,并将刚才创建的 Policy 附加给 Role:
LinkedAccount 通过 SwitchRole 登陆进 Payer 的 AWS Console,他将可以实现以下操作:
-
AWS SSO 只读操作 (AWSSSOReadOnly):
- 列出 IAM 策略(对于权限集设置非常重要)
- 查看组织结构和账户信息
- 查看和搜索 SSO 相关信息
- 描述 SSO 目录
- 验证策略
- 列出可信身份传播应用程序
-
权限集管理 (PermissionSet):
- 创建、删除和配置权限集
- 将托管策略和客户管理的策略附加到权限集
此处可以根据实际需求,添加条件以限制这个 IAM 实体仅能更新某几个权限集。 但前提是需要先将权限集创建出来,才能拿到 arn 来限制更新权限集的范围。
-
用户和组管理 (UserAndGroup):
- 创建、删除、启用、禁用和更新用户
- 管理用户的MFA设备
- 创建、删除和更新组
- 管理组成员
- 查看和搜索用户和组信息
-
账户分配管理 (CreateAccountAssignment):
- 创建和删除账户分配(仅限于特定的 SSO 实例、权限集和链接账户)
方案限制
- AWS 的 List 操作没办法使用 Resource/Condition 限制范围,因此带来以下问题:
- 客户可以看到组织内所有 AWS Account 信息:
- 名称
- ID
- ARN
- 电子邮件
- 加入时间
- 如果有其他人在使用 Payer SSO,客户可以看到其他人的 SSO 用户/用户组/权限集
- 无法限制客户仅对某几个 SSO 用户/用户组进行操作,因为 SSO 用户/用户组没有 arn 也不能打 tag,因此没办法使用 Resource/Condition 进行限制
- 可以考虑移除 Policy 中 Delete/Update User/UserGroup 的操作,最大程度保证同时多家客户使用 Payer SSO 时的最低安全性
- 可以使用 Resource 限制客户仅能更新某几个权限集:
- 前提是必须先创建出权限集,再修改 IAM Policy
- 所以创建权限集的操作必须由 Payer 的管理员先进行,再允许客户 Update 权限集
- 无法限制客户仅对某几个 SSO 用户/用户组进行操作,因为 SSO 用户/用户组没有 arn 也不能打 tag,因此没办法使用 Resource/Condition 进行限制
- 客户可以看到组织内所有 AWS Account 信息: