事件驱动框架,用于将 Amazon Backup 服务与 CSPM 工具集成

作者: Abhi Patlolla, Kalyan Arunachalam |

许多组织使用第三方云安全状态管理 (CSPM) 工具(例如 Wiz.io)来持续检测和修复混合云(例如亚马逊云科技)从构建到运行时的配置错误。CSPM 工具经常使用亚马逊云科技资源标签来增强其安全性和合规性监控能力。标签是您可以分配给亚马逊云科技资源的键值对,以帮助您管理、组织和保护它们。CSPM 工具可以使用这些标签来:

  • 根据特定标准(例如环境、应用程序和所有者)识别和分组资源
  • 根据标签值应用安全性和合规性规则
  • 生成根据贵组织的标记惯例量身定制的报告和可视化效果

组织通常使用 Amazon Backup 进行集中备份管理、合规和监管。Amazon Backup 通过实时分析和洞察为亚马逊云科技和混合服务上的应用资源提供数据保护、多账户和多区域勒索软件恢复以及数据保护合规性。这是 Amazon Backup 所支持功能的完整列表。Amazon Backup 可以高效管理和自动化备份流程,生成与备份活动相关的事件。这些事件可用于对原始资源应用标签,使 CSPM(云安全状态管理)工具能够通过检查备份资源上的标签来有效检查合规性,从而加强组织的整体合规状况。

这篇文章演示了如何使用事件驱动框架,该框架使用 Amazon EventBridge 来响应 Amazon Backup 生成的事件,触发 Amazon Lambda 函数以使用事件元数据,并为备份的相应亚马逊云科技服务创建标签。这些标签可以与 CSPM 工具集成,帮助满足组织合规性和安全需求。

解决方案概述

在这篇文章中,我们将以 Amazon S3 作为使用 Amazon Backup 备份的亚马逊云科技服务示例,引导您完成使用这个事件驱动框架(如下图所示)的过程。但是,该框架可以扩展到 Amazon Backup 支持的亚马逊云科技服务。这是 Amazon Backup 支持的服务列表。

图 1 用于将亚马逊云科技资源元数据存储为标签的事件驱动框架概述

图 1:用于将亚马逊云科技资源元数据存储为标签的事件驱动框架概述

先决条件

部署解决方案必须满足以下先决条件:

  • 具有 Amazon Identity and Access Management (IAM) 角色的亚马逊云科技账户和有权为应用程序创建和管理必要资源和组件的用户。如果您没有亚马逊云科技账户,请观看"如何创建和激活新的亚马逊云科技账户?"
  • 启用了版本控制的 S3 存储桶。要测试本文中描述的解决方案,请按照步骤创建 S3 存储桶并启用版本控制。

操作步骤

在以下步骤中,我们将演示如何使用在 Amazon Backup 过程中从 EventBridge 生成的事件来触发 Lambda 函数来更新 S3 存储桶上的标签。

1. 使用以下步骤创建与 Amazon Backup 关联的 IAM 角色:

1. 登录亚马逊云科技管理控制台并打开 Amazon IAM 控制台。

2. 在 IAM 控制台的导航窗格中,选择角色,然后选择创建角色

3. 对于可信实体类型,选择亚马逊云科技服务

4. 对于服务或用例,选择 S3

5. 选择"下一步"。

6. 对于权限策略,选择适用于 S3Backup 的 Amazon BackupServiceRole 策略和适用于 S3 Restore 的 AWSBackupServiceRolePolicy。

7. 选择"下一步"。

8. 用于角色名称描述。输入一个有意义的名称来标识此角色。

9. 查看该角色,然后选择创建角色

2. 使用以下步骤创建 Amazon Backup "按需备份":

1. 打开 Amazon Backup 控制台。

2. 在仪表板上,选择创建按需备份。或者,在导航窗格中,选择"受保护的资源",然后选择"创建按需备份"。

3. 在"资源类型"页面中,选择 Amazon S3

4. 选择在先决条件中创建的存储桶名称作为要保护的 S3 存储桶。

5. 确保选择"立即创建备份"。

6. 在"总保留期"中,指定天数。

7. 选择默认的备份保管库

8. 对于 IAM 角色,选择您在上一步中创建的角色。

9. 选择"创建按需备份"。这将打开"作业"页面,您可以在其中查看作业列表并查看作业状态。

