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

默认密钥策略

创建 KMS 密钥时,您可以为新的 KMS 密钥指定密钥策略。如果您未提供密钥策略,则 Amazon KMS 将为您创建一个。Amazon KMS 使用的默认密钥策略会有所不同,具体取决于密钥是在 Amazon KMS 控制台创建的,还是使用 Amazon KMS API 创建的。

以编程方式创建 KMS 密钥时采用的默认密钥策略

以编程方式使用 Amazon KMS API(包括使用Amazon 开发工具包Amazon Command Line InterfaceAmazon Tools for PowerShell)且不指定密钥策略创建 KMS 密钥时,Amazon KMS 将应用非常简单的默认密钥策略。此默认密钥策略具有一个策略语句,该语句授予拥有 KMS 密钥的 Amazon Web Services 账户 使用 IAM policy 的权限,以允许访问 KMS 密钥上的所有 Amazon KMS 操作。有关此策略语句的更多信息,请参阅允许访问 Amazon Web Services 账户 并启用 IAM policy

通过 Amazon Web Services Management Console 创建 KMS 密钥时采用的默认密钥策略

使用 Amazon Web Services Management Console 创建 KMS 密钥时,密钥策略以允许访问 Amazon Web Services 账户 并启用 IAM policy 的策略语句开始。随后,控制台添加一个密钥管理员语句、一个密钥用户语句和(适用于大多数密钥类型)允许主体使用 KMS 密钥和其他 Amazon 服务的语句。您可以使用 Amazon KMS 控制台功能指定 IAM 用户和角色以及作为密钥管理员和密钥用户(或两者兼有)的 Amazon Web Services 账户。

权限

允许访问 Amazon Web Services 账户 并启用 IAM policy

以下默认密钥策略语句至关重要。

  • 此语句向拥有 KMS 密钥的 Amazon Web Services 账户 授予对 KMS 密钥的完全访问权限。

    与其他 Amazon 资源策略不同,Amazon KMS 密钥策略不会自动授予账户或其任何用户权限。若要授予账户管理员权限,密钥策略必须包含提供此权限的显式语句,如下所示。

  • 除密钥策略外,还允许账户使用 IAM policy 允许对 KMS 密钥进行访问。

    如果没有此权限,尽管拒绝访问密钥的 IAM policy 仍然有效,但是允许访问密钥的 IAM policy 将无效。

  • 此权限通过向账户管理员(包括账户根用户)授予无法删除的访问控制权限,来降低密钥变得无法管理的风险。

以下密钥策略语句是以编程方式创建的 KMS 密钥的完整默认密钥策略。这是在 Amazon KMS 控制台中创建的 KMS 密钥的默认密钥策略中的第一个策略语句。

{ "Sid": "Enable IAM policies", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "kms:*", "Resource": "*" }
允许 IAM policy 允许对 KMS 密钥的访问。

上述密钥策略语句向拥有密钥权限的 Amazon Web Services 账户 授予使用 IAM policy 的权限以及密钥策略,以允许 KMS 密钥上的所有操作 (kms:*)。

本密钥策略声明中的主体是账户主体,其由此格式 (arn:aws:iam::account-id:root) 的 ARN 进行表示。账户主体代表 Amazon 账户及其管理员。

当密钥策略语句中的主体是格式账户主体时,该策略语句不授予任何 IAM 用户或角色使用 KMS 密钥的权限。相反,其授予账户使用 IAM policy 委托密钥语句中指定的权限。此默认密钥策略语句允许账户使用 IAM policy 委托 KMS 密钥上所有操作 (kms:*) 的权限。

降低 KMS 密钥变得不可管理的风险。

与其他 Amazon 资源策略不同,Amazon KMS 密钥策略不会自动授予账户或其任何用户权限。若要授予任何主体(包括账户主体)权限,您必须使用明确提供权限的密钥策略语句。您无需授予账户主体或任何主体访问 KMS 密钥的权限。但是,授予账户主体访问权限有助于防止无法管理密钥。

例如,假设您创建的密钥策略仅授予一个用户访问 KMS 密钥的权限。如果删除该用户,则密钥将变得无法管理,您必须联系 Amazon Support 才能重新获得 KMS 密钥的访问权限。

上方显示的密钥策略语句授予账户主体 [其代表 Amazon Web Services 账户 及其管理员(包括账户根用户)] 控制密钥的权限。除非您删除 Amazon Web Services 账户,否则账户根用户是唯一无法删除的主体。IAM 最佳实践不鼓励代表账户根用户采取操作,但紧急情况除外。但是,如果删除所有其他具有 KMS 密钥访问权限的用户和角色,则您可能需要充当账户根用户。

