密钥策略中 AWS 服务的权限 - AWS Key Management Service

密钥策略中 AWS 服务的权限

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

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

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

实施最低权限

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

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

使用加密上下文条件键

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

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

将值设置为服务在加密资源时使用的加密上下文。此信息通常可在服务文档的“安全性”章节中找到。例如,AWS Proton 的加密上下文标识 AWS Proton 资源及其关联的模板。AWS 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 条件键

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

要使用 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/*" ] } } } ] }