从 Amazon Cognito 用户池导出日志 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

从 Amazon Cognito 用户池导出日志

您可以将您的用户池配置为向另一个 Amazon Web Services 服务(例如,CloudWatch 日志组)发送一些其他活动的详细日志。这些日志的精细度比 Amazon CloudTrail 中的日志要更高,对于排查用户池的问题以及使用威胁防护功能分析用户登录活动可能很有用。当您想要流式传输短信和电子邮件通知错误的日志时,您的用户池会向 CloudWatch 日志组发送 ERROR 级别日志。当您想要流式传输用户登录活动的日志时,您的用户池会将 INFO 级别日志发送到日志组、Amazon Data Firehose 流或 Amazon S3 存储桶。您可以将这两个选项合并到一个用户池中。

有关日志导出的需知信息

成本影响

Amazon Data Firehose、Amazon S3 和 CloudWatch Logs 会产生数据摄取和检索费用。您的日志配置可能会影响 Amazon 账单。有关更多信息,请参阅下列内容:

用户活动日志导出包含安全评估,并且是用户池威胁防护的一项功能。Amazon Cognito 仅在威胁防护处于仅限审计全功能模式,并且您的用户池使用的是增值版功能计划时,才会生成这些日志。

用户活动日志为 INFO 级别

导出的用户活动日志仅包含 INFO 错误级别的日志,用于为针对身份验证活动的统计和安全分析提供信息。WARNINGERROR 错误级别的消息(例如节流错误)不包含在导出的日志中。

尽力传输

从 Amazon Cognito 传输日志将尽力而为。您的用户池传输的日志量以及 CloudWatch Logs、Amazon S3 和 Firehose 的服务配额可能会影响日志的传输。

现有的外部日志不受影响

这些日志记录选项不会取代或更改用户池的以下日志功能。

  1. CloudTrail 记录了常规用户活动,例如注册和登录。

  2. 使用 CloudWatch 指标大规模分析用户活动。

另外,您还可以在 CloudWatch Logs 中找到来自 在 CloudWatch 控制台中查看用户池导入结果使用 Lambda 触发器自定义用户池工作流 的日志。Amazon Cognito 和 Lambda 将这些日志存储在与您为用户活动日志指定的日志组不同的日志组中。

仅适用于用户池

身份池没有日志导出功能。

需要用户权限和服务相关角色

设置日志导出的 Amazon 主体必须具有修改目标资源的权限,如以下主题所述。Amazon Cognito 代表您创建一个服务相关角色并代入角色,以便向目标资源传输日志。

有关从 Amazon Cognito 发送日志的授权模式的更多信息,请参阅《Amazon CloudWatch Logs 用户指南》中的启用从 Amazon Web Services 服务进行日志记录

每种日志类型的日志级别是特定的

消息传递日志为 userNotification 类型和 ERROR 错误级别。高级安全用户活动日志为 userAuthEvents 类型和 INFO 错误级别。您可以合并 LogConfigurations 的两个成员,一个成员为 userNotification,用于 CloudWatch Logs,另一个成员为 userAuthEvents,用于 Firehose、Amazon S3 或 CloudWatch Logs。

不能将用户活动日志发送到多个目的地。不能将用户通知日志发送到除 CloudWatch Logs 之外的任何其他目的地。

不同的配置选项

您只能使用 Amazon Cognito 用户池 API 或 Amazon SDK 配置用户通知日志。您可以使用 API 或在 Amazon Cognito 控制台中配置高级安全用户活动日志。要同时设置两者,请使用 API,如 SetLogDeliveryConfiguration 中的示例请求所示。

基于大型资源的策略需要其他配置

要将日志发送到资源策略大小超过 5120 个字符的日志组,请使用以 /aws/vendedlogs 开头的路径配置日志组。有关更多信息,请参阅从某些 Amazon 服务启用日志记录

在 Amazon S3 中自动创建文件夹

当您将威胁防护日志导出配置到 Amazon S3 存储桶时,Amazon Cognito 可能会在您的存储桶中创建一个 AWSLogs 文件夹。该文件夹并非在所有情况下都会创建,且即使未创建,配置操作仍可成功完成。

