قواعد لغة نهج إصدار المفتاح الآمن Azure Key Vault

توثق هذه المقالة قواعد لغة EBNF المبسطة لنهج إصدار المفتاح الآمن، والتي تم تصميمها على غرار نهج Azure. للحصول على مثال كامل لنهج إصدار مفتاح آمن، راجع نهج إصدار مفتاح الجهاز الظاهري السري.

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

حالة المطالبة

شرط المطالبة هو عنصر JSON يحدد اسم المطالبة وشرط المطابقة وقيمة، على سبيل المثال:

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

في التكرار الأول، الشرط الوحيد المسموح به هو "يساوي" ولكن التكرارات المستقبلية قد تسمح لمشغلين آخرين على غرار نهج Azure (راجع القسم الخاص بالشروط). في حالة عدم وجود مطالبة محددة، يتم اعتبار شرطها على أنه لم يتم الوفاء به.

تسمح أسماء المطالبات "بالتدوين النقطي" لتمكين التنقل في عنصر JSON، على سبيل المثال:

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

مواصفات الصفيف غير مدعومة حالياً. وفقاً لقواعد اللغة، لا يُسمح بالعناصر كقيم للمطابقة.

شروط AnyOf، AllOf

تسمح عناصر الشرط AnOf وAllOf بنمذجة OR وAND. بالنسبة لـ AnyOf، إذا كان أي من الشروط المقدمة صحيحاً، يتم استيفاء الشرط. بالنسبة إلى AllOf، يجب أن تكون جميع الشروط صحيحة.

يتم عرض الأمثلة أدناه. في البداية، يتطلب allOf استيفاء جميع الشروط:

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

المعنى (claim_1 == value_1) و (claim_2 == value_2).

في هذا المثال، يتطلب anyOf تطابق أي شرط:

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

المعنى (claim_1 == value_2) || (Claim_2 == value_2)

يمكن أن تتداخل عناصر الشرط anyOf وallOf:

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

أو:

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

تخويل إصدار المفتاح

يتم جمع الشروط في بيانات التخويل ودمجها:

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

المكان:

  • التخويل: معرّف إجراء مطالبات التخويل. يعمل هذا المعرف بنفس طريقة المطالبة بالإصدار في الرمز المميز JSON Web Token. يشير بشكل غير مباشر إلى مفتاح يوقع على تأكيد البيئة.
  • allOf: واحد أو أكثر من شروط المطالبة التي تحدد المطالبات والقيم التي يجب الوفاء بها في تأكيد البيئة حتى تنجح نهج الإعفاء. يُسمح أيضاً باستخدام anyOf. ومع ذلك، كلاهما غير مسموح بهما معًا.

نهج إصدار المفتاح

نهج الإصدار هي شرط anyOf يحتوي على مجموعة من تخويلات المفاتيح:

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

نهج إصدار مفتاح الترميز

نظرًا لأن نهج إصدار المفتاح عبارة عن مستند JSON، يتم تشفيره عند حمله في الطلبات والاستجابة لـ AKV لتجنب الحاجة إلى وصف اللغة الكاملة في تعريفات Swagger.

الترميز كالتالي:

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

تأكيد البيئة

تأكيد البيئة هو تأكيد موقع، في نموذج رمز JSON على الويب، من مرجع موثوق به. يحتوي تأكيد البيئة على مفتاح تشفير مفتاح على الأقل ومطالبة واحدة أو أكثر حول البيئة المستهدفة (على سبيل المثال، نوع TEE، الناشر، الإصدار) التي تتم مطابقتها مع نهج إصدار المفتاح. مفتاح تشفير المفتاح هو مفتاح RSA عام مملوك ومحمي بواسطة بيئة التنفيذ المستهدفة المستخدمة لتصدير المفتاح. لابد أن يظهر في مطالبة مفاتيح TEE (x-ms-runtime/keys). هذه المطالبة هي عنصر JSON يمثل مجموعة مفاتيح ويب JSON. داخل JWKS، يجب أن يفي أحد المفاتيح بمتطلبات الاستخدام كمفتاح تشفير (key_use هو "enc"، أو key_ops يحتوي على "encrypt"). يتم اختيار أول مفتاح مناسب.

Key Vault ومتطلبات الرمز المميز لمصادقة HSM المدارة

تم تصميم Azure Key Vault Premium وHSM Secure Key Release المدار جنبا إلى جنب مع Microsoft Azure Attestation Service ولكن قد يعمل مع أي رموز مميزة لخادم التصديق إذا كان يتوافق مع بنية الرمز المميز المتوقع، ويدعم اتصال OpenID، ولديه المطالبات المتوقعة. DigiCert هو المرجع المصدق العام الوحيد الذي يثق به Azure Key Vault Premium وHSM المدار لشهادات توقيع الرمز المميز للإثبات.

المجموعة الكاملة من المتطلبات هي:

  • مطالبة iss التي تحدد المصدر مطلوب ومطابقتها مع نهج SKR على المفتاح المطلوب.

    • يجب أن يدعم المصدر OpenID الاتصال بيانات التعريف باستخدام شهادة متجذرة في DigiCert CA.

    • في OpenID الاتصال بيانات التعريف، تكون مطالبة jwks_uri مطلوبة ويجب حلها إلى مجموعة مفاتيح ويب JSON (JWKS)، حيث يجب أن تحتوي كل JWK في المجموعة على طفل، وkty، ومصفوفة X5c من شهادات التوقيع.

  • المطالبة ب x-ms-runtime مطلوبة ككائن JSON يحتوي على:

    • صفيف من مفاتيح ويب JSON المسماة المفاتيح التي تمثل المفاتيح التي تحتفظ بها البيئة المصدقة. يجب أن تكون المفاتيح بتنسيق JWK عادي أو صفيف x5c (يتم أخذ المفتاح الأول كمفتاح التوقيع ويجب أن يتطابق طفله مع مفتاح توقيع في OpenId الاتصال بيانات التعريف).

    • الطفل مطلوب.

    • يجب أن يكون أحد هذه المفاتيح RSA.

    • تم وضع علامة key_use التشفير أو صفيف key_ops يحتوي على عملية التشفير.

للحصول على نموذج رمز مميز، راجع أمثلة على رمز Azure Attestation المميز.