使用 Config 为公共子网部署基于侦探属性的访问控制 AWS - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Config 为公共子网部署基于侦探属性的访问控制 AWS

由阿尔贝托·梅嫩德斯创作 () AWS

环境:PoC 或试点

技术:安全性、身份、合规性;网络

AWS服务:AWSConfig;Amazon SNS

Summary

分布式边缘网络架构依赖于与其虚拟私有云中的工作负载一起运行的网络边缘安全(VPCs)。与更常见的集中式方法相比,这提供了前所未有的可扩展性。尽管在工作负载账户中部署公有子网可以带来好处,但它也会带来新的安全风险,因为它增加了攻击面。我们建议您仅在这些资源的公有子网中部署 Elastic Load Balancing (ELB) 资源,例如应用程序负载均衡器或网NAT关。VPCs在专用的公有子NAT网中使用负载均衡器和网关可以帮助您对入站和出站流量实施精细控制。

我们建议您同时实施预防控制和检测控制,以限制可在公有子网中部署的资源类型。有关使用基于属性的访问控制 (ABAC) 为公有子网部署预防性控制的更多信息,请参阅为公有子网部署基于属性的预防性访问控制。尽管这些预防性控制措施对大多数情况都有效,但可能无法解决所有可能的用例。因此,此模式建立在该ABAC方法的基础上,可帮助您配置有关部署在公共子网中的不合规资源的警报。该解决方案检查弹性网络接口是否属于公有子网中不允许使用的资源。

为此,此模式使用 AWSConfig 自定义规则ABAC。无论何时创建或修改弹性网络接口,自定义规则都会处理该接口的配置。简而言之,此规则执行两个操作来确定网络接口是否合规:

  1. 为了确定网络接口是否在规则范围内,该规则会检查子网是否具有表明其为公有子网的特定AWS标记。例如,这个标签可能是IsPublicFacing=True

  2. 如果网络接口部署在公有子网中,则该规则会检查哪个AWS服务创建了此资源。如果资源不是ELB资源或NAT网关,则会将该资源标记为不合规。

先决条件和限制

先决条件

  • 一个活跃的AWS账户

  • AWSConfig,在工作负载账户中设置

  • 在工作负载账户中部署所需资源的权限

  • VPC带有公有子网的 A

  • 正确应用标签以识别目标公有子网

  • (可选)Organizations 中的AWS组织

  • (可选)中央安全账户,它是 AWS Config 和 Sec AWS urity Hub 的委托管理员

架构

目标架构

使用 AWS Config 自定义规则检测公共子网中的不合规资源

该图阐释了以下内容:

  1. 部署或修改弹性网络接口资源 (AWS::EC2::NetworkInterface) 时,AWSConfig 会捕获事件和配置。

  2. AWSConfig 将此事件与用于评估配置的自定义规则进行匹配。

  3. 将调用与此自定义规则关联的 AWS Lambda 函数。该函数评估资源并应用指定的逻辑来确定资源配置是否为COMPLIANTNON_COMPLIANTNOT_APPLICABLE

  4. 如果确定某个资源是NON_COMPLIANT,AWSConfig 会通过亚马逊简单通知服务 (亚马逊SNS) 发送警报。

    注意:如果此账户是 Organizations 中的AWS成员账户,则可以通过 AWS Config 或 Security Hub 向中央AWS安全账户发送合规数据。

Lambda 函数评估逻辑

下图显示了 Lambda 函数应用的逻辑,用于评估弹性网络接口的合规性。

Lambda 函数逻辑示意图

自动化和扩缩

这种模式是一种侦探解决方案。您还可以使用补救规则对其进行补充,以自动解决任何不合规的资源。有关更多信息,请参阅使用 Confi AWS g 规则修复不合规的资源

您可以通过以下方式扩展此解决方案:

  • 强制应用您为识别面向公众的子网而建立的相应AWS标签。有关更多信息,请参阅 Organizations 文档AWS中的标签政策

  • 配置一个中央安全帐户,将 AWS Config 自定义规则应用于组织中的每个工作负载帐户。有关更多信息,请参阅AWS(AWS博客文章)中的大规模自动配置合规性

  • 将 AWS Config 与 AWS Security Hub 集成,以便大规模捕获、集中和通知。有关更多信息,请参阅 Sec AWS urity Hub 文档中的AWS配置 Config

