التحكم في الوصول إلى Azure IoT Hub Device Provisioning Service (DPS) باستخدام توقيعات الوصول المشتركة ورمز الأمان المميز

توضح هذه المقالة الخيارات المتاحة لتأمين خدمة توفير جهاز Azure IoT Hub (DPS). تستخدم خدمة التوفير المصادقة والأذونات لمنح حق الوصول إلى كل نقطة نهاية. تسمح الأذونات لعملية المصادقة بالحد من الوصول إلى مثيل خدمة استنادا إلى الوظائف.

تتناول هذه المقالة ما يلي:

  • عملية المصادقة والرموز المميزة التي تستخدمها خدمة التوفير للتحقق من الأذونات مقابل كل من Service وDevice REST APIs.

  • الأذونات المختلفة التي يمكنك منحها لتطبيق الواجهة الخلفية للوصول إلى واجهة برمجة تطبيقات الخدمة.

المصادقة

تدعم واجهة برمجة تطبيقات الجهاز مصادقة الجهاز المستندة إلى المفتاح و X.509 المستندة إلى الشهادة.

تدعم واجهة برمجة تطبيقات الخدمة المصادقة المستندة إلى المفتاح لتطبيقات الواجهة الخلفية.

عند استخدام المصادقة المستندة إلى المفتاح، تستخدم خدمة تزويد الأجهزة رموز الأمان المميزة لمصادقة الخدمات لتجنب إرسال المفاتيح على السلك. بالإضافة إلى ذلك، رموز الأمان المميزة محدودة في صلاحية الوقت والنطاق. تنشئ مجموعات SDK لتوفير جهاز Azure IoT تلقائيا رموزا مميزة دون الحاجة إلى أي تكوين خاص.

في بعض الحالات، قد تحتاج إلى استخدام واجهات برمجة تطبيقات REST لخدمة توفير جهاز HTTP مباشرة، دون استخدام SDKs. تصف الأقسام التالية كيفية المصادقة مباشرة مقابل واجهات برمجة تطبيقات REST.

مصادقة واجهة برمجة تطبيقات الجهاز

يتم استخدام واجهة برمجة تطبيقات الجهاز من قبل الأجهزة للتصديق على خدمة تزويد الأجهزة وتلقي اتصال IoT Hub.

إشعار

لتلقي اتصال مصادق عليه، يجب أولا تسجيل الأجهزة في خدمة تزويد الأجهزة من خلال التسجيل. استخدم واجهة برمجة تطبيقات الخدمة لتسجيل جهاز برمجيا من خلال التسجيل.

يجب أن يصادق الجهاز على واجهة برمجة تطبيقات الجهاز كجزء من عملية التزويد. يتم تعريف الطريقة التي يستخدمها الجهاز للمصادقة عند إعداد مجموعة تسجيل أو تسجيل فردي. مهما كانت طريقة المصادقة، يجب أن يصدر الجهاز HTTPS PUT إلى عنوان URL التالي لتوفير نفسه.

    https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01

إذا كنت تستخدم المصادقة المستندة إلى المفتاح، يتم تمرير رمز أمان مميز في عنوان طلب تخويل HTTP بالتنسيق التالي:

    SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI} 

بنية رمز الأمان للمصادقة المستندة إلى المفتاح

يتم تمرير رمز الأمان المميز في عنوان طلب تخويل HTTP بالتنسيق التالي:

    SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI} 

القيم المتوقعة هي:

قيمة ‏‏الوصف
{signature} سلسلة توقيع HMAC-SHA256 من النموذج: {URL-encoded-resourceURI} + "\n" + expiry. هام: تم فك تشفير المفتاح من base64 واستخدامه كمفتاح لإجراء حساب HMAC-SHA256.
{expiry} سلاسل UTF8 لعدد الثواني منذ 00:00:00 للتوقيت العالمي المتفق عليه في 1 يناير 1970.
{URL-encoded-resourceURI} ترميز عنوان URL للأحرف الصغيرة {ID_Scope}/registrations/{registration_id}
{policyName} بالنسبة لواجهة برمجة تطبيقات الجهاز، يكون هذا النهج دائما "تسجيل".

يظهر مقتطف Python التالي دالة تسمى generate_sas_token التي تحسب الرمز المميز من المدخلات uri، ، keypolicy_name، expiry لتسجيل فردي باستخدام نوع مصادقة مفتاح متماثل.


