亚马逊AWS官方博客

在多账户环境中更充分地利用服务控制策略

我们的很多客户使用 Amazon Organizations 来管理多个亚马逊云科技账户。在组织中使用多个账户有很多好处,如将具有共同业务目的的工作负载分组、遵守监管框架,以及基于所有权在应用程序之间建立强大的隔离屏障。客户甚至使用不同账户进行开发、测试和生产。随着这些账户数量激增,客户需要一种集中设置防护机制和控制措施的方法。

在这篇博客文章中,我们将向您介绍不同的技巧,您可以使用这些技巧在多账户环境中更充分地利用 Amazon Organizations 服务控制策略(SCP)。我们将重点介绍策略评估逻辑以及 SCP 如何融入其中,概述 SCP 继承,并描述编写紧凑型 SCP 的方法。我们将介绍以下五种技巧:

  1. 考虑每个实体的策略数量
  2. 使用策略继承
  3. 按工作负载类型细分
  4. 将策略组合在一起
  5. 压缩您的策略

Amazon Organizations 提供了一种使用组织单位(OU)设置不同逻辑边界的机制。当您在不同的亚马逊云科技账户中拥有需要通用防护机制的相似工作负载时,这很有用。SCP 是一种组织策略,可以用于管理组织中的权限。SCP 提供对组织中所有账户的最大可用权限的集中控制。SCP 可帮助您确保您的账户符合组织的访问控制指导方针。SCP 的关键不同点在于,该策略可用于在整个环境中设置广泛的防护机制。您可以将防护机制视为在环境的不同层面强制执行特定治理策略的一种方式,我们将在本文中对此进行讨论。

策略评估逻辑以及 SCP 如何融入

在深入研究细节之前,让我们先从总体策略角度来看看 SCP 的工作原理以及评估逻辑。任何策略中的明确 Deny 语句都优先于 Allow 语句。适用于任何亚马逊云科技账户(该账号属于 Amazon Organizations 中的组织)的组织 SCP 都需要 Allow 语句,然后才能继续进行策略评估流程。

要深入了解如何评估策略,请参阅文档中的策略评估逻辑

现在,让我们来看看五种建议技巧,它们可帮助您更充分地利用 SCP。

1.考虑每个实体的策略数量

组织是您共同管理的亚马逊云科技账户的集合。您可以使用 OU 对组织内的账户进行分组,并将这些分组账户作为一个单位进行管理。这将极大简化账户的管理。可以在一个组织内创建多个 OU,也可以在其他 OU 中创建 OU,也称为嵌套 OU。您可以灵活地将多个策略附加到组织的根,或者附加到 OU 或账户。例如,在一个拥有根、一个 OU 和一个账户的组织中,将五个 SCP 附加到每个根、OU 或账户,总共会生成 15 个 SCP(五个 SCP 位于根,五个 SCP 位于 OU,五个 SCP 位于账户)。

您可以申请的 SCP 数量有限,接近或达到配额可能会限制您将来添加更多策略的能力。目前公布的配额如下:

  • 附加到根的最大 SCP 数量:5
  • 附加到每个 OU 的最大 SCP 数量:5
  • 一个根中的 OU 最大嵌套数量:一个根下 5 个级别的 OU
  • 附加到每个账户的最大 SCP 数量:5

注意有关配额的最新信息,请参阅 Amazon Organizations 的配额

请考虑以下示例组织结构,以了解如何在组织中的不同级别应用多个 SCP。

图 1:一个示例组织,显示了每个级别(根、OU、账户)适用的最大 SCP 数量

2.使用策略继承

策略继承是指对附加到组织的根或 OU 的策略的继承。作为附加策略的组织根或 OU 的成员的所有账户,都将受到该策略的影响,但继承对于 Allow 和 Deny 语句的工作方式有所不同。对于要为指定账户允许的权限,从根到通向该账户的直接路径中的每个 OU 的每个 SCP,甚至附加到该账户本身的每个 SCP,都必须允许该权限。换句话说,允许访问的语句需要存在于层次结构的每个级别;该语句不会被继承。但 Deny 语句在每个级别都会被继承和评估。

