启用从 AWS 服务进行日志记录 - Amazon CloudWatch 日志

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

启用从 AWS 服务进行日志记录

虽然许多服务仅将日志发布到 CloudWatch Logs,但有些AWS服务可以将日志直接发布到 Amazon Simple Storage Service 或 Amazon Data Firehose。如果您对日志的主要需求是在其中一种服务中存储或处理日志,那么您可以轻松地让生成日志的服务将它们直接发送到 Amazon S3 或 Firehose,而无需额外设置。

即使日志直接发布到 Amazon S3 或 Firehose,仍会产生费用。有关更多信息,请参阅 Amazon CloudWatch Pricing(Amazon CloudWatch 定价)Logs(日志)选项卡上的 Vended Logs(已出售日志)

一些 AWS 服务使用通用基础设施来发送日志。要启用从这些服务进行日志记录,您必须以具有特定权限的用户身份登录。此外,您必须向 AWS 授予权限才能发送日志。

对于需要这些权限的服务,所需的权限有两个版本。表中将需要这些额外权限的服务标为支持的 [V1 权限]支持的 [V2 权限]。有关这些必需权限的信息,请参阅表后的部分。

日志源 日志类型 CloudWatch Logs Amazon S3 Firehose

Amazon API Gateway 访问日志

Vended logs(已出售日志)

支持的 [V1 权限]

AWS AppSync 日志

Custom logs(自定义日志)

支持

Amazon Aurora MySQL 日志

Custom logs(自定义日志)

支持

Amazon Bedrock 知识库日志记录

Vended logs(已出售日志) 支持的 [V2 权限] 支持的 [V2 权限] 支持的 [V2 权限]

Amazon Chime 媒体质量指标日志和 SIP 消息日志

Vended logs(已出售日志)

支持的 [V1 权限]

CloudFront:访问日志

Vended logs(已出售日志) 支持的 [V1 权限]

AWS CloudHSM 审计日志

Custom logs(自定义日志)

支持

CloudWatch Evidently 评估事件日志

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限]

CloudWatch Internet Monitor 日志

Vended logs(已出售日志) 支持的 [V1 权限]

CloudTrail 日志

Custom logs(自定义日志)

支持

AWS CodeBuild 日志

Custom logs(自定义日志)

支持

Amazon CodeWhisperer 事件日志

Vended logs(已出售日志) 支持的 [V2 权限] 支持的 [V2 权限] 支持的 [V2 权限]

Amazon Cognito 日志

Vended logs(已出售日志) 支持的 [V1 权限]

Amazon Connect 日志

Custom logs(自定义日志)

支持

AWS DataSync 日志

Custom logs(自定义日志)

支持

Amazon ElastiCache(Redis OSS)日志

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限]

AWS Elastic Beanstalk 日志

Custom logs(自定义日志)

支持

Amazon Elastic Container Service 日志

Custom logs(自定义日志)

支持

Amazon Elastic Kubernetes Service 控制面板日志

Vended logs(已出售日志)

支持

AWS Elemental MediaTailor 日志

Vended logs(已出售日志)

支持

Amazon EventBridge 管道日志记录

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限] 支持的 [V1 权限]

AWS Fargate 日志

Custom logs(自定义日志)

支持

AWS Fault Injection Service 实验日志

Vended logs(已出售日志) 支持的 [V1 权限]

Amazon FinSpace

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限] 支持的 [V1 权限]

AWS Global Accelerator 流日志

Vended logs(已出售日志) 支持的 [V1 权限]

AWS Glue 作业日志

Custom logs(自定义日志)

支持

IAM Identity Center 错误日志

Vended logs(已出售日志) 支持的 [V2 权限] 支持的 [V2 权限] 支持的 [V2 权限]

Amazon Interactive Video Service 聊天日志

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限] 支持的 [V1 权限]

AWS IoT 日志

Custom logs(自定义日志)

支持

AWS IoT FleetWise 日志

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限] 支持的 [V1 权限]

AWS Lambda 日志

Custom logs(自定义日志)

支持

Amazon Macie 日志

Custom logs(自定义日志)

支持

AWS Mainframe Modernization

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限] 支持的 [V1 权限]

Amazon Managed Service for Prometheus 日志

Vended logs(已出售日志)

支持的 [V1 权限]

Amazon MSK 代理日志

Vended logs(已出售日志)

支持的 [V1 权限]

支持的 [V1 权限] 支持的 [V1 权限]

Amazon MSK Connect 日志

Vended logs(已出售日志)

支持的 [V1 权限]

支持的 [V1 权限] 支持的 [V1 权限]

Amazon MQ 一般日志和审计日志

Custom logs(自定义日志)

支持

AWS 网络防火墙日志

Vended logs(已出售日志)

支持的 [V1 权限]

支持的 [V1 权限] 支持的 [V1 权限]

Network Load Balancer 访问日志

Vended logs(已出售日志) 支持的 [V1 权限]

OpenSearch 日志

Custom logs(自定义日志)

支持

Amazon OpenSearch Service 摄取日志

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限] 支持的 [V1 权限]

AWS OpsWorks 日志

Custom logs(自定义日志)

支持