from base64 import b64encode, b64decode, encode 
from hashlib import sha256 
from time import time 
from urllib.parse import quote_plus, urlencode 
from hmac import HMAC 

 def generate_sas_token(uri, key, policy_name, expiry=3600): 
    ttl = time() + expiry 
    sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl)) 
    signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest()) 

    rawtoken = { 
        'sr' :  uri, 
        'sig': signature, 
        'se' : str(int(ttl)), 
        'skn' : policy_name 
    } 

    return 'SharedAccessSignature ' + urlencode(rawtoken) 

print(generate_sas_token("myIdScope/registrations/mydeviceregistrationid", "00mysymmetrickey", "registration"))

يجب أن تشبه النتيجة الإخراج التالي:


SharedAccessSignature sr=myIdScope%2Fregistrations%2Fmydeviceregistrationid&sig=SDpdbUNk%2F1DSjEpeb29BLVe6gRDZI7T41Y4BPsHHoUg%3D&se=1630175722&skn=registration 

يوضح المثال التالي كيفية استخدام توقيع الوصول المشترك بعد ذلك للمصادقة مع واجهة برمجة تطبيقات الجهاز.


curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [token]' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01 

إذا كنت تستخدم مجموعة تسجيل متماثلة تستند إلى مفتاح، فستحتاج أولا إلى إنشاء device symmetric مفتاح باستخدام مفتاح مجموعة التسجيل. استخدم المفتاح الأساسي أو الثانوي لمجموعة التسجيل لحساب HMAC-SHA256 لمعرف التسجيل للجهاز. ثم يتم تحويل النتيجة إلى تنسيق Base64 للحصول على مفتاح الجهاز المشتق. لعرض أمثلة التعليمات البرمجية، راجع كيفية توفير الأجهزة باستخدام مجموعات تسجيل المفاتيح المتماثلة. بمجرد اشتقاق المفتاح المتماثل للجهاز، يمكنك تسجيل الجهاز باستخدام الأمثلة السابقة.

تحذير

لتجنب تضمين المفتاح الرئيسي للمجموعة في التعليمات البرمجية لجهازك، يجب إجراء عملية اشتقاق مفتاح الجهاز من الجهاز.

استخدام المصادقة المستندة إلى شهادة

إذا قمت بإعداد مجموعة تسجيل فردية أو مجموعة تسجيل للمصادقة المستندة إلى شهادة X.509، فسيحتاج الجهاز إلى استخدام شهادة X.509 الصادرة للمصادقة على واجهة برمجة تطبيقات الجهاز. راجع المقالات التالية حول كيفية إعداد التسجيل وإنشاء شهادة الجهاز.

بمجرد إعداد التسجيل وإصدار شهادة الجهاز، يوضح المثال التالي كيفية المصادقة على واجهة برمجة تطبيقات الجهاز مع شهادة X.509 للجهاز.


curl -L -i -X PUT –cert ./[device_cert].pem –key ./[device_cert_private_key].pem -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01 

مصادقة واجهة برمجة تطبيقات الخدمة

يتم استخدام واجهة برمجة تطبيقات الخدمة لاسترداد حالة التسجيل وإزالة تسجيلات الجهاز. كما يتم استخدام الخدمة من قبل تطبيقات الواجهة الخلفية لإدارة كل من المجموعاتالفردية ومجموعات التسجيل برمجيا. تدعم واجهة برمجة تطبيقات الخدمة المصادقة المستندة إلى المفتاح لتطبيقات الواجهة الخلفية.

يجب أن يكون لديك الأذونات المناسبة للوصول إلى أي من نقاط نهاية واجهة برمجة تطبيقات الخدمة. على سبيل المثال، يجب أن يتضمن تطبيق الواجهة الخلفية رمزا مميزا يحتوي على بيانات اعتماد الأمان مع كل رسالة يرسلها إلى الخدمة.

تمنح Azure IoT Hub Device Provisioning Service حق الوصول إلى نقاط النهاية عن طريق التحقق من الرمز المميز مقابل نهج الوصول المشترك. لا يتم إرسال بيانات اعتماد الأمان، مثل المفاتيح المتماثلة، عبر السلك مطلقًا.

التحكم بالوصول والأذونات

