亚马逊AWS官方博客

使用 IAM 与 Amazon Organizations 中的亚马逊云科技账户组共享您的亚马逊云科技资源

Original URL: https://aws.amazon.com/blogs/security/iam-share-aws-resources-groups-aws-accounts-aws-organizations/

您现在可以在 Amazon Identity and Access Management(IAM)策略中引用组织单位(OU),即 Amazon Organizations 中的亚马逊云科技账户组,从而更轻松地定义您的 IAM 主体(用户和角色)对组织中亚马逊资源的访问权限。Amazon Organizations 让您可以将账户组织到 OU 中,使其与您的业务或安全目的保持一致。现在,您可以在策略中使用新的条件键 aws:PrincipalOrgPaths,根据主体在 OU 中的成员资格来允许或拒绝访问。如此,在亚马逊云科技环境中拥有的账户之间共享资源就变得前所未有地简单。

例如,您可能需要与属于特定 OU 成员账户的开发人员和应用程序共享 Amazon S3 存储桶。为此,您可以指定 aws:PrincipalOrgPaths 条件,并将值设置为附加到存储桶的、基于资源的策略中发起人的组织单位 ID。当主体尝试访问存储桶时,亚马逊云科技会验证其账户的 OU 是否与策略中指定的 OU 匹配。在这种情况下,当您向 OU 添加账户时,会自动应用权限,而无需对策略进行任何其他更新。

在这篇文章中,我将介绍新的条件键,并通过两个示例向您展示如何使用新的条件键。在第一个示例中,您将看到如何使用 aws:PrincipalOrgPaths 条件键授予多个亚马逊云科技账户访问资源的权限,而无需在策略中维护账户 ID 列表。在第二个示例中,您将看到如何为您的管理角色添加防护机制,以确保只有您组织中受保护的 OU 才有重大操作的访问权限。

Amazon Organizations 概念

在介绍条件之前,让我们先回顾一下 Amazon Organizations 的一些重要概念。

Amazon Organizations 允许您将一组亚马逊云科技账户分组到一个可以集中管理的组织中。账户加入组织后,您可以将其分组为组织单位(OU),从而允许您设置有助于满足安全性和合规性要求的策略。您可以在单个组织内创建多个 OU,也可以在其他 OU 内创建 OU,以在您的账户之间形成层级关系。当您创建组织时,Amazon Organizations 会自动创建您的第一个账户容器。其有一个特殊的名称,叫做。您创建的所有 OU 都存在于根中。

组织、根和 OU 的标识符有不同的格式。下表中展示了它们的区别:

资源 ID 格式 示例值 全局唯一
组织 o-exampleorgid o-p8iu8lkook
r-examplerootid r-tkh7
组织单位 ou-examplerootid-exampleouid ou-tkh7-pbevdy6h

组织 ID 是全局唯一的,这意味着不同的组织不会有相同的组织 ID。OU 和根 ID 不是全局唯一的。这意味着其他客户的组织 OU 可能与您组织的 OU 具有相同的 ID。OU 和根 ID 在组织内是唯一的。因此,在指定 OU 时应始终包括组织标识符,以确保其在您的组织中是唯一的。

基于 OU 的对资源的访问权限控制

在 IAM policy 的条件元素中使用条件键。条件是一个可选的 IAM policy 元素,可用于指定策略授予或拒绝权限等情况。条件包括条件键条件运算符和条件值。

条件键 说明 运算符
aws:PrincipalOrgPaths 来自 Amazon Organizations 的主体 OU 的路径 所有字符串运算符  Amazon Organizations  ID组织单位 ID 的路径

aws:PrincipalOrgPaths 条件键是一个全局条件,这意味着您可以将其与任何亚马逊云科技操作结合使用。当您在 IAM policy 的条件元素中使用时,其会验证对资源执行操作的主体的组织、根和 OU。例如,假设主体是组织 o-1122334455 中根 r-abcd 中 ID 为 ou-abcd-zzyyxxww 的 OU 的成员。当主体对资源发出请求时,其 aws:PrincipalOrgPaths 值为:

[“o-1122334455/r-abcd/ou-abcd-zzyyxxww/”]

该路径中包含了组织 ID,以确保全局唯一性。这样可以确保只有您组织的主体才能访问您的亚马逊云科技资源。您可以在条件中使用任意字符串运算符,例如 StringEquals。您也可以在提供路径时使用通配符(* 和 ?)。

aws:PrincipalOrgPaths 是一个多值条件键。多值键允许您以列表形式提供多个值。以下是某策略的条件语句示例,该策略使用键来验证主体是来自于 ou-1 还是 ou-2

"Condition":{
    "ForAnyValue:StringLike":{
        "aws:PrincipalOrgPaths":[
          "o-1122334455/r-abcd/ou-1/",
          "o-1122334455/r-abcd/ou-2/"
        ]
    }
}

如上所示,对于所有多值条件键,您必须以列表(JSON 格式)提供值(即使您只指定一个值)。如上例所示,您还必须在条件中使用 ForAnyValue 限定符来指定要您要检查一个 OU 路径的成员资格。有关更多信息,请参阅 IAM 文档中的创建测试多个键值的条件

在下一节中,我将举一个示例,说明如何使用新的条件键保护账户中的资源,以避免来自给定 OU 之外的访问。

