CloudTrail事件记录缺失控制台显示资源,如何通过Python获取?
用Python结合cloudaux/boto提取AWS CloudTrail事件中所有引用资源
AWS CloudTrail事件的resources字段并非所有操作都会返回(比如AttachRolePolicy这类操作),但控制台能展示的引用资源,本质是通过解析事件的请求/响应参数生成的。以下是程序化的实现方案:
核心思路
通过预定义常见事件类型的参数映射规则,解析事件的requestParameters或responseElements字段,结合cloudaux/boto工具构造或获取资源ARN,补充resources字段的缺失内容。
实现步骤与代码示例
1. 定义事件-资源映射规则
针对不同事件类型,指定参数提取路径、资源类型,或直接调用cloudaux的资源查询方法:
import boto3 from cloudaux.aws.iam import get_role, get_policy # 映射规则:键为事件名称,值为资源提取规则列表 EVENT_RESOURCE_RULES = { 'AttachRolePolicy': [ { 'source': 'requestParameters', 'key': 'roleName', 'arn_template': 'arn:aws:iam::{account_id}:role/{value}', 'resource_type': 'IAM::Role' }, { 'source': 'requestParameters', 'key': 'policyArn', 'handler': get_policy, 'resource_type': 'IAM::Policy' } ], 'CreateUser': [ { 'source': 'requestParameters', 'key': 'userName', 'arn_template': 'arn:aws:iam::{account_id}:user/{value}', 'resource_type': 'IAM::User' } ] }
2. 编写资源提取函数
根据规则解析事件,生成或获取资源ARN:
def extract_event_resources(event, account_id): extracted_resources = [] event_name = event.get('eventName') # 优先返回事件原生的resources字段 if 'resources' in event and len(event['resources']) > 0: return event['resources'] # 处理预定义规则的事件 if event_name not in EVENT_RESOURCE_RULES: return extracted_resources for rule in EVENT_RESOURCE_RULES[event_name]: source_data = event.get(rule['source'], {}) resource_value = source_data.get(rule['key']) if not resource_value: continue # 方式1:通过ARN模板构造资源ARN if 'arn_template' in rule: arn = rule['arn_template'].format(account_id=account_id, value=resource_value) extracted_resources.append({ 'ARN': arn, 'resourceType': rule['resource_type'] }) # 方式2:调用cloudaux工具查询资源详情,提取ARN elif 'handler' in rule: try: if rule['key'] == 'roleName': resource_detail = rule['handler'](resource_value, account_number=account_id) else: resource_detail = rule['handler'](resource_value, account_number=account_id) if resource_detail and 'Arn' in resource_detail: extracted_resources.append({ 'ARN': resource_detail['Arn'], 'resourceType': rule['resource_type'] }) except Exception as e: # 捕获权限不足或资源不存在的异常 print(f"Failed to fetch resource {resource_value}: {str(e)}") return extracted_resources
3. 结合CloudTrail API使用
从CloudTrail拉取事件后,调用提取函数获取完整资源列表:
# 初始化CloudTrail客户端 cloudtrail_client = boto3.client('cloudtrail') # 查询指定事件 trail_events = cloudtrail_client.lookup_events( EventName='AttachRolePolicy', MaxResults=10 )['Events'] # 遍历事件提取资源 for event in trail_events: account_id = event.get('recipientAccountId') resources = extract_event_resources(event, account_id) print(f"事件ID {event['eventId']} 引用资源: {resources}")
方案优缺点
- 优点:覆盖大部分高频操作,结合cloudaux可自动验证资源有效性,无需手动拼接ARN;
- 缺点:需维护映射规则字典,新增事件类型时需补充对应规则。
内容的提问来源于stack exchange,提问作者Idan
相关产品推荐
相关产品推荐

