作者:David Rowe 和 Valentine Reid发布时间:2023 年 11 月 29 日分类: 高级 最佳实践 安全、身份和合规性 技术操作指南永久链接 评论 分享
在组织扩展其 Amazon Web Services (AWS) 环境并将工作负载迁移到云时,往往会涉及到多个 AWS 身份与访问管理 (IAM) 角色和策略。由于 IAM 在保护和控制对 AWS 资源的访问中扮演着重要角色,这些角色和策略会不断增加。想象一下,你有一个团队正在创建一个应用程序。你创建一个 IAM 角色来授予他们访问必要 AWS 资源的权限,例如 Amazon 简单存储服务 (Amazon S3) 存储桶、Amazon 密钥管理服务 (Amazon KMS) 密钥和 Amazon 弹性文件服务 (Amazon EFS) 分享。随着工作负载的增加和新的数据访问模式,IAM 角色和策略的数量自然会增加。随着资源和数据访问模式的复杂性增加,简化访问权限和管理 IAM 策略与角色变得至关重要。
在本博文中,我们将介绍如何使用 IAM 路径 来组织 IAM 策略和角色,并提供可以作为你自己用例基础的示例。
当你创建角色或策略时,会使用默认路径。在 IAM 中,资源的默认路径是“/”。你可以通过 创建并使用嵌套路径作为结构 来管理 IAM 资源。以下示例演示了一个名为 S3Access 的 IAM 角色,其路径为 developer:
arnawsiam111122223333role/developer/S3Access
服务链接角色创建在保留路径 /awsservicerole/ 下。以下是服务链接角色路径的示例:
arnawsiamrole/awsservicerole/SERVICENAMEamazonawscom/SERVICELINKEDROLENAME
以下示例展示了一个名为 S3ReadOnlyAccess 的 IAM 策略,其路径为 security:
arnawsiam111122223333policy/security/S3ReadOnlyAccess
通过在 角色 和 策略 中使用 IAM 路径,可以创建分组并设计逻辑分隔以简化管理。你可以使用这些分组向团队授予访问权限、委托权限,并控制可以传递给 AWS 服务的角色。接下来的部分将通过引用一家虚构公司及其 AWS 资源的扩展来说明如何使用 IAM 路径创建角色和策略的分组。
首先,要创建具有路径的角色和策略,你可以使用 IAM API 或 AWS 命令行界面 (AWS CLI) 运行 aws clicreaterole。
以下是创建 IAM 路径中角色的 AWS CLI 命令示例:
aws iam createrole rolename ltROLENAMEgt assumerolepolicydocument file//assumeroledocjson path ltPATHgt
将命令中的 ltROLENAMEgt 和 ltPATHgt 替换为你的角色名称和角色路径。使用与用例匹配的 信任策略 作为信任文档。以下是一个允许 Amazon Elastic Compute Cloud (Amazon EC2) 实例代表你假设该角色的信任政策示例:
json{ Version 20121017 Statement [ { Effect Allow Action [ stsAssumeRole ] Principal { Service [ ec2amazonawscom ] } } ]}
以下是创建 IAM 路径中策略的 AWS CLI 命令示例:
aws iam createpolicy policyname ltPOLICYNAMEgt path ltPATHgt policydocument file//policyjson
假设你是 AnyCompany 的云平台架构师,这是一家计划扩展其 AWS 环境的初创公司。在年末,AnyCompany 将从一个开发团队扩展到多个团队,而所有团队都需要访问 AWS。你希望设计一个可扩展的方法来管理 IAM 角色和策略,以简化每个团队角色的权限授予流程。为此,你根据团队创建角色和策略分组。
AnyCompany 决定基于团队创建以下角色。
团队名称角色名称IAM 路径访问权限安全universalsecurityreadonly/security/所有资源团队 A 数据库管理员DBAroleA/teamA/TeamA 的数据库团队 B 数据库管理员DBAroleB/teamB/TeamB 的数据库以下是上面列出的角色的示例 Amazon 资源名称 (ARNs)。在此示例中,你定义 IAM 路径以基于团队名称创建分组。
arnawsiam444455556666role/security/universalsecurityreadonlyrolearnawsiam444455556666role/teamA/DBAroleAarnawsiam444455556666role/teamB/DBAroleB注意: 角色名称在 AWS 账户内必须唯一,无论其 IAM 路径如何。例如,在不同路径下不能有两个名称为 DBArole 的角色。
在 IAM 路径中创建角色后,你需要创建策略以向这些角色提供权限。用于 IAM 策略的路径结构与 IAM 角色中定义的相同。以下是如何在 IAM 路径中创建策略的示例。创建策略后,可以使用 attachrolepolicy 命令 将策略附加到角色。
aws iam createpolicy policyname ltPOLICYNAMEgt policydocument file//policydocjson path ltPATHgt
arnawsiam444455556666policy/security/universalsecurityreadonlypolicyarnawsiam444455556666policy/teamA/DBApolicyAarnawsiam444455556666policy/teamB/DBApolicyB在你创建了路径中的角色和策略后,可以更容易地定义哪些主体组可以访问资源。在以下拒绝声明示例中,你仅允许 IAM 路径 /teamA/ 中的角色对你的存储桶进行操作,并拒绝所有其他 IAM 主体的访问。与其使用单个角色拒绝对存储桶的访问这会要求你列出每个角色,不如通过路径拒绝整个主体组的访问。如果你在指定路径中创建了新角色,则无需修改策略以包含它们。基于路径的拒绝声明将自动生效。
json{ Version 20121017 Statement [ { Action s3 Effect Deny Resource [ arnawss3EXAMPLEBUCKET arnawss3EXAMPLEBUCKET/ ] Principal Condition { ArnNotLike { awsPrincipalArn arnawsiamrole/teamA/ } } } ]}
IAM 路径还可以使团队更安全地创建 IAM 角色和策略,只能使用路径中包含的角色和策略。这些路径有助于防止团队特权升级,拒绝使用不属于他们团队的角色。
继续上面的示例,AnyCompany 建立了一个流程,允许每个团队创建自有 IAM 角色和策略,前提是它们位于指定的 IAM 路径。示例中,AnyCompany 允许团队 A 在路径 /teamA/ 中创建 IAM 角色和策略:
arnawsiam444455556666role/teamA/arnawsiam444455556666policy/teamA/通过使用 IAM 路径,AnyCompany 可以允许团队 A 更安全地创建和管理其 IAM 角色和策略,并安全地将这些角色传递给 AWS 服务,使用 iamPassRole 权限。
在 AnyCompany 中,有四个使用 IAM 路径的 IAM 策略,允许团队更安全地创建和管理自己的 IAM 角色和策略。按照最佳实践,AnyCompany 对所有 IAM 角色和策略创建使用基础设施即代码IaC。以下四个基于路径的策略将附加到每个团队的 CI/CD 管道角色,该角色具备创建角色的权限。以下示例重点关注团队 A,以及这些策略如何使他们能够自行管理 IAM 凭据。
在路径中创建角色并修改角色上的内联策略: 此策略允许三项操作:iamCreateRole、iamPutRolePolicy 和 iamDeleteRolePolicy。当此策略附加到主体时,该主体被允许在 IAM 路径 /teamA/ 中创建角色,并在该 IAM 路径中的角色上添加和删除内联策略。json{ Version 20121017 Statement [ { Effect Allow Action [ iamCreateRole iamPutRolePolicy iamDeleteRolePolicy ] Resource arnawsiam444455556666role/teamA/ } ]}
附加和删除管理策略: 第二个策略示例允许两项操作:iamAttachRolePolicy 和 iamDetachRolePolicy。此策略允许主体附加和分离 /teamA/ 路径下的角色已创建的角色的 托管策略。json{ Version 20121017 Statement [ { Effect Allow Action [ iamAttachRolePolicy iamDetachRolePolicy ] Resource arnawsiam444455556666role/teamA/ Condition { ArnLike { iamPolicyARN arnawsiam444455556666policy/teamA/ } } } ]}
删除角色、标记和取消标记角色、读取角色: 第三项策略允许主体删除角色、标记和取消标记角色,并检索在 /teamA/ 路径中创建的角色的信息。json{ Version 20121017 Statement [ { Effect Allow Action [ iamDeleteRole iamTagRole iamUntagRole iamGetRole iamGetRolePolicy ] Resource arnawsiam444455556666role/teamA/ } ]}
在 IAM 路径中的策略管理: 最后一项政策示例允许访问在 /teamA/ 路径中创建的策略的创建、修改、获取和删除操作。这包括创建、删除和标记策略。json{ Version 20121017 Statement [ { Effect Allow Action [ iamCreatePolicy iamDeletePolicy iamCreatePolicyVersion iamDeletePolicyVersion iamGetPolicy iamTagPolicy iamUntagPolicy iamSetDefaultPolicyVersion iamListPolicyVersions ] Resource arnawsiam444455556666policy/teamA/ } ]}
将角色传递给 AWS 服务 时,主体必须具有 iamPassRole 权限。IAM 路径是限制主体可以传递哪些角色的推荐选项。IAM 路径帮助验证主体只能将特定角色或角色组传递给 AWS 服务。
在 AnyCompany 中,安全团队希望允许团队 A 向 实例配置文件 添加 IAM 角色,并将其附加到 Amazon EC2 实例,但仅当 这些角色位于 /teamA/ 路径中。允许团队 A 向实例提供角色的 IAM 操作是 iamPassRole。安全团队不希望团队 A 能够传递账户中的其他角色,例如管理员角色。

