你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Key Vault 安全密钥发布策略语法

本文介绍了安全密钥发布策略的简化 EBNF 语法,该策略本身以 Azure Policy 为模型。 有关安全密钥发布策略的完整示例,请参阅机密 VM 密钥发布策略

(* string and number from JSON *)
value =
  string |
  number |
  "true" |
  "false";

(* The operators supported for claim value comparison *)
operator =
  "equals:" |
  "notEquals:" |
  "less:" |
  "lessOrEquals:" |
  "greater:" |
  "greaterOrEquals:" |
  "exists:";

(* A JSON condition that evaluates the value of a claim *)
claim_condition =
  "{" "claim:", string "," operator, ":", value "}";

(* A JSON condition requiring any of the listed conditions to be true *)
anyof_condition =
  "{" "anyof:", condition_array "}";

(* A JSON condition requiring all of the listed conditions to be true *)
allof_condition =
  "{" "allof:", condition_array "}";

(* A condition is any of the allowed condition types *)
condition =
  claim_condition |
  anyof_condition |
  allof_condition;

(* A list of conditions, one is required *)
condition_list =
  condition { "," condition };

(* An JSON array of conditions *)
condition_array =
  "[" condition_list "]";

(* A JSON authority with its conditions *)
authority =
  "{" "authority:", string "," ( anyof_condition | allof_condition );

(* A list of authorities, one is required *)
authority_list =
  authority { "," authority_list };

(* A policy is an anyOf selector of authorities *)
policy = 
  "{" "version: \"1.0.0\"", "anyOf:", "[" authority_list "]" "}";

声明条件

声明条件是一个 JSON 对象,用于标识声明名称、匹配条件和值,例如:

{ 
  "claim": "<claim name>", 
  "equals": <value to match>
} 

在第一次迭代中,唯一允许的条件是“equals”,但未来的迭代可能会允许其他操作符(类似于 Azure Policy)(请参阅“条件”部分)。 如果指定的声明不存在,则将其条件视为尚未得到满足。

声明名称允许“点表示法”以启用 JSON 对象导航,例如:

{ 
  "claim": "object.object.claim", 
  "equals": <value to match>
}

目前尚不支持数组规范。 根据语法,不允许对象作为匹配值。

AnyOf、AllOf 条件

AnOf 和 AllOf 条件对象允许对 OR 和 AND 进行建模。 对于 AnyOf,如果提供的任何条件为 true,则满足条件。 对于 AllOf,所有条件都必须为 true。

下面显示了示例。 在第一种情况下,allOf 要求所有条件都得到满足:

{
  "allOf":
  [
    { 
      "claim": "<claim_1>", 
      "equals": <value_1>
    },
    { 
      "claim": "<claim_2>", 
      "equals": <value_2>
    }
  ]
}

含义 (claim_1 == value_1) && (claim_2 == value_2)。

在此示例中,anyOf 要求任一条件匹配:

{
  "anyOf":
  [
    { 
      "claim": "<claim_1>", 
      "equals": <value_1>
    },
    { 
      "claim": "<claim_2>", 
      "equals": <value_2>
    }
  ]
}

表示 (claim_1 == value_2) || (claim_2 == value_2)

anyOf 和 allOf 条件对象可以嵌套:

  "allOf":
  [
    { 
      "claim": "<claim_1>", 
      "equals": <value_1>
    },
    {
      "anyOf":
      [
        { 
          "claim": "<claim_2>", 
          "equals": <value_2>
        },
        { 
          "claim": "<claim_3>", 
          "equals": <value_3>
        }
      ]
    }
  ]

或:

{
  "allOf":
  [
    { 
      "claim": "<claim_1>", 
      "equals": <value_1>
    },
    {
      "anyOf":
      [
        { 
          "claim": "<claim_2>", 
          "equals": <value_2>
        },
        {
          "allOf":
          [
            { 
              "claim": "<claim_3>", 
              "equals": <value_3>
            },
            { 
              "claim": "<claim_4>", 
              "equals": <value_4>
            }
          ]
        }
      ]
    }
  ]
}

密钥发布机构

条件被收集到机构声明中并组合:

{
  "authority": "<issuer>",
  "allOf":
  [
    { 
      "claim": "<claim_1>", 
      "equals": <value_1>
    }
  ]
}

其中:

  • 机构:发出声明的机构的标识符。 此标识符的工作方式与 JSON Web 令牌中的 iss 声明相同。 它间接引用对环境断言进行签名的密钥。
  • allOf:一个或多个声明条件,用于标识必须在环境断言中满足才能成功发布策略的声明和值。 也允许使用 anyOf。 但是,两者不允许同时使用。

密钥发布策略

发布策略是包含密钥颁发机构数组的 anyOf 条件:

{
  "anyOf":
  [
    {
      "authority": "my.attestation.com",
      "allOf":
      [
        { 
          "claim": "mr-signer", 
          "equals": "0123456789"
        }
      ]
    }
  ]
}

对密钥发布策略进行编码

由于密钥发布策略是一个 JSON 文档,因此在请求和响应 AKV 时,将对其进行编码,以免需要以 Swagger 定义来描述完整语言。

编码如下:

{
  "contentType": "application/json; charset=utf-8",
  "data": "<BASE64URL(JSON serialization of policy)>"
}

环境断言

环境断言是来自受信任颁发机构的已签名断言,采用 JSON Web 令牌的形式。 环境断言至少包含一个密钥加密密钥以及一个或多个关于目标环境的声明(例如 TEE 类型、发布者、版本),这些声明针对密钥发布策略匹配。 密钥加密密钥是由用于密钥导出的目标执行环境拥有和保护的公共 RSA 密钥。 它必须出现在 TEE 密钥声明 (x-ms-runtime/keys) 中。 此声明是表示 JSON Web 密钥集的 JSON 对象。 在 JWKS 中,其中一个密钥必须满足用作加密密钥的要求(key_use 为“enc”或 key_ops 包含“encrypt”)。 选择第一个合适的密钥。

密钥保管库和托管 HSM 证明令牌要求

Azure 密钥保管库高级版和托管 HSM 安全密钥发布虽然在设计之初是搭配 Microsoft Azure 证明服务一起使用,但也可能和任何证明服务器的令牌配合使用,只要令牌遵循预期的令牌结构,支持 OpenID 连接,且具有预期的声明。 DigiCert 是目前唯一 Azure 密钥保管库高级版和托管 HSM 都信任的,可用作证明令牌签名证书的公共 CA。

完整的要求如下:

  • iss 声明,用于识别证书颁发者是必需的,并且与所请求的密钥上的 SKR 策略匹配。

    • 证书颁发者必须支持 OpenID ConnectOpenID Connect 元数据使用 DigiCert CA 中的根证书。

    • 在 OpenID Connect 元数据中,jwks_uri 声明是必需要的,并且必须解析到 JSON Web 密钥集 (JWKS),其中每个 JWK 都必须包含签名证书的 kid、kty 和 X5c 数组。

  • x-ms-runtime 声明需要作为包含以下内容的 JSON 对象:

    • JSON Web 密钥数组命名了代表已证明的环境持有的密钥。 密钥必须为纯 JWK 格式或 x5c 数组(第一个密钥作为签名密钥,并且其子密钥必须匹配 OpenID Connect 元数据中的一个签名密钥)。

    • 子密钥是必需的。

    • 其中一个密钥是 RSA。

    • 标有加密的 key_use,或是包含加密操作的数组 key_ops

有关示例令牌,请参阅 Azure 证明令牌示例