Amazon Relational Database ServicePostgreSQL 日志

Custom logs(自定义日志)

支持

AWS RoboMaker 日志

Custom logs(自定义日志)

支持

Amazon Route 53 公有 DNS 查询日志

Vended logs(已出售日志)

支持

Amazon Route 53 Resolver 查询日志

Vended logs(已出售日志)

支持的 [V1 权限]

支持的 [V1 权限]

Amazon SageMaker 事件

Vended logs(已出售日志)

支持的 [V1 权限]

Amazon SageMaker 工件事件

Vended logs(已出售日志)

支持的 [V1 权限]

AWS Site-to_Site VPN 日志

Vended logs(已出售日志)

支持的 [V1 权限]

支持的 [V1 权限]

支持的 [V1 权限]

Amazon Simple Email Service 日志

Vended logs(已出售日志) 支持的 [V2 权限] 支持的 [V2 权限] 支持的 [V2 权限]

Amazon Simple Notification Service 日志

Custom logs(自定义日志)

支持

Amazon Simple Notification Service 数据保护策略日志

Custom logs(自定义日志)

支持

EC2 Spot 实例数据源文件

Vended logs(已出售日志)

支持的 [V1 权限]

AWS Step Functions 表达工作流和标准工作流日志

Vended logs(已出售日志)

支持的 [V1 权限]

Storage Gateway 审计日志和运行状况日志

Vended logs(已出售日志)

支持的 [V1 权限]

AWS Transfer Family 日志

Vended logs(已出售日志)

支持的 [V1 权限]

支持的 [V1 权限]

支持的 [V1 权限]

AWS Verified Access 日志

Vended logs(已出售日志)

支持的 [V1 权限]

支持的 [V1 权限]

支持的 [V1 权限]

Amazon Virtual Private Cloud 流日志

Vended logs(已出售日志)

支持

支持的 [V1 权限] 支持的 [V1 权限]

Amazon VPC Lattice 访问日志

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限] 支持的 [V1 权限]

AWS WAF 日志

Vended logs(已出售日志) 支持的 [V1 权限] 支持的 [V1 权限]

支持

Amazon WorkMail日志

Vended logs(已出售日志) 支持的 [V2 权限] 支持的 [V2 权限] 支持的 [V2 权限]

需要额外权限 [V1] 的日志记录

一些 AWS 服务使用通用基础设施将其日志发送到 CloudWatch Logs、Amazon S3 或 Firehose。要启用下表中列出的AWS服务,将其日志发送到前述目标,您必须以具有特定权限的用户身份登录。

此外,必须将权限授予AWS以启用日志发送。AWS可以在设置日志时自动创建这些权限,您也可以在设置日志记录之前自行创建这些权限。对于跨账户传输,您必须自己手动创建权限策略。

如果您或您企业中的某个人在首次设置日志发送时选择让AWS自动设置必要的权限和资源策略,那么设置日志发送的用户必须具有一定的权限,如本节后面所述。或者,您可以自行创建资源策略,这样设置日志发送的用户就不需要那么多权限。

下表汇总了适用本节中信息的日志类型及日志目标。

以下各部分提供了每个目标的更多详细信息。

发送到 CloudWatch Logs 的日志

重要

当您将以下列表中的日志类型设置为发送到 CloudWatch Logs 时,AWS会创建或更改与接收日志的日志组关联的资源策略(如需要)。继续阅读本节,查看详细信息。

当前一部分的表中列出的日志类型发送到 CloudWatch Logs 时,本部分适用:

用户权限

若要能够设置首次将这些类型日志中的任一种日志发送到 CloudWatch Logs,您必须登录到具有以下权限的账户。

  • logs:CreateLogDelivery

  • logs:PutResourcePolicy

  • logs:DescribeResourcePolicies

  • logs:DescribeLogGroups

    注意

    当您指定 logs:DescribeLogGroupslogs:DescribeResourcePolicieslogs:PutResourcePolicy 权限时,请确保将其 Resource 行的 ARN 设置为使用 * 通配符,而不是仅指定单个日志组名称。例如,"Resource": "arn:aws:logs:us-east-1:111122223333:log-group:*"

如果其中任何一种类型的日志已被发送到 CloudWatch Logs 中的日志组,要设置将其中另一种日志也发送到同一日志组,您只需要 logs:CreateLogDelivery 权限。

日志组和资源策略

接收日志的日志组必须具有包含特定权限的资源策略。如果日志组当前没有资源策略,而且设置日志记录的用户对日志组具有 logs:PutResourcePolicylogs:DescribeResourcePolicieslogs:DescribeLogGroups 权限,那么当您开始将日志发送到 CloudWatch Logs 日志时,AWS会自动为其创建以下策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogDeliveryWrite20150319", "Effect": "Allow", "Principal": { "Service": [ "delivery.logs.amazonaws.com" ] }, "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-east-1:0123456789:log-group:my-log-group:log-stream:*" ], "Condition": { "StringEquals": { "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:*"] } } } ] }

如果日志组具有资源策略,但该策略不包含上一个策略中所示的语句,并且设置日志记录的用户对日志组具有 logs:PutResourcePolicylogs:DescribeResourcePolicieslogs:DescribeLogGroups 权限,则该语句将附加到日志组的资源策略中。