导出电子邮件和短信消息传输错误

对于电子邮件和短信消息传输错误,您可以从用户池中传输 Error 级别的用户通知日志。激活此功能后,您可以选择希望 Amazon Cognito 将日志发送到哪个日志组。当您想了解您的用户池通过 Amazon SNS 和 Amazon SES 传递的电子邮件和短信消息的状态时,用户通知日志记录非常有用。与用户活动导出不同,此日志导出选项不需要增值版功能计划。

您可以在 SetLogDeliveryConfiguration API 请求中使用 Amazon Cognito 用户池 API 配置详细的通知日志。您可以在 GetLogDeliveryConfiguration API 请求中查看用户池的日志记录配置。以下是一个示例请求正文。

{ "LogConfigurations": [ { "CloudWatchLogsConfiguration": { "LogGroupArn": "arn:aws:logs:us-west-2:123456789012:log-group:example-user-pool-exported" }, "EventSource": "userNotification", "LogLevel": "ERROR" } ], "UserPoolId": "us-west-2_EXAMPLE" }

您必须使用具有以下权限的 Amazon 凭证来对这些请求进行授权。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ManageUserPoolLogs", "Action": [ "cognito-idp:SetLogDeliveryConfiguration", "cognito-idp:GetLogDeliveryConfiguration" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid": "CognitoLog", "Action": [ "logs:CreateLogDelivery", "logs:GetLogDelivery", "logs:UpdateLogDelivery", "logs:DeleteLogDelivery", "logs:ListLogDeliveries" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid": "CognitoLoggingCWL", "Action": [ "logs:PutResourcePolicy", "logs:DescribeResourcePolicies", "logs:DescribeLogGroups" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

以下是用户池中的一个示例事件。此日志架构可能会发生变化。某些字段可能记录为空值。

{ "eventTimestamp": "1687297330677", "eventSource": "USER_NOTIFICATION", "logLevel": "ERROR", "message": { "details": "String" }, "logSourceId": { "userPoolId": "String" } }

导出威胁防护用户活动日志

使用增值版功能计划并启用了威胁防护的用户池会记录用户活动事件:包括用户登录、注销以及与您的用户池进行的其他身份验证操作的详细信息和安全评估。您可能想要在自己的日志管理系统中查看用户活动日志,或者创建归档。您可以将此数据导出至 Amazon CloudWatch Logs 日志组、Amazon Data Firehose 流或 Amazon Simple Storage Service(Amazon S3)存储桶。在这里,您可以将这些数据摄取到其他系统中,这些系统以适合您的操作流程的方式分析、标准化或以其他方式处理数据。要导出此类数据,您的用户池必须使用增值版功能计划,并且必须启用威胁防护

利用这些用户活动日志中的信息,您可以查看用户登录和账户管理活动的概况。默认情况下,Amazon Cognito 会将这些事件捕获到与用户池关联的存储中。以下示例是已登录且评估结果表明没有风险因素的用户的示例事件。您可以使用 AdminListUserAuthEvents API 操作来检索此信息。下面是一个示例输出:

{ "AuthEvents": [ { "EventId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222", "EventType": "SignIn", "CreationDate": "2024-06-27T10:49:59.139000-07:00", "EventResponse": "Pass", "EventRisk": { "RiskDecision": "NoRisk", "CompromisedCredentialsDetected": false }, "ChallengeResponses": [ { "ChallengeName": "Password", "ChallengeResponse": "Success" } ], "EventContextData": { "IpAddress": "192.0.2.1", "DeviceName": "Chrome 126, Windows 10", "Timezone": "-07:00", "City": "null", "Country": "United States" } } ], "NextToken": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222#2024-06-27T17:49:59.139Z" }

您可以在 Amazon Cognito 控制台中或通过 SetLogDeliveryConfiguration API 操作为用户活动激活日志导出。

Amazon Web Services 管理控制台
  1. 如果您还没有要使用的 S3 存储桶Firehose 流CloudWatch 日志组,请创建这些项。

  2. 登录 Amazon Cognito 控制台

  3. 选择用户池

  4. 从列表中选择一个现有用户池,或创建一个用户池

  5. 选择高级安全选项卡。找到导出用户活动日志,然后选择编辑

  6. 日志记录状态下,选中激活用户活动日志导出旁边的复选框。

  7. 日志记录目标下,选择要用于处理日志的 Amazon Web Services 服务:CloudWatch 日志组Amazon Data Firehose 流S3 存储桶

  8. 您的选择将使用相应的资源类型填入资源选择器。从列表中选择日志组、流或存储桶。您也可以选择创建按钮,导航到所选服务的 Amazon Web Services 管理控制台 并创建新资源。

  9. 选择保存更改

API

为您的用户活动日志选择一种目标类型。

以下是将 Firehose 流设置为日志目标的示例 SetLogDeliveryConfiguration 请求正文。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "FirehoseConfiguration": { "StreamArn": "arn:aws:firehose:us-west-2:123456789012:deliverystream/example-user-pool-activity-exported" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

以下是将 Amazon S3 存储桶设置为日志目标的示例 SetLogDeliveryConfiguration 请求正文。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "S3Configuration": { "BucketArn": "arn:aws:s3:::amzn-s3-demo-logging-bucket" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

以下是将 CloudWatch 日志组设置为日志目标的示例 SetLogDeliveryConfiguration 请求正文。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "CloudWatchLogsConfiguration": { "LogGroupArn": "arn:aws:logs:us-west-2:123456789012:log-group:DOC-EXAMPLE-LOG-GROUP" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

配置日志传送的用户必须是用户池管理员并具有以下额外权限:

Amazon S3
JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ManageUserPoolLogs", "Action": [ "cognito-idp:SetLogDeliveryConfiguration", "cognito-idp:GetLogDeliveryConfiguration" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid": "ManageLogsS3", "Effect": "Allow", "Action": [ "logs:CreateLogDelivery", "s3:PutBucketPolicy", "s3:GetBucketPolicy" ], "Resource": "*" } ] }
CloudWatch Logs
JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ManageUserPoolLogs", "Action": [ "cognito-idp:SetLogDeliveryConfiguration", "cognito-idp:GetLogDeliveryConfiguration" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid": "ManageLogsCWL", "Action": [ "logs:CreateLogDelivery", "logs:GetLogDelivery", "logs:UpdateLogDelivery", "logs:DeleteLogDelivery", "logs:ListLogDeliveries", "logs:PutResourcePolicy", "logs:DescribeResourcePolicies", "logs:DescribeLogGroups" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
Amazon Data Firehose
JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ManageUserPoolLogs", "Action": [ "cognito-idp:SetLogDeliveryConfiguration", "cognito-idp:GetLogDeliveryConfiguration" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Sid": "ManageUserPoolLogsFirehose", "Effect": "Allow", "Action": [ "logs:CreateLogDelivery", "iam:CreateServiceLinkedRole", "firehose:TagDeliveryStream" ], "Resource": "*" } ] }

以下是用户池中的一个示例事件。此日志架构可能会发生变化。某些字段可能记录为空值。

{ "eventTimestamp": "1687297330677", "eventSource": "USER_ACTIVITY", "logLevel": "INFO", "message": { "version": "1", "eventId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "eventType": "SignUp", "userSub": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222", "userName": "test-user", "userPoolId": "us-west-2_EXAMPLE", "clientId": "1example23456789", "creationDate": "Wed Jul 17 17:25:55 UTC 2024", "eventResponse": "InProgress", "riskLevel": "", "riskDecision": "PASS", "challenges": [], "deviceName": "Other, Other", "ipAddress": "192.0.2.1", "requestId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333", "idpName": "", "compromisedCredentialDetected": "false", "city": "Seattle", "country": "United States", "eventFeedbackValue": "", "eventFeedbackDate": "", "eventFeedbackProvider": "", "hasContextData": "true" }, "logSourceId": { "userPoolId": "us-west-2_EXAMPLE" } }