此时,您应该开始从更广泛的控制措施角度考虑这些策略:您想针对整个组织实施的控制措施应该纳入组织的根级 SCP。当您在 Amazon Organizations 中的层次结构向下移动时,控制措施应该更加精细。

例如,在将 Deny 策略附加到组织的根时,该组织中的所有账户都将受到该策略的影响。当您将 Deny 策略附加到特定 OU 时,直接位于该 OU 下或其嵌套 OU 下的账户都将受到该策略的影响。由于您可以将策略附加到组织中的多个级别,因此账户可能拥有多个适用的策略文档,如图 2 中所示。

图 2:显示适用策略的示例组织

默认情况下,Amazon Organizations 会在每个根和 OU 创建时,为其附加一个名为 FullAWSAccess 的亚马逊云科技托管 SCP。此策略允许所有服务和操作。

注意:添加具有“完全亚马逊云科技访问权限”的 SCP 不会授予账户中的所有主体访问所有内容的权限。SCP 不会授予权限;它们用于筛选权限。主体仍然需要在账户中制定授予他们访问权限的策略。

此外,应用于 OU 的策略仅会影响该 OU 下的账户或子 OU,而不会影响在根下创建的其他 OU。例如,应用于沙盒 OU 的策略不会影响工作负载 OU。

下面的两个表显示了继承产生的策略的示例。如前所述,如果并非在所有级别(根、OU 和账户)都存在 Allow,则该账户将无权访问任何服务。考虑沙盒 OU 表中的最后一个示例,根处存在“拒绝 S3 访问”SCP,它将限制对 Amazon Simple Storage Service(Amazon S3)的访问。尽管存在适用于沙盒 OU 的“允许 S3 访问”,并且账户级别存在“完全亚马逊云科技访问权限”,但针对账户 A 生成的策略是“无服务访问权限”,因为在根级别的 SCP 中没有具有“Allow”效果的策略。

下表显示了沙盒 OU 中策略的继承。

位于根的 SCP

SCP 位于

沙盒 OU SCP

位于账户 A 的 SCP 在账户 A 生成的策略 在账户 B 和 C 生成的策略
FullAWSAccess FullAWSAccess + 拒绝 S3 访问 FullAWSAccess + 拒绝 EC2 访问 没有 S3,没有 EC2 访问权限 没有 S3 访问权限
FullAWSAccess 允许 Amazon Elastic Compute Cloud(Amazon EC2)访问 允许 EC2 访问 仅允许 EC2 访问 仅允许 EC2 访问
拒绝 S3 访问 允许 S3 访问 FullAWSAccess 没有服务访问权限 没有服务访问权限

下表显示了工作负载 OU 中策略的继承。

位于根的 SCP 位于工作负载 OU 的 SCP 位于测试 OU 的 SCP 在账户 D 生成的策略 在生产 OU/账户 E 和 F 生成的策略
FullAWSAccess FullAWSAccess FullAWSAccess + 拒绝 EC2 访问 没有 EC2 访问权限 FullAWSAccess
FullAWSAccess FullAWSAccess 允许 EC2 访问 允许 EC2 访问 FullAWSAccess
拒绝 S3 访问 FullAWSAccess 允许 S3 访问 没有服务访问权限 没有服务访问权限

常见根级策略的一些示例如下:

有关示例 SCP,请参阅服务控制策略示例。要深入了解在组织中的不同级别应用策略的最佳实践,请参阅多账户环境中 SCP 的最佳实践

3.按工作负载类型对 SCP 进行细分

Amazon Organizations 的一项关键功能是能够使用组织单位(OU)创建不同的工作负载边界。您可以将 OU 视为可以直接应用 SCP 的逻辑边界。您还可以嵌套最多五个级别的 OU,并在每个级别应用不同策略。通过使用 OU,您可以细分工作负载类型,并创建以目的为导向的防护机制,以满足您的安全性和合规性要求。