工具

  • AWSConfig 提供了您AWS账户中的资源及其配置方式的详细视图。它可以帮助您确定资源之间的关联方式,以及它们的配置如何随时间变化。

  • Elastic Load Balancing (ELB) 将传入的应用程序或网络流量分布到多个目标。例如,您可以跨亚马逊弹性计算云 (AmazonEC2) 实例、容器以及一个或多个可用区中的 IP 地址分配流量。

  • AWSLambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • 亚马逊简单通知服务 (AmazonSNS) 可帮助您协调和管理发布者与客户之间的消息交换,包括网络服务器和电子邮件地址。 

  • Amazon Virtual Private Cloud(亚马逊VPC)可帮助您将AWS资源启动到您定义的虚拟网络中。此虚拟网络类似于您在自己的数据中心中运行的传统网络,其优点是使用的可扩展基础架构。AWS

最佳实践

有关开发自定义 AWS Config 规则的更多示例和最佳实践,请参阅上的官方 AWSConfig Rules 存储库 GitHub。

操作说明

任务描述所需技能

创建 Lambda 函数。

  1. 登录AWS管理控制台,然后打开 AWS Lambda 控制台。

  2. Functions (LAM 函数) 页面上,选择 Create function (创建函数)

  3. 选择从头开始编写

  4. 基本信息窗格中,在函数名称中输入一个名称。

  5. 对于运行时系统,选择 Python 3.12

  6. 架构设置为 x86_64

  7. 选择 Create function (创建函数)

  8. 选择节点选项卡。

  9. 在文件资源管理器中,选择 lambda_function.py

  10. 将此模式的 “其他信息” 部分中提供的示例代码粘贴到 lambda_function.py 选项卡中。自定义示例代码以识别evaluate_change_notification_compliance函数中的任何自定义评估逻辑。

  11. 选择部署

将军 AWS

向 Lambda 函数的执行角色添加权限。

  1. 在导航窗格中,选择函数

  2. 选择您刚刚创建的函数。

  3. 选择 Configuration(配置),然后选择 Permissions(权限)。

  4. 选择角色名称以在 Identity and Access Managem AWS ent (IAM) 控制台中打开该角色。

  5. 在 “权限策略” 下,选择 “添加权限”,然后选择 “创建内联策略”。

  6. 选择JSON

  7. 将以下策略粘贴到策略编辑器中。这允许 Lambda 函数执行以下操作:

    • 获取子网标签的详细信息。

    • 将合规结果发回 AWS Config。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "config:PutEvaluations", "ec2:DescribeSubnets" ], "Resource": "*", "Effect": "Allow" } ] }
  8. 选择下一步

  9. 为策略输入名称,然后选择 Create policy (创建策略)

将军 AWS

检索 Lambda 函数亚马逊资源名称 () ARN。

  1. 打开 Lambda 控制台。

  2. 在导航窗格中,选择函数

  3. 选择您刚刚创建的函数。

  4. 函数概述部分的函数下ARN,复制该值。

将军 AWS

创建 C AWS onfig 自定义规则。

  1. 打开 AWS Config 控制台,网址为https://console.aws.amazon.com/config/

  2. Rules 页面,选择 Add rule

  3. 指定规则类型页面上,选择创建自定义 Lambda 规则,然后选择下一步。

  4. 在 “配置规则” 页面上,执行以下操作:

    1. 输入名称和描述。

    2. 对于 AWSLambda 函数 ARN,请粘贴您之前复制ARN的。

    3. 对于触发器类型,选择在配置发生更改时

    4. 在 “更改范围” 中,选择 “资源”。

    5. 对于资源类型,选择AWSEC2 NetworkInterface

    6. 选择下一步

  5. 在 “查看并创建” 页面上,验证您的规则,然后选择 “保存”。

将军 AWS

配置通知。

  1. 按照创建亚马逊SNS主题中的说明创建亚马逊SNS主题。

  2. 按照订阅亚马逊主题中的说明配置接收亚马逊SNS主题通知的终端节点。SNS

  3. 按照资源不合规时如何收到通知中的说明使用 AWS Config 为您的不合规AWS资源配置自定义 Amazon EventBridge 规则。