示例:向组织中 OU 中的所有主体授予 S3 存储桶访问权限

此示例演示如何使用新的条件键与账户组共享资源。通过将账户放入 OU 并根据成员资格授予访问权限,您可以针对性地授予访问权限,而不必在权限策略中列出和维护所有亚马逊云科技账户 ID。

举一个例子,我想授予我的机器学习团队访问 S3 存储桶 training-data 的权限,该数据包含团队用于训练其机器学习模型的图像。我已经设置了我的组织,这样我的机器学习团队拥有的所有亚马逊云科技账户都属于特定的 OU,ID 为 ou-machinelearn。就本示例而言,我的组织 ID 是 o-myorganization。

在此示例中,我想允许来自机器学习 OU 或其之下任何 OU 的用户和应用程序有读取 training-data S3 存储桶的权限。任何其他亚马逊云科技账户都应当无法查看该资源。

为了授予这些权限,我为我的 training-data 资源创建了一项 S3 存储桶策略,如下所示。

{
    "Version":"2012-10-17",
    "Statement":{
        "Sid":"TrainingDataS3ReadOnly",
        "Effect":"Allow",
        "Principal": "*",
        "Action":"s3:GetObject",
        "Resource":"arn:aws:s3:::training-data/*",
        "Condition":{
            "ForAnyValue:StringLike":{
                "aws:PrincipalOrgPaths":["o-myorganization/*/ou-machinelearn/*"]
            }
        }
    }
}

在上述策略中,我以断言要求试图读取 training-data 存储桶内容的主体必须是与我提供的 ou-machinelearn ID(我的机器学习 OU 标识符)相对应的 OU 的成员,或者是任何其子 OU 的成员。在 aws:PrincipalOrgPaths 的值中,我使用了两个星号 (*) 通配符。我在组织 ID 和 OU ID 之间使用了第一个星号 (*),因为 OU ID 在我的组织中是唯一的。这意味着无需指定完整路径即可选择我需要的 OU。第二个星号 (*) 位于路径末尾,以表明我想允许所有子 OU 都包含在我的字符串对比中。如果我不想包含子 OU,我可以删除该通配符。

在此存储桶策略下,如果用户或角色具有适当的 S3 权限,则机器学习 OU 中的任何主体都可以读取存储桶内的对象。请注意,如果此策略没有条件语句,则任何亚马逊云科技账户都可以访问该策略。作为最佳实践,亚马逊云科技建议仅向有需要的主体授予访问权限。至于接下来的步骤,我可以编辑策略的 Principal 部分,以限制我的机器学习账户中特定主体的访问权限。有关更多信息,请参阅 S3 文档中的在策略中指定主体部分。

示例:仅限我的组织中 OU 中的账户访问 IAM 角色。

下一个示例将显示如何使用 aws:PrincipalOrgPaths 为您现有的 IAM 角色信任策略添加又一层安全保护,确保只有特定 OU 的成员才能担任您的角色。

在此示例中,假设我的公司要求,只有网络安全工程师才能在我的账户中创建或管理亚马逊云科技虚拟私有云(VPC)资源。网络安全团队有专门的 OU,ou-netsec,用来处理他们的工作负载。我的组织 ID 与前面的示例相同,为 o-myorganization。

我组织中的每个账户都有一个专门的 IAM 角色 VPCManager,具有管理 VPC 所需的权限。我想确保只有我的网络安全团队(被标记为此的主体)才能访问该角色。为此,我编辑了 VPCManager 的角色信任策略,该策略定义了谁可以访问 IAM 角色。在这种情况下,我在策略中添加了一个条件,要求任何担任该角色的账户都必须来自 ou-netsec。

这是我为 VPCManager 创建的信任策略:

{
    "Version": "2012-10-17",
    "Statement": [
      {
              "Effect": "Allow",
              "Principal": {
              "AWS": [
                  "123456789012",
                  "345678901234",
                  "567890123456"
              ]
          },
          "Action": "sts:AssumeRole",
          "Condition":{
          "StringEquals":{
          "aws:PrincipalTag/JobRole":"NetworkAdmin"
              },
              "ForAnyValue:StringLike":{
                  "aws:PrincipalOrgPaths":["o-myorganization/*/ou-netsec/"]
              }
           }
        }
     ]
  }

我首先添加了 Effect、Principal 和 Action,以允许来自三个网络安全账户的主体担任该角色。为了确保主体拥有正确的工作角色,我添加了一个条件,要求主体必须先应用 JobRole=NetworkAdmin 标签,然后才能担任该角色。最后,作为又一层安全性措施,我添加了第二个条件,要求担任该角色的任何账户都必须来自网络安全 OU。最后一步可确保为我的网络安全账户指定正确的账户 ID,即使我不小心提供了一个不属于我的组织的账户,该账户的成员也无法担任该角色,因为他们不属于 ou-netsec。

摘要

亚马逊云科技提供控制个人主体、账户、OU 或整个组织的访问权限的工具,有助于您以适合业务的规模对权限进行管理。现在,您可以使用 aws:PrincipalOrgPaths 条件键,基于 Amazon Organizations 的 OU 配置以控制对资源的访问权限。有关全局条件键和策略示例的更多信息,请阅读 IAM 文档