3. 创建一个 Lambda 函数,当 Amazon Backup 服务生成 Amazon Backup 事件时,EventBridge 会触发该函数。要做到这一点:

1. 打开 Lambda 控制台。

2. 选择创建函数

3. 配置以下设置:

1. 函数名称:输入函数的名称。

2. 运行时:选择 Python 3.10 或更高版本

4. 选择创建函数

5. 控制台使用名为 lambda_function 的单个源文件创建了一个 Lambda 函数。编辑此文件并在内置代码编辑器中添加以下代码。要保存更改,请选择"保存"。

import boto3
from botocore.exceptions import ClientError
import json

def lambda_handler(event, context):
    print("Received event: ", json.dumps(event, indent=2))

    try:
        # Extract relevant information from the event
        event_detail = event["detail"]
        resource_type = event_detail["resourceType"]
        resource_arn = event_detail["resourceArn"]
        state = event_detail["state"]
    except KeyError as e:
        print(f"Error extracting event information: {str(e)}")
        return {
            "statusCode": 400,
            "body": json.dumps({
                "message": "Error extracting event information"
            })
        }

    # Process the event if the resource type is S3 and the state is "COMPLETED"
    if resource_type == "S3" and state == "COMPLETED":
        try:
            # Extract the recovery point ID from the recovery point ARN
            recovery_point_id = event["resources"][0].split(':')[-1]

            # Extract the S3 bucket name from the resource ARN
            s3_bucket_name = resource_arn.split(':')[-1].split('/')[-1]

            # Update the S3 bucket tags
            s3 = boto3.client('s3')
            try:
                # Get the existing tags
                response = s3.get_bucket_tagging(Bucket=s3_bucket_name)
                existing_tags = response['TagSet']
            except ClientError as e:
                if e.response['Error']['Code'] == 'NoSuchTagSet':
                    existing_tags = []
                else:
                    raise e

            # Update the tags with the new values
            new_tags = {
                'BackupState': state,
                'BackupCompletionDate': event_detail["completionDate"],
                'recoverypointid': recovery_point_id
            }

            # Merge the new tags with the existing tags
            tags_to_update = [tag for tag in existing_tags if tag['Key'] not in new_tags]
            tags_to_update.extend([{'Key': key, 'Value': value} for key, value in new_tags.items()])

            # Update the bucket tags
            s3.put_bucket_tagging(Bucket=s3_bucket_name, Tagging={'TagSet': tags_to_update})

            print(f"Updated S3 bucket {s3_bucket_name} tags with BackupState={state}, BackupCompletionDate={event_detail['completionDate']}, and recoverypointid={recovery_point_id}")
            
            return {
                "statusCode": 200,
                "body": json.dumps({
                    "message": "Event processed successfully!"
                })
            }
        except (IndexError, ClientError) as e:
            print(f"Error extracting recovery point information or updating S3 bucket tags: {str(e)}")
            return {
                "statusCode": 400,
                "body": json.dumps({
                    "message": "Error extracting recovery point information or updating S3 bucket tags"
                })
            }
    else:
        print(f"Skipping event with resource type {resource_type} and state {state}")
        return {
            "statusCode": 200,
            "body": json.dumps({
                "message": "Event skipped as it doesn't match the criteria."
            })
        }

Lambda 代码片段

6. 将函数超时更新为 15 分钟。要做到这一点:

1. 选择"配置"选项卡,然后选择"常规配置"

2. 在"常规配置"下,选择"编辑"。

3. 对于"超时",设置 15 分钟。

4. 选择"保存"。

7. 更新函数的执行角色以添加更新 S3 存储桶上的标签所需的权限。要做到这一点:

1. 选择"配置",然后选择"权限"。

2. 在"执行角色"下,选择"编辑"。

3. 选择现有角色。这将在 Amazon IAM 控制台中打开角色。

4. 附上 Amazon LambdaBasicExecutionRole 亚马逊云科技托管策略。

5. 在"权限策略"下,选择"添加权限"下的"创建内联策略"。

6. 在"选择服务"下,选择 S3

7. 在"允许的操作"下,选择 GetBucketTagging 和 PutBucketTagging

8. 在资源下,选择特定,选择添加 ARN,然后选择在先决条件部分创建的 S3 存储桶的亚马逊资源名称 (ARN)。

9. 选择"下一步"。

