基于AWS Cognito+CloudTrail日志在QuickSight生成用户审计报表咨询
对应操作的Cognito事件列表
首先需要明确:CloudTrail默认仅记录Cognito控制面操作,用户操作类的数据面事件默认不开启,这也是你查不到登出、忘记密码事件的核心原因。开启数据面事件追踪后,三类操作对应的事件如下:
- 登录成功事件:优先取
RespondToAuthChallenge(用户完成所有认证挑战、登录成功触发),如果无二次验证场景也可使用InitiateAuth事件,过滤掉返回错误码的记录即可 - 登出事件:包含
GlobalSignOut(用户主动触发全局登出)、RevokeToken(应用侧主动吊销用户token实现的登出)两类 - 忘记密码事件:
ForgotPassword(用户发起忘记密码请求),如果需要统计重置成功的事件可以追加ConfirmForgotPassword
缺失字段与事件的完整解决方案
1. 补齐CloudTrail缺失的用户操作事件
操作步骤:
- 进入CloudTrail控制台,打开你当前用于接收日志的Trail配置页
- 找到「数据事件」配置模块,添加新的事件源,选择
cognito-idp.amazonaws.com - 根据需求勾选需要记录的事件,也可直接选择记录所有Cognito数据面事件,保存配置后新产生的用户操作就会写入CloudTrail日志
- 等待新日志同步到Athena对应的日志表后即可查询到对应事件
2. 补全sub与用户邮箱的映射关系
CloudTrail的Cognito事件默认仅返回用户sub(UUID),无邮箱字段,两种落地性较强的实现方案:
方案一:离线同步Cognito用户属性
- 编写Lambda定时任务,周期调用Cognito
ListUsers接口拉取全量用户的sub、邮箱等属性,写入S3指定路径 - 在Athena中为该S3路径创建用户属性表,核心字段为
sub、email - QuickSight数据集的自定义SQL中,用
sub作为关联键,关联CloudTrail日志表和用户属性表,即可拿到邮箱字段
方案二:实时落盘用户属性
- 配置Cognito「预令牌生成」触发器,每次用户完成认证/密码相关操作时,触发器自动将用户sub、邮箱等信息写入CloudWatch Logs或者S3
- 为这部分数据单独创建Athena表,和CloudTrail日志关联查询即可
3. QuickSight数据集参考SQL
你可以根据自己的表名、字段名调整如下关联查询逻辑:
SELECT user_attr.email AS 登录用户邮箱ID, login_success.event_time AS 登录时间, user_logout.event_time AS 登出时间, pwd_reset.event_time AS 忘记密码操作时间 FROM cognito_user_attributes user_attr LEFT JOIN ( SELECT useridentity.principalid AS sub, eventtime AS event_time FROM cloudtrail_cognito_logs WHERE eventname = 'RespondToAuthChallenge' AND errorcode IS NULL ) login_success ON user_attr.sub = login_success.sub LEFT JOIN ( SELECT useridentity.principalid AS sub, eventtime AS event_time FROM cloudtrail_cognito_logs WHERE eventname IN ('GlobalSignOut', 'RevokeToken') AND errorcode IS NULL ) user_logout ON user_attr.sub = user_logout.sub LEFT JOIN ( SELECT useridentity.principalid AS sub, eventtime AS event_time FROM cloudtrail_cognito_logs WHERE eventname = 'ForgotPassword' AND errorcode IS NULL ) pwd_reset ON user_attr.sub = pwd_reset.sub
内容的提问来源于stack exchange,提问作者aws_ik
相关产品推荐
相关产品推荐