允许密钥管理员管理 KMS 密钥

控制台创建的默认密钥策略允许您选择账户中的 IAM 用户和角色,并使其成为密钥管理员。此语句称为密钥管理员语句。密钥管理员有权管理 KMS 密钥,但无权在加密操作中使用 KMS 密钥。在原定设置视图或策略视图中创建 KMS 密钥时,您可以将 IAM 用户和角色添加到密钥管理员列表。

警告

由于密钥管理员有权更改密钥策略和创建授权,因此管理员可以向自己和其他人授予未在此策略中指定的 Amazon KMS 权限。

有权管理标签和别名的委托人也可以控制对 KMS 密钥的访问。有关详细信息,请参阅Amazon KMS 中的 ABAC

以下示例在 Amazon KMS 控制台的原定设置视图中显示了密钥管理员语句。


          控制台默认密钥策略中的密钥管理员,默认视图

以下示例是 Amazon KMS 控制台的策略视图中的密钥管理员语句。此密钥管理员语句适用于单区域对称加密 KMS 密钥。

{ "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/KMSAdminUser", "arn:aws:iam::111122223333:role/KMSAdminRole" ]}, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }

最常见 KMS 密钥、单区域对称加密 KMS 密钥的原定设置密钥管理员语句允许以下权限。有关每个权限的详细信息,请参阅 Amazon KMS 权限

当您使用 Amazon KMS 控制台创建 KMS 密钥时,控制台会将您指定的用户和角色添加到密钥管理员语句中的 Principal 元素。

这些权限中有很多都包含通配符 (*),使用它可以允许以指定动词开头的所有权限。因此,在 Amazon KMS 添加新的 API 操作时,会自动允许密钥管理员使用它们。您不必更新密钥策略即可包含新操作。如果您希望将密钥管理员限制在一组固定的 API 操作中,则可以更改密钥策略

kms:Create*

允许 kms:CreateAliaskms:CreateGrant。(kms:CreateKey 权限仅在 IAM policy 中有效。)

kms:Describe*

允许 kms:DescribeKey。需要 kms:DescribeKey 权限才能查看 Amazon Web Services Management Console 中 KMS 密钥的密钥详细信息页面。

kms:Enable*

允许 kms:EnableKey。对于对称加密 KMS 密钥,它还允许 kms:EnableKeyRotation

kms:List*

允许 kms:ListGrantskms:ListKeyPolicieskms:ListResourceTags。(查看 Amazon Web Services Management Console 中的 KMS 密钥所需的 kms:ListAliaseskms:ListKeys 权限仅在 IAM policy 中有效。)

kms:Put*

允许 kms:PutKeyPolicy。此权限允许密钥管理员更改此 KMS 密钥的密钥策略。

kms:Update*

允许 kms:UpdateAliaskms:UpdateKeyDescription。对于多区域密钥,它允许此 KMS 密钥上的 kms:UpdatePrimaryRegion

kms:Revoke*

允许 kms:RevokeGrant,其允许密钥管理员删除授权,即使管理员不是授权中的停用主体

kms:Disable*

允许 kms:DisableKey。对于对称加密 KMS 密钥,它还允许 kms:DisableKeyRotation

kms:Get*

允许 kms:GetKeyPolicykms:GetKeyRotationStatus。对于具有导入密钥材料的 KMS 密钥,它允许 kms:GetParametersForImport。对于非对称 KMS 密钥,它允许 kms:GetPublicKey。需要 kms:GetKeyPolicy 权限才能查看 Amazon Web Services Management Console 中 KMS 密钥的密钥策略。

kms:Delete*

允许 kms:DeleteAlias。对于具有导入密钥材料的密钥,它允许 kms:DeleteImportedKeyMaterialkms:Delete* 权限不允许密钥管理员删除 KMS 密钥 (ScheduleKeyDeletion)。

kms:TagResource

允许 kms:TagResource,以此允许密钥管理员向 KMS 密钥添加标签。由于标签也可用于控制对 KMS 密钥的访问,因此管理员通过此权限可允许或拒绝对 KMS 密钥的访问。有关详细信息,请参阅Amazon KMS 中的 ABAC

kms:UntagResource

允许 kms:UntagResource,以此允许密钥管理员从 KMS 密钥删除标签。由于标签可用于控制对密钥的访问,因此管理员通过此权限可允许或拒绝对 KMS 密钥的访问。有关详细信息,请参阅Amazon KMS 中的 ABAC

