【问题标题】:AWS QuickSight Report for web application users using AWS Cognito logs with CloudTrail针对使用 AWS Cognito 日志和 CloudTrail 的 Web 应用程序用户的 AWS QuickSight 报告
【发布时间】:2021-09-01 01:39:49
【问题描述】:

我们将 AWS Cognito 服务用于我们的 Web 应用程序进行身份验证。 我们希望在 AWS QuickSight 中创建报告,以审计所有应用程序用户的登录、注销和忘记密码事件。 因此,我们启用了 CloudTrail Logs 并在 Athena 中创建了存储日志的表。使用此 Athena 表,我们正在使用自定义 SQL 在 QuickSight 中创建数据集。 现在,我们想知道我们应该考虑哪些事件来捕获用户执行的登录/注销和忘记密码操作。

日志包含用户名,即 sub (UUID),而不是用户的实际电子邮件 ID。 此外,在 CloudTrail 中,我们没有看到登录/忘记密码的任何事件。 因此,对于审计报告,必填字段是登录用户的电子邮件 ID、登录时间、退出时间、忘记密码时间。 如果您能提供任何帮助,我们将不胜感激。

【问题讨论】:

  • 审计报告的用例是否需要拥有(近)实时数据的能力?如果不是,那么可接受的延迟是多少?例如,可以每天或每月生成报告数据吗?
  • 您好,非常感谢您的回复。可接受的延迟可以是一个小时。即一小时大也可以。要求是在 QuickSight 报告中为每个用户获取电子邮件 ID、登录、注销和忘记密码事件。

标签: amazon-web-services amazon-cognito amazon-cloudwatch amazon-quicksight amazon-cloudtrail


【解决方案1】:

不幸的是,为认知事件设置审计跟踪仍然相当困难。问题之一是并非所有事件都被 cloudtrail 捕获(例如注销事件)。 See supported events here

你的选择基本上是

(A) 修改您的用例,仅记录由 cloudtrail 实际捕获的事件。您可以在存储事件之前添加用户电子邮件地址(例如,设置 EventBridge 事件规则,在所需事件上调用 lambda,丰富数据,然后将数据转储到某个数据存储)。或者,您可以创建一个单独的表来保留来自 user-id => 用户电子邮件的映射,并将它们连接到 quicksight 数据集中。

(B) 创建一个类似于 api 网关的东西,位于您的前端和 cognito api 之间。使用前端调用您的 api 网关并在那里执行自定义逻辑。例如:调用时,首先将条目添加到审计表,然后调用 cognito 端点,反之亦然。

两者都比您迄今为止尝试的要多得多,但不幸的是,Cognito 还没有提供您想要的功能。

编辑: 我想补充一点,cognito 高级安全添加了一些事件,但它们不会被 cloudtrail 捕获,并且对于集成目的不是超级有用。

此外,cognito lambda 触发器可用于向身份验证流程添加自定义逻辑,但遗憾的是,注销不是其中之一。

【讨论】:

  • 非常感谢@LRutten 的回复。 Cognito 有 ForgotPassword 事件。我们已经为应用程序用户检查了这一点,但在 CloudTrail 中没有记录 ForgotPassword 事件。此外,我已将 Advanced Security 从 Audit only 更改为 Yes,仍然看不到任何 Sign In 、 Sign Out 或 Forgot Password 事件。我在 CloudTrail 中只能看到 3 个事件,它们是 AdminUpdateUserAttributes (pre auth)、AdminUpdateUserAttributes(post-auth) 和 GetUser - 一旦用户登录应用程序并且 eventSource 是 cognito-idp.amazonaws.com,就会记录这些事件。跨度>
  • 高级安全问题是预期行为。高级安全确实会添加事件,但它们不是 cloudtrail 事件,因此不会在您的设置中捕获。如果没有记录,忘记密码事件很奇怪。然后我需要查看执行实际逻辑的代码,以查看 API 是否被调用。
【解决方案2】:

好的,这里我看到两个主要问题:

  1. 如何识别注销和忘记密码的 CloudTrail 事件
  2. 如何在您的快速报告中获取用户的 EmailId(来自 CloudTrail 中的 UserSub

关于 (1) 识别注销和忘记密码事件:

Cognito 的唯一身份验证审计事件是 SignInSignUpForgotPassword。因此,您可以使用 eventName = 'ForgotPassword' 查询 ForgotPassword 事件。但是,没有针对注销的审计事件,因此您将无法使用 CloudTrail 以这种方式跟踪它们。

为了捕获退出事件,您需要一种不同/额外的方法来退出,这可能会很困难,甚至可能,这取决于您是否使用联合身份。

关于 (2) 在快速查看报告中获取用户的 EmailId:

如上所述in the Cognito developer guide

Amazon Cognito 支持将用户池操作页面上列出的所有操作记录为 CloudTrail 日志文件中的事件。对于特定于用户的请求,Amazon Cognito 在 CloudTrail 日志中记录 UserSub 而不是 UserName

如果您需要的信息比 CloudTrail 本身提供的更多信息,您可以通过调用 ListUsers API 并为 sub 使用过滤器来查找给定 UserSub 的用户。

现在,为了获得您想要的 QuickSight 报告,您需要以某种方式自己处理 CloudTrail 输出以获取您想要的所有数据(例如,使用 cognito API 处理 UserSub 以获取 EmailId)到数据源中可以使用 QuickSight 查询。如何构建此解决方案在很大程度上取决于您是否需要实时数据。

如果您需要(近)实时解决方案,您可以通过无服务器设置来实现此目的,您可以在其中流式传输 cloudtrail -> cloudwatch 日志(可选过滤)-> kinesis 流 -> 处理 UserSub 的流消费者(例如 Lambda)您想要的数据 -> QuickSight 的数据源(s3/athena/dynamodb/etc)。

如果您不需要近乎实时的解决方案,您可以采用类似的方法,除了不是流式传输日志事件,您可能只是在 S3 存储桶中累积日志。然后,您会定期处理来自 S3 的日志,并将处理后的数据放入您选择的连接到 QuickSight 的数据源中。

【讨论】:

  • 非常感谢@sytech 的回复。所以基本上,以我目前的设计,我无法获得 userSub 的电子邮件 ID。此外,我没有看到任何有关 SignIn、SignOut 和 ForgotPassword 事件的 CloudTrail 日志。但是为什么这些事件没有被记录在 CloudTrail 中,例如文档中提到了 ForgotPassword 事件,但我在日志中没有看到。
猜你喜欢
  • 2019-12-22
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2020-11-20
  • 1970-01-01
  • 2016-12-24
  • 2018-10-23
相关资源
最近更新 更多