关键策略中的 AWS 服务权限 - AWS Key Management Service

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

关键策略中的 AWS 服务权限

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

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

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

实施最低权限

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

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

使用加密上下文条件键

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

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

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

以下示例是密钥策略语句允许 Amazon Location Service 代表授权用户创建授权。本政策声明通过使用 k ms: ViaService、kms: 和kms:EncryptionContext:context-key条件密钥将权限绑定到特定的跟踪器资源来限制权限。CallerAccount

{ "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 条件键

密钥策略语句中的主体是 AWS 服务主体时,除了 kms:EncryptionContext:context-key 条件键外,我们强烈建议您使用 aws:SourceArnaws:SourceAccount 全局条件键。只有当请求 AWS KMS 来自其他 AWS 服务时,ARN 和账户值才会包含在授权上下文中。这种条件的组合实施最低权限,避免了潜在的混淆代理情况。在密钥策略中,服务委托人通常不用作委托人,但某些 AWS 服务(例如)需要 AWS CloudTrail它。

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

注意

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

在以下示例密钥策略中,获得权限的主体是 AWS 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/*" ] } } } ] }