kms:ScheduleKeyDeletion

允许 kms:ScheduleKeyDeletion,以此允许密钥管理员删除此 KMS 密钥。要删除此权限,请清除 Allow key administrators to delete this key(允许密钥管理员删除此密钥)选项。

kms:CancelKeyDeletion

允许 kms:CancelKeyDeletion,以此允许密钥管理员取消此 KMS 密钥的删除。要删除此权限,请清除 Allow key administrators to delete this key(允许密钥管理员删除此密钥)选项。

 

在您创建特殊用途密钥时,Amazon KMS 将以下权限添加到原定设置的密钥管理员语句中。

kms:ImportKeyMaterial

kms:ImportKeyMaterial 权限允许密钥管理员将密钥材料导入 KMS 密钥。仅当创建不含密钥材料的 KMS 密钥时,此权限才包含在密钥策略中。

kms:ReplicateKey

kms:ReplicateKey 权限允许密钥管理员在不同的 Amazon 区域中创建多区域主密钥的副本。仅当您创建多区域主键或副本键时,此权限才会包含在密钥策略中。

kms:UpdatePrimaryRegion

kms:UpdatePrimaryRegion 权限允许密钥管理员将多区域副本密钥更改为多区域主密钥。仅当您创建多区域主键或副本键时,此权限才会包含在密钥策略中。

允许密钥用户使用 KMS 密钥

控制台为 KMS 密钥创建的默认密钥策略允许您选择账户和外部 Amazon Web Services 账户 中的 IAM 用户和角色,并使其成为密钥用户

控制台将两个策略语句添加到密钥用户的密钥策略中。

创建 KMS 密钥时,您可以将 IAM 用户、IAM 角色和其他 Amazon Web Services 账户 添加到密钥用户列表。您也可以使用控制台的默认密钥策略视图来编辑该列表,如下图所示。默认密钥策略视图可从密钥详细信息页面获取。有关允许其他 Amazon Web Services 账户 中的用户使用 KMS 密钥的更多信息,请参阅 允许其他账户中的用户使用 KMS 密钥


          控制台默认密钥策略中的密钥用户,默认视图

单区域对称的原定设置密钥用户语句允许以下权限。有关每个权限的详细信息,请参阅 Amazon KMS 权限

当您使用 Amazon KMS 控制台创建 KMS 密钥时,控制台会将您指定的用户和角色添加到各个密钥用户语句中的 Principal 元素。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/ExampleUser", "arn:aws:iam::111122223333:role/ExampleRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::111122223333:user/ExampleUser", "arn:aws:iam::111122223333:role/ExampleRole", "arn:aws:iam::444455556666:root" ]}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

允许密钥用户使用 KMS 密钥进行加密操作

密钥用户有权在 KMS 密钥支持的所有加密操作中直接使用 KMS 密钥。密钥用户还可以使用 DescribeKey 操作,在 Amazon KMS 控制台中或通过使用 Amazon KMS API 操作获得有关 KMS 密钥的详细信息。

默认情况下,Amazon KMS 控制台会将诸如以下示例的密钥用户语句添加到默认密钥策略中。由于支持的 API 操作不同,策略语句中针对对称加密 KMS 密钥、HMAC KMS 密钥、用于公有密钥加密的非对称 KMS 密钥以及用于签名和验证的非对称 KMS 密钥的操作略有不同。

对称加密 KMS 密钥

控制台将以下语句添加到对称加密 KMS 密钥的密钥策略中。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/ExampleUser"}, "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey*", "kms:ReEncrypt*" ], "Resource": "*" }
HMAC KMS 密钥

控制台将以下语句添加到 HMAC KMS 密钥的密钥策略中。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/ExampleUser"}, "Action": [ "kms:DescribeKey", "kms:GenerateMac", "kms:VerifyMac" ], "Resource": "*" }
用于公有密钥加密的非对称 KMS 密钥

对于密钥用法为 Encrypt and decrypt(加密和解密)的非对称 KMS 密钥,控制台将以下语句添加到其密钥策略中。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/ExampleUser" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:DescribeKey", "kms:GetPublicKey" ], "Resource": "*" }
用于签名和验证的非对称 KMS 密钥

对于密钥用法为 Sign and verify(签名和验证)的非对称 KMS 密钥,控制台将以下语句添加到其密钥策略中。

