创建授权 - AWS Key Management Service

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

创建授权

在创建授权之前,请了解用于自定义您的授权的选项。您可以使用授权约束来限制授权中的权限。此外,了解有关授予CreateGrant权限的信息。从授权获得创建授权的权限的委托人在他们可以创建的授权中受到限制。

创建授予

要创建授权,请调用 CreateGrant 操作。指定 CMK、被授权委托人和允许的授权操作的列表。您还可以指定可选的停用委托人。要自定义授权,请使用可选 Constraints 参数来定义授予约束

当您创建、停用或撤销授权时,可能会有短暂的延迟(通常不到 5 分钟),直到操作实现最终一致性

例如CreateGrant,以下命令创建一个授权,以允许 对指定的exampleUser对称 调用 Decrypt CMK 操作。授权使用 RetiringPrincipal 参数,指定可以停用授权的委托人。其中还包含一个授权约束,仅当请求中的加密上下文包含 "Department": "IT" 时才允许该权限。

$ aws kms create-grant \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --grantee-principal arn:aws:iam::111122223333:user/exampleUser \ --operations Decrypt \ --retiring-principal arn:aws:iam::111122223333:role/adminRole \ --constraints EncryptionContextSubset={Department=IT}

如果您的代码重试 CreateGrant 操作或使用自动重试请求的 AWS 开发工具包,请使用可选的 Name 参数来防止创建重复授权。如果 AWS KMS 获取具有与现有授权相同的属性(包括名称)的授权CreateGrant请求,它将认为请求为重试,并且不会创建新的授权。您不能在任何 Name 操作中使用AWS KMS该值来标识授权。

$ aws kms create-grant \ --name IT-1234abcd-exampleUser-decrypt --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --grantee-principal arn:aws:iam::111122223333:user/exampleUser \ --operations Decrypt \ --retiring-principal arn:aws:iam::111122223333:role/adminRole \ --constraints EncryptionContextSubset={Department=IT}

有关演示如何使用多种编程语言的授权的代码示例,请参阅处理授予

使用授权约束

授权约束设置被授权委托人可以执行的权限的条件。授权约束取代了密钥策略使用 AWS KMS 中的密钥策略 策略中的IAM条件键。您不能在授权中使用条件键。

AWS KMS 支持两个授权约束,即 EncryptionContextEqualsEncryptionContextSubset,它们都涉及加密操作请求中的加密上下文。仅在包含加密上下文的授权操作上支持这些授权约束。

注意

您不能在非对称 的授权中使用加密上下文授权约束CMK。AWS KMS 使用的非对称加密算法不支持加密上下文。

  • EncryptionContextEquals 指定仅在请求中加密上下文对与授权约束中加密上下文对是区分大小写的完全匹配时,应用授权。上下文对可以按任意顺序显示,不过每一对中的键和值不能有改变。

  • EncryptionContextSubset 指定仅在请求中加密上下文包含在授权约束中指定的加密上下文时,应用授权。请求中的加密上下文必须是约束中加密上下文的区分大小写的精确匹配,但它也可以包含其他加密上下文对。上下文对可以按任意顺序显示,不过包括的每一对中的键和值不能有改变。

每个约束值最多可以包含 8 个加密上下文对。每个约束中的加密上下文值不能超过 384 个字符。

要在授权中为对称 CMK 指定加密上下文约束,请在 ConstraintsCreateGrant 操作中使用 参数。此命令创建的授权向 exampleUser 授予调用 Decrypt 操作的权限。不过,该权限仅在 Decrypt 请求中的加密上下文包含 "Department": "IT" 加密上下文对时有效。

$ aws kms create-grant \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --grantee-principal arn:aws:iam::111122223333:user/exampleUser \ --operations Decrypt \ --retiring-principal arn:aws:iam::111122223333:role/adminRole \ --constraints EncryptionContextSubset={Department=IT}

生成的授权与以下项目类似。请注意,向 exampleUser 授予的权限仅在 Decrypt 请求包含授权约束中指定的加密上下文时有效。要查找对的授权CMK,请使用 ListGrants操作。

要满足此约束,Decrypt 操作请求中的加密上下文必须包含 "Department": "IT" 对。此对可以是加密上下文中的唯一对,也可以是多个对之一。

$ aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab { "Grants": [ { "Name": "", "IssuingAccount": "arn:aws:iam::111122223333:root", "GrantId": "8c94d1f12f5e69f440bae30eaec9570bb1fb7358824f9ddfa1aa5a0dab1a59b2", "Operations": [ "Decrypt" ], "GranteePrincipal": "arn:aws:iam::111122223333:user/exampleUser", "Constraints": { "EncryptionContextSubset": { "Department": "IT" } }, "CreationDate": 1568565290.0, "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole" } ] }

