如何为未开启加密的新建Amazon S3存储桶配置CloudWatch告警
实现未配置加密策略的S3存储桶创建时自动告警的操作方法
注:AWS自2023年1月5日起,所有新创建的S3存储桶默认开启SSE-S3加密,只有手动关闭默认加密的新桶才会触发下述告警规则。
前置准备
首先需要确保你要监控的区域已启用CloudTrail跟踪,且跟踪配置了捕获S3服务的管理事件,所有S3桶的创建操作会被CloudTrail记录后同步给EventBridge(原CloudWatch Events)做后续处理。
步骤1:创建SNS告警通知主题
如果需要邮件、短信等通知渠道,先配置SNS主题:
- 进入SNS控制台,创建标准类型的主题,记录主题ARN
- 为主题添加订阅,比如填写邮箱、手机号、企业IM回调地址等,确认订阅生效
- 配置主题的资源策略,允许后续创建的Lambda函数有权限向该主题发布消息
步骤2:创建检查S3桶加密状态的Lambda函数
- 进入Lambda控制台,新建函数,运行时选择Python 3.10及以上版本
- 为Lambda执行角色添加两个必要权限:
s3:GetEncryptionConfiguration(用于读取桶的加密配置)、sns:Publish(用于向SNS主题发告警) - 替换函数默认代码为以下内容,将代码里的SNS_TOPIC_ARN替换为你上一步创建的SNS主题ARN:
import boto3 import json s3_client = boto3.client('s3') sns_client = boto3.client('sns') # 替换为你的SNS主题ARN SNS_TOPIC_ARN = "arn:aws-cn:sns:cn-north-1:123456789012:unencrypted-s3-alert-topic" def lambda_handler(event, context): # 从EventBridge事件中提取新创建的桶名 bucket_name = event['detail']['requestParameters']['bucketName'] create_user_arn = event['detail']['userIdentity']['arn'] try: # 查询桶的加密配置 encrypt_resp = s3_client.get_bucket_encryption(Bucket=bucket_name) if 'ServerSideEncryptionConfiguration' not in encrypt_resp: raise ValueError("未找到加密配置规则") except Exception as e: # 未配置加密则发送告警 alert_content = f"安全告警:检测到未配置加密策略的S3存储桶创建\n桶名:{bucket_name}\n创建者ARN:{create_user_arn}\n创建区域:{event['region']}" sns_client.publish( TopicArn=SNS_TOPIC_ARN, Subject="【AWS安全告警】未加密S3存储桶被创建", Message=alert_content ) return { "statusCode": 200, "body": json.dumps(f"已触发未加密桶{bucket_name}的告警通知") } return { "statusCode": 200, "body": json.dumps(f"桶{bucket_name}已配置加密策略,无需告警") }
- 保存函数后可以手动运行测试,确认权限配置正常。
步骤3:创建CloudWatch/EventBridge事件规则
- 进入EventBridge控制台,选择「规则」-「创建规则」
- 规则类型选择事件模式,事件源选择「AWS服务」,服务列表选「S3」,事件类型选「Amazon S3 Event」,匹配事件勾选「CreateBucket」
- 目标配置选择「Lambda函数」,选中上一步创建的Lambda函数,保存规则即可
验证方法
你可以手动创建一个关闭了默认加密的S3桶,确认很快能收到对应告警通知即可。
内容的提问来源于stack exchange,提问作者Swati B
相关产品推荐
相关产品推荐

