Share via


Gramática da política de liberação segura de chaves do Azure Key Vault

Este artigo documenta uma gramática EBNF simplificada para a política de liberação segura de chaves, que é modelada na Política do Azure. Para obter um exemplo completo de uma política de liberação de chave segura, consulte a política confidencial de liberação de chave 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 "]" "}";

Condição do sinistro

Uma Condição de Declaração é um objeto JSON que identifica um nome de declaração, uma condição para correspondência e um valor, por exemplo:

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

Na primeira iteração, a única condição permitida é "igual", mas iterações futuras podem permitir outros operadores semelhantes à Política do Azure (consulte a seção sobre Condições). Se uma reivindicação especificada não estiver presente, sua condição é considerada como não atendida.

Os nomes de declaração permitem a "notação de ponto" para habilitar a navegação de objetos JSON, por exemplo:

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

Atualmente, não há suporte para especificações de matriz. De acordo com a gramática, os objetos não são permitidos como valores para correspondência.

AnyOf, AllOf condições

Os objetos de condição AnOf e AllOf permitem a modelagem de OR e AND. Para AnyOf, se qualquer uma das condições fornecidas for verdadeira, a condição será atendida. Para a AllOf, todas as condições devem ser verdadeiras.

Seguem-se alguns exemplos. No primeiro, allOf exige que todas as condições sejam cumpridas:

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

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

Neste exemplo, anyOf requer que qualquer condição corresponda:

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

Significado (claim_1 == value_2) || (claim_2 == value_2)

Os objetos de condição anyOf e allOf podem ser aninhados:

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

Ou:

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

Autoridade de liberação de chaves

As condições são recolhidas nas declarações da Autoridade e combinadas:

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

Em que:

  • autoridade: um identificador para a autoridade que faz as reivindicações. Esse identificador funciona da mesma maneira que a declaração iss em um token Web JSON. Refere-se indiretamente a uma chave que assina a Declaração Ambiental.
  • allOf: Uma ou mais condições de declaração que identificam declarações e valores que devem ser satisfeitos na asserção do ambiente para que a política de liberação seja bem-sucedida. anyOf também é permitido. No entanto, ambos não são permitidos juntos.

Política de Lançamento de Chaves

A política de liberação é uma condição anyOf que contém uma matriz de autoridades-chave:

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

Política de liberação de chave de codificação

Como a política de liberação de chaves é um documento JSON, ela é codificada quando carregada em solicitações e respostas ao AKV para evitar a necessidade de descrever a linguagem completa nas definições do Swagger.

A codificação é a seguinte:

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

Asserção Ambiental

Uma asserção de ambiente é uma asserção assinada, no formato JSON Web Token, de uma autoridade confiável. Uma Declaração de Ambiente contém pelo menos uma chave de criptografia de chave e uma ou mais declarações sobre o ambiente de destino (por exemplo, tipo TEE, editor, versão) que são comparadas com a Política de Liberação de Chave. A chave de criptografia de chave é uma chave RSA pública de propriedade e protegida pelo ambiente de execução de destino usado para exportação de chaves. Ele deve aparecer na declaração de chaves TEE (x-ms-runtime/keys). Esta declaração é um objeto JSON que representa um conjunto de chaves da Web JSON. Dentro do JWKS, uma das chaves deve atender aos requisitos para uso como uma chave de criptografia (key_use é "enc" ou key_ops contém "criptografar"). A primeira chave adequada é escolhida.

Requisitos do Key Vault e do token de atestado HSM gerenciado

O Azure Key Vault Premium e o Managed HSM Secure Key Release foram projetados junto com o Serviço de Atestado do Microsoft Azure, mas podem funcionar com tokens de qualquer servidor de atestado se ele estiver em conformidade com a estrutura de token esperada, oferecer suporte ao OpenID Connect e tiver as declarações esperadas. Atualmente, o DigiCert é a única autoridade de certificação pública na qual o Azure Key Vault Premium e o Managed HSM confiam para certificados de assinatura de token de atestado.

O conjunto completo de requisitos são:

  • A declaração iss que identifica o emissor é necessária e é combinada com a política SKR na chave que está sendo solicitada.

    • O emissor deve suportar metadados OpenID Connect usando um certificado enraizado na CA DigiCert.

    • Nos metadados do OpenID Connect, a declaração jwks_uri é necessária e deve ser resolvida para um conjunto de chaves da Web JSON (JWKS), onde cada JWK no conjunto deve conter kid, kty e uma matriz X5c de certificados de assinatura.

  • A declaração x-ms-runtime é necessária como um objeto JSON contendo:

    • Uma matriz de chaves da Web JSON chamadas chaves que representam as chaves mantidas pelo ambiente atestado. As chaves devem ser de formato JWK simples ou matriz x5c (a primeira chave é tomada como a chave de assinatura e seu filho deve corresponder a uma chave de assinatura nos metadados do OpenId Connect).

    • Criança é necessária.

    • Uma dessas chaves deve ser um RSA.

    • Marcado com key_use de criptografia ou uma matriz key_ops contendo a operação Encrypt.

Para obter um token de exemplo, consulte Exemplos de um token de atestado do Azure.