View a markdown version of this page

OpenTelemetry 指标的静态加密 - Amazon CloudWatch

OpenTelemetry 指标的静态加密

什么是 CloudWatch 数据集

您发送到 Amazon CloudWatch 的 OpenTelemetry(oTel)指标存储在名为“数据集”的资源中。在所有 OTel 指标所在的每个区域中,每个 AWS 账户都有一个 default 数据集。该 default 数据集是唯一支持的数据集,您无法创建其他数据集。

可以像其他 AWS 资源一样对数据集进行加密和标记。数据集 ARN 有以下格式:

arn:{partition}:cloudwatch:{region}:{account-id}:dataset/default

要查看数据集的当前加密配置,请使用 GetDataset API:

aws cloudwatch get-dataset \ --dataset-identifier default

如果客户自主管理型密钥与数据集相关联,则响应将包含密钥 ARN。如果未关联任何客户自主管理型密钥,则使用 AWS 拥有的密钥对数据集进行加密。

静态加密选项

CloudWatch 始终加密数据集静态数据。默认情况下,CloudWatch 使用 AWS 拥有的密钥加密静态数据。无需执行任何操作,即可使用 AWS 拥有的密钥来保护数据。有关更多信息,请参阅《AWS Key Management Service Developer Guide》中的 AWS owned keys

如果要管理用于加密数据集数据的密钥,则可以在 AWS Key Management Service(AWS KMS)中使用客户自主管理型密钥。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的 客户托管密钥

若使用客户自主管理型密钥,则会收取 AWS KMS 费用。有关定价的更多信息,请参阅 AWS Key Management Service 定价

CloudWatch 如何使用客户自主管理型密钥进行数据集加密

重要

客户自主管理型密钥加密适用于 default 数据集。该 default 数据集是唯一支持的数据集,您无法创建其他数据集。

将客户自主管理型密钥与 default 数据集关联时,CloudWatch 会使用该密钥加密存储在该数据集中的所有 OTel 指标数据。

CloudWatch 会直接使用具有密钥策略权限的服务主体 (cloudwatch.amazonaws.com)。CloudWatch 不会使用授权或 IAM 角色来访问您的 AWS KMS 密钥。

CloudWatch 不会缓存数据密钥。但是,CloudWatch 会缓存 kms:Decrypt 响应长达 15 分钟。对密钥策略的更改可能最多需要 15 分钟才能生效。

CloudWatch 在所有 AWS KMS 加密操作中使用以下加密上下文:

  • 键:aws:cloudwatch:arn

  • 值:arn:{partition}:cloudwatch:{region}:{account-id}:dataset/default

配置数据集的客户自主管理型密钥

用于 CloudWatch 数据集的 AWS KMS 密钥必须满足以下要求:

  • 该密钥必须为对称加密密钥 (SYMMETRIC_DEFAULT),且密钥使用情况为 ENCRYPT_DECRYPT。不支持非对称密钥。

  • 不支持多区域密钥。

  • 密钥必须与数据集处于相同的 AWS 区域。

  • 必须将密钥指定为完全限定的密钥 ARN。不支持密钥别名和密钥 ID。

配置密钥策略权限

要在 CloudWatch 数据集中使用客户自主管理型密钥,密钥策略必须向 CloudWatch 授予使用该密钥的权限。以下示例密钥策略会授予 CloudWatch 必要的权限,并包含混淆代理保护。

关联或使用数据集的调用方必须拥有 kms:Decrypt 权限,范围限于 CloudWatch ViaService 和加密上下文,如以下 AllowCallerDecrypt 声明中所示。将 YouApplicationRole 替换为用于调用 CloudWatch 数据集 API 的 IAM 角色。