以下策略允许传递在 /teamA/ 路径中创建的角色,不允许传递其他角色例如管理员角色。
json{ Version 20121017 Statement [{ Effect Allow Action iamPassRole Resource arnawsiam444455556666role/teamA/ }]}
可以使用 服务控制策略 (SCP) 限制对特定 IAM 路径内敏感角色和策略的访问。可以使用 SCP 防止修改在定义路径中创建的敏感角色和策略。
在声明的资源和条件部分中可以看到 IAM 路径。只能在 /security/ 路径中创建或修改角色 IAMAdministrator。此 SCP 允许你自信地将 IAM 角色和策略管理委派给开发人员,确保他们无法在安全路径中创建、修改或删除任何角色或策略。
json{ Version 20121017 Statement [ { Sid RestrictIAMWithPathManagement Effect Deny Action [ iamAttachRolePolicy iamCreateRole iamDeleteRole iamDeleteRolePermissionsBoundary iamDeleteRolePolicy iamDetachRolePolicy iamPutRolePermissionsBoundary iamPutRolePolicy iamUpdateRole iamUpdateAssumeRolePolicy iamUpdateRoleDescription stsAssumeRole iamTagRole iamUntagRole ] Resource [ arnawsiamrole/security/ ] Condition { ArnNotLike { awsPrincipalARN arnawsiam444455556666role/security/IAMAdministrator } } } ]}
以下示例展示了如何安全地将在安全路径中创建的 IAM 角色排除在组织的特定控制之外。该策略对关闭成员账户的所有角色进行拒绝,除了在 /security/ IAM 路径中创建的角色。
json{ Version 20121017 Statement [ { Sid PreventCloseAccount Effect Deny Action organizationsCloseAccount Resource Condition { ArnNotLikeIfExists { awsPrincipalArn [ arnawsiam
飞机加速器