查找以假定角色调用我的 lambda 的帐户

Find accounts calling my lambda with assumed role

我们有一个带有 lambda 的帐户 A 和一个调用它的角色。我们有帐户 B、C、D,它们被允许承担 A 角色并调用该 lambda。

现在的问题是:我们对 lambda 的调用太多了,我们想弄清楚哪些账户最活跃地使用它。所以在 lambda 代码中,我想知道是谁在调用它并写一些日志或放置一些度量记录。 但看起来我找不到代码(至少在 java)。

我还启用了 cloudtrail 数据事件,现在在跟踪中我可以看到一些关于我的 lambda 调用的附加信息。 “userIdentity”字段看起来很有前途,但它也不包含有关承担该角色的原始帐户的任何信息。唯一可能有用的信息是在担任角色操作期间提供的角色会话名称。但是B、C、D服务不提供任何合理的session-name,只是一些随机的东西。

目前我只看到两个选项,并且都需要更改依赖服务: 提供帐户 ID 或服务名称作为角色会话名称,或为每个 B、C 和 D 服务创建独立的可承担角色。

在不更改这些服务的代码的情况下,是否有任何其他可能性可以追踪到这一点?

@jellycsc 的评论确实提供了答案,尽管该文档对如何设置自动审计系统的描述相当冗长。简短的回答是:都在 CloudTrail 中。

正如您已经确定的那样,您可以在 CloudTrail 中找到 InvokeFunctionInvokeAsync 事件。在 CloudTrail 事件的 userIdentity 对象中,查看 accessKeyId 字段。我们想使用此字段而不是 arn 字段(其中包含代入角色的 ARN),因为每次代入角色时它都是唯一的(这意味着它允许您 link 特定的 InvokeFunction 动作到特定的 AssumeRole 动作)。

现在,您想查找事件类型为 AssumeRole 的 CloudTrail 管理 事件(不是数据事件),其中 responseElements.credentials.accessKeyId 字段与您在上一步中找到的 accessKeyId 匹配。这是首次担任用于调用 Lambda 的角色的事件。在 this 事件的 userIdentity 对象中,您将找到承担该角色的用户的凭据,即通过承担的角色实际调用 Lambda 的原始用户。