Gramatika zásad vydávání klíčů spravovaného HSM ve službě Azure Managed HSM

Tento článek popisuje zjednodušenou gramatiku EBNF pro zásady bezpečného vydání klíče, které se samy modelují na Azure Policy.

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

(* The operators supported for claim value comparison *)
operator =
  "equals:";

(* 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 "]" "}";

Podmínka deklarace identity

Podmínka deklarace identity je objekt JSON, který identifikuje název deklarace identity, podmínku pro porovnávání a hodnotu, například:

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

V první iteraci je jediná povolená podmínka "rovná se", ale budoucí iterace můžou umožňovat další operátory podobné Azure Policy (viz část o podmínkách). Pokud zadaná deklarace identity neexistuje, její podmínka se považuje za nedoplněnou.

Názvy deklarací umožňují "tečkování" povolit navigaci objektů JSON, například:

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

Specifikace polí se momentálně nepodporují. Podle gramatiky nejsou objekty povolené jako hodnoty pro porovnávání.

AnyOf, AllOf podmínky

Objekty podmínky AnOf a AllOf umožňují modelování objektů OR a AND. Pro AnyOf, pokud některé z uvedených podmínek jsou splněny, je splněna podmínka. Pro AllOf musí být všechny podmínky pravdivé.

Příklady jsou uvedené níže. V první řadě vyžaduje splnění všech podmínek:

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

Význam (claim_1 == value_1) && (claim_2 == value_2).

V tomto příkladu anyOf vyžaduje, aby se všechny podmínky shodovaly:

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

Význam (claim_1 == value_2) || (claim_2 == value_2)

Objekty anyOf a allOf condition mohou být vnořené:

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

Nebo:

{
  "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>
            }
          ]
        }
      ]
    }
  ]
}

Autorita pro vydání klíče

Podmínky se shromažďují do příkazů autority a kombinují se:

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

Kde:

  • autorita: Identifikátor autority provádějící deklarace identity. Tento identifikátor funguje stejným způsobem jako deklarace identity iss ve webovém tokenu JSON. Nepřímo odkazuje na klíč, který podepisuje kontrolní výraz prostředí.
  • allOf: Jedna nebo více podmínek deklarace identity, které identifikují deklarace identity a hodnoty, které musí být splněny v kontrolním výrazu prostředí, aby zásady vydané verze byly úspěšné. anyOf je také povolen. Obě ale nejsou povolené společně.

Zásady vydávání klíčů

Zásada vydané verze je libovolná podmínka obsahující pole klíčových autorit:

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

Zásady vydávání klíčů kódování

Vzhledem k tomu, že klíčové zásady vydávání verzí jsou dokument JSON, kóduje se při přenášení požadavků a odezvy do AKV, aby se zabránilo nutnosti popsat celý jazyk v definicích Swaggeru.

Kódování je následující:

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

Kontrolní výraz prostředí

Kontrolní výraz prostředí je podepsaný kontrolní výraz ve formuláři webového tokenu JSON od důvěryhodné autority. Asserting prostředí obsahuje alespoň šifrovací klíč klíče a jednu nebo více deklarací identity týkající se cílového prostředí (například typ TEE, vydavatel, verze), které se shodují se zásadami vydávání klíčů. Šifrovací klíč klíče je veřejný klíč RSA vlastněný a chráněný cílovým spouštěcím prostředím, které se používá k exportu klíče. Musí se zobrazit v deklaraci identity klíčů TEE (x-ms-runtime/keys). Tato deklarace identity je objekt JSON představující sadu webových klíčů JSON. V JWKS musí jeden z klíčů splňovat požadavky pro použití jako šifrovací klíč (key_use je "en" nebo key_ops obsahuje "encrypt"). Vybere se první vhodný klíč.