日志组资源策略大小限制注意事项

这些服务必须在资源策略中列出它们向其发送日志的每个日志组,并且 CloudWatch Logs 资源策略不得超过 5120 个字符。将日志发送到大量日志组的服务可能会遇到此限制。

为了缓解这种情况,CloudWatch Logs 监视该服务使用的资源策略的大小,并在检测到某个策略接近 5120 个字符的大小限制时,CloudWatch Logs 将在该服务的资源策略中自动启用 /aws/vendedlogs/*。之后,您可以开始将名称以 /aws/vendedlogs/ 开头的日志组作为这些服务所发送的日志的目标。

发送到 Amazon S3 的日志

当您将日志设置为发送到 Amazon S3 时,AWS 会创建或更改与接收日志的 S3 存储桶关联的资源策略(如需要)。

直接发布到 Amazon S3 的日志将发布到您指定的现有存储桶。每 5 分钟将在指定的存储桶中创建一个或多个日志文件。

当您首次将日志发送到 Amazon S3 存储桶时,发送日志的服务会记录存储桶的拥有者,以确保日志仅发送到属于该账户的存储桶。因此,要更改 Amazon S3 存储桶拥有者,您必须在原始服务中重新创建或更新日志订阅。

注意

CloudFront 使用与将公开发布的日志发送到 S3 的其他服务不同的权限模型。有关更多信息,请参阅配置标准日志记录和访问日志文件所需的权限

此外,如果您对 CloudFront 访问日志和另一个日志源使用相同的 S3 存储桶,则在 CloudFront 的存储桶上启用 ACL 也会向使用此存储桶的所有其他日志源授予权限。

重要

如果您要将日志发送到 Amazon S3 存储桶,并且存储桶策略包含 NotActionNotPrincipal 元素,则自动向存储桶添加日志传输权限和创建日志订阅将会失败。为了成功创建日志订阅,您需要手动将日志传输权限添加到存储桶策略,然后创建日志订阅。有关更多信息,请参阅本节中的说明。

如果存储桶使用客户自主管理型 AWS KMS 密钥进行服务器端加密,您还必须为客户自主管理型密钥添加密钥政策。有关更多信息,请参阅 Amazon S3

用户权限

若要能够设置首次将这些类型日志中的任一种日志发送到 Amazon S3,您必须登录具有以下权限的账户。

  • logs:CreateLogDelivery

  • S3:GetBucketPolicy

  • S3:PutBucketPolicy

如果其中任何一种类型的日志已被发送到 Amazon S3 存储桶,要设置将其中另一种日志也发送到同一存储桶,您只需要 logs:CreateLogDelivery 权限。

S3 存储桶资源策略

接收日志的 S3 存储桶必须具有包含特定权限的资源策略。如果存储桶当前没有资源策略,而且设置日志记录的用户对存储桶具有 S3:GetBucketPolicyS3:PutBucketPolicy 权限,那么当您开始将日志发送到 Amazon S3 时,AWS会自动为其创建以下策略。

{ "Version": "2012-10-17", "Id": "AWSLogDeliveryWrite20150319", "Statement": [ { "Sid": "AWSLogDeliveryAclCheck", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition": { "StringEquals": { "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:*"] } } }, { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/AWSLogs/account-ID/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:*"] } } } ] }

在之前的策略中,对于 aws:SourceAccount,请指定将日志传送到此存储桶的账户 ID 列表。对于 aws:SourceArn,请按 arn:aws:logs:source-region:source-account-id:* 格式指定生成日志的资源 ARN 列表。

如果存储桶具有资源策略,但该策略不包含上一个策略中所示的语句,并且设置日志记录的用户对存储桶具有 S3:GetBucketPolicyS3:PutBucketPolicy 权限,则该语句将附加到存储桶的资源策略中。

注意

某些情况下,如果未向 delivery.logs.amazonaws.com 授予 s3:ListBucket 权限,可能会在 AWS CloudTrail 中看到 AccessDenied 错误。为了避免 CloudTrail 日志中出现此类错误,必须向 delivery.logs.amazonaws.com 授予 s3:ListBucket 权限且必须包含与在上述存储桶策略中设置的 s3:GetBucketAcl 权限一起显示的 Condition 参数。为方便起见,可以直接将 AWSLogDeliveryAclCheck 更新为 “Action”: [“s3:GetBucketAcl”, “s3:ListBucket”],而不是创建一个新的 Statement

Amazon S3 存储桶服务器端加密

您可以通过启用 Amazon S3 托管式密钥 (SSE-S3) 的服务器端加密或 AWS Key Management Service 中存储 AWS KMS 密钥 (SSE-KMS) 的服务器端加密来保护 Amazon S3 存储桶中的数据。有关更多信息,请参阅使用服务器端加密保护数据

如果选择 SSE-S3,则不需要额外的配置。Amazon S3 处理加密密钥。

警告

如果选择 SSE-KMS,则必须使用客户托管式密钥,因为此场景不支持使用 AWS 托管式密钥。如果您使用 AWS 托管密钥设置加密,则会以不可读取的格式提供日志。

当您使用客户托管式 AWS KMS 密钥时,您可以在启用存储桶加密时指定客户托管式密钥的Amazon Resource Name (ARN)。您必须将以下内容添加到客户托管式密钥的密钥策略(不是 S3 存储桶的存储桶策略)中,以便日志传输账户可以写入 S3 存储桶。

如果选择 SSE-KMS,则必须使用客户托管式密钥,因为此场景不支持使用 AWS 托管式密钥。当您使用客户托管式 AWS KMS 密钥时,您可以在启用存储桶加密时指定客户托管式密钥的Amazon Resource Name (ARN)。您必须将以下内容添加到客户托管式密钥的密钥策略(不是 S3 存储桶的存储桶策略)中,以便日志传输账户可以写入 S3 存储桶。

{ "Sid": "Allow Logs Delivery to use the key", "Effect": "Allow", "Principal": { "Service": [ "delivery.logs.amazonaws.com" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:*"] } } }

对于 aws:SourceAccount,请指定将日志传送到此存储桶的账户 ID 列表。对于 aws:SourceArn,请按 arn:aws:logs:source-region:source-account-id:* 格式指定生成日志的资源 ARN 列表。

日志发送至 Firehose

当前一部分的表中列出的日志类型发送到 Firehose 时,本部分适用:

用户权限

若要能够设置首次将这些类型日志中的任一种日志发送到 Firehose,您必须登录具有以下权限的账户。

  • logs:CreateLogDelivery

  • firehose:TagDeliveryStream

  • iam:CreateServiceLinkedRole

如果其中任何一种日志已被发送到 Firehose,要设置将其中另一种日志也发送到 Firehose,您只需要 logs:CreateLogDeliveryfirehose:TagDeliveryStream 权限。

用于权限的 IAM 角色

由于 Firehose 不使用资源策略,AWS 将这些日志设置为发送到 Firehose 时会使用 IAM 角色。AWS 创建名为 AWSServiceRoleForLogDelivery 的服务相关角色。此服务相关角色包括以下权限。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch", "firehose:ListTagsForDeliveryStream" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/LogDeliveryEnabled": "true" } }, "Effect": "Allow" } ] }

此服务相关角色会为将 LogDeliveryEnabled 标签设置为 true 的所有 Firehose 传输流授予权限。当您设置日志记录时,AWS 会将此标签提供给目标传输流。

此服务相关角色还具有允许 delivery.logs.amazonaws.com 服务委托人来代入所需服务相关角色的信任策略。该信任策略如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

需要额外权限 [V2] 的日志记录

一些 AWS 服务使用新的方法来发送日志。这是一种灵活的方法,可让您设置日志从这些服务传输到以下一个或多个目标:CloudWatch Logs、Amazon S3 或 Firehose。

工作日志传输由三个元素组成:

  • DeliverySource,这是代表实际发送日志的资源的逻辑对象。

  • DeliveryDestination,这是代表实际传输目标的逻辑对象。

  • Delivery,这连接传输源与传输目标

要在支持的 AWS 服务和目标之间配置日志传输,您必须执行以下操作:

  • 使用 putDeliverySource 创建传输源。

  • 使用 putDeliveryDestination 创建传输目标。

  • 如果要跨账户传输日志,则必须在目标账户中使用 PutDeliveryDestinationPolicy 为目标分配 IAM 策略。此策略授权创建从账户 A 中的传输源到账户 B 中的传输目标的传输。对于跨账户传输,您必须手动创建权限策略。

  • 通过使用 CreateDelivery 将一个传输源和一个传输目标精确配对来创建传输。

以下各节详细介绍了在登录期间使用 V2 流程将日志传输到每种类型目标时需要具备的权限。这些权限可以授予您登录时使用的 IAM 角色。

重要

删除日志生成资源后,您有责任删除日志传输资源。为此,请按照以下步骤操作。

  1. 使用 DeleteDelivery 操作删除 Delivery

  2. 使用 DeleteDeliverySource 操作删除 DeliverySource

  3. 如果与您刚刚删除的 DeliverySource 关联的 DeliveryDestination 仅用于此特定的 DeliverySource,则您可以使用 DeleteDeliveryDestinations 操作将其删除。

发送到 CloudWatch Logs 的日志

用户权限

要启用将日志发送到 CloudWatch Logs,您必须使用以下权限登录。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadWriteAccessForLogDeliveryActions", "Effect": "Allow", "Action": [ "logs:GetDelivery", "logs:GetDeliverySource", "logs:PutDeliveryDestination", "logs:GetDeliveryDestinationPolicy", "logs:DeleteDeliverySource", "logs:PutDeliveryDestinationPolicy", "logs:CreateDelivery", "logs:GetDeliveryDestination", "logs:PutDeliverySource", "logs:DeleteDeliveryDestination", "logs:DeleteDeliveryDestinationPolicy", "logs:DeleteDelivery", "logs:UpdateDeliveryConfiguration" ], "Resource": [ "arn:aws:logs:region:account-id:delivery:*", "arn:aws:logs:region:account-id:delivery-source:*", "arn:aws:logs:region:account-id:delivery-destination:*" ] }, { "Sid": "ListAccessForLogDeliveryActions", "Effect": "Allow", "Action": [ "logs:DescribeDeliveryDestinations", "logs:DescribeDeliverySources", "logs:DescribeDeliveries", "logs:DescribeConfigurationTemplates" ], "Resource": "*" }, { "Sid": "AllowUpdatesToResourcePolicyCWL", "Effect": "Allow", "Action": [ "logs:PutResourcePolicy", "logs:DescribeResourcePolicies", "logs:DescribeLogGroups" ], "Resource": [ "arn:aws:logs:region:account-id:*" ] } ] }

日志组和资源策略

接收日志的日志组必须具有包含特定权限的资源策略。如果日志组当前没有资源策略,而且设置日志记录的用户对日志组具有 logs:PutResourcePolicylogs:DescribeResourcePolicieslogs:DescribeLogGroups 权限,那么当您开始将日志发送到 CloudWatch Logs 日志时,AWS会自动为其创建以下策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogDeliveryWrite20150319", "Effect": "Allow", "Principal": { "Service": [ "delivery.logs.amazonaws.com" ] }, "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-east-1:0123456789:log-group:my-log-group:log-stream:*" ], "Condition": { "StringEquals": { "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:*"] } } } ] }

日志组资源策略大小限制注意事项

这些服务必须在资源策略中列出它们向其发送日志的每个日志组,并且 CloudWatch Logs 资源策略不得超过 5120 个字符。将日志发送到大量日志组的服务可能会遇到此限制。

为了缓解这种情况,CloudWatch Logs 监视该服务使用的资源策略的大小,并在检测到某个策略接近 5120 个字符的大小限制时,CloudWatch Logs 将在该服务的资源策略中自动启用 /aws/vendedlogs/*。之后,您可以开始将名称以 /aws/vendedlogs/ 开头的日志组作为这些服务所发送的日志的目标。

发送到 Amazon S3 的日志

用户权限

要启用向 Amazon S3 发送日志,您必须使用以下权限登录。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadWriteAccessForLogDeliveryActions", "Effect": "Allow", "Action": [ "logs:GetDelivery", "logs:GetDeliverySource", "logs:PutDeliveryDestination", "logs:GetDeliveryDestinationPolicy", "logs:DeleteDeliverySource", "logs:PutDeliveryDestinationPolicy", "logs:CreateDelivery", "logs:GetDeliveryDestination", "logs:PutDeliverySource", "logs:DeleteDeliveryDestination", "logs:DeleteDeliveryDestinationPolicy", "logs:DeleteDelivery", "logs:UpdateDeliveryConfiguration" ], "Resource": [ "arn:aws:logs:region:account-id:delivery:*", "arn:aws:logs:region:account-id:delivery-source:*", "arn:aws:logs:region:account-id:delivery-destination:*" ] }, { "Sid": "ListAccessForLogDeliveryActions", "Effect": "Allow", "Action": [ "logs:DescribeDeliveryDestinations", "logs:DescribeDeliverySources", "logs:DescribeDeliveries", "logs:DescribeConfigurationTemplates" ], "Resource": "*" }, { "Sid": "AllowUpdatesToResourcePolicyS3", "Effect": "Allow", "Action": [ "s3:PutBucketPolicy", "s3:GetBucketPolicy" ], "Resource": "arn:aws:s3:::bucket-name" } ] }

接收日志的 S3 存储桶必须具有包含特定权限的资源策略。如果存储桶当前没有资源策略,而且设置日志记录的用户对存储桶具有 S3:GetBucketPolicyS3:PutBucketPolicy 权限,那么当您开始将日志发送到 Amazon S3 时,AWS会自动为其创建以下策略。

{ "Version": "2012-10-17", "Id": "AWSLogDeliveryWrite20150319", "Statement": [ { "Sid": "AWSLogDeliveryAclCheck", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition": { "StringEquals": { "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:delivery-source*"] } } }, { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/AWSLogs/account-ID/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:delivery-source:*"] } } } ] }

在之前的策略中,对于 aws:SourceAccount,请指定将日志传送到此存储桶的账户 ID 列表。对于 aws:SourceArn,请按 arn:aws:logs:source-region:source-account-id:* 格式指定生成日志的资源 ARN 列表。

如果存储桶具有资源策略,但该策略不包含上一个策略中所示的语句,并且设置日志记录的用户对存储桶具有 S3:GetBucketPolicyS3:PutBucketPolicy 权限,则该语句将附加到存储桶的资源策略中。

注意

某些情况下,如果未向 delivery.logs.amazonaws.com 授予 s3:ListBucket 权限,可能会在 AWS CloudTrail 中看到 AccessDenied 错误。为了避免 CloudTrail 日志中出现此类错误,必须向 delivery.logs.amazonaws.com 授予 s3:ListBucket 权限且必须包含与在上述存储桶策略中设置的 s3:GetBucketAcl 权限一起显示的 Condition 参数。为方便起见,可以直接将 AWSLogDeliveryAclCheck 更新为 “Action”: [“s3:GetBucketAcl”, “s3:ListBucket”],而不是创建一个新的 Statement

Amazon S3 存储桶服务器端加密

您可以通过启用 Amazon S3 托管式密钥 (SSE-S3) 的服务器端加密或 AWS Key Management Service 中存储 AWS KMS 密钥 (SSE-KMS) 的服务器端加密来保护 Amazon S3 存储桶中的数据。有关更多信息,请参阅使用服务器端加密保护数据

如果选择 SSE-S3,则不需要额外的配置。Amazon S3 处理加密密钥。

警告

如果选择 SSE-KMS,则必须使用客户托管式密钥,因为此场景不支持使用 AWS 托管式密钥。如果您使用 AWS 托管密钥设置加密,则会以不可读取的格式提供日志。

当您使用客户托管式 AWS KMS 密钥时,您可以在启用存储桶加密时指定客户托管式密钥的Amazon Resource Name (ARN)。您必须将以下内容添加到客户托管式密钥的密钥策略(不是 S3 存储桶的存储桶策略)中,以便日志传输账户可以写入 S3 存储桶。

如果选择 SSE-KMS,则必须使用客户托管式密钥,因为此场景不支持使用 AWS 托管式密钥。当您使用客户托管式 AWS KMS 密钥时,您可以在启用存储桶加密时指定客户托管式密钥的Amazon Resource Name (ARN)。您必须将以下内容添加到客户托管式密钥的密钥策略(不是 S3 存储桶的存储桶策略)中,以便日志传输账户可以写入 S3 存储桶。

{ "Sid": "Allow Logs Delivery to use the key", "Effect": "Allow", "Principal": { "Service": [ "delivery.logs.amazonaws.com" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:delivery-source:*"] } } }

对于 aws:SourceAccount,请指定将日志传送到此存储桶的账户 ID 列表。对于 aws:SourceArn,请按 arn:aws:logs:source-region:source-account-id:* 格式指定生成日志的资源 ARN 列表。

日志发送至 Firehose

用户权限

要启用向 Firehose 发送日志,您必须使用以下权限登录。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadWriteAccessForLogDeliveryActions", "Effect": "Allow", "Action": [ "logs:GetDelivery", "logs:GetDeliverySource", "logs:PutDeliveryDestination", "logs:GetDeliveryDestinationPolicy", "logs:DeleteDeliverySource", "logs:PutDeliveryDestinationPolicy", "logs:CreateDelivery", "logs:GetDeliveryDestination", "logs:PutDeliverySource", "logs:DeleteDeliveryDestination", "logs:DeleteDeliveryDestinationPolicy", "logs:DeleteDelivery", "logs:UpdateDeliveryConfiguration" ], "Resource": [ "arn:aws:logs:region:account-id:delivery:*", "arn:aws:logs:region:account-id:delivery-source:*", "arn:aws:logs:region:account-id:delivery-destination:*" ] }, { "Sid": "ListAccessForLogDeliveryActions", "Effect": "Allow", "Action": [ "logs:DescribeDeliveryDestinations", "logs:DescribeDeliverySources", "logs:DescribeDeliveries", "logs:DescribeConfigurationTemplates" ], "Resource": "*" }, { "Sid": "AllowUpdatesToResourcePolicyFH", "Effect": "Allow", "Action": [ "firehose:TagDeliveryStream" ], "Resource": [ "arn:aws:firehose:region:account-id:deliverystream/*" ] }, { "Sid": "CreateServiceLinkedRole", "Effect": "Allow", "Action": [ "iam:CreateServiceLinkedRole" ], "Resource": "arn:aws:iam::account-id:role/aws-service-role/delivery.logs.amazonaws.com/AWSServiceRoleForLogDelivery" } ] }

用于资源权限的 IAM 角色

由于 Firehose 不使用资源策略,AWS 将这些日志设置为发送到 Firehose 时会使用 IAM 角色。AWS 创建名为 AWSServiceRoleForLogDelivery 的服务相关角色。此服务相关角色包括以下权限。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch", "firehose:ListTagsForDeliveryStream" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/LogDeliveryEnabled": "true" } }, "Effect": "Allow" } ] }

此服务相关角色会为将 LogDeliveryEnabled 标签设置为 true 的所有 Firehose 传输流授予权限。当您设置日志记录时,AWS 会将此标签提供给目标传输流。

此服务相关角色还具有允许 delivery.logs.amazonaws.com 服务委托人来代入所需服务相关角色的信任策略。该信任策略如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

服务特定的权限

除了前面部分列出的特定于目标的权限之外,一些服务还需要明确授权,以允许客户从其资源发送日志,以此作为额外安全层。它授权在该服务中公开发布日志的资源执行 AllowVendedLogDeliveryForResource 操作。对于这些服务,请使用以下策略并将 serviceresource-type 替换为适当的值。有关这些字段的服务特定值,请参阅这些服务的公开发布的日志的文档页面。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ServiceLevelAccessForLogDelivery", "Effect": "Allow", "Action": [ "service:AllowVendedLogDeliveryForResource" ], "Resource": "arn:aws:service:region:account-id:resource-type/*" } ] }

控制台特定的权限

除了前面部分列出的权限外,如果您使用控制台而不是 API 设置日志传输,则还需要以下额外权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLogDeliveryActionsConsoleCWL", "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": [ "arn:aws:logs:us-east-1:111122223333:log-group:*" ] }, { "Sid": "AllowLogDeliveryActionsConsoleS3", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowLogDeliveryActionsConsoleFH", "Effect": "Allow", "Action": [ "firehose:ListDeliveryStreams", "firehose:DescribeDeliveryStream" ], "Resource": [ "*" ] } ] }

跨账户传输示例

在此示例中,涉及两个账户。具有日志生成资源的账户是账户 A,ID:AAAAAAAAAAAA,具有日志消耗资源的账户是账户 B,ID:BBBBBBBBBBBB

账户 A 想要使用 ARN arn:aws:bedrock:region:AAAAAAAAAAAA:knowledge-base/XXXXXXXXXX 从其账户中的 Amazon Bedrock 知识库传输日志。

对于此示例,账户 A 需要以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowVendedLogDeliveryForKnowledgeBase", "Effect": "Allow", "Action": [ "bedrock:AllowVendedLogDeliveryForResource" ], "Resource": "arn:aws:bedrock:region:AAAAAAAAAAAA:knowledge-base/XXXXXXXXXX" }, { "Sid": "CreateLogDeliveryPermissions", "Effect": "Allow", "Action": [ "logs:PutDeliverySource", "logs:CreateDelivery" ], "Resource": [ "arn:aws:logs:region:AAAAAAAAAAAA:delivery-source:*", "arn:aws:logs:region:AAAAAAAAAAAA:delivery:*", "arn:aws:logs:region:BBBBBBBBBBBB:delivery-destination:*" ] } ] }

创建传输源

首先,账户 A 使用其 bedrock 知识库创建传输源:

aws logs put-delivery-source --name my-delivery-source --log-type APPLICATION_LOGS --resource-arn arn:aws:bedrock:region:AAAAAAAAAAAA:knowledge-base/XXXXXXXXXX

接下来,账户 B 必须使用以下流之一创建传输目标:

配置传输到 Amazon S3 存储桶

用户 B 希望使用 ARN arn:aws:s3:::amzn-s3-demo-bucket 将日志接收到其 S3 存储桶中。对于此示例,账户 B 将需要以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PutLogDestinationPermissions", "Effect": "Allow", "Action": [ "logs:PutDeliveryDestination", "logs:PutDeliveryDestinationPolicy" ], "Resource": "arn:aws:logs:region:BBBBBBBBBBBB:delivery-destination:*" } ] }

存储桶在其存储桶策略中需要具有以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogsDeliveryWrite", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/AWSLogs/AAAAAAAAAAAA/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": ["AAAAAAAAAAAA"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:region:AAAAAAAAAAAA:delivery-source:my-delivery-source"] } } } ] }

如果存储桶使用 SSE-KMS 进行加密,请确保 AWS KMS 密钥政策具有相应的权限。例如,如果 KMS 密钥是 arn:aws:kms:region:BBBBBBBBBBBB:key/X,请使用以下内容:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLogsGenerateDataKey", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" } "Action": [ "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:region:BBBBBBBBBBBB:key/X", "Condition": { "StringEquals": { "aws:SourceAccount": ["AAAAAAAAAAAA"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:region:AAAAAAAAAAAA:delivery-source:my-delivery-source"] } } } ] }

然后,账户 B 可以创建一个以 S3 存储桶为目标资源的传输目标:

aws logs put-delivery-destination --name my-s3-delivery-destination --delivery-destination-configuration "destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket"

接下来,账户 B 在其新创建的传输目标上创建传输目标策略,该策略将授予账户 A 创建日志传输的权限。将添加到新创建的传输目标的策略如下:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCreateDelivery", "Effect": "Allow", "Principal": { "AWS": "AAAAAAAAAAAA" }, "Action": [ "logs:CreateDelivery" ], "Resource": "arn:aws:logs:region:BBBBBBBBBBBB:delivery-destination:my-s3-delivery-destination" } ] }

此策略将以 destination-policy-s3.json 形式保存在账户 B 的计算机中。要附加此资源,账户 B 将运行以下命令:

aws logs put-delivery-destination-policy --delivery-destination-name my-s3-delivery-destination --delivery-destination-policy file://destination-policy-s3.json

最后,账户 A 创建传输,将账户 A 中的传输源链接到账户 B 中的传输目标。

aws logs create-delivery --delivery-source-name my-delivery-source --delivery-destination-arn arn:aws:logs:region:BBBBBBBBBBBB:delivery-destination:my-s3-delivery-destination

配置向 Firehose 流的传输

在此示例中,账户 B 希望将日志接收到其 Firehose 流中。Firehose 流具有以下 ARN,并配置为使用 DirectPut 传输流类型:

arn:aws:firehose:region:BBBBBBBBBBBB:deliverystream/X

对于此示例,账户 B 需要以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowFirehoseCreateSLR", "Effect": "Allow", "Action": [ "iam:CreateServiceLinkedRole" ], "Resource": "arn:aws:iam::BBBBBBBBBBBB:role/aws-service-role/delivery.logs.amazonaws.com/AWSServiceRoleForLogDelivery", }, { "Sid": "AllowFirehoseTagging", "Effect": "Allow", "Action": [ "firehose:TagDeliveryStream" ], "Resource": "arn:aws:firehose:region:BBBBBBBBBBBB:deliverystream/X" }, { "Sid": "AllowFirehoseDeliveryDestination", "Effect": "Allow", "Action": [ "logs:PutDeliveryDestination", "logs:PutDeliveryDestinationPolicy" ], "Resource": "arn:aws:logs:region:BBBBBBBBBBBB:delivery-destination:*" } ] }

Firehose 流必须将标签 LogDeliveryEnabled 设置为 true

然后,账户 B 将创建一个以 Firehose 流为目标资源的传输目标:

aws logs put-delivery-destination --name my-fh-delivery-destination --delivery-destination-configuration "destinationResourceArn=arn:aws:firehose:region:BBBBBBBBBBBB:deliverystream/X"

接下来,账户 B 在其新创建的传输目标上创建传输目标策略,该策略将授予账户 A 创建日志传输的权限。要添加到新创建的传输目标的策略如下:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCreateDelivery", "Effect": "Allow", "Principal": { "AWS": "AAAAAAAAAAAA" }, "Action": [ "logs:CreateDelivery" ], "Resource": "arn:aws:logs:region:BBBBBBBBBBBB:delivery-destination:my-fh-delivery-destination" } ] }

此策略将以 destination-policy-fh.json 形式保存在账户 B 的计算机中。要附加此资源,账户 B 运行以下命令:

aws logs put-delivery-destination-policy --delivery-destination-name my-fh-delivery-destination --delivery-destination-policy file://destination-policy-fh.json

最后,账户 A 创建传输,将账户 A 中的传输源链接到账户 B 中的传输目标。

aws logs create-delivery --delivery-source-name my-delivery-source --delivery-destination-arn arn:aws:logs:region:BBBBBBBBBBBB:delivery-destination:my-fh-delivery-destination

防止跨服务混淆座席

混淆代理问题是一个安全性问题,即不具有操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。在 AWS 中,跨服务模拟可能会导致混淆代理问题。一个服务(呼叫服务)调用另一项服务(所谓的服务)时,可能会发生跨服务模拟。可以操纵调用服务,使用其权限以在其他情况下该服务不应有访问权限的方式对另一个客户的资源进行操作。为防止这种情况,AWS 提供可帮助您保护所有服务的数据的工具,而这些服务中的服务主体有权限访问账户中的资源。

建议在资源策略中使用 aws:SourceArnaws:SourceAccountaws:SourceOrgIDaws:SourceOrgPaths 全局条件上下文键,以限制 CloudWatch Logs 为其他服务提供的资源访问权限。使用 aws:SourceArn 来仅将一个资源与跨服务访问相关联。使用 aws:SourceAccount 来让该账户中的任何资源与跨服务使用相关联。使用 aws:SourceOrgID 来允许某组织内的任何账户中的任何资源与跨服务使用相关联。使用 aws:SourceOrgPaths 来将 AWS Organizations 路径内账户中的任何资源与跨服务使用相关联。有关使用和了解路径的更多信息,请参阅了解 AWS Organizations 实体路径

防范混淆代理问题最有效的方法是使用 aws:SourceArn 全局条件上下文键和资源的完整 ARN。如果不知道资源的完整 ARN,或者正在指定多个资源,请针对 ARN 未知部分使用带有通配符字符 (*) 的 aws:SourceArn 全局上下文条件键。例如,arn:aws:servicename:*:123456789012:*

如果 aws:SourceArn 值不包含账户 ID,例如 Amazon S3 桶 ARN,您必须使用 aws:SourceAccountaws:SourceArn 来限制权限。

要防范大规模混淆代理问题,请在基于资源的策略中将 aws:SourceOrgIDaws:SourceOrgPaths 全局条件上下文键与资源的组织 ID 或组织路径一起使用。包含 aws:SourceOrgIDaws:SourceOrgPaths 键的策略将自动包含正确的账户,并且当您在组织中添加、删除或移动账户时,无需手动更新策略。

本页前几节中的策略显示了如何使用 aws:SourceArnaws:SourceAccount 全局条件上下文密钥,以避免混淆代理人问题出现。

CloudWatch Logs 对AWS托管策略的更新

查看有关 CloudWatch Logs 的AWS托管策略更新的详细信息(从该服务开始跟踪这些更改开始)。有关此页面更改的自动提示,请订阅 CloudWatch Logs 文档历史记录页面上的 RSS 源。

更改 描述 日期

AWSServiceRoleForLogDelivery 服务相关角色策略 – 对现有策略的更新

CloudWatch Logs 更改了与 AWSServiceRoleForLogDelivery 服务相关角色关联的 IAM policy 权限。更改内容如下:

  • firehose:ResourceTag/LogDeliveryEnabled": "true" 条件键已更改为 aws:ResourceTag/LogDeliveryEnabled": "true"

2021 年 7 月 15 日

CloudWatch Logs 开始跟踪更改

CloudWatch Logs 开始跟踪其AWS托管策略的更改。

2021 年 6 月 10 日