密钥策略概述

密钥策略是基于资源的策略,用于控制哪些阿里云账号、RAM用户、RAM角色有权限来管理或使用KMS密钥,KMS实例中的每个密钥必须有且只有一个密钥策略。本文介绍密钥策略的详细信息。

密钥策略与访问控制RAM的权限策略的关系

密钥策略支持将当前阿里云账号(密钥所属的阿里云账号)下的RAM用户、RAM角色设置为管理员或使用者,将其他阿里云账号下的RAM用户、RAM角色设置为使用者。

除了在KMS上设置密钥策略外,您也可以在访问控制RAM上设置基于身份的策略,用于指定阿里云账号、RAM用户、RAM角色可以管理或使用哪些密钥。具体操作,请参见为RAM用户授权为RAM角色授权密钥管理服务自定义权限策略参考

当阿里云账号、RAM身份(RAM用户或RAM角色)通过阿里云控制台、OpenAPI或CLI发起KMS资源访问请求时,都需要执行权限策略的判定流程,根据判定结果决定是否被允许访问。具体请参见如下流程图和说明。

image

判定结果遵循如下原则:

  • 如果是当前阿里云账号下的RAM用户、RAM角色:判定结果A或者判定结果B中,有一个是允许(Allow)且无Explicit Deny(显式拒绝),即允许管理或使用该密钥。

    说明
    • 当前阿里云账号,即密钥创建者的阿里云账号。您可以通过如下方式查看密钥创建者:

      • 通过控制台:登录密钥管理服务控制台,在密钥管理页面,进入密钥详情页面,查看创建者

      • 通过OpenAPI:调用DescribeKey接口,响应消息中的Creator即创建者。

    • 关于Explicit Deny(显式拒绝)、Implicit Deny(隐式拒绝)的详细介绍,请参见权限策略判定流程

  • 如果是其他阿里云账号下的RAM用户、RAM角色:判定结果A和判定结果B,必须都是允许(Allow),才允许使用该密钥。

通过上述判断流程,您可以了解到:

  • 如果您想允许当前阿里云账号下的RAM用户、RAM角色管理或使用密钥,只需在KMS侧设置密钥策略允许其管理或使用密钥,或者在RAM侧设置权限策略允许其管理或使用密钥。

  • 如果您想允许其他阿里云账号下的RAM用户、RAM角色使用密钥,不仅需要在KMS侧设置密钥策略允许其使用密钥,同时还要在RAM侧设置权限策略允许其使用密钥。

注意事项

  • 仅KMS实例中的密钥支持密钥策略。您可在创建密钥时设置密钥策略,也可在创建后进行修改,具体请参见创建密钥设置密钥策略

  • 如果您授权给其他阿里云账号下的RAM用户、RAM角色,会消耗KMS实例的访问管理数量配额,按阿里云账号个数计算消耗的配额。如果您后续取消跨账号的授权且该实例没有其他资源分享给此账号时,请等待约5分钟再查看配额,配额会返还。

  • 密钥策略仅适用于通过KMS服务Endpoint访问密钥时,对访问权限进行判定。如果您是通过KMS实例Endpoint访问密钥,是否能访问依赖于应用接入点AAP中配置的权限策略。

  • 密钥策略的内容长度不超过32768个字节,且为JSON格式。

密钥策略说明

