在使用STS AssumeRole时实际配置EC2实例的CloudTrail RunInstances事件?

时间:2017-06-02 00:22:28

标签: amazon-s3 boto3 amazon-cloudtrail

我的客户需要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'是自动缩放事件。

1 个答案:

答案 0 :(得分:0)

直接回答:

对于你提出的解决方案,遗憾的是你不幸。你可以看看http://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html#w28aac22b9b4b7b3b1。在第4行,它表示Assume Role将仅为所有后续调用保存角色身份。

我会联系aws支持以确保这一点,因为我很可能会弄错。

在你的情况下我会做什么:

首先,请等待几天,以防有人有更好的想法,或者我错了,并通过开箱即用的解决方案获得支持答案

  1. 创建一个aws配置规则,删除所有具有特定标记的实例。然后告诉开发人员标记他们确定应该删除的所有实例,然后这些实例将被删除
  2. 使用自己的标记
  3. 标记所有生产实例和仍需要的开发实例
  4. 运行一个脚本,该脚本会使用单独的标记标记所有未标记的实例。双重和三重检查这些实例。
  5. 备份并关闭步骤3中标记的实例(不带 删除实例)。
  6. 如果有人抱怨某些事情没有发生,那就意味着他们 错过了步骤1或2中的实例。正确标记此实例并且 再打开它。
  7. 过了一会儿(一周左右),删除仍然存在的实例 停止(保留备份)
  8. 几个月后,删除未恢复的备份
  9. 请注意,这不是万无一失的,因为它可能存在人为错误和可能的停机时间,因此需要进行双重检查和三重检查,对同一环境进行克隆并对其进行测试(如果您的开发环境已经具有此类一个配置,这将是最好的方案),慢慢地能够监控所有内容,并确保保留所有内容的备份。

    祝你好运,并告诉我你的解决方案最终是什么。

    未来的一般准则:

    注意:以下几点非常具体,并且是我遵守的一般规则,因为我发现它们不时给我带来麻烦。阅读它们,解雇你认为不合适的东西,并采取你觉得合理的东西。

    1. 不要经常使用假定角色,因为它会混淆用户访问权限。如果它是在开发人员的PC上运行的脚本,请让它使用自己的用户名运行。如果它在服务器上运行,请将其与创建它的角色保持一致。管理量将会减少,因为您只需削减中间人(假设角色)并且不再需要创建角色,只需将权限分配给正确的组/用户即可。当我考虑使用假设角色作为必要时,请看下面。
    2. 自动删除。您应该创建的第一件事是自动执行尽可能保持aws帐户清洁的任务,因为这样可以节省$$$和调试的痛苦。作用于这些标签的标签和脚本是非常强大的工具。因此,如果开发人员需要一天的实例来尝试新的东西,他可以创建一个标记,将实例计时,然后有一个脚本在时机成熟时清理它。这些都是针对特定项目的,并不是每个人都需要所有这些,因此请查看并评估您的项目所需的内容并采取相应措施。
    3. 我建议的是在开发环境中向用户自己授予权限,因为它会将事情跟踪到他们的根目录并找到最有经验的人来更轻松地解决问题。在生产环境中,一切都应该是自动化的(在需要时创建并在不再需要时删除)并且任何人都不应该对该帐户具有任何写入权限。

      至于假定角色,我只使用它以防我想要访问另一个帐户的只读生产日志。另一种情况是真的不应该发生的事情,如果有的话,但仍然需要让一些用户访问它。所以,作为一个额外的保护层来防止'我错误地做了',我让他们切换角色去做,并且永远不会有一个自动切换角色并执行操作的脚本,以尽量使其尽可能慎重(想想删除数据库等)。另一件事是访问敏感信息(信用卡数据库等)。可能会出现更多情况,这取决于您的判断。

      再次,祝你好运。