来自被授权委托人的类似请求将满足 EncryptionContextSubset 约束。

$ aws kms generate-data-key \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --key-spec AES_256 \ --encryption-context Department=IT,Purpose=Test

AWS 服务通常使用授权中的加密上下文约束,这些约束授予其在CMKs您的账户AWS中使用 的权限。例如, Amazon DynamoDB 使用类似于以下的授权获取在您的账户中使用 AWSCMK DynamoDB 托管的 的权限。此授权中的 EncryptionContextSubset 授权约束使授权中的权限仅在请求中的加密上下文包含 "subscriberID": "111122223333""tableName": "Services" 对时有效。此授权约束意味着授权DynamoDB仅允许CMK对AWS账户中的特定表使用指定的 。

要获取此输出,请对您的账户用于 AWS 的 托管运行 CMKListGrantsDynamoDB操作。

$ aws kms list-grants --key-id 0987dcba-09fe-87dc-65ba-ab0987654321 { "Grants": [ { "Operations": [ "Decrypt", "Encrypt", "GenerateDataKey", "ReEncryptFrom", "ReEncryptTo", "RetireGrant", "DescribeKey" ], "IssuingAccount": "arn:aws:iam::111122223333:root", "Constraints": { "EncryptionContextSubset": { "aws:dynamodb:tableName": "Services", "aws:dynamodb:subscriberId": "111122223333" } }, "CreationDate": 1518567315.0, "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", "GranteePrincipal": "dynamodb.us-west-2.amazonaws.com", "RetiringPrincipal": "dynamodb.us-west-2.amazonaws.com", "Name": "8276b9a6-6cf0-46f1-b2f0-7993a7f8c89a", "GrantId": "1667b97d27cf748cf05b487217dd4179526c949d14fb3903858e25193253fe59" } ] }

授予 CreateGrant 权限

授权可以包括调用 CreateGrant 操作的权限。但是,当被授权者委托人CreateGrant从授权而不是从策略获得调用 的权限时,该权限将受到限制。

  • 被授权委托人只能创建允许父授权中的部分或全部操作的授权。

  • 他们创建的授权中的授权约束必须至少与父授权中的授权一样严格。

这些限制不适用于从策略获取CreateGrant权限的委托人,尽管其权限可能受策略条件的限制。

例如,考虑一个授权,该授权允许被授权委托人调用 GenerateDataKeyDecryptCreateGrant 操作。我们将授权称为允许CreateGrant父授权的权限。

# The original grant in a ListGrants response. { "Grants": [ { "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "CreationDate": 1572216195.0, "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a", "Operations": [ "GenerateDataKey", "Decrypt", "CreateGrant ] "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole", "Name": "", "IssuingAccount": "arn:aws:iam::111122223333:root", "GranteePrincipal": "arn:aws:iam::111122223333:user/exampleUser", "Constraints": { "EncryptionContextSubset": { "Department": "IT" } }, } ] }

被授权者委托人 exampleUser 可以使用此权限创建授权,其中包括原始授权中指定的操作的任意子集,例如 CreateGrantDecrypt子授权不能包含其他操作,例如 ScheduleKeyDeletionReEncrypt

此外,子授权中的授权约束必须与父授权中的限制相同或更严格。例如,子授权可以添加对到父授权中的 EncryptionContextSubset 约束,但不能从中删除对。子授权可以将 EncryptionContextSubset 约束更改为 EncryptionContextEquals 约束,但不能反之。

例如,被授权委托人可以使用其从父授权获取CreateGrant的权限来创建以下子授权。子授权中的操作是父授权中操作的子集,而授权约束更严格。

# The child grant in a ListGrants response. { "Grants": [ { "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "CreationDate": 1572249600.0, "GrantId": "fedcba9999c1e2e9876abcde6e9d6c9b6a1987650000abcee009abcdef40183f", "Operations": [ "CreateGrant" "Decrypt" ] "RetiringPrincipal": "arn:aws:iam::111122223333:user/exampleUser", "Name": "", "IssuingAccount": "arn:aws:iam::111122223333:root", "GranteePrincipal": "arn:aws:iam::111122223333:user/anotherUser", "Constraints": { "EncryptionContextEquals": { "Department": "IT" } }, } ] }

子授权中的被授权委托人 anotherUser可使用其CreateGrant权限创建授权。但是, anotherUser 创建的授权必须在其父授权或子集中包含 操作,并且授权约束必须相同或更严格。