التحكم في الوصول إلى خدمة توفير الأجهزة (DPS) الخاصة بمركز إنترنت الأشياء من Azure باستخدام توقيعات الوصول المشترك ورموز الأمان المميزة

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

تناقش هذه المقالة:

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

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

المصادقة

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

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

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

في بعض الحالات، قد تحتاج إلى استخدام واجهات برمجة تطبيقات REST لخدمة توفير الأجهزة HTTP مباشرة، دون استخدام مجموعات تطوير البرامج (SDK). توضح الأقسام التالية كيفية المصادقة مباشرة مقابل واجهات برمجة تطبيقات 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_nameexpiry لتسجيل فردي باستخدام نوع مصادقة مفتاح متماثل.


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 حق الوصول إلى نقاط النهاية عن طريق التحقق من الرمز المميز مقابل سياسات الوصول المشترك. لا يتم إرسال بيانات اعتماد الأمان، مثل المفاتيح المتماثلة، عبر السلك مطلقًا.

التحكم في الوصول وأذونات الوصول

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

ملاحظة

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

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

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 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)

ملاحظة

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

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

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

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

نقطة النهاية الوظيفة
{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

Create a shared access policy for your Device Provisioning Service instance in the portal

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 والعينات

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

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

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

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

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