Sdílet prostřednictvím


Gramatika zásad zabezpečeného vydávání klíčů ve službě Azure Key Vault

Tento článek dokumentuje zjednodušenou gramatiku EBNF pro zásady bezpečného vydání klíče, která se sama modeluje ve službě Azure Policy. Úplný příklad zásady vydání zabezpečeného klíče najdete v zásadách vydávání tajných klíčů virtuálního počítače.

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

Podmínka deklarace identity

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

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

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

Názvy deklarací identity umožňují "zápis tečky" povolit navigaci objektů JSON, například:

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

Specifikace polí nejsou momentálně podporovány. 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í or a AND. Pro AnyOf platí některá z uvedených podmínek, podmínka je splněna. Pro AllOf musí být všechny podmínky pravdivé.

Příklady jsou uvedené níže. V prvním případě všePokud 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 všechny podmínky odpovídaly:

{
  "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 podmínky 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ý podepíše 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ásada vydané verze byla úspěšná. anyOf je také povolen. Obě ale nejsou povolené společně.

Klíčové zásady vydávání verzí

Zásada vydání 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ání klíče kódování

Vzhledem k tomu, že zásady vydávání klíčů jsou dokumentEM JSON, kóduje se při přenášení požadavků a odpovědí na AKV, aby se zabránilo nutnosti popisovat 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 z důvěryhodné autority. Kontrolní výraz prostředí obsahuje aspoň šifrovací klíč klíče a jednu nebo více deklarací identity o cílovém 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 "enc" nebo key_ops obsahuje "encrypt"). Vybere se první vhodný klíč.

Požadavky na token ověření identity ve službě Key Vault a spravovaný HSM

Služba Azure Key Vault Úrovně Premium a zabezpečeného klíče HSM byla navržena společně se službou Microsoft Azure Attestation Service , ale může pracovat s tokeny libovolného serveru ověření identity, pokud vyhovuje očekávané struktuře tokenů, podporuje připojení OpenID a má očekávané deklarace identity. DigiCert je v současné době jedinou veřejnou certifikační autoritou, která důvěřuje službě Azure Key Vault Premium a spravovanému HSM pro podpisové certifikáty tokenů ověření identity.

Úplná sada požadavků:

  • iss claim that identifies the issuer is required and is matched against the SKR policy on the key being requested.

    • Vystavitel musí podporovat metadata OpenID Connect pomocí certifikátu kořenového certifikátu v certifikační autoritě DigiCert.

    • V metadatech OpenID Connect se vyžaduje deklarace identity jwks_uri a musí se přeložit na sadu webových klíčů JSON (JWKS), kde každý JWK v sadě musí obsahovat pole kid, kty a pole X5c podpisových certifikátů.

  • Deklarace identity x-ms-runtime se vyžaduje jako objekt JSON obsahující:

    • Pole pojmenovaných klíčů JSON s názvem klíče, které představují klíče uchovávané v otestovaném prostředí. Klíče musí být prostý formát JWK nebo pole x5c (první klíč se použije jako podpisový klíč a jeho dítě musí odpovídat podpisovém klíči v metadatech OpenId Connect).

    • Dítě je povinné.

    • Jedním z těchto klíčů musí být RSA.

    • Označení key_use šifrování nebo pole key_ops obsahující operaci Encrypt.

Ukázkový token najdete v tématu Příklady tokenu ověření identity Azure.