يمكنك منح الأذونات بالطرق التالية:

  • نهج تخويل الوصول المشترك. يمكن أن تمنح نهج الوصول المشترك أي مجموعة من الأذونات. يمكنك تحديد النهج في مدخل Microsoft Azure، أو برمجيا باستخدام واجهات برمجة تطبيقات REST لخدمة توفير الأجهزة. تحتوي خدمة التزويد التي تم إنشاؤها حديثًا على السياسة الافتراضية التالية:

  • provisioningservicener: نهج مع جميع الأذونات. راجع الأذونات للحصول على معلومات مفصلة.

إشعار

يتم تأمين موفر موارد خدمة توفير الأجهزة من خلال اشتراك Azure، كما هو الحال مع جميع الموفرين في Azure Resource Manager.

لمزيد من المعلومات حول كيفية إنشاء رموز الأمان المميزة واستخدامها، راجع القسم التالي.

HTTP هو البروتوكول الوحيد المدعوم، وينفذ المصادقة عن طريق تضمين رمز مميز صالح في عنوان طلب التخويل .

مثال

SharedAccessSignature sr = 
   mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\

إشعار

تنشئ حزم SDK لخدمة تزويد أجهزة Azure IoT تلقائيا رموزا مميزة عند الاتصال بالخدمة.

رموز الأمان المميزة

تستخدم خدمة تزويد الأجهزة رموز الأمان المميزة لمصادقة الخدمات لتجنب إرسال المفاتيح عبر السلك. بالإضافة إلى ذلك، رموز الأمان المميزة محدودة في صلاحية الوقت والنطاق. تنشئ حزم SDK لخدمة تزويد أجهزة Azure IoT تلقائيا رموزا مميزة دون الحاجة إلى أي تكوين خاص. تتطلب بعض وحدات السيناريو إنشاء رموز الأمان المميزة واستخدامها مباشرة. تتضمن مثل هذه السيناريوهات الاستخدام المباشر لسطح HTTP.

هيكل رمز الأمان المميز

بإمكانك استخدام رموز الأمان المميزة لمنح الوصول المحدد زمنيا للخدمات إلى وظائف معينة في خدمة تزويد جهاز IoT. للحصول على إذن للاتصال بخدمة التزويد، يجب على الخدمات إرسال رموز أمان مميزة موقعة إما بوصول مشترك أو مفتاح متماثل.

الرمز المميز الموقع مع مفتاح وصول مشترك يمنح حق الوصول إلى كافة الوظائف المقترنة بأذونات سياسة الوصول المشترك.

يكون رمز الأمان المميز بالتنسيق التالي:

SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}

فيما يلي القيم المتوقعة

قيمة ‏‏الوصف
{signature} سلسلة توقيع HMAC-SHA256 من النموذج: {URL-encoded-resourceURI} + "\n" + expiry. هام: تم فك تشفير المفتاح من base64 واستخدامه كمفتاح لإجراء حساب HMAC-SHA256.
{expiry} سلاسل UTF8 لعدد الثواني منذ 00:00:00 للتوقيت العالمي المتفق عليه في 1 يناير 1970.
{URL-encoded-resourceURI} ترميز عنوان موقع ويب بأحرف صغيرة- لعنوان موقع ويب لمورد بأحرف صغيرة. بادئة عنوان موقع الويب (حسب المقطع) لنقاط النهاية التي يمكن الوصول إليها باستخدام هذا الرمز المميز، بدءا من اسم المضيف لخدمة تزويد أجهزة IoT (لا يوجد بروتوكول). على سبيل المثال، mydps.azure-devices-provisioning.net
{policyName} اسم نهج الوصول المشترك الذي يوضح هذا الرمز المميز.

إشعار

يتم حساب بادئة عنوان موقع الويب حسب القطعة وليس حسب الحرف. على سبيل المثال،/a/b هي بادئة لـ /a/b/cولكن ليست لـ/a/bc.

تعرض القصاصة البرمجية Node.js التالية دالة تسمى generateSasToken تحسب الرمز المميز من المدخلات resourceUri, signingKey, policyName, expiresInMins. توضح الأقسام التالية بالتفصيل كيفية تهيئة المدخلات المختلفة لحالات استخدام الرموز المميزة المختلفة.

var generateSasToken = function(resourceUri, signingKey, policyName, expiresInMins) {
    resourceUri = encodeURIComponent(resourceUri);

    // Set expiration in seconds
    var expires = (Date.now() / 1000) + expiresInMins * 60;
    expires = Math.ceil(expires);
    var toSign = resourceUri + '\n' + expires;

    // Use crypto
    var hmac = crypto.createHmac('sha256', new Buffer(signingKey, 'base64'));
    hmac.update(toSign);
    var base64UriEncoded = encodeURIComponent(hmac.digest('base64'));

    // Construct authorization string
    var token = "SharedAccessSignature sr=" + resourceUri + "&sig="
    + base64UriEncoded + "&se=" + expires + "&skn="+ policyName;
    return token;
};

