Megosztás a következőn keresztül:


Az Azure Key Vault biztonságos kulcskiadási szabályzatának nyelvtana

Ez a cikk a biztonságos kulcskiadási szabályzat egyszerűsített EBNF-nyelvtanát ismerteti, amelyet maga az Azure Policy modellez. A biztonságos kulcs kiadási szabályzatának teljes példáját a bizalmas virtuálisgép-kulcs kiadási szabályzatában talál.

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

Jogcímfeltétel

A jogcímfeltétel egy JSON-objektum, amely azonosítja a jogcím nevét, az egyeztetés feltételét és egy értéket, például:

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

Az első iterációban az egyetlen engedélyezett feltétel az "egyenlő", de a jövőbeli iterációk más, az Azure Policyhoz hasonló operátorokat is lehetővé tehetnek (lásd a feltételekről szóló szakaszt). Ha egy megadott jogcím nincs jelen, a feltétel nem teljesültnek minősül.

A jogcímnevek lehetővé teszik a "pontjelezést" a JSON-objektumok navigációjának engedélyezéséhez, például:

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

A tömbspecifikációk jelenleg nem támogatottak. A nyelvhelyesség szerint az objektumok nem használhatók értékekként az egyezéshez.

AnyOf, AllOf feltételek

Az AnOf és az AllOf feltételobjektumok lehetővé teszik az OR és az AND modellezését. Az AnyOf esetében, ha a megadott feltételek bármelyike teljesül, a feltétel teljesül. Az AllOf esetében az összes feltételnek igaznak kell lennie.

Példák az alábbiakban láthatók. Az első esetben az allOf megköveteli az összes feltétel teljesítését:

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

Jelentése (claim_1 == value_1) &> (claim_2 == value_2).

Ebben a példában az anyOf megköveteli, hogy minden feltétel egyezzen:

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

Jelentés (claim_1 == value_2) || (claim_2 == value_2)

Az anyOf és allOf feltételobjektumok beágyazottak lehetnek:

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

Vagy:

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

Kulcskiadási szolgáltató

A feltételek szolgáltatói utasításokba vannak gyűjtve és kombinálva:

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

Ahol:

  • szolgáltató: A jogcímeket beszolgáltató hatóság azonosítója. Ez az azonosító ugyanúgy működik, mint egy JSON-webjogkivonat iss-jogcíme. Közvetetten hivatkozik egy olyan kulcsra, amely aláírja a környezeti helyességi feltételt.
  • allOf: Egy vagy több jogcímfeltétel, amely azonosítja azokat a jogcímeket és értékeket, amelyeknek teljesülniük kell a kiadási szabályzat sikerességéhez szükséges környezeti állításban. az anyOf is engedélyezett. Azonban mindkettő nem engedélyezett együtt.

Kulcskiadási szabályzat

A kiadási szabályzat bármely olyan feltétel, amely a főbb hatóságok tömbét tartalmazza:

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

Kódolási kulcs kiadási szabályzata

Mivel a kulcskiadási szabályzat egy JSON-dokumentum, a rendszer kódolja, amikor kéréseket és válaszokat küld az AKV-nak, hogy ne kelljen leírnia a teljes nyelvet a Swagger-definíciókban.

A kódolás a következő:

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

Környezeti helyesség

A környezeti helyesség egy JSON webes jogkivonat formájában aláírt, megbízható szolgáltatótól származó helyességi feltétel. A környezetérvényesítés legalább egy kulcstitkosítási kulcsot és egy vagy több jogcímet tartalmaz a célkörnyezetről (például TEE-típus, közzétevő, verzió), amelyek megfelelnek a kulcskiadási szabályzatnak. A kulcstitkosítási kulcs egy nyilvános RSA-kulcs, amelyet a kulcsexportáláshoz használt célvégrehajtási környezet véd. Meg kell jelennie a TEE-kulcsok jogcímében (x-ms-runtime/keys). Ez a jogcím egy JSON-objektum, amely egy JSON-webkulcskészletet jelöl. A JWKS-ben az egyik kulcsnak meg kell felelnie a titkosítási kulcsként való használatra vonatkozó követelményeknek (key_use "enc", vagy key_ops "titkosítást" tartalmaz). Az első megfelelő kulcs van kiválasztva.

A Key Vault és a felügyelt HSM-igazolási jogkivonat követelményei

Az Azure Key Vault prémium szintű és felügyelt HSM biztonságos kulcskiadása a Microsoft Azure Attestation Service mellett lett kialakítva, de bármely igazolási kiszolgáló jogkivonatával együttműködhet, ha megfelel a várt jogkivonat-struktúrának, támogatja az OpenID-csatlakozást, és rendelkezik a várt jogcímekkel. A DigiCert jelenleg az egyetlen nyilvános hitelesítésszolgáltató, amelyet az Azure Key Vault Premium és a felügyelt HSM megbízik az igazolási jogkivonat-aláíró tanúsítványokban.

A követelmények teljes készlete a következő:

  • Iss-jogcím , amely azonosítja a kiállítót, és megfelel a kért kulcs SKR-szabályzatának.

    • A kiállítónak támogatnia kell az OpenID Connect metaadatait a DigiCert CA-ban gyökerező tanúsítvány használatával.

    • Az OpenID Connect metaadataiban a jwks_uri jogcímre van szükség, és egy JSON-webkulcskészletre (JWKS) kell feloldani, ahol a készlet minden JWK-jának tartalmaznia kell az aláíró tanúsítványokat tartalmazó kid, kty és X5c tömböt.

  • Az x-ms-runtime jogcím olyan JSON-objektumként szükséges, amely a következőket tartalmazza:

    • JSON-webkulcsok tömbje, amely az igazolt környezet által tárolt kulcsokat jelöli. A kulcsok egyszerű JWK formátumúnak vagy x5c tömbnek kell lenniük (az első kulcs az aláíró kulcs, a gyermeknek pedig meg kell egyeznie egy aláíró kulccsal az OpenId Connect metaadataiban).

    • Gyerekre van szükség.

    • Az egyik kulcsnak RSA-nak kell lennie.

    • Titkosítási key_use vagy titkosítási műveletet tartalmazó key_ops tömb.

A mintajogkivonatokért tekintse meg az Azure-igazolási jogkivonatok példáit.