为了说明这一点,让我们举一个例子,其中有三种不同的工作负载类型,分为三个独立的 OU:基础设施、沙盒和工作负载,如图 3 中所示。最佳实践是针对每种特定 OU 类型量身定制 SCP。您的安全组织不希望允许通过互联网访问私有工作负载。但为外部客户提供服务的工作负载需要外部网络连接。为了支持创新和实验,您可以建立一个沙盒 OU,该 OU 具有较少的策略限制,但可以限制重新连接到贵公司的数据中心。

有关如何组织 OU 的更多信息,请参阅推荐的 OU

图 3:显示不同工作负载的组织示例

4.将策略组合在一起

Amazon Identity and Access Management(IAM)policy 相似,您可以在服务控制策略中包含多个语句。您可以将语句组合到一个策略中,以避免达到每个账户、OU 或根五个策略的配额限制。在针对组织启用 SCP 时,默认情况下会附加 FullAWSAccess 策略。您可以将完整访问策略与其他控制措施组合起来,然后组合语句,如下面的示例策略中所示。您应用的每个 SCP 的策略大小可以为 5,120 字节。在组合语句时,请确保生成的语句不会改变您的原始意图。如果策略的 Effect、Resource 和 Condition 值相同,则可以在 SCP 中组合 Action 元素。

亚马逊云科技完全访问策略(143 字节)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

您可以将此完全访问策略与下面的拒绝策略组合使用:

拒绝删除存储桶和禁用 Security Hub260 字节

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "s3:DeleteBucket",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": "securityhub:Disable*",
            "Resource": "*"
        }
    ]
}

生成的组合策略如下所示:

 组合策略274 字节

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
            "s3:DeleteBucket",
            "securityhub:Disable*"
            ],
            "Resource": "*"
        }
    ]
}

5.压缩您的策略

IAM policy 与 SCP 之间的一个区别是,空格计入 SCP 中的大小配额。压缩策略中的相关操作可以帮助您缩短策略。以下是压缩策略的四种方法:

1. 删除空格。如果您使用亚马逊云科技管理控制台,则会自动删除空格。但是,如果您不希望每次都使用该控制台手动更新策略,则可以合并一个删除空格的脚本(本列表后面的方法四提供了此类脚本的示例)。

2. 使用通配符和前缀组合多个操作。例如,下面的策略拒绝访问在 Amazon Security Hub 中禁用配置。

     {
     "Effect": "Deny",
     "Action":[
        "Securityhub:DisableSecurityHub", 
        "Securityhub:DisableOrganizationAdminAccount",
        "Securityhub:DisableImportFindingsForProduct”
     ],
     "Resource": "*"
    }

通过使用通配符和前缀,您可以按照如下方式重写此策略:

{
    "Effect": "Deny",
    "Action": "Securityhub:Disable*",
    "Resource": "*"
}

重要提示:在像本示例中那样将操作组合在一起时,请注意,如果将来发布以 Disable 关键字开头的新操作,可能会产生潜在影响,因为这些操作会被通配符覆盖并被拒绝。

3. 可以将 SCP 配置为以拒绝列表或允许列表的形式工作。有关允许列表和拒绝列表的更多详细信息,请参阅使用 SCP 的策略。我们建议您尽可能使用拒绝列表,因为它们更灵活,并且可以帮助简化您的策略,从而减少维护。要扩展此策略,请拒绝语句支持条件(如下面的示例中所示),以及适用于要指定的特定资源的支持条件。例如,当亚马逊云科技添加新服务时,如果您使用了拒绝语句,则不必返回并更新策略。为了支持这一点,Amazon Organizations 会在每个根和 OU 创建时,为其附加一个名为 FullAWSAccess 的亚马逊云科技托管 SCP。此策略允许所有服务和操作。此外,拒绝语句与 NotAction 语句结合,可以帮助您编写较短的策略。

请考虑以下场景:您的安全组织要求应用程序团队使用特定的亚马逊云科技区域。推荐方法是创建一个拒绝列表,该列表将屏蔽除 NotAction 块中的内容以外的所有内容。下面是一个示例,其中 SCP 拒绝您的组织已授权使用的指定区域之外的任何操作。