例用于 CloudWatch 数据集加密的密钥策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudWatchDatasetDescribeKey", "Effect": "Allow", "Principal": { "Service": "cloudwatch.amazonaws.com" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:region:account-id:dataset/default" } } }, { "Sid": "AllowCloudWatchDatasetEncryption", "Effect": "Allow", "Principal": { "Service": "cloudwatch.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "account-id", "kms:EncryptionContext:aws:cloudwatch:arn": "arn:aws:cloudwatch:region:account-id:dataset/default" }, "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:region:account-id:dataset/default" } } }, { "Sid": "AllowCallerDecrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:role/YourApplicationRole" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "cloudwatch.region.amazonaws.com", "kms:EncryptionContext:aws:cloudwatch:arn": "arn:aws:cloudwatch:region:account-id:dataset/default" } } } ] }

account-idregion 替换为您的值。

有关密钥策略的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的 AWS KMS 中的密钥策略

将客户自主管理型密钥与数据集关联

使用 AssociateDatasetKmsKey API 将客户自主管理型密钥与数据集关联。必须将 default 指定为数据集标识符。

要使用 AWS CLI 关联客户自主管理型密钥,请运行以下命令:

aws cloudwatch associate-dataset-kms-key \ --dataset-name default \ --kms-key-arn arn:aws:kms:region:account-id:key/key-id

更改或移除加密配置

可以更改或移除用于加密数据集数据的客户自主管理型密钥。

更改客户自主管理型密钥

要更换客户自主管理型密钥,请使用新的密钥 ARN 再次调用 AssociateDatasetKmsKey。调用方必须同时拥有当前密钥和新密钥的 kms:Decrypt 权限。CloudWatch 开始使用新密钥进行后续的加密操作。

移除客户自主管理型密钥

要移除客户自主管理型密钥并恢复为 AWS 拥有的密钥加密,请调用 DisassociateDatasetKmsKey。调用方必须拥有当前关联密钥的 kms:Decrypt 权限。

aws cloudwatch disassociate-dataset-kms-key \ --dataset-name default
重要

取消关联客户自主管理型密钥后,会有 3 小时的强制执行时段,在此期间,CloudWatch 仍需要先前已关联密钥的 kms:Decrypt 权限。在此时段内,请勿禁用或删除密钥。

如果密钥处于禁用状态,则必须先重新启用密钥,然后才能将其与数据集取消关联。

缩小密钥策略访问权限的范围

您可以使用密钥策略中的条件来限制对 AWS KMS 密钥的访问权限。

加密上下文条件

使用 kms:EncryptionContext:aws:cloudwatch:arn 条件键,将密钥的使用限制在 default 数据集中。

"Condition": { "StringEquals": { "kms:EncryptionContext:aws:cloudwatch:arn": "arn:aws:cloudwatch:region:account-id:dataset/default" } }
混淆代理保护

使用 aws:SourceArnaws:SourceAccount 条件来防止跨账户混淆代理攻击。

"Condition": { "StringEquals": { "aws:SourceAccount": "account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:region:account-id:dataset/default" } }
kms:ViaService 条件

使用 kms:ViaService 条件键,将密钥的使用限制在来自 CloudWatch 的请求中。

"Condition": { "StringEquals": { "kms:ViaService": "cloudwatch.region.amazonaws.com" } }

监控 CloudWatch 与 AWS KMS 的互动

您可以使用 AWS CloudTrail 来跟踪 CloudWatch 代表您向 AWS KMS 发送的请求。AWS CloudTrail 日志条目使用服务主体 cloudwatch.amazonaws.com.rproxy.goskope.comcloudwatch.{region}.amazonaws.com.rproxy.goskope.comViaService 值。

以下 CloudTrail 事件名称显示在 CloudWatch 数据集加密操作的日志条目中:

  • GenerateDataKey

  • Encrypt

  • Decrypt

  • DescribeKey

  • ReEncrypt

每个日志条目均包含加密上下文,您可以使用该上下文来标识操作所适用的特定数据集。

有关监控 AWS KMS 密钥使用情况的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的监控 AWS Key Management Service