如何为不支持的资源类型创建 AWS Config 规则?

3 分钟阅读
0

我想要为 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 调用。

  1. 打开 IAM 控制台,然后从导航窗格中选择角色

  2. 选择创建角色

  3. 对于选择一个使用案例,在常见用例下,选择 Lambda

  4. 选择下一步: 权限

  5. 选择创建策略
    注意: “创建策略”页面将在新选项卡中打开。在此过程的稍后阶段,您将返回到原始选项卡。

  6. 选择 JSON 选项卡,然后输入以下策略:

    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "VisualEditor0",
          "Effect": "Allow",
          "Action": [
            "config:PutEvaluations",
            "cognito-idp:ListUserPools"
            "`cognito-idp:DescribeUserPool"`
          ],
          "Resource": "*"
        }
      ]
    }
  7. 选择下一步: 标签,然后选择下一步: 审核

  8. 对于名称,输入策略名称。

  9. 选择创建策略

  10. 返回步骤 5 中的“创建角色”选项卡,然后选择策略列表右侧的刷新图标。

  11. 找到并选择新的策略名称,然后选择下一步: 标记

  12. 选择下一步: 审核

  13. 对于角色名称,输入 lambda-role

  14. 选择创建角色

为自定义 AWS Config 规则创建 Lambda 函数

  1. 打开 Lambda 控制台
  2. 选择创建函数
  3. 选择从头开始创作
    对于函数名称,输入名称。
    对于运行时,选择 Python 3.8
  4. 对于权限,展开更改默认执行角色
    对于执行角色,选择使用现有角色
    对于现有角色,选择您在本文的“先决条件”部分创建的角色以允许 Lambda 进行必要的 API 调用。
  5. 选择创建函数
  6. 对于代码源,在 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 函数

  1. 打开 Lambda 控制台,然后从导航窗格中选择函数
  2. 为您的 Lambda 函数选择带超链接的函数名称以打开函数详细信息。
  3. 配置选项卡中,选择权限
  4. 对于基于资源的策略,选择添加权限
    对于策略语句,选择 AWS 服务
    对于服务,选择其他
    对于委托人,输入 config.amazonaws.com
    对于源 ARN,输入您在上一节中创建的自定义规则的 ARN。
    注意: 要查找自定义规则 ARN,请打开 AWS Config 控制台,然后从导航窗格中选择规则。选择带超链接的规则名称,然后复制 Config 规则 ARN
    对于操作,选择 lambda:InvokeFunction
    对于语句 ID,输入唯一的 ID。
  5. 选择保存

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 Config 规则创建 AWS Lambda 函数

AWS 官方
AWS 官方已更新 8 个月前