注意:该列表包括无法根据区域列入允许列表的亚马逊云科技全球服务。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyAllOutsideEU",
            "Effect": "Deny",
            "NotAction": [
                "a4b:*",
                "acm:*",
                "aws-marketplace-management:*",
                "aws-marketplace:*",
                "aws-portal:*",
                "budgets:*",
                "ce:*",
                "chime:*",
                "cloudfront:*",
                "config:*",
                "cur:*",
                "directconnect:*",
                "ec2:DescribeRegions",
                "ec2:DescribeTransitGateways",
                "ec2:DescribeVpnGateways",
                "fms:*",
                "globalaccelerator:*",
                "health:*",
                "iam:*",
                "importexport:*",
                "kms:*",
                "mobileanalytics:*",
                "networkmanager:*",
                "organizations:*",
                "pricing:*",
                "route53:*",
                "route53domains:*",
                "s3:GetAccountPublic*",
                "s3:ListAllMyBuckets",
                "s3:PutAccountPublic*",
                "shield:*",
                "sts:*",
                "support:*",
                "trustedadvisor:*",
                "waf-regional:*",
                "waf:*",
                "wafv2:*",
                "wellarchitected:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": [
                        "eu-central-1",
                        "eu-west-1"
                    ]
                }
            }
        }
    ]
}

4. 缩短策略中的 Sid 值:Sid(语句 ID)是您为策略语句提供的可选标识符。如果它对您没有任何用处,请将其从您的策略中完全删除。我们还有一些客户发现,在本地索引文件中保留 SID 值列表和相应策略的详细信息是有效的。

下面的示例 Python 代码可以通过删除空格和 Sid 值来压缩提供的策略。

您可以在名为 Compressed_Policy.json 的文件中导出压缩的策略,也可以通过从下面的代码中删除 # 在终端上显示输出。

import json
def compress_json(policy):
    statement = policy["Statement"]
    if not isinstance(statement, list):
        statement = [statement]
    for s in statement:
        s.pop("Sid", None)
   
    # json.dumps 删除 JSON 中分隔符周围的空格,并将其转换为 JSON 格式的字符串。
    # 要获得最紧凑的表示形式,请指定 separators=(item_separator, key_separator)
    policy_without_whitespace = json.dumps(policy, separators=(',', ':'))
   
    return policy_without_whitespace

if __name__ == '__main__':
  path = input("Enter the path to policy file like: \n  /Users/swara/Desktop/policy.json or ./policy.json  \n >  ")
  with open(path) as f:
    policy = json.load(f)
   
original_len = len(str(policy))
mini_policy = compress_json(policy)
#在屏幕上打印输出
print(mini_policy)
compressed_len = len(str(mini_policy))
print("\n \t original length: {} -> compressed length: {} \n".format(original_len, compressed_len))
#将输出写入具有以下名称的文件 Compressed_Policy.json
with open("Compressed_Policy.json", "w") as Output_file:
     print(mini_policy, file=Output_file)

屏幕上的输出示例:

{"Version":"2012-10-17","Statement":[{"Action":["iam:AttachRolePolicy","iam:DeleteRole","iam:DeleteRolePermissionsBoundary","iam:DeleteRolePolicy","iam:DetachRolePolicy","iam:PutRolePermissionsBoundary","iam:PutRolePolicy","iam:UpdateAssumeRolePolicy","iam:UpdateRole","iam:UpdateRoleDescription"],"Resource":["arn:aws:iam::*:role/role-to-deny"],"Effect":"Deny"}]}

原始长度:433 -> 压缩后的长度:364

结论

在本文中,我们向您介绍了不同的技巧,您可以使用这些技巧在多账户环境中更充分地利用服务控制策略。通过使用这些技巧,您可以为组织如何在多账户环境中采用 SCP 制定深思熟虑的策略。您还了解了 SCP 如何融入亚马逊云科技的整体策略格局。SCP 是一种强大的工具,可以帮助客户建立防护机制。在评估您的 IAM policy 时,请考虑您要实现的目标。如果您要为多个账户建立广泛的防护机制,我们建议您先看下 SCP。

Original URL:https://aws.amazon.com/blogs/security/get-more-out-of-service-control-policies-in-a-multi-account-environment/