اتصال وسيط MQTT الآمن باستخدام BrokerListener
هام
معاينة عمليات Azure IoT - التي تم تمكينها بواسطة Azure Arc قيد المعاينة حاليا. يجب عدم استخدام برنامج المعاينة هذا في بيئات الإنتاج.
ستحتاج إلى نشر تثبيت Azure IoT Operations جديد عند توفير إصدار متوفر بشكل عام. لن تتمكن من ترقية تثبيت معاينة.
للحصول على الشروط القانونية التي تنطبق على ميزات Azure الموجودة في الإصدار التجريبي، أو المعاينة، أو التي لم يتم إصدارها بعد في التوفر العام، راجع شروط الاستخدام التكميلية لمعاينات Microsoft Azure.
لتخصيص الوصول إلى الشبكة والأمان، استخدم مورد BrokerListener . يتوافق المستمع مع نقطة نهاية الشبكة التي تعرض الوسيط للشبكة. يمكنك الحصول على واحد أو أكثر من موارد BrokerListener لكل مورد وسيط ، وبالتالي منافذ متعددة مع تحكم وصول مختلف لكل منها.
يمكن أن يكون لكل منفذ وحدة استماع قواعد المصادقة والتخويل الخاصة به التي تحدد من يمكنه الاتصال بوحدة الاستماع والإجراءات التي يمكنهم تنفيذها على الوسيط. يمكنك استخدام موارد BrokerAuthentication و BrokerAuthorization لتحديد نهج التحكم في الوصول لكل وحدة استماع. تتيح لك هذه المرونة ضبط أذونات وأدوار عملاء MQTT، بناء على احتياجاتهم وحالات الاستخدام الخاصة بهم.
تلميح
يمكنك فقط الوصول إلى نشر وسيط MQTT الافتراضي باستخدام IP نظام المجموعة وTLS ورمز حساب الخدمة المميز. يحتاج العملاء الذين يتصلون من خارج المجموعة إلى تكوين إضافي قبل أن يتمكنوا من الاتصال.
تتمتع وحدات الاستماع بالخصائص التالية:
- يمكنك الحصول على ما يصل إلى ثلاثة مستمعين. وحدة استماع واحدة لكل نوع خدمة من
loadBalancer
أوclusterIp
أوnodePort
. الوسيط الافتراضي BrokerListener المسمى default هو نوعclusterIp
الخدمة . - يدعم كل وحدة استماع منافذ متعددة
- مراجع BrokerAuthentication و BrokerAuthorization لكل منفذ
- تكوين TLS لكل منفذ
- يجب أن تكون أسماء الخدمة فريدة
- لا يمكن أن تتعارض المنافذ مع المستمعين المختلفين
للحصول على قائمة بالإعدادات المتوفرة، راجع مرجع Broker Listener API.
BrokerListener الافتراضي
عند نشر Azure IoT Operations Preview، ينشئ النشر أيضا مورد BrokerListener المسمى default
azure-iot-operations
في مساحة الاسم. يرتبط هذا المستمع بمورد الوسيط الافتراضي المسمى default
الذي تم إنشاؤه أيضا أثناء النشر. يعرض المستمع الافتراضي الوسيط على المنفذ 18883 مع تمكين مصادقة TLS وST. تتم إدارة شهادة TLS تلقائيا بواسطة cert-manager. يتم تعطيل التخويل بشكل افتراضي.
لعرض وحدة الاستماع أو تحريرها:
في مدخل Microsoft Azure، انتقل إلى مثيل عمليات IoT.
ضمن موارد عمليات Azure IoT، حدد MQTT Broker.
من قائمة مستمع الوسيط، حدد وحدة الإصغاء الافتراضية .
راجع إعدادات وحدة الاستماع وقم بإجراء أي تغييرات حسب الحاجة.
إنشاء مستمعين وسيط جديدين
يوضح هذا المثال كيفية إنشاء مورد BrokerListener جديد يسمى loadbalancer-listener لمورد Broker. يعرف مورد BrokerListener منفذين يقبلان اتصالات MQTT من العملاء.
- يستمع المنفذ الأول على المنفذ 1883 دون إيقاف تشغيل TLS والمصادقة. يمكن للعملاء الاتصال بالوسيط دون تشفير أو مصادقة.
- يستمع المنفذ الثاني على المنفذ 18883 مع تمكين TLS والمصادقة. يمكن للعملاء المصادق عليهم فقط الاتصال بالوسيط باستخدام تشفير TLS. تم تعيين TLS إلى
automatic
، ما يعني أن وحدة الاستماع تستخدم مدير الشهادات للحصول على شهادة الخادم وتجديدها.
في مدخل Microsoft Azure، انتقل إلى مثيل عمليات IoT.
ضمن موارد عمليات Azure IoT، حدد MQTT Broker.
حدد مستمع وسيط MQTT لإنشاء LoadBalancer>. يمكنك إنشاء وحدة استماع واحدة فقط لكل نوع خدمة. إذا كان لديك وحدة استماع من نفس نوع الخدمة، يمكنك إضافة المزيد من المنافذ إلى وحدة الاستماع الموجودة.
أدخل الإعدادات التالية:
الإعدادات الوصف الاسم اسم مورد BrokerListener. اسم الخدمة اسم خدمة Kubernetes المقترنة ب BrokerListener. نوع الخدمة نوع خدمة الوسيط، مثل LoadBalancer أو NodePort أو ClusterIP. المنفذ رقم المنفذ الذي يستمع إليه BrokerListener لاتصالات MQTT. المصادقة مرجع مورد المصادقة. التصريح مرجع مورد التخويل. TLS يشير إلى ما إذا كان TLS ممكنا للاتصال الآمن. يمكن تعيينه إلى تلقائي أو يدوي. حدد إنشاء وحدة استماع.
تكوين TLS مع الإدارة التلقائية للشهادات
لتمكين TLS مع الإدارة التلقائية للشهادات، حدد إعدادات TLS على منفذ وحدة الاستماع.
التحقق من تثبيت مدير الشهادات
باستخدام الإدارة التلقائية للشهادات، يمكنك استخدام مدير الشهادات لإدارة شهادة خادم TLS. بشكل افتراضي، يتم تثبيت cert-manager جنبا إلى جنب مع Azure IoT Operations Preview في azure-iot-operations
مساحة الاسم بالفعل. تحقق من التثبيت قبل المتابعة.
استخدم
kubectl
للتحقق من الحاويات المطابقة لتسميات تطبيق cert-manager.kubectl get pods --namespace azure-iot-operations -l 'app in (cert-manager,cainjector,webhook)'
NAME READY STATUS RESTARTS AGE aio-cert-manager-64f9548744-5fwdd 1/1 Running 4 (145m ago) 4d20h aio-cert-manager-cainjector-6c7c546578-p6vgv 1/1 Running 4 (145m ago) 4d20h aio-cert-manager-webhook-7f676965dd-8xs28 1/1 Running 4 (145m ago) 4d20h
إذا رأيت pods تظهر على أنها جاهزة ومشغلة، يتم تثبيت cert-manager وجاهز للاستخدام.
تلميح
لمزيد من التحقق من التثبيت، تحقق من وثائق cert-manager للتحقق من التثبيت. تذكر استخدام azure-iot-operations
مساحة الاسم.
إنشاء مصدر لشهادة خادم TLS
يحدد مورد مصدر إدارة الشهادات كيفية إصدار الشهادات تلقائيا. يدعم Cert-manager العديد من أنواع المصدرين في الأصل. كما أنه يدعم نوع مصدر خارجي لتوسيع الوظائف خارج المصدرين المدعومين أصلا. يمكن استخدام وسيط MQTT مع أي نوع من مصدري الشهادات.
هام
أثناء النشر الأولي، يتم تثبيت عمليات Azure IoT مع مصدر افتراضي لشهادات خادم TLS. يمكنك استخدام مصدر البيانات هذا للتطوير والاختبار. لمزيد من المعلومات، راجع المرجع المصدق الجذري الافتراضي ومصدر الشهادة مع عمليات Azure IoT. الخطوات أدناه مطلوبة فقط إذا كنت تريد استخدام مصدر آخر.
يختلف نهج إنشاء المصدر وفقا للسيناريو الخاص بك. تسرد الأقسام التالية أمثلة لمساعدتك على البدء.
مصدر CA مفيد للتطوير والاختبار. يجب تكوينه بشهادة ومفتاح خاص مخزن في سر Kubernetes.
إعداد الشهادة الجذر كبيانات سرية ل Kubernetes
إذا كان لديك شهادة CA موجودة، فبادر بإنشاء سر Kubernetes باستخدام شهادة المرجع المصدق وملفات PEM الخاصة. قم بتشغيل الأمر التالي وقمت بإعداد الشهادة الجذر كسر Kubernetes ويمكن تخطي القسم التالي.
kubectl create secret tls test-ca --cert tls.crt --key tls.key -n azure-iot-operations
إذا لم يكن لديك شهادة CA، يمكن لمدير الشهادات إنشاء شهادة المرجع المصدق الجذر لك. يعرف استخدام مدير الشهادات لإنشاء شهادة المرجع المصدق الجذر باسم تمهيد تشغيل مصدر CA بشهادة موقعة ذاتيا.
ابدأ بإنشاء
ca.yaml
:apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: selfsigned-ca-issuer namespace: azure-iot-operations spec: selfSigned: {} --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: selfsigned-ca-cert namespace: azure-iot-operations spec: isCA: true commonName: test-ca secretName: test-ca issuerRef: # Must match Issuer name above name: selfsigned-ca-issuer # Must match Issuer kind above kind: Issuer group: cert-manager.io # Override default private key config to use an EC key privateKey: rotationPolicy: Always algorithm: ECDSA size: 256
إنشاء شهادة CA الموقعة ذاتيا باستخدام الأمر التالي:
kubectl apply -f ca.yaml
ينشئ مدير الشهادات شهادة CA باستخدام الإعدادات الافتراضية الخاصة به. يمكن تغيير خصائص هذه الشهادة عن طريق تعديل مواصفات الشهادة. راجع وثائق مدير الشهادات للحصول على قائمة بالخيارات الصالحة.
توزيع الشهادة الجذر
يخزن المثال السابق شهادة المرجع المصدق في سر Kubernetes يسمى test-ca
. يمكن استرداد الشهادة بتنسيق PEM من السر وتخزينها في ملف ca.crt
باستخدام الأمر التالي:
kubectl get secret test-ca -n azure-iot-operations -o json | jq -r '.data["tls.crt"]' | base64 -d > ca.crt
يجب توزيع هذه الشهادة والوثوق بها من قبل جميع العملاء. على سبيل المثال، استخدم --cafile
علامة لعميل mosquitto.
إنشاء مصدر الشهادة استنادا إلى شهادة المرجع المصدق
يحتاج مدير الشهادات إلى مصدر استنادا إلى شهادة المرجع المصدق التي تم إنشاؤها أو استيرادها في الخطوة السابقة. قم بإنشاء الملف التالي ك issuer-ca.yaml
:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: my-issuer
namespace: azure-iot-operations
spec:
ca:
# Must match secretName of generated or imported CA cert
secretName: test-ca
إنشاء المصدر باستخدام الأمر التالي:
kubectl apply -f issuer-ca.yaml
يقوم الأمر السابق بإنشاء مصدر لإصدار شهادات خادم TLS. لاحظ اسم المصدر ونوعه. في المثال، الاسم my-issuer
والنوع Issuer
. يتم تعيين هذه القيم في مورد BrokerListener لاحقا.
تمكين إدارة شهادات TLS التلقائية لمنفذ
فيما يلي مثال لمورد BrokerListener الذي يمكن TLS على المنفذ 8884 مع الإدارة التلقائية للشهادات.
في مدخل Microsoft Azure، انتقل إلى مثيل عمليات IoT.
ضمن موارد عمليات Azure IoT، حدد MQTT Broker.
حدد وحدة استماع أو أنشئها. يمكنك إنشاء وحدة استماع واحدة فقط لكل نوع خدمة. إذا كان لديك وحدة استماع من نفس نوع الخدمة، يمكنك إضافة المزيد من المنافذ إلى وحدة الاستماع الموجودة.
يمكنك إضافة إعدادات TLS إلى وحدة الاستماع عن طريق تحديد TLS على منفذ موجود أو عن طريق إضافة منفذ جديد.
أدخل الإعدادات التالية:
الإعدادات الوصف المنفذ رقم المنفذ الذي يستمع إليه BrokerListener لاتصالات MQTT. مطلوب. المصادقة مرجع مورد المصادقة. التصريح مرجع مورد التخويل. TLS حدد الزر إضافة. اسم المصدر اسم مصدر مدير الشهادات. مطلوب. نوع المصدر نوع مصدر مدير الشهادات. مطلوب. مجموعة المصدر مجموعة من مصدر مدير الشهادات. مطلوب. خوارزمية المفتاح الخاص خوارزمية المفتاح الخاص. نهج تدوير المفتاح الخاص نهج تدوير المفتاح الخاص. أسماء DNS أسماء بديلة لموضوع DNS للشهادة. عناوين IP عناوين IP للأسماء البديلة للموضوع للشهادة. اسم السر بيانات Kubernetes السرية التي تحتوي على شهادة عميل X.509. المدة إجمالي عمر شهادة خادم TLS الافتراضية إلى 90 يوما. التجديد قبل متى تبدأ تجديد الشهادة. حدد حفظ لحفظ إعدادات TLS.
الاتصال بالوسيط باستخدام TLS
بمجرد تكوين شهادة الخادم، يتم تمكين TLS. للاختبار باستخدام mosquitto:
mosquitto_pub -h $HOST -p 8884 -V mqttv5 -i "test" -t "test" -m "test" --cafile ca.crt
--cafile
تمكن الوسيطة TLS على عميل mosquitto وتحدد أن العميل يجب أن يثق في جميع شهادات الخادم الصادرة عن الملف المحدد. يجب تحديد ملف يحتوي على مصدر شهادة خادم TLS المكونة.
استبدل $HOST
بالمضيف المناسب:
- إذا كان الاتصال من داخل نفس المجموعة، فاستبدل باسم الخدمة المحدد (
my-new-tls-listener
على سبيل المثال) أو الخدمةCLUSTER-IP
. - إذا كان الاتصال من خارج نظام المجموعة، فإن الخدمة
EXTERNAL-IP
.
تذكر تحديد أساليب المصادقة إذا لزم الأمر.
المرجع المصدق الجذري الافتراضي ومصدر الشهادة
لمساعدتك في البدء، يتم نشر عمليات Azure IoT باستخدام المرجع المصدق الجذر الافتراضي "quickstart" ومصدر شهادات خادم TLS. يمكنك استخدام مصدر البيانات هذا للتطوير والاختبار. لمزيد من المعلومات، راجع المرجع المصدق الجذري الافتراضي ومصدر شهادات خادم TLS.
للإنتاج، يجب تكوين مصدر CA بشهادة من مرجع مصدق موثوق به، كما هو موضح في الأقسام السابقة.
تكوين TLS مع إدارة الشهادات اليدوية
لتكوين وسيط MQTT يدويا لاستخدام شهادة TLS معينة، حددها في مورد BrokerListener مع مرجع إلى سر Kubernetes. ثم انشره باستخدام kubectl. تعرض هذه المقالة مثالا لتكوين TLS مع شهادات موقعة ذاتيا للاختبار.
إنشاء مرجع مصدق باستخدام الخطوة CLI
Step هو مدير شهادات يمكنه الحصول عليك وتشغيله بسرعة عند إنشاء المرجع المصدق الخاص بك وإدارته.
تثبيت Step CLI وإنشاء شهادة ومفتاح مرجع مصدق جذر (CA).
step certificate create --profile root-ca "Example Root CA" root_ca.crt root_ca.key
إنشاء شهادة CA وسيطة ومفتاح موقع من قبل المرجع المصدق الجذر.
step certificate create --profile intermediate-ca "Example Intermediate CA" intermediate_ca.crt intermediate_ca.key \ --ca root_ca.crt --ca-key root_ca.key
إنشاء شهادة الخادم
استخدم Step CLI لإنشاء شهادة خادم من الموقعة من قبل المرجع المصدق الوسيط.
step certificate create mqtts-endpoint mqtts-endpoint.crt mqtts-endpoint.key \
--profile leaf \
--not-after 8760h \
--san mqtts-endpoint \
--san localhost \
--ca intermediate_ca.crt --ca-key intermediate_ca.key \
--no-password --insecure
هنا، mqtts-endpoint
و localhost
هي الأسماء البديلة للموضوع (SANs) للواجهة الأمامية للوسيط MQTT في Kubernetes والعملاء المحليين، على التوالي. للاتصال عبر الإنترنت، أضف --san
مع عنوان IP خارجي. --no-password --insecure
يتم استخدام العلامات للاختبار لتخطي مطالبات كلمة المرور وتعطيل حماية كلمة المرور للمفتاح الخاص لأنه مخزن في سر Kubernetes. للإنتاج، استخدم كلمة مرور وقم بتخزين المفتاح الخاص في موقع آمن مثل Azure Key Vault.
متطلبات خوارزمية مفتاح الشهادة
يتم دعم كل من مفاتيح EC وRSA، ولكن يجب أن تستخدم جميع الشهادات في السلسلة نفس خوارزمية المفتاح. إذا قمت باستيراد شهادات المرجع المصدق الخاصة بك، فتأكد من أن شهادة الخادم تستخدم نفس خوارزمية المفتاح مثل CAs.
استيراد سلسلة شهادات الخادم كبيانات سرية ل Kubernetes
إنشاء سلسلة شهادات خادم كاملة، حيث يكون ترتيب الشهادات مهما: شهادة الخادم هي الأولى في الملف، الوسيطة هي الثانية.
cat mqtts-endpoint.crt intermediate_ca.crt > server_chain.crt
إنشاء سر Kubernetes مع سلسلة شهادات الخادم ومفتاح الخادم باستخدام kubectl.
kubectl create secret tls server-cert-secret -n azure-iot-operations \ --cert server_chain.crt \ --key mqtts-endpoint.key
تمكين إدارة شهادات TLS اليدوية لمنفذ
فيما يلي مثال لمورد BrokerListener الذي يمكن TLS على المنفذ 8884 مع إدارة الشهادات اليدوية.
في مدخل Microsoft Azure، انتقل إلى مثيل عمليات IoT.
ضمن موارد عمليات Azure IoT، حدد MQTT Broker.
حدد وحدة استماع أو أنشئها. يمكنك إنشاء وحدة استماع واحدة فقط لكل نوع خدمة. إذا كان لديك وحدة استماع من نفس نوع الخدمة، يمكنك إضافة المزيد من المنافذ إلى وحدة الاستماع الموجودة.
يمكنك إضافة إعدادات TLS إلى وحدة الاستماع عن طريق تحديد TLS على منفذ موجود أو عن طريق إضافة منفذ جديد.
أدخل الإعدادات التالية:
الإعدادات الوصف المنفذ رقم المنفذ الذي يستمع إليه BrokerListener لاتصالات MQTT. مطلوب. المصادقة مرجع مورد المصادقة. التصريح مرجع مورد التخويل. TLS حدد الزر إضافة. اسم السر بيانات Kubernetes السرية التي تحتوي على شهادة عميل X.509. حدد حفظ لحفظ إعدادات TLS.
الاتصال بالوسيط باستخدام TLS
لاختبار اتصال TLS مع عميل mosquitto، انشر رسالة ومرر شهادة المرجع المصدق الجذر في المعلمة --cafile
.
mosquitto_pub -d -h localhost -p 8885 -i "my-client" -t "test-topic" -m "Hello" --cafile root_ca.crt
Client my-client sending CONNECT
Client my-client received CONNACK (0)
Client my-client sending PUBLISH (d0, q0, r0, m1, 'test-topic', ... (5 bytes))
Client my-client sending DISCONNECT
تلميح
لاستخدام localhost، يجب أن يكون المنفذ متوفرا على الجهاز المضيف. على سبيل المثال، kubectl port-forward svc/mqtts-endpoint 8885:8885 -n azure-iot-operations
مع بعض توزيعات Kubernetes مثل K3d، يمكنك إضافة منفذ معاد توجيهه باستخدام k3d cluster edit $CLUSTER_NAME --port-add 8885:8885@loadbalancer
.
إشعار
للاتصال بالوسيط، تحتاج إلى توزيع جذر الثقة على العملاء، والمعروف أيضا باسم حزمة الثقة. في هذه الحالة، جذر الثقة هو المرجع المصدق الجذر الموقع ذاتيا الذي تم إنشاؤه CLI الخطوة. توزيع جذر الثقة مطلوب للعميل للتحقق من سلسلة شهادات الخادم. إذا كان عملاء MQTT هم أحمال العمل على مجموعة Kubernetes، فستحتاج أيضا إلى إنشاء ConfigMap مع المرجع المصدق الجذر وتركيبه في جراب الخاص بك.
تذكر تحديد اسم المستخدم وكلمة المرور وما إلى ذلك إذا تم تمكين مصادقة وسيط MQTT.
استخدام IP خارجي لشهادة الخادم
للاتصال ب TLS عبر الإنترنت، يجب أن يكون لشهادة خادم وسيط MQTT اسم المضيف الخارجي الخاص به ك SAN. في الإنتاج، عادة ما يكون هذا اسم DNS أو عنوان IP معروفا. ومع ذلك، أثناء التطوير/الاختبار، قد لا تعرف اسم المضيف أو IP الخارجي الذي تم تعيينه قبل النشر. لحل هذه المشكلة، انشر وحدة الإصغاء بدون شهادة الخادم أولا، ثم أنشئ شهادة الخادم والبيانات السرية باستخدام عنوان IP الخارجي، وأخيرا قم باستيراد السر إلى وحدة الاستماع.
إذا حاولت نشر مثال وحدة إصغاء manual-tls-listener
TLS ولكن سر server-cert-secret
Kubernetes المشار إليه غير موجود، يتم إنشاء الخدمة المقترنة، ولكن لا تبدأ وحدات الجراب. يتم إنشاء الخدمة لأن المشغل يحتاج إلى حجز IP الخارجي للمستمع.
kubectl get svc mqtts-endpoint -n azure-iot-operations
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mqtts-endpoint LoadBalancer 10.X.X.X 172.X.X.X 8885:30674/TCP 1m15s
ومع ذلك، هذا السلوك متوقع ولا بأس من تركه على هذا النحو أثناء استيراد شهادة الخادم. تشير سجلات إدارة الصحة إلى أن وسيط MQTT ينتظر شهادة الخادم.
kubectl logs -l app=health-manager -n azure-iot-operations
...
<6>2023-11-06T21:36:13.634Z [INFO] [1] - Server certificate server-cert-secret not found. Awaiting creation of secret.
إشعار
بشكل عام، في نظام موزع، سجلات pods ليست محددة ويجب استخدامها بحذر. الطريقة الصحيحة لعرض معلومات مثل هذه هي من خلال أحداث Kubernetes وحالة الموارد المخصصة، وهي في التراكم. ضع في اعتبارك الخطوة السابقة كحل بديل مؤقت.
على الرغم من أن القرون الأمامية ليست أعلى، فإن IP الخارجي متاح بالفعل.
kubectl get svc mqtts-endpoint -n azure-iot-operations
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mqtts-endpoint LoadBalancer 10.X.X.X 172.X.X.X 8885:30674/TCP 1m15s
من هنا، اتبع نفس الخطوات السابقة لإنشاء شهادة خادم باستخدام عنوان IP الخارجي هذا في --san
وإنشاء سر Kubernetes بنفس الطريقة. بمجرد إنشاء السر، يتم استيراده تلقائيا إلى وحدة الاستماع.