【发布时间】:2017-06-02 00:22:28
【问题描述】:
我的客户需要 AWS 大扫除!
在我们可以终止 EC2 实例之前,我们需要找出谁提供了这些实例,并在我们删除它们之前询问他们是否仍在使用该实例。 AWS 似乎没有提供开箱即用的功能来报告 EC2 实例的“所有者”/“供应商”是谁,据我了解,我需要解析驻留在 S3 中的存档压缩日志文件.
问题是,他们的自动化是利用 STS AssumeRole 来配置实例。这意味着日志中的 RunInstances 事件不会追溯到实际用户(如果我错了,请纠正我,希望我错了)。
AWS blog 提供了一个虚构人物 Alice 的故事,她的步骤将 TerminateInstance 事件追溯到用户,其中涉及 2 个日志事件:TerminateInstance 事件和 AssumeRole 事件的“某时某处”事件,其中包含实际的用户详细信息。是否有一种实用的方法可以将这两个事件关联起来?
这是我的 POC,它通过来自 s3 的 cloudtrail 日志进行解析:
import boto3
import gzip
import json
boto3.setup_default_session(profile_name=<your_profile_name>)
s3 = boto3.resource('s3')
s3.Bucket(<your_bucket_name>).download_file(<S3_path>, "test.json.gz")
with gzip.open('test.json.gz','r') as fin:
file_contents = fin.read().replace('\n', '')
json_data = json.loads(file_contents)
for record in json_data['Records']:
if record['eventName'] == "RunInstances":
user = record['userIdentity']['userName']
principalid = record['userIdentity']['principalId']
for index, instance in enumerate(record['responseElements']['instancesSet']['items']):
print "instance id: " + instance['instanceId']
print "user name: " + user
print "principalid " + principalid
但是,由于这些角色由许多组共享,因此详细信息是通用的。如何在脚本中担任角色之前找到用户的详细信息?
更新:做了一些研究,看起来我可以通过共享的“accessKeyId”将 Runinstances 事件与 AssumeRole 事件相关联,并且应该在它承担角色之前向我显示帐户名称。虽然很棘手。并非所有 RunInstances 事件都包含此 accessKeyId,例如,如果 'invokedby' 是一个自动缩放事件。
【问题讨论】:
-
我认为您在可用信息方面存在差距。 AssumeRole 是如何准确发生的? Mallory(Alice 和 Bob 的虚构克星)是否在她的工作站上运行自动化脚本,她的 AWS 凭证用于调用 AssumeRole?或者她是 ssh-ing 到 EC2 上使用 IAM 角色的机器,所以它根本不是一个 person 承担这个角色? (对于 IAM 实例角色,是 EC2 基础设施调用 AssumeRole,然后将生成的临时凭证提供给实例。)
标签: amazon-s3 boto3 amazon-cloudtrail