本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
启用从 AWS 服务进行日志记录
虽然许多服务仅将日志发布到 CloudWatch Logs,但有些AWS服务可以将日志直接发布到 Amazon Simple Storage Service 或 Amazon Data Firehose。如果您对日志的主要需求是在其中一种服务中存储或处理日志,那么您可以轻松地让生成日志的服务将它们直接发送到 Amazon S3 或 Firehose,而无需额外设置。
即使日志直接发布到 Amazon S3 或 Firehose,仍会产生费用。有关更多信息,请参阅 Amazon CloudWatch Pricing(Amazon CloudWatch 定价)
一些 AWS 服务使用通用基础设施来发送日志。要启用从这些服务进行日志记录,您必须以具有特定权限的用户身份登录。此外,您必须向 AWS 授予权限才能发送日志。
对于需要这些权限的服务,所需的权限有两个版本。表中将需要这些额外权限的服务标为支持的 [V1 权限]和支持的 [V2 权限]。有关这些必需权限的信息,请参阅表后的部分。
日志源 | 日志类型 | CloudWatch Logs | Amazon S3 | Firehose |
---|---|---|---|---|
Vended logs(已出售日志) | ||||
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V2 权限] | 支持的 [V2 权限] | 支持的 [V2 权限] | |
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | 支持的 [V1 权限] | |||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | ||
Vended logs(已出售日志) | 支持的 [V1 权限] | |||
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Amazon CodeWhisperer 事件日志 |
Vended logs(已出售日志) | 支持的 [V2 权限] | 支持的 [V2 权限] | 支持的 [V2 权限] |
Vended logs(已出售日志) | 支持的 [V1 权限] | |||
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | ||
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) |
支持 |
|||
Vended logs(已出售日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | 支持的 [V1 权限] | |
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | |||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | 支持的 [V1 权限] | |
Vended logs(已出售日志) | 支持的 [V1 权限] | |||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V2 权限] | 支持的 [V2 权限] | 支持的 [V2 权限] | |
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | 支持的 [V1 权限] | |
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | 支持的 [V1 权限] | |
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | 支持的 [V1 权限] | |
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | ||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | ||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | ||
Vended logs(已出售日志) | 支持的 [V1 权限] | |||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | 支持的 [V1 权限] | |
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) |
支持 |
|||
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | ||||
Amazon Simple Email Service 日志 |
Vended logs(已出售日志) | 支持的 [V2 权限] | 支持的 [V2 权限] | 支持的 [V2 权限] |
Custom logs(自定义日志) |
支持 |
|||
Custom logs(自定义日志) |
支持 |
|||
Vended logs(已出售日志) | 支持的 [V1 权限] | |||
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | ||||
Vended logs(已出售日志) | 支持 |
支持的 [V1 权限] | 支持的 [V1 权限] | |
Vended logs(已出售日志) | 支持的 [V1 权限] | 支持的 [V1 权限] | 支持的 [V1 权限] | |
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:DescribeLogGroups
、logs:DescribeResourcePolicies
或logs:PutResourcePolicy
权限时,请确保将其Resource
行的 ARN 设置为使用*
通配符,而不是仅指定单个日志组名称。例如,"Resource": "arn:aws:logs:us-east-1:111122223333:log-group:*"
如果其中任何一种类型的日志已被发送到 CloudWatch Logs 中的日志组,要设置将其中另一种日志也发送到同一日志组,您只需要 logs:CreateLogDelivery
权限。
日志组和资源策略
接收日志的日志组必须具有包含特定权限的资源策略。如果日志组当前没有资源策略,而且设置日志记录的用户对日志组具有 logs:PutResourcePolicy
、logs:DescribeResourcePolicies
和 logs: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:PutResourcePolicy
、logs:DescribeResourcePolicies
和 logs: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 存储桶,并且存储桶策略包含 NotAction
或 NotPrincipal
元素,则自动向存储桶添加日志传输权限和创建日志订阅将会失败。为了成功创建日志订阅,您需要手动将日志传输权限添加到存储桶策略,然后创建日志订阅。有关更多信息,请参阅本节中的说明。
如果存储桶使用客户自主管理型 AWS KMS 密钥进行服务器端加密,您还必须为客户自主管理型密钥添加密钥政策。有关更多信息,请参阅 Amazon S3。
用户权限
若要能够设置首次将这些类型日志中的任一种日志发送到 Amazon S3,您必须登录具有以下权限的账户。
logs:CreateLogDelivery
S3:GetBucketPolicy
S3:PutBucketPolicy
如果其中任何一种类型的日志已被发送到 Amazon S3 存储桶,要设置将其中另一种日志也发送到同一存储桶,您只需要 logs:CreateLogDelivery
权限。
S3 存储桶资源策略
接收日志的 S3 存储桶必须具有包含特定权限的资源策略。如果存储桶当前没有资源策略,而且设置日志记录的用户对存储桶具有 S3:GetBucketPolicy
和 S3: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:
格式指定生成日志的资源 ARN 列表。source-region
:source-account-id
:*
如果存储桶具有资源策略,但该策略不包含上一个策略中所示的语句,并且设置日志记录的用户对存储桶具有 S3:GetBucketPolicy
和 S3: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:
格式指定生成日志的资源 ARN 列表。source-region
:source-account-id
:*
日志发送至 Firehose
当前一部分的表中列出的日志类型发送到 Firehose 时,本部分适用:
用户权限
若要能够设置首次将这些类型日志中的任一种日志发送到 Firehose,您必须登录具有以下权限的账户。
logs:CreateLogDelivery
firehose:TagDeliveryStream
iam:CreateServiceLinkedRole
如果其中任何一种日志已被发送到 Firehose,要设置将其中另一种日志也发送到 Firehose,您只需要 logs:CreateLogDelivery
和 firehose: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 角色。
重要
删除日志生成资源后,您有责任删除日志传输资源。为此,请按照以下步骤操作。
使用 DeleteDelivery 操作删除
Delivery
。使用 DeleteDeliverySource 操作删除
DeliverySource
。如果与您刚刚删除的
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:PutResourcePolicy
、logs:DescribeResourcePolicies
和 logs: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:GetBucketPolicy
和 S3: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:
格式指定生成日志的资源 ARN 列表。source-region
:source-account-id
:*
如果存储桶具有资源策略,但该策略不包含上一个策略中所示的语句,并且设置日志记录的用户对存储桶具有 S3:GetBucketPolicy
和 S3: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:
格式指定生成日志的资源 ARN 列表。source-region
:source-account-id
:*
日志发送至 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
操作。对于这些服务,请使用以下策略并将 service
和 resource-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:SourceArn
、aws:SourceAccount
、aws:SourceOrgID
和 aws: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:SourceAccount
和 aws:SourceArn
来限制权限。
要防范大规模混淆代理问题,请在基于资源的策略中将 aws:SourceOrgID
或 aws:SourceOrgPaths
全局条件上下文键与资源的组织 ID 或组织路径一起使用。包含 aws:SourceOrgID
或 aws:SourceOrgPaths
键的策略将自动包含正确的账户,并且当您在组织中添加、删除或移动账户时,无需手动更新策略。
本页前几节中的策略显示了如何使用 aws:SourceArn
和 aws:SourceAccount
全局条件上下文密钥,以避免混淆代理人问题出现。
CloudWatch Logs 对AWS托管策略的更新
查看有关 CloudWatch Logs 的AWS托管策略更新的详细信息(从该服务开始跟踪这些更改开始)。有关此页面更改的自动提示,请订阅 CloudWatch Logs 文档历史记录页面上的 RSS 源。
更改 | 描述 | 日期 |
---|---|---|
AWSServiceRoleForLogDelivery 服务相关角色策略 – 对现有策略的更新 |
CloudWatch Logs 更改了与 AWSServiceRoleForLogDelivery 服务相关角色关联的 IAM policy 权限。更改内容如下:
|
2021 年 7 月 15 日 |
CloudWatch Logs 开始跟踪更改 |
CloudWatch Logs 开始跟踪其AWS托管策略的更改。 |
2021 年 6 月 10 日 |