Tata bahasa kebijakan rilis kunci aman Azure Key Vault
Artikel ini mendokumentasikan tata bahasa EBNF yang disederhanakan untuk kebijakan rilis kunci yang aman, yang dengan sendirinya dimodelkan pada Azure Policy. Untuk contoh lengkap kebijakan rilis kunci aman, lihat kebijakan rilis kunci VM rahasia.
(* 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 "]" "}";
Kondisi klaim
Kondisi Klaim adalah objek JSON yang mengidentifikasi nama klaim, kondisi untuk pencocokan, serta nilai, misalnya:
{
"claim": "<claim name>",
"equals": <value to match>
}
Dalam iterasi pertama, satu-satunya kondisi yang diizinkan adalah "equals", tetapi iterasi di masa mendatang dapat memungkinkan operator lain yang mirip dengan Azure Policy (lihat bagian mengenai Kondisi). Jika klaim tertentu tidak ada, kondisinya dianggap belum terpenuhi.
Nama klaim memungkinkan "dot notation" untuk mengaktifkan navigasi objek JSON, misalnya:
{
"claim": "object.object.claim",
"equals": <value to match>
}
Spesifikasi array saat ini tidak didukung. Sesuai tata bahasa, objek tidak diizinkan sebagai nilai untuk pencocokan.
Kondisi AnyOf, Allof
Objek kondisi AnOf dan AllOf memungkinkan pemodelan OR dan AND. Untuk AnyOf, jika salah satu kondisi yang diberikan benar, kondisinya terpenuhi. Untuk AllOf, semua kondisi harus benar.
Contohnya ditunjukkan di bawah ini. Pada yang pertama, allOf mengharuskan semua kondisi agar terpenuhi:
{
"allOf":
[
{
"claim": "<claim_1>",
"equals": <value_1>
},
{
"claim": "<claim_2>",
"equals": <value_2>
}
]
}
Artinya (claim_1 == value_1) && (claim_2 == value_2).
Dalam contoh ini, anyOf mengharuskan kondisi apa pun cocok:
{
"anyOf":
[
{
"claim": "<claim_1>",
"equals": <value_1>
},
{
"claim": "<claim_2>",
"equals": <value_2>
}
]
}
Artinya (claim_1 == value_2) || (claim_2 == value_2)
Objek kondisi anyOf dan allOf dapat ditumpuk:
"allOf":
[
{
"claim": "<claim_1>",
"equals": <value_1>
},
{
"anyOf":
[
{
"claim": "<claim_2>",
"equals": <value_2>
},
{
"claim": "<claim_3>",
"equals": <value_3>
}
]
}
]
Atau:
{
"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>
}
]
}
]
}
]
}
Otoritas rilis kunci
Kondisi dikumpulkan ke dalam pernyataan Otoritas dan digabungkan:
{
"authority": "<issuer>",
"allOf":
[
{
"claim": "<claim_1>",
"equals": <value_1>
}
]
}
Mana:
- otoritas: Pengidentifikasi untuk otoritas yang membuat klaim. Pengidentifikasi ini berfungsi dengan cara yang sama seperti klaim iss Token Web JSON. Ini secara tidak langsung mereferensikan kunci yang menandatangani Penegasan Lingkungan.
- allOf: Satu atau lebih kondisi klaim yang mengidentifikasi klaim dan nilai-nilai yang harus dipenuhi dalam penegasan lingkungan agar kebijakan rilis berhasil. anyOf juga diperbolehkan. Namun, keduanya tidak diizinkan bersamaan.
Kebijakan Rilis Kunci
Kebijakan rilis adalah kondisi anyOf yang berisi array otoritas kunci:
{
"anyOf":
[
{
"authority": "my.attestation.com",
"allOf":
[
{
"claim": "mr-signer",
"equals": "0123456789"
}
]
}
]
}
Kebijakan rilis kunci pengodean
Karena kebijakan rilis kunci berupa dokumen JSON, kebijakan tersebut dikodekan saat dibawa dalam permintaan dan respons terhadap AKV untuk menghindari perlunya menjelaskan bahasa lengkap dalam definisi Swagger.
Pengodean tersebut adalah sebagai berikut:
{
"contentType": "application/json; charset=utf-8",
"data": "<BASE64URL(JSON serialization of policy)>"
}
Penegasan Lingkungan
Pernyataan Lingkungan adalah pernyataan yang ditandatangani, dalam formulir JSON Web Token, dari otoritas tepercaya. Pernyataan Lingkungan berisi setidaknya kunci enkripsi utama dan satu atau beberapa klaim mengenai lingkungan target (misalnya, jenis TEE, penerbit, versi) yang dicocokkan dengan Kebijakan Rilis Kunci. Kunci enkripsi utama adalah kunci RSA publik yang dimiliki dan dilindungi oleh lingkungan eksekusi target yang digunakan untuk ekspor kunci. Ini harus muncul dalam klaim kunci TEE (x-ms-runtime/keys). Klaim ini adalah objek JSON yang mewakili Set Kunci Web JSON. Di dalam JWKS, salah satu kunci harus memenuhi persyaratan untuk digunakan sebagai kunci enkripsi (key_use adalah "enc", atau key_ops berisi "encrypt"). Kunci pertama yang cocok dipilih.
Persyaratan Token Pengesahan Key Vault dan HSM Terkelola
Azure Key Vault Premium dan Rilis Kunci Aman HSM Terkelola dirancang bersama Microsoft Azure Attestation Service tetapi dapat bekerja dengan token server pengesahan apa pun jika sesuai dengan struktur token yang diharapkan, mendukung openID connect, dan memiliki klaim yang diharapkan. DigiCert saat ini adalah satu-satunya CA publik yang dipercaya Azure Key Vault Premium dan HSM Terkelola untuk sertifikat penandatanganan token pengesahan.
Serangkaian persyaratan lengkapnya adalah:
klaim iss yang mengidentifikasi penerbit diperlukan dan dicocokkan dengan kebijakan SKR pada kunci yang diminta.
Penerbit harus mendukung Metadata OpenID Connect menggunakan sertifikat yang berakar di DigiCert CA.
Dalam Metadata OpenID Connect, klaim jwks_uri diperlukan dan harus diselesaikan ke JSON Web Key Set (JWKS), di mana setiap JWK dalam set harus berisi kid, kty, dan array X5c dari sertifikat penandatanganan.
Klaim x-ms-runtime diperlukan sebagai objek JSON yang berisi:
Array Kunci Web JSON bernama kunci yang mewakili kunci yang dipegang oleh lingkungan yang dites. Kunci harus format JWK biasa atau array x5c (kunci pertama diambil sebagai kunci penandatanganan dan anaknya harus cocok dengan kunci penandatanganan dalam metadata OpenId Connect).
Anak itu diperlukan.
Salah satu kunci tersebut harus RSA.
Ditandai dengan key_use enkripsi atau array key_ops yang berisi operasi Enkripsi.
Untuk token sampel, lihat Contoh token Azure Attestation.