密钥策略中 Amazon 服务的权限 - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

密钥策略中 Amazon 服务的权限

多个 Amazon 服务使用 Amazon KMS keys 来保护其管理的资源。在服务使用 Amazon 拥有的密钥Amazon 托管式密钥 时,该服务会为这些 KMS 密钥建立和维护密钥策略。

但是,当您通过 Amazon 服务使用客户托管式密钥时,您可以设置并维护密钥策略。该密钥策略必须允许服务具有代表您保护资源所需的最低权限。建议您遵循最低权限原则:仅授予服务所需的权限。您可以通过了解服务需要哪些权限,并使用 Amazon 全局条件键Amazon KMS 条件键来优化权限,以有效做到这一点。

要查找服务在客户托管式密钥上需要的权限,请参阅该服务的加密文档。例如,对于 Amazon Elastic Block Store (Amazon EBS) 所需的权限,请参阅适用于 Linux 实例的 Amazon EC2 用户指南适用于 Windows 实例的 Amazon EC2 用户指南中的 IAM 用户的权限。有关 Secrets Manager 所需的权限,请参阅 Amazon Secrets Manager 用户指南中的授权使用 KMS 密钥

实施最低权限

在您授予使用 KMS 密钥的 Amazon 服务权限时,请确保该权限仅对该服务必须代表您访问的资源有效。当请求在 Amazon 服务之间传递时,这种最低权限策略有助于防止未经授权地使用 KMS 密钥。

要实施最低权限策略,请使用我们建议的 Amazon KMS 加密上下文条件键和全局源 ARN 或源账户条件键。

使用加密上下文条件键

在允许主体调用 Amazon KMS 加密操作的策略中包含 kms:EncryptionContext:context-keykms:EncryptionContextKeys 条件键,是使用 Amazon KMS 资源时实施最低权限的最有效方法。这些条件键特别有效,因为它们将权限与在加密资源时绑定到密文的加密上下文相关联。

仅当策略语句中的操作是 CreateGrant 时,或采用 EncryptionContext 参数的 Amazon KMS 对称加密操作(例如 GenerateDataKeyDecrypt 等操作)时,才使用加密上下文条件键。(有关支持的操作列表,请参阅 kms:EncryptionContext:context-keykms:EncryptionContextKeys)。如果使用这些条件键允许其他操作,例如 DescribeKey,则将拒绝权限。

将值设置为服务在加密资源时使用的加密上下文。此信息通常可在服务文档的“安全性”章节中找到。例如,Amazon Proton 的加密上下文标识 Amazon Proton 资源及其关联的模板。Amazon Secrets Manager 加密上下文标识密钥及其版本。Amazon Location 的加密上下文标识跟踪器或集合。

以下示例是密钥策略语句允许 Amazon Location Service 代表授权用户创建授权。此策略语句通过使用 kms:ViaServicekms:CallerAccountkms:EncryptionContext:context-key 条件键将权限绑定到特定跟踪器资源,以此限制权限。

{ "Sid": "Allow Amazon Location to create grants on behalf of authorized users", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/LocationTeam" }, "Action": "kms:CreateGrant", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "geo.us-west-2.amazonaws.com", "kms:CallerAccount": "111122223333", "kms:EncryptionContext:aws:geo:arn": "arn:aws:geo:us-west-2:111122223333:tracker/SAMPLE-Tracker" } } }

使用 aws:SourceArnaws:SourceAccount 条件键

密钥策略语句中的主体是 Amazon 服务主体时,除了 kms:EncryptionContext:context-key 条件键外,我们强烈建议您使用 aws:SourceArnaws:SourceAccount 全局条件键。仅当请求是从另一项 Amazon 服务发送到 Amazon KMS 时,ARN 和账户值才会包含在授权上下文中。这种条件的组合实施最低权限,避免了潜在的混淆代理情况。服务主体通常不用作密钥策略中的主体,但 Amazon CloudTrail 等一些 Amazon 服务需要它。

要使用 aws:SourceArnaws:SourceAccount 全局条件键,将值设置为正在加密的资源的 Amazon Resource Name (ARN) 或账户。例如,在提供 Amazon CloudTrail 权限加密跟踪记录的密钥策略语句中,将 aws:SourceArn 的值设置为跟踪记录的 ARN。请尽可能使用更具体的 aws:SourceArn。将值设置为 ARN 或带通配符的 ARN 模式。如果您不知道资源的 ARN,请改用 aws:SourceAccount

注意

如果资源 ARN 包含不允许在 Amazon KMS 密钥策略中使用的字符,则不能将该资源 ARN 用于 aws:SourceArn 条件键的值。改为使用 aws:SourceAccount 条件键。有关密钥策略文档规则的详细信息,请参阅 密钥策略格式

在以下示例密钥策略中,获得权限的主体是 Amazon CloudTrail 服务主体 cloudtrail.amazonaws.com。为实施最低权限,本策略使用 aws:SourceArnkms:EncryptionContext:context-key 条件键。本策略语句允许 CloudTrail 使用 KMS 密钥来生成用来加密跟踪记录的数据密钥aws:SourceArnkms:EncryptionContext:context-key 条件会得到独立评估。使用 KMS 密钥进行指定操作的任何请求都必须满足这两个条件。

为了限制服务对示例账户 (111122223333) 和 us-west-2 区域中 finance 跟踪记录的权限,此策略语句将 aws:SourceArn 条件键设置为特定跟踪记录的 ARN。条件语句使用 ArnEquals 运算符,以确保在匹配时独立评估 ARN 中的每个元素。此示例还使用 kms:EncryptionContext:context-key 条件键来限制对特定账户和区域中跟踪记录的权限。

在使用此密钥策略之前,请将示例账户 ID、区域和跟踪记录名称替换为您账户中的有效值。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow CloudTrail to encrypt logs", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:GenerateDataKey", "Resource": "*", "Condition": { "ArnEquals": { "aws:SourceArn": [ "arn:aws:cloudtrail:us-west-2:111122223333:trail/finance" ] }, "StringLike": { "kms:EncryptionContext:aws:cloudtrail:arn": [ "arn:aws:cloudtrail:*:111122223333:trail/*" ] } } } ] }