共用方式為


Azure Key Vault 安全金鑰發行原則文法

本文記載了安全密鑰發行原則的簡化 EBNF 文法,其本身會以 Azure 原則 模型化。 如需安全密鑰發行原則的完整範例,請參閱 機密 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>
} 

在第一個反覆專案中,唯一允許的條件是「相等」,但未來的反覆專案可能會允許類似 Azure 原則 的其他運算元(請參閱條件一節)。 如果指定的宣告不存在,則會將其條件視為尚未符合。

宣告名稱允許「點表示法」啟用 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 語句中,並合併:

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

其中:

  • authority:發出宣告之授權單位的標識符。 此標識子的運作方式與 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",或包含 "enc"的 key_ops)。 系統會選擇第一個合適的金鑰。

金鑰保存庫 及受控 HSM 證明令牌需求

Azure 金鑰保存庫 Premium 和受控 HSM 安全密鑰發行是與Microsoft Azure 證明服務一起設計,但如果它符合預期的令牌結構、支援 OpenID 連線,且具有預期的宣告,則可能會使用任何證明伺服器的令牌。 DigiCert 目前是唯一的公用 CA,Azure 金鑰保存庫 進階和受控 HSM 信任證明令牌簽署憑證。

完整的需求集合如下:

  • iss 宣告,可識別簽發者是必要的,而且會與所要求的密鑰上的 SKR 原則相符。

    • 簽發者必須使用 DigiCert CA 中跟著的憑證來支援 OpenID Connect 元數據。

    • 在OpenID Connect元數據中, 需要jwks_uri 宣告,而且必須解析為JSON Web 金鑰集 (JWKS),其中集合中的每個 JWK 都必須包含簽署憑證的 kid、kty 和 X5c 陣列。

  • 需要 x-ms-runtime 宣告作為 JSON 物件,其中包含:

    • JSON Web 金鑰的陣列,其名稱為索引鍵,代表證明環境所持有的索引鍵。 密鑰必須是純 JWK 格式或 x5c 陣列(第一個密鑰是作為簽署金鑰,其子系必須符合 OpenId Connect 元數據中的簽署金鑰)。

    • 孩子是必要的。

    • 其中一個金鑰必須是 RSA。

    • 標示key_use加密或包含 Encrypt 作業的key_ops陣列。

如需範例令牌,請參閱 Azure 證明 令牌的範例。