{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/ExampleUser"}, "Action": [ "kms:DescribeKey", "kms:GetPublicKey", "kms:Sign", "kms:Verify" ], "Resource": "*" }

这些语句中的操作赋予密钥用户以下权限。

kms:Encrypt

允许密钥用户使用此 KMS 密钥加密数据。

kms:Decrypt

允许密钥用户使用此 KMS 密钥解密数据。

kms:DescribeKey

允许密钥用户获取有关此 KMS 密钥的详细信息,包括其标识符、创建日期和密钥状态。还允许密钥用户在 Amazon KMS 控制台中显示有关 KMS 密钥的详细信息。

kms:GenerateDataKey*

允许密钥用户请求对称数据密钥或非对称数据密钥对,以执行客户端加密操作。控制台采用 * 通配符表示以下 API 操作的权限:GenerateDataKeyGenerateDataKeyWithoutPlaintextGenerateDataKeyPairGenerateDataKeyPairWithoutPlaintext。这些权限仅对加密数据密钥的对称 KMS 密钥有效。

kms:GenerateMac

允许密钥用户使用 HMAC KMS 密钥生成 HMAC 标签。

kms:GetPublicKey

允许密钥用户下载非对称 KMS 密钥的公有密钥。与您共享此公有密钥的各方可以在 Amazon KMS 外部加密数据。但是,这些密文只能通过调用 Amazon KMS 中的 Decrypt 操作进行解密。

kms:ReEncrypt*

允许密钥用户重新加密最初使用此 KMS 密钥加密的数据,或使用此 KMS 密钥重新加密之前已加密的数据。ReEncrypt 操作需要访问源 KMS 密钥和目标 KMS 密钥。为此,可以允许对源 KMS 密钥具备 kms:ReEncryptFrom 权限,对目标 KMS 密钥具备 kms:ReEncryptTo 权限。但是,为简单起见,控制台允许对两个 KMS 密钥具备 kms:ReEncrypt* 权限(采用 * 通配符)。

kms:Sign

允许密钥用户使用此 KMS 密钥签署消息。

kms:Verify

允许密钥用户使用此 KMS 密钥验证签名。

kms:VerifyMac

允许密钥用户使用 HMAC KMS 密钥验证 HMAC 标签。

允许密钥用户将 KMS 密钥与 Amazon 服务一起使用

控制台中的默认密钥策略还授予密钥用户在使用授权的 Amazon 服务中保护其数据所需的授权权限。Amazon 服务通常使用授权来获取使用 KMS 密钥的特定且有限的权限。

此密钥策略语句允许密钥用户在 KMS 密钥上创建、查看和撤消授权,但仅限授权操作请求来自与 Amazon KMS 集成的 Amazon 服务kms:GrantIsForAWSResource 策略条件不允许用户直接调用这些授权操作。当密钥用户允许时,Amazon 服务可以代表用户创建授权,从而允许该服务使用 KMS 密钥保护用户的数据。

密钥用户必须具备这些授权权限,才能一起使用 KMS 密钥和集成服务,但仅有这些权限还不够。密钥用户还必须具备使用集成服务的权限。有关授权用户访问与 Amazon KMS 集成的 Amazon 服务的详细信息,请查阅有关集成服务的文档。

{ "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/ExampleUser"}, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}} }

例如,密钥用户可以通过以下方式对 KMS 密钥使用这些权限。

  • 将此 KMS 密钥与 Amazon Elastic Block Store (Amazon EBS) 和 Amazon Elastic Compute Cloud (Amazon EC2) 结合使用,将加密的 EBS 卷附加到 EC2 实例。密钥用户向 Amazon EC2 隐式授予使用 KMS 密钥将加密卷挂载到实例的权限。有关更多信息,请参阅Amazon Elastic Block Store (Amazon EBS) 如何使用 Amazon KMS

  • 将此 KMS 密钥用于 Amazon Redshift 以启动加密集群。密钥用户向 Amazon Redshift 隐式授予使用 KMS 密钥启动加密集群并创建加密快照的权限。有关更多信息,请参阅Amazon Redshift 如何使用 Amazon KMS

  • 将此 KMS 密钥与其他与 Amazon KMS 集成的 Amazon 服务一起使用,这些服务使用授权服务创建、管理或使用这些服务加密的资源。

默认密钥策略允许密钥用户向所有使用授权的集成服务委托授权权限。但是,您可以创建自定义密钥策略,此策略将权限限制为指定的 Amazon 服务。有关更多信息,请参阅 kms:ViaService 条件键。