Condividi tramite


Grammatica dei criteri di Secure Key Release di Azure Key Vault

Questo articolo illustra una grammatica EBNF semplificata per i criteri di rilascio delle chiavi sicure, modellati su Criteri di Azure. Per un esempio completo dei criteri di rilascio delle chiavi sicure, vedere i criteri di rilascio della chiave di macchina virtuale riservata.

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

Condizione attestazione

Una condizione attestazione è un oggetto JSON che identifica un nome di attestazione, una condizione per la corrispondenza e un valore, ad esempio:

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

Nella prima iterazione, l'unica condizione consentita è "uguale", ma le iterazioni future possono consentire altri operatori simili a Criteri di Azure (vedere la sezione condizioni). Se non è presente un'attestazione specificata, la condizione viene considerata non soddisfatta.

I nomi delle attestazioni consentono la "notazione punto" per abilitare la navigazione degli oggetti JSON, ad esempio:

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

Le specifiche della matrice non sono attualmente supportate. In base alla grammatica, gli oggetti non sono consentiti come valori per la corrispondenza.

Condizioni AnyOf, AllOf

Gli oggetti condizione AnOf e AllOf consentono la modellazione di OR e AND. Per AnyOf, se una delle condizioni specificate è true, la condizione viene soddisfatta. Per AllOf, tutte le condizioni devono essere vere.

Di seguito sono riportati alcuni esempi. Nel primo, allOf richiede che tutte le condizioni siano soddisfatte:

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

Significato (claim_1 == value_1) && (claim_2 == value_2).

In questo esempio anyOf richiede che qualsiasi condizione corrisponda:

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

Significato (claim_1 == value_2) || (claim_2 == value_2)

Gli oggetti condizione anyOf e allOf possono essere annidati:

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

Oppure:

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

Autorità di rilascio chiave

Le condizioni vengono raccolte nelle istruzioni dell'autorità e combinate:

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

Dove:

  • authority: identificatore dell'autorità che effettua le attestazioni. Questo identificatore funziona nello stesso modo dell'attestazione iss in un token Web JSON. Fa riferimento indirettamente a una chiave che firma l'asserzione dell'ambiente.
  • allOf: una o più condizioni attestazioni che identificano attestazioni e valori che devono essere soddisfatti nell'asserzione dell'ambiente affinché i criteri di versione abbiano esito positivo. anyOf è consentito anche. Tuttavia, entrambi non sono consentiti insieme.

Criteri di rilascio chiave

I criteri di rilascio sono una condizione anyOf contenente una matrice di autorità chiave:

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

Criteri di rilascio della chiave di codifica

Poiché i criteri di rilascio chiave sono un documento JSON, vengono codificati quando vengono eseguiti in richieste e risposte ad AKV per evitare la necessità di descrivere il linguaggio completo nelle definizioni di Swagger.

La codifica è la seguente:

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

Asserzione dell'ambiente

Un'asserzione environment è un'asserzione firmata, nel formato JSON Web Token, da un'autorità attendibile. Un'asserzione dell'ambiente contiene almeno una chiave di crittografia della chiave e una o più attestazioni relative all'ambiente di destinazione (ad esempio, tipo TEE, editore, versione) corrispondenti ai criteri di rilascio della chiave. La chiave di crittografia della chiave è una chiave RSA pubblica di proprietà e protetta dall'ambiente di esecuzione di destinazione usato per l'esportazione delle chiavi. Deve essere visualizzata nell'attestazione delle chiavi TEE (x-ms-runtime/keys). Questa attestazione è un oggetto JSON che rappresenta un set di JSON Web Key. In JWKS, una delle chiavi deve soddisfare i requisiti per l'uso come chiave di crittografia (key_use è "enc" o key_ops contiene "encrypt"). Viene scelta la prima chiave appropriata.

Requisiti del token di attestazione del modulo di protezione hardware gestito e dell'insieme di credenziali delle chiavi

Il rilascio della chiave sicura di Azure Key Vault Premium e del modulo di protezione HSM gestito è stato progettato insieme a Microsoft attestazione di Azure Service, ma può funzionare con qualsiasi token del server di attestazione se è conforme alla struttura di token prevista, supporta OpenID connect e ha le attestazioni previste. DigiCert è attualmente l'unica CA pubblica attendibile di Azure Key Vault Premium e del modulo di protezione hardware gestito per i certificati di firma del token di attestazione.

Il set completo di requisiti è:

  • attestazione iss che identifica l'autorità emittente è obbligatoria e viene confrontata con i criteri SKR sulla chiave richiesta.

    • L'autorità emittente deve supportare i metadati openID Connect usando un certificato rooted nella CA DigiCert.

    • Nei metadati OpenID Connect è necessaria l'attestazione jwks_uri e deve essere risolta in un set di chiavi Web JSON (JWKS), in cui ogni JWK nel set deve contenere elementi figlio, kty e una matrice X5c di certificati di firma.

  • L'attestazione x-ms-runtime è necessaria come oggetto JSON contenente:

    • Matrice di chiavi Web JSON denominate chiavi che rappresentano le chiavi contenute nell'ambiente di attestazione. Le chiavi devono essere in formato JWK normale o matrice x5c (la prima chiave viene presa come chiave di firma e il figlio deve corrispondere a una chiave di firma nei metadati OpenId Connect).

    • Il bambino è obbligatorio.

    • Una di queste chiavi deve essere rsa.

    • Contrassegnato con key_use di crittografia o una matrice di key_ops contenente l'operazione Encrypt.

Per un token di esempio, vedere Esempi di un token attestazione di Azure.