本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Config 为公共子网部署基于侦探属性的访问控制 AWS
由阿尔贝托·梅嫩德斯创作 () AWS
环境:PoC 或试点 | 技术:安全性、身份、合规性;网络 | AWS服务:AWSConfig;Amazon SNS |
Summary
分布式边缘网络架构依赖于与其虚拟私有云中的工作负载一起运行的网络边缘安全(VPCs)。与更常见的集中式方法相比,这提供了前所未有的可扩展性。尽管在工作负载账户中部署公有子网可以带来好处,但它也会带来新的安全风险,因为它增加了攻击面。我们建议您仅在这些资源的公有子网中部署 Elastic Load Balancing (ELB) 资源,例如应用程序负载均衡器或网NAT关。VPCs在专用的公有子NAT网中使用负载均衡器和网关可以帮助您对入站和出站流量实施精细控制。
我们建议您同时实施预防控制和检测控制,以限制可在公有子网中部署的资源类型。有关使用基于属性的访问控制 (ABAC) 为公有子网部署预防性控制的更多信息,请参阅为公有子网部署基于属性的预防性访问控制。尽管这些预防性控制措施对大多数情况都有效,但可能无法解决所有可能的用例。因此,此模式建立在该ABAC方法的基础上,可帮助您配置有关部署在公共子网中的不合规资源的警报。该解决方案检查弹性网络接口是否属于公有子网中不允许使用的资源。
为此,此模式使用 AWSConfig 自定义规则和ABAC
为了确定网络接口是否在规则范围内,该规则会检查子网是否具有表明其为公有子网的特定AWS标记。例如,这个标签可能是
IsPublicFacing=True
。如果网络接口部署在公有子网中,则该规则会检查哪个AWS服务创建了此资源。如果资源不是ELB资源或NAT网关,则会将该资源标记为不合规。
先决条件和限制
先决条件
一个活跃的AWS账户
AWSConfig,在工作负载账户中设置
在工作负载账户中部署所需资源的权限
VPC带有公有子网的 A
正确应用标签以识别目标公有子网
(可选)Organizations 中的AWS组织
(可选)中央安全账户,它是 AWS Config 和 Sec AWS urity Hub 的委托管理员
架构
目标架构
该图阐释了以下内容:
部署或修改弹性网络接口资源 (
AWS::EC2::NetworkInterface
) 时,AWSConfig 会捕获事件和配置。AWSConfig 将此事件与用于评估配置的自定义规则进行匹配。
将调用与此自定义规则关联的 AWS Lambda 函数。该函数评估资源并应用指定的逻辑来确定资源配置是否为
COMPLIANT
、NON_COMPLIANT
或NOT_APPLICABLE
。如果确定某个资源是
NON_COMPLIANT
,AWSConfig 会通过亚马逊简单通知服务 (亚马逊SNS) 发送警报。注意:如果此账户是 Organizations 中的AWS成员账户,则可以通过 AWS Config 或 Security Hub 向中央AWS安全账户发送合规数据。
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 存储库
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
创建 Lambda 函数。 |
| 将军 AWS |
向 Lambda 函数的执行角色添加权限。 |
| 将军 AWS |
检索 Lambda 函数亚马逊资源名称 () ARN。 |
| 将军 AWS |
创建 C AWS onfig 自定义规则。 |
| 将军 AWS |
配置通知。 |
| 将军 AWS |
任务 | 描述 | 所需技能 |
---|---|---|
创建合规资源。 |
| 将军 AWS |
创建不合规的资源。 |
| 将军 AWS |
创建不适用的资源。 |
| 将军 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