完整的密钥策略包含如下内容:

  • Version:密钥策略的版本,目前版本仅支持设置为1。

  • Statement:密钥策略的语句,每个密钥策略包含一个或多个语句。每个语句包含以下几个参数。

    • Sid

      可选,表示自定义的语句标识符。内容长度小于等于128字符,支持的字符为:大写英文字母(A-Z)、小写英文字母(a-z)、数字(0-9),特殊字符( _/+=.@-)。

    • Effect

      必选,表示是允许还是拒绝该策略语句中的权限。取值为:AllowDeny

    • Principal

      必选,表示权限策略的授权主体,支持设置为以下主体:

      • 当前阿里云账号,即密钥所属的阿里云账号。

      • 当前阿里云账号下的RAM用户、RAM角色。

      • 其他阿里云账号下的RAM用户、RAM角色。

        重要

        授权给其他阿里云账号下的RAM用户、RAM角色后,您仍需在访问控制RAM侧,使用该RAM用户、RAM角色的阿里云账号为其授权使用该密钥,RAM用户、RAM角色才能使用该密钥。

        具体操作,请参见密钥管理服务自定义权限策略参考为RAM用户授权为RAM角色授权

    • Action

      必选,表示要允许或拒绝的API操作,内容必须以"kms:"开头。操作权限列表的范围如下,如果您设置了列表外的操作,设置后也不会生效。

      权限列表

       "Action": [
                      "kms:List*",
                      "kms:Describe*",
                      "kms:Create*",
                      "kms:Enable*",
                      "kms:Disable*",
                      "kms:Get*",
                      "kms:Set*",
                      "kms:Update*",
                      "kms:Delete*",
                      "kms:Cancel*",
                      "kms:TagResource",
                      "kms:UntagResource",
                      "kms:ImportKeyMaterial",
                      "kms:ScheduleKeyDeletion"
                      "kms:Encrypt",
                      "kms:Decrypt",
                      "kms:GenerateDataKey",
                      "kms:GenerateAndExportDataKey",
                      "kms:AsymmetricEncrypt",
                      "kms:AsymmetricDecrypt",
                      "kms:DescribeKey",
                      "kms:DescribeKeyVersion",
                      "kms:ListKeyVersions",
                      "kms:ListAliasesByKeyId",
                      "kms:TagResource"
                  ]

    • Resource

      必选,取值只能是*,表示本KMS密钥。

    • Condition

      可选,表示授权生效的限制条件。Condition元素也称为条件块(Condition Block),它是由一个或多个条件子句构成。一个条件子句由条件操作类型、条件关键字和条件值组成。详细信息,请参见权限策略基本元素

      格式为"Condition": {"condition operator": {"condition key": "condition value"}}

      • condition operator:具体请参见条件操作类型

      • condition keycondition value:密钥策略支持的条件关键字及取值,具体请参见条件键

密钥策略示例

为阿里云账号(119285303511****)下的密钥设置密钥策略为例。示例表示:

  • 允许当前阿里云账号(119285303511****)对该密钥的完全访问权限,即管理和使用密钥。

  • 允许当前阿里云账号(119285303511****)下的RAM用户(key_ramuser1)管理密钥。

  • 允许当前阿里云账号(119285303511****)下的RAM用户(key_ramuser2)、其他阿里云账号(190325303126****)下的RAM用户(key_ramuser3)使用密钥。

{
    "Statement": [
        {
            "Action": [
                "kms:*"
            ],
            "Effect": "Allow",
            "Principal": {
                "RAM": [
                    "acs:ram::119285303511****:*"
                ]
            },
            "Resource": [
                "*"
            ],
            "Sid": "kms default key policy"
        },
        {
            "Action": [
                "kms:List*",
                "kms:Describe*",
                "kms:Create*",
                "kms:Enable*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Set*",
                "kms:Update*",
                "kms:Delete*",
                "kms:Cancel*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ImportKeyMaterial",
                "kms:ScheduleKeyDeletion"
            ],
            "Effect": "Allow",
            "Principal": {
                "RAM": [
                    "acs:ram::119285303511****:user/key_ramuser1"
                ]
            },
            "Resource": [
                "*"
            ]
        },
        {
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:GenerateAndExportDataKey",
                "kms:AsymmetricEncrypt",
                "kms:AsymmetricDecrypt",
                "kms:DescribeKey",
                "kms:DescribeKeyVersion",
                "kms:ListKeyVersions",
                "kms:ListAliasesByKeyId",
                "kms:TagResource"
            ],
            "Effect": "Allow",
            "Principal": {
                "RAM": [
                    "acs:ram::119285303511****:user/key_ramuser2",
                    "acs:ram::190325303126****:user/key_ramuser3"
                ]
            },
            "Resource": [
                "*"
            ]
        }
    ],
    "Version": "1"
}