我正在尝试开发一种使用CloudTrail分解用户/项目的S3的方法。 CloudTrail是否能够查看哪个IAM用户将特定对象上传到存储桶?
更新:
我打开了一个CloudTrail来监视对象级活动(对于所有s3存储桶,包括读写活动),但是,当我尝试在上面的更新中列出“PutObject”事件时,它不起作用(即列表)事件空白)。
ct_client = boto3.client('cloudtrail')
response = ct_client.lookup_events(
LookupAttributes=[
{
'AttributeKey': 'EventName',
'AttributeValue': 'PutObject'
}],
StartTime=datetime(2018, 3, 1),
EndTime=datetime.now(),
MaxResults=50
)
更新2
我的存储桶属性和控制台中的CloudTrail的图像:
是的,您可以使用CloudTrail监控IAM用户将对象上传到S3。 CloudTrail记录的信息量非常广泛。
此文档链接将为您提供CloudTrail S3日志记录的介绍:
Logging Amazon S3 API Calls by Using AWS CloudTrail
此文档链接将为您提供有关CloudTrail记录的事件的详细信息:
CloudTrail Log Event Reference
按照此文档链接启用S3存储桶的对象级别日志记录。这对于查看PutObject等API是必要的:
How Do I Enable Object-Level Logging for an S3 Bucket with AWS CloudTrail Data Events?
CloudTrail有一个Python API。但是,您需要直接处理存储在S3中的CloudTrail日志。
我更喜欢使用Athena分析CloudTrail日志,这使得这个过程变得简单。
我不相信数据事件的显示方式与管理事件相同。如果您在AWS控制台中查看事件历史记录,情况就是如此。
正如其他地方所建议的那样,在存储数据事件的s3位置上放置一个Athena表也很有效 - 这样的事情会告诉你上传对象的是谁/什么:
SELECT
useridentity
, json_extract_scalar(requestparameters,'$.bucketName')
, json_extract_scalar(requestparameters,'$.key')
FROM cloudtrail_logs
WHERE eventname IN ('PutObject')
AND json_extract_scalar(requestparameters,'$.bucketName') = 'xxx'
AND json_extract_scalar(requestparameters,'$.key') = 'yyy';
其中cloudtrail_logs
是根据以下文档创建的:https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html
useridentity
并不总是IAM用户 - 它可能是AWS服务,外部帐户,也是假定的角色 - 您可以使用.type元素根据需要进行过滤或简单地拉取所有元素。
根据您在S3中拥有的对象数量/ S3中cloudtrail日志的大小,您可能希望按日期优化cloudtrail日志表的s3位置 - 例如:
s3://<BUCKETNAME>/AWSLogs/<ACCOUNTNUMBER>/CloudTrail/<REGION>/2018/08/17
如果您希望可以使用boto3执行Athena查询,将输出保存到S3位置,然后使用boto3从S3中提取该数据。