将军 AWS
任务描述所需技能

创建合规资源。

  1. 按照以下说明在公有子网中创建支持的资源之一:

  2. 创建资源后,AWSConfig 自定义规则将评估与资源关联的弹性网络接口。它将这些网络接口标记为COMPLIANT。您可以按照以下步骤在 AWS Config 中查看资源:

    1. 打开 AWS Config 控制台,网址为https://console.aws.amazon.com/config/

    2. 规则页面上,选择您的规则。

    3. 规则详情页面上,前往页面底部。

    4. 在 “范围内的资源” 下,选择 “合规”。确认您看到已创建IDs的网络接口。

    5. 有关网络接口配置的更多详细信息,请选择资源 ID。

将军 AWS

创建不合规的资源。

  1. 按照以下说明在公有子网中创建不合规的资源:

  2. 创建资源后,AWSConfig 自定义规则将评估与资源关联的弹性网络接口。它将这些网络接口标记为NON_COMPLIANT。您可以按照以下步骤在 AWS Config 中查看资源:

    1. 打开 AWS Config 控制台,网址为https://console.aws.amazon.com/config/

    2. 规则页面上,选择您的规则。

    3. 规则详情页面上,前往页面底部。

    4. 在 “范围内的资源” 下,选择NonCompliant。确认您看到已创建IDs的网络接口。

    5. 有关网络接口配置的更多详细信息,请选择资源 ID。

  3. 确认您已在亚马逊中配置的终端节点上收到通知SNS。

将军 AWS

创建不适用的资源。

  1. 在私有子网中,创建任何需要弹性网络 interface 的资源。

  2. 创建资源后,AWSConfig 自定义规则将评估与资源关联的弹性网络接口。它将这些网络接口标记为NOT_APPLICABLE。这些资源不会显示在 AWS Config 控制台中。

将军 AWS

相关资源

AWS文档

其他AWS资源

其他信息

以下是为演示目的而提供的示例 Lambda 函数。

import boto3 import json import os # Init clients config_client = boto3.client('config') ec2_client = boto3.client('ec2') def lambda_handler(event, context): # Init values compliance_value = 'NOT_APPLICABLE' invoking_event = json.loads(event['invokingEvent']) configuration_item = invoking_event['configurationItem'] status = configuration_item['configurationItemStatus'] eventLeftScope = event['eventLeftScope'] # First check if the event configuration applies. Ex. resource event is not delete if (status == 'OK' or status == 'ResourceDiscovered') and not eventLeftScope: compliance_value = evaluate_change_notification_compliance(configuration_item) config_client.put_evaluations( Evaluations=[ { 'ComplianceResourceType': invoking_event['configurationItem']['resourceType'], 'ComplianceResourceId': invoking_event['configurationItem']['resourceId'], 'ComplianceType': compliance_value, 'OrderingTimestamp': invoking_event['configurationItem']['configurationItemCaptureTime'] }, ], ResultToken=event['resultToken']) # Function with the logs to evaluate the resource def evaluate_change_notification_compliance(configuration_item): is_in_scope = is_in_scope_subnet(configuration_item['configuration']['subnetId']) if (configuration_item['resourceType'] != 'AWS::EC2::NetworkInterface') or not is_in_scope: return 'NOT_APPLICABLE' else: alb_condition = configuration_item['configuration']['requesterId'] in ['amazon-elb'] nlb_condition = configuration_item['configuration']['interfaceType'] in ['network_load_balancer'] nat_gateway_condition = configuration_item['configuration']['interfaceType'] in ['nat_gateway'] if alb_condition or nlb_condition or nat_gateway_condition: return 'COMPLIANT' return 'NON_COMPLIANT' # Function to check if elastic network interface is in public subnet def is_in_scope_subnet(eni_subnet): subnet_description = ec2_client.describe_subnets( SubnetIds=[eni_subnet] ) for subnet in subnet_description['Subnets']: for tag in subnet['Tags']: if tag['Key'] == os.environ.get('TAG_KEY') and tag['Value'] == os.environ.get('TAG_VALUE'): return True return False