10. 查看策略详细信息并选择创建策略

4. 创建一个 EventBridge 规则,用于查找 Amazon Backup 运行和调用 Lambda 函数时生成的事件模式。要做到这一点:

1. 打开 EventBridge 控制台。

2. 在导航窗格中,选择"规则"。

3. 选择"创建规则"。

4. 输入规则的名称描述(可选)。

5. 对于事件总线,选择默认。当您账户中的亚马逊云科技服务发出事件时,它始终会转到您账户的默认事件总线。

6. 对于规则类型,选择带有事件模式的规则

7. 选择"下一步"。

8. 对于"事件源",选择"其他"。

9. 在示例事件部分中,选择一个亚马逊云科技事件

10. 对于创建方法,选择自定义模式(JSON 编辑器),然后在事件模式中输入以下 JSON。在这篇文章中,我们使用"备份任务状态更改"事件将元数据捕获为标签。可以对其进行自定义和进一步扩展,以监控其他 Amazon Backup 事件。这是亚马逊云科技备份事件的列表。

{
    "source": [
        "aws.backup"],
    "detail-type": ["Backup Job State Change"],
    "detail": {
        "resourceType": ["S3"],
        "state": ["COMPLETED"]
    }
}

事件模式

11. 选择"下一步"。

12. 对于目标类型,选择亚马逊云科技服务,选择 Lambda 函数作为目标,然后选择在前面的步骤中创建的函数。

13. 选择"下一步"。

14.(可选)为规则输入所需的标签。选择"下一步"。

15. 查看规则,然后选择创建规则

测试

按照以下步骤测试在前面步骤中设置的事件驱动框架:

  1. 前往 Amazon Backup 控制台,为受保护资源创建按需备份,在本例中为前提条件部分创建的 S3 存储桶。要做到这一点:
    1. 打开 Amazon Backup 控制台。
    2. 转到左侧导航栏中的受保护资源,然后选择与受保护的 S3 存储桶关联的资源 ID。
    3. 选择"创建按需备份"。
    4. 选择"选择 IAM 角色",然后选择在前面的步骤中为 Amazon Backup 创建的 IAM 角色。
    5. 选择"创建按需备份"。这应该启动受保护的 S3 存储桶的亚马逊云科技备份流程,生成 Amazon Backup 事件,触发 Lambda 函数,并在 S3 存储桶上创建以下标签。
      1. recoverypointid:这是在 Amazon Backup 过程中生成的唯一恢复点 ID。
      2. 备份状态:这表示备份的状态(例如"已完成")。
      3. 备份完成日期:这表示备份完成的时间戳。

清理

如果您正在尝试使用本文中的步骤,请删除创建的资源以避免产生成本。要做到这一点:

  1. 删除创建的 S3 存储桶。请参阅列出的这些步骤来删除存储桶。
  2. 删除创建的 Lambda 函数。
    1. 打开 Lambda 控制台。
    2. 选择为测试而创建的函数,选择操作,然后选择删除。在确认字段中键入"删除",确认删除,然后选择"删除"。
  3. 删除创建的 EventBridge 规则。
    1. 打开 EventBridge 控制台。
    2. 在导航窗格中,选择"规则"。
    3. 选择为测试创建的规则,然后选择"删除"。在确认字段中键入"删除",确认删除,然后选择"删除"。
  4. 删除创建的按需备份。请参阅这些步骤。

结论

在这篇文章中,我们展示了如何使用 Amazon Backup 服务设置和运行事件驱动框架,以及如何使用生成的事件将资源标签应用到备份的亚马逊云科技资源。然后,CSPM 工具可以使用资源标签来监控环境的安全性和合规性。

试试这篇文章中的解决方案,并在评论部分留下你的反馈和问题。有关 Amazon Backup 的更多信息,请查看开发人员指南。



Abhi Patlolla

Abhi Patlolla

Abhi Patlolla 是一位来自纽约地区的高级解决方案架构师,负责帮助用户进行云转型、人工智能/机器学习和数据计划。他是战略和技术负责人,为高管和工程师提供云战略方面的建议,以促进创新和积极影响。

Kalyan Arunachalam

Kalyan Arunachalam

Kalyan Arunachalam 是一位来自纽约地区的高级解决方案架构师。他是一位充满激情的技术爱好者,喜欢与用户合作并帮助他们构建创新的解决方案。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。