وكمقارنة، فإن رمز Python المكافئ لإنشاء رمز أمان مميز هو:

from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC

def generate_sas_token(uri, key, policy_name, expiry=3600):
    ttl = time() + expiry
    sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
    print sign_key
    signature = b64encode(HMAC(b64decode(key), sign_key, sha256).digest())

    rawtoken = {
        'sr' :  uri,
        'sig': signature,
        'se' : str(int(ttl)),
        'skn' : policy_name
    }

    return 'SharedAccessSignature ' + urlencode(rawtoken)

إشعار

نظرا لأنه تم التحقق من صحة الوقت للرمز المميز على أجهزة IoT Device Provisioning Service، يجب أن يكون الانجراف على ساعة الجهاز الذي ينشئ الرمز المميز ضئيلا.

عملية استخدام رموز الأمان المميزة من مكونات الخدمة

يمكن لمكونات الخدمة إنشاء رموز أمان مميزة فقط باستخدام سياسات الوصول المشتركة التي تمنح الأذونات المناسبة كما هو موضح سابقا.

فيما يلي وظائف الخدمة المكشوفة على نقاط النهاية:

نقطة النهاية الدالات
{your-service}.azure-devices-provisioning.net/enrollments قم بتوفير عمليات تسجيل الجهاز باستخدام خدمة تزويد الأجهزة.
{your-service}.azure-devices-provisioning.net/enrollmentGroups قم بتوفير عمليات لإدارة مجموعات تسجيل الأجهزة.
{your-service}.azure-devices-provisioning.net/registrations/{id} قم بتوفير عمليات لاسترداد حالة تسجيلات الأجهزة وإدارتها.

على سبيل المثال، قد تنشئ الخدمة التي تم إنشاؤها باستخدام نهج وصول مشترك تم إنشاؤه مسبقا يسمى enrollmentread رمزا مميزا بالمعلمات التالية:

  • URI للمورد: {mydps}.azure-devices-provisioning.net،
  • مفتاح التوقيع: أحد مفاتيح سياسةenrollmentread،
  • اسم السياسة:enrollmentread،
  • أي وقت انتهاء صلاحية.backn

إنشاء نهج وصول مشترك لمثيل خدمة تزويد الأجهزة في المدخل

var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread'; 
var policyKey = '...';

var token = generateSasToken(endpoint, policyKey, policyName, 60);

والنتيجة، التي من شأنها أن تضمن حق الوصول إلى قراءة جميع سجلات التسجيل، ستكون:

SharedAccessSignature sr=mydps.azure-devices-provisioning.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=enrollmentread

SDKs والعينات

مواضيع مرجعية:

توفر لك الموضوعات المرجعية التالية مزيدا من المعلومات حول التحكم في الوصول إلى خدمة توفير جهاز IoT.

خدمة تزويد أجهزة Azure

يسرد الجدول التالي الأذونات التي بإمكانك استخدامها للتحكم في الوصول إلى خدمة تزويد أجهزة IoT.

الإذن ملاحظات
تكوين الخدمة إعطاء حق الوصول لتغيير تكوينات الخدمة.
يتم استخدام هذا الإذن من قبل خدمات مجموعة النظراء الخلفية.
قراءة التسجيل يمنح حق الوصول للقراءة إلى عمليات تسجيل الجهاز ومجموعات التسجيل.
يتم استخدام هذا الإذن من قبل خدمات مجموعة النظراء الخلفية.
كتابة التسجيل منح حق الوصول للكتابة إلى عمليات التسجيل الخاصة بالجهاز ومجموعات التسجيل.
يتم استخدام هذا الإذن من قبل خدمات مجموعة النظراء الخلفية.
RegistrationStatusRead منح الوصول للقراءة فقط إلى حالة تسجيل الجهاز.
يتم استخدام هذا الإذن من قبل خدمات مجموعة النظراء الخلفية.
RegistrationStatusWrite منح حذف الوصول إلى حالة التسجيل الخاصة بالجهاز.
يتم استخدام هذا الإذن من قبل خدمات مجموعة النظراء الخلفية.