如何为不支持的资源类型创建 AWS Config 规则?
我想要为 AWS Config 不支持的资源类型创建一个规则。
简短描述
AWS Config 允许您创建规则来验证 AWS 资源是否符合指定的配置。默认情况下,AWS Config 支持数量有限的 AWS 资源类型。但是,您可以为不支持的资源类型创建自定义 AWS Config 规则。
当您部署自定义规则时,AWS Lambda 会创建一个函数来评估资源。使用此函数可评估不支持的资源类型,并将合规性结果返回给自定义规则。
**注意:**默认情况下,AWS Config 不会捕获不支持的资源类型的历史配置或合规性更改。为此,请完成第三方资源的记录配置中的步骤,然后创建一个规则来评估该自定义资源类型。有关记录和评估自定义资源的详细信息,请参阅使用 AWS Config 自定义资源跟踪 AWS 上的任何资源。
解决方法
注意: 以下步骤和代码示例创建了一个自定义 AWS Config 角色来评估 Amazon Cognito。这是不支持的资源。
先决条件
为 Lambda 函数创建 AWS Identity and Access Management(IAM)角色,以允许 Lambda 进行必要的 API 调用。
-
打开 IAM 控制台,然后从导航窗格中选择角色。
-
选择创建角色。
-
对于选择一个使用案例,在常见用例下,选择 Lambda。
-
选择下一步: 权限。
-
选择创建策略。
注意: “创建策略”页面将在新选项卡中打开。在此过程的稍后阶段,您将返回到原始选项卡。 -
选择 JSON 选项卡,然后输入以下策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "config:PutEvaluations", "cognito-idp:ListUserPools" "`cognito-idp:DescribeUserPool"` ], "Resource": "*" } ] }
-
选择下一步: 标签,然后选择下一步: 审核。
-
对于名称,输入策略名称。
-
选择创建策略。
-
返回步骤 5 中的“创建角色”选项卡,然后选择策略列表右侧的刷新图标。
-
找到并选择新的策略名称,然后选择下一步: 标记。
-
选择下一步: 审核。
-
对于角色名称,输入 lambda-role。
-
选择创建角色。
为自定义 AWS Config 规则创建 Lambda 函数
- 打开 Lambda 控制台。
- 选择创建函数。
- 选择从头开始创作。
对于函数名称,输入名称。
对于运行时,选择 Python 3.8。 - 对于权限,展开更改默认执行角色。
对于执行角色,选择使用现有角色。
对于现有角色,选择您在本文的“先决条件”部分创建的角色以允许 Lambda 进行必要的 API 调用。 - 选择创建函数。
- 对于代码源,在 Lambda 控制台中打开 lambda_function.py 文件,将默认代码替换为以下代码,然后选择部署。
注意: 以下代码示例查找所有具有以下内容的 Amazon Cognito UserPools,即 MFA: OFF,并将结果标记为 NON_COMPLIANT。有关针对其他不支持的服务和目标自定义本指南的信息和资源,请参阅文章部分 PutEvaluations API 和 AWS::::Account 资源类型值。## Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.// SPDX-License-Identifier: MIT-0 import json import boto3 def lambda_handler(event,context): cognito = boto3.client('cognito-idp') userpools = cognito.list_user_pools( MaxResults=5 ) userpool_list = userpools['UserPools'] userpool_ids = [] for i in userpool_list: userpool_ids.append(i['Id']) evaluations = [] orderingtime = json.loads(event['invokingEvent'])['notificationCreationTime'] for j in userpool_ids: userpool_describe = cognito.describe_user_pool( UserPoolId = j ) userpool_MFA = userpool_describe['UserPool']['MfaConfiguration'] if userpool_MFA == 'OFF': evaluations.append( { 'ComplianceResourceType': 'AWS::::Account', 'ComplianceResourceId': j, 'ComplianceType': 'NON_COMPLIANT', 'Annotation': 'Test', 'OrderingTimestamp': orderingtime } ) else: evaluations.append( { 'ComplianceResourceType': 'AWS::::Account', 'ComplianceResourceId': j, 'ComplianceType': 'COMPLIANT', 'Annotation': 'Test', 'OrderingTimestamp': orderingtime } ) result_token = event['resultToken'] config = boto3.client('config') response = config.put_evaluations( Evaluations = evaluations, ResultToken = result_token, TestMode = False )
此代码执行三个主要步骤:
- 列出用于创建清单的所有资源
- 根据指定的配置评估清单中的每个资源
- 对 AWS Config 使用 PutEvaluations API 调用以返回合规性状态
创建自定义周期性 AWS Config 规则
在 AWS Config 中创建自定义周期性规则。然后,将自定义规则与您在上一节中创建的 Lambda 函数相关联。有关说明,请参阅创建自定义 Lambda 规则以评估 Amazon EC2 实例。
重要事项: 请记下新自定义规则的 Amazon 资源名称(ARN),以供后续步骤使用。
授权 AWS Config 服务调用 Lambda 函数
- 打开 Lambda 控制台,然后从导航窗格中选择函数。
- 为您的 Lambda 函数选择带超链接的函数名称以打开函数详细信息。
- 从配置选项卡中,选择权限。
- 对于基于资源的策略,选择添加权限。
对于策略语句,选择 AWS 服务。
对于服务,选择其他。
对于委托人,输入 config.amazonaws.com。
对于源 ARN,输入您在上一节中创建的自定义规则的 ARN。
注意: 要查找自定义规则 ARN,请打开 AWS Config 控制台,然后从导航窗格中选择规则。选择带超链接的规则名称,然后复制 Config 规则 ARN。
对于操作,选择 lambda:InvokeFunction。
对于语句 ID,输入唯一的 ID。 - 选择保存。
PutEvaluations API 和 AWS::::Account 资源类型值
此解决方法中的步骤和示例会找到所有具有以下内容的 Amazon Cognito UserPools,即 MFA: OFF,然后将结果标记为 NON_COMPLIANT。但是,对于任何不支持的资源类型,您都可以修改该过程以满足您的特定要求。有关使用 AWS::::Account 资源类型的更多代码示例,请参阅 aws-config-rules GitHub 页面。
PutEvaluations API 调用包括以下参数:
{ "Evaluations": [ { "Annotation": "string", "ComplianceResourceId": "string", "ComplianceResourceType": "string", "ComplianceType": "string", "OrderingTimestamp": number } ], "ResultToken": "string", "TestMode": boolean }
对于不支持的资源类型,请输入 AWS::::Account 作为 ComplianceResourceType 的值。AWS::::Account 资源类型报告的是整个账户,而不是特定资源:
{ 'ComplianceResourceType': 'AWS::::Account', 'ComplianceResourceId': 'Resource Id', 'ComplianceType': 'COMPLIANT'|'NON_COMPLIANT', 'Annotation': 'string', 'OrderingTimestamp': number }
如果将不受支持的资源输入为 ComplianceResourceType 值,而不是 AWS::::Account,则会出现以下错误:
- 在 AWS Config 控制台上: “无可用结果”
- Lambda CloudWatch 日志:“错误: ClientError: 调用 PutEvaluations 操作时出现错误 (InternalFailure)(已达到最大重试次数: 4)”
- Cloudtrail (PutEvaluations API): “错误: ClientError: 调用 PutEvaluations 操作时出现错误 (InternalFailure)(已达到最大重试次数: 4)
在使用 AWS::::Account 资源类型值时,请记住以下几点:
- 系统不会记录此资源类型的配置项目。
- 未为此资源类型记录 AWS::Config::ResourceCompliance 下的合规性配置项目。
- 此资源类型没有可用的资源时间表。
- 在 AWS 管理控制台中,此资源类型的管理资源按钮不可用。
相关信息
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前