从 Amazon Cognito 用户池导出日志 - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

从 Amazon Cognito 用户池导出日志

您可以将用户池配置为将某些其他活动的详细日志发送给其他人(例如 CloudWatch 日志组)。 AWS 服务这些日志比中的日志更精细 AWS CloudTrail,可用于对用户池进行故障排除和使用高级安全功能分析用户登录活动。当您想要流式传输短信和电子邮件通知错误的日志时,您的用户池会向 CloudWatch 日志组发送ERROR级别日志。当您想要流式传输用户登录活动的日志时,您的用户池会将 INFO 级别日志发送到日志组、Amazon Data Firehose 流或 Amazon S3 存储桶。您可以将这两个选项合并到一个用户池中。

有关日志导出的需知信息

成本影响

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

用户活动日志导出包含安全评估,并且是用户池高级安全特征的一项功能。只有在高级安全特征处于活动状态时,Amazon Cognito 才会生成这些日志。这些特征会增加用户池中每月活跃用户(MAU)的费用。有关更多信息,请参阅 Amazon Cognito 定价

用户活动日志是INFO级别的

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

尽力传输

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

现有的外部日志不受影响

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

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

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

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

仅适用于用户池

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

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

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

有关从 Amazon Cognito 发送日志的授权模式的更多信息,请参阅《亚马逊日志用户指南 AWS 服务》中的启用 CloudWatch 日志记录。

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

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

不能将用户活动日志发送到多个目的地。除了 “日志” 之外 CloudWatch ,您无法将用户通知日志发送到任何目的地。

不同的配置选项

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

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

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

在 Amazon S3 中自动创建文件夹

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

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

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

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

{ "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" }

您必须使用具有以下权限的 AWS 证书来授权这些请求。

{ "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" } }

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

具有 Plus 功能计划和威胁防护的用户池记录用户活动事件:对用户池中的用户登录、注销和其他身份验证操作的详细信息和安全评估。您可能想要在自己的日志管理系统中查看用户活动日志,或者创建归档。您可以将这些数据导出到亚马逊 CloudWatch 日志组、亚马逊数据 Firehose 流或亚马逊简单存储服务 (Amazon S3) 存储桶。在这里,您可以将这些数据摄取到其他系统中,这些系统以适合您的操作流程的方式分析、标准化或以其他方式处理数据。要导出此类数据,您的用户池必须在 Plus 功能计划中,并且您的用户池中必须启用高级安全功能

利用这些用户活动日志中的信息,您可以查看用户登录和账户管理活动的概况。默认情况下,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 操作为用户活动激活日志导出。

AWS Management Console
  1. 如果您还没有要使用的存储桶,请创建 S3 存储桶Firehose 流CloudWatch日志组。

  2. 登录 Amazon Cognito 控制台

  3. 选择用户池

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

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

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

  7. 日志目标下,选择要处理日志 AWS 服务 的:CloudWatch 日志组Amazon Data Firehose 流S3 存储桶。

  8. 您的选择将使用相应的资源类型填入资源选择器。从列表中选择日志组、流或存储桶。您也可以选择 “创建” 按钮,导航到 AWS Management Console 所选服务的,然后创建新资源。

  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
{ "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
{ "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
{ "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": "" }, "logSourceId": { "userPoolId": "us-west-2_EXAMPLE" } }