最低权限许可 - AWS Key Management Service

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

最低权限许可

由于您的 KMS 密钥可以保护敏感信息,因此我们建议遵循最低权限访问原则。在定义密钥政策时,请委派执行任务所需的最低权限。仅当您计划使用其他 IAM 策略进一步限制权限时,才允许对 KMS 密钥政策执行所有操作(kms:*)。如果您计划使用 IAM 策略管理权限,请限制哪些人员能够创建 IAM 策略并将其附加到 IAM 主体,以及监控策略更改

如果您允许在密钥政策和 IAM 策略中执行所有操作(kms:*),则主体同时拥有 KMS 密钥的管理和使用权限。建议仅将这些权限委托给特定主体,这是最佳安全实践。您可以通过在密钥政策中明确指明主体,或通过限制 IAM 策略附加到哪些主体来实现。您也可以使用条件键来限制权限。例如,如果进行 API 调用的主体具有条件规则中指定的标签,则可以使用 aws:PrincipalTag 来允许所有操作。

如需帮助了解 AWS 中如何评估策略语句,请参阅《IAM 用户指南》中的策略评估逻辑。我们建议您在撰写策略前先阅读此主题,减少策略产生意外影响的可能,例如向本不应该拥有访问权限的主体提供访问权限。

提示

在非生产环境中测试应用程序时,请使用 IAM Access Analyzer 来帮助您将最低权限应用于 IAM 策略。

如果您使用 IAM 用户而不是 IAM 角色,我们强烈建议您启用 AWS 多重身份验证(MFA),以减轻长期证书的漏洞影响。您可使用 MFA 执行以下操作:

  • 要求用户在执行特权操作(例如安排密钥删除)前先使用 MFA 验证其凭证。

  • 将管理员账户密码和 MFA 设备的所有权分配给不同个人,进行授权拆分。

实施最低权限

在您授予使用 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/*" ] } } } ] }