إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
توضح هذه المقالة الخيارات المتوفرة لتأمين خدمة توفير جهاز Azure IoT Hub (DPS). تستخدم خدمة التوفير المصادقةوالأذونات لمنح حق الوصول إلى كل نقطة نهاية. تسمح الأذونات لعملية المصادقة بتقييد الوصول إلى مثيل الخدمة استنادا إلى الوظيفة.
تناقش هذه المقالة:
عملية المصادقة والرموز المميزة التي تستخدمها خدمة التوفير للتحقق من الأذونات مقابل كل من واجهات برمجة تطبيقات REST للخدمة والجهاز.
الأذونات المختلفة التي يمكنك منحها لتطبيق الواجهة الخلفية للوصول إلى واجهة برمجة تطبيقات الخدمة.
المصادقة
تدعم واجهة برمجة تطبيقات الجهاز مصادقة الجهاز المستندة إلى المفتاح ومصادقة X.509.
تدعم واجهة برمجة تطبيقات الخدمة المصادقة المستندة إلى المفتاح لتطبيقات الواجهة الخلفية.
عند استخدام المصادقة المستندة إلى المفتاح، تستخدم خدمة توفير الأجهزة رموز الأمان المميزة لمصادقة الخدمات لتجنب إرسال المفاتيح على السلك. بالإضافة إلى ذلك، فإن الرموز المميزة للأمان محدودة من حيث الصلاحية الزمنية والنطاق. تنشئ مجموعات SDK لتزويد الأجهزة Azure IoT Hub تلقائيا الرموز المميزة دون الحاجة إلى أي تكوين خاص.
في بعض الحالات، قد تحتاج إلى استخدام واجهات برمجة تطبيقات REST لخدمة توفير أجهزة HTTP مباشرة، بدون استخدام حزم تطوير البرامج (SDK). توضح الأقسام التالية كيفية المصادقة مباشرة مقابل واجهات برمجة تطبيقات REST.
مصادقة واجهة برمجة تطبيقات الجهاز
يتم استخدام واجهة برمجة تطبيقات الجهاز بواسطة الأجهزة للتصديق على خدمة توفير الجهاز وتلقي اتصال IoT Hub.
Note
لتلقي اتصال مصادق عليه، يجب أولا تسجيل الأجهزة في خدمة توفير الأجهزة من خلال التسجيل. استخدم واجهة برمجة تطبيقات الخدمة لتسجيل جهاز برمجيا من خلال تسجيل.
يجب أن يصادق الجهاز على واجهة برمجة تطبيقات الجهاز كجزء من عملية التوفير. يتم تحديد الطريقة التي يستخدمها الجهاز للمصادقة عند إعداد مجموعة تسجيل أو تسجيل فردي. مهما كانت طريقة المصادقة، يجب على الجهاز إصدار 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، key، policy_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 للحصول على مفتاح الجهاز المشتق. لعرض أمثلة التعليمات البرمجية، راجع اشتقاق مفتاح جهاز. بمجرد اشتقاق المفتاح المتماثل للجهاز، يمكنك تسجيل الجهاز باستخدام الأمثلة السابقة.
Warning
لتجنب تضمين المفتاح الرئيسي للمجموعة في رمز جهازك ، يجب أن تتم عملية اشتقاق مفتاح الجهاز خارج الجهاز.
استخدام المصادقة المستندة إلى شهادة
إذا قمت بإعداد تسجيل فردي أو مجموعة تسجيل للمصادقة المستندة إلى الشهادة 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 الوصول إلى نقاط النهاية عن طريق التحقق من الرمز المميز مقابل نهج الوصول المشتركة. لا يتم إرسال بيانات اعتماد الأمان ، مثل المفاتيح المتماثلة ، عبر السلك.
التحكم في الوصول والأذونات
يمكنك منح الأذونات بالطرق التالية:
سياسات تفويض الوصول المشترك. يمكن أن تمنح سياسات الوصول المشترك أي مجموعة من الأذونات. يمكنك تحديد النهج في مدخل Microsoft Azure، أو برمجيا باستخدام واجهات برمجة تطبيقات REST لخدمة توفير الجهاز. تحتوي خدمة التوفير التي تم إنشاؤها حديثا على النهج الافتراضي التالي:
provisioningserviceowner: نهج بجميع الأذونات. راجع الأذونات للحصول على معلومات مفصلة.
Note
يتم تأمين موفر موارد خدمة توفير الجهاز من خلال اشتراك Azure، كما هو الحال مع جميع مقدمي الخدمة في Azure Resource Manager.
لمزيد من المعلومات حول كيفية إنشاء رموز الأمان المميزة واستخدامها، راجع القسم التالي.
HTTP هو البروتوكول الوحيد المدعوم، وينفذ المصادقة من خلال تضمين رمز مميز صالح في رأس طلب التخويل .
مثال
SharedAccessSignature sr =
mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\
Note
تقوم مجموعات SDK لخدمة توفير الأجهزة Azure IoT Hub تلقائيا بإنشاء رموز مميزة عند الاتصال بالخدمة.
رموز الأمان
تستخدم خدمة توفير الأجهزة رموز الأمان المميزة لمصادقة الخدمات لتجنب إرسال المفاتيح على السلك. بالإضافة إلى ذلك، فإن الرموز المميزة للأمان محدودة من حيث الصلاحية الزمنية والنطاق. تقوم مجموعات SDK الخاصة بخدمة توفير الأجهزة في Azure IoT Hub تلقائيا بإنشاء رموز مميزة دون الحاجة إلى أي تكوين خاص. تتطلب بعض السيناريوهات إنشاء رموز الأمان المميزة واستخدامها مباشرة. تتضمن هذه السيناريوهات الاستخدام المباشر لسطح HTTP.
هيكل رمز الأمان
يمكنك استخدام الرموز المميزة للأمان لمنح وصول محدد زمنيا للخدمات لوظائف معينة في خدمة توفير جهاز IoT Hub. للحصول على تفويض للاتصال بخدمة التوفير، يجب أن ترسل الخدمات رموز الأمان المميزة الموقعة إما باستخدام وصول مشترك أو مفتاح متماثل.
يمنح الرمز المميز الموقع باستخدام مفتاح وصول مشترك الوصول إلى جميع الوظائف المرتبطة بأذونات نهج الوصول المشترك.
يحتوي الرمز المميز للأمان على التنسيق التالي:
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
فيما يلي القيم المتوقعة
| القيمة | الوصف |
|---|---|
| {توقيع} | سلسلة توقيع HMAC-SHA256 للنموذج: {URL-encoded-resourceURI} + "\n" + expiry.
هام: يتم فك تشفير المفتاح من base64 واستخدامه كمفتاح لإجراء حساب HMAC-SHA256. |
| {انتهاء الصلاحية} | سلاسل UTF8 لعدد الثواني منذ الحقبة 00:00:00 بالتوقيت العالمي المنسق في 1 يناير 1970. |
| {URL-encoded-resourceURI} | ترميز عنوان URL بأحرف صغيرة لعنوان URI لمورد الأحرف الصغيرة. بادئة URI (حسب المقطع) لنقاط النهاية التي يمكن الوصول إليها باستخدام هذا الرمز المميز، بدءا من اسم المضيف لخدمة توفير جهاز IoT (بدون بروتوكول). على سبيل المثال، mydps.azure-devices-provisioning.net |
| {اسم السياسة} | اسم نهج الوصول المشترك الذي يشير إليه هذا الرمز المميز. |
Note
يتم حساب بادئة URI حسب المقطع وليس حسب الحرف. على سبيل المثال ، /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)
Note
نظرا لأنه يتم التحقق من صحة الصلاحية الزمنية للرمز المميز على أجهزة خدمة توفير جهاز IoT، يجب أن يكون الانجراف على ساعة الجهاز الذي ينشئ الرمز المميز ضئيلا.
استخدام الرموز المميزة للأمان من مكونات الخدمة
يمكن لمكونات الخدمة إنشاء رموز الأمان المميزة فقط باستخدام نهج الوصول المشترك التي تمنح الأذونات المناسبة كما هو موضح سابقا.
فيما يلي وظائف الخدمة المعروضة على نقاط النهاية:
| نقطة النهاية | الوظائف |
|---|---|
{your-service}.azure-devices-provisioning.net/enrollments |
يوفر عمليات تسجيل الجهاز مع خدمة توفير الأجهزة. |
{your-service}.azure-devices-provisioning.net/enrollmentGroups |
يوفر عمليات لإدارة مجموعات تسجيل الأجهزة. |
{your-service}.azure-devices-provisioning.net/registrations/{id} |
يوفر عمليات لاسترداد وإدارة حالة تسجيلات الأجهزة. |
على سبيل المثال، ستقوم الخدمة التي تم إنشاؤها باستخدام نهج وصول مشترك تم إنشاؤه مسبقا بإنشاء enrollmentread رمز مميز بالمعلمات التالية:
- الموارد المنتظمة للموارد المنتظمة:
{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.
أذونات خدمة توفير الأجهزة
يسرد الجدول التالي الأذونات التي يمكنك استخدامها للتحكم في الوصول إلى خدمة توفير جهاز IoT.
| الإذن | ملاحظات |
|---|---|
| ServiceConfig | يمنح حق الوصول لتغيير تكوينات الخدمة. يتم استخدام هذا الإذن بواسطة خدمات الواجهة السحابية الخلفية. |
| EnrollmentRead | يمنح حق الوصول للقراءة إلى تسجيلات الجهاز ومجموعات التسجيل. يتم استخدام هذا الإذن بواسطة خدمات الواجهة السحابية الخلفية. |
| كتابة التسجيل | يمنح حق الوصول للكتابة إلى تسجيلات الجهاز ومجموعات التسجيل. يتم استخدام هذا الإذن بواسطة خدمات الواجهة السحابية الخلفية. |
| RegistrationStatusRead | يمنح حق الوصول للقراءة إلى حالة تسجيل الجهاز. يتم استخدام هذا الإذن بواسطة خدمات الواجهة السحابية الخلفية. |
| RegistrationStatusWrite | يمنح حق الحذف إلى حالة تسجيل الجهاز. يتم استخدام هذا الإذن بواسطة خدمات الواجهة السحابية الخلفية. |