إعداد تشفير TLS والمصادقة لنظام مجموعة Non-ESP Apache Kafka في Azure HDInsight
توضح لك هذه المقالة كيفية إعداد تشفير أمان طبقة النقل (TLS)، المعروف سابقًا باسم تشفير طبقة مآخذ التوصيل الآمنة (SSL)، بين عملاء Apache Kafka ووسطاء Apache Kafka. كما يوضح لك كيفية إعداد مصادقة العملاء (يشار إليها أحيانًا باسم TLS ثنائي الاتجاه).
هام
يوجد عميلان يمكنك استخدامهما لتطبيقات Kafka: عميل Java وعميل وحدة تحكم. يمكن لعميل Java فقط ProducerConsumer.java
استخدام TLS للإنتاج والاستهلاك. لا يعمل عميل منتج وحدة التحكم console-producer.sh
مع TLS.
إعداد وسيط Apache Kafka
يستخدم إعداد وسيط Kafka TLS أربعة أجهزة ظاهرية لنظام مجموعة HDInsight بالطريقة التالية:
- headnode 0 - المرجع المصدق (CA)
- عقدة العامل 0 و 1 و 2 - الوسطاء
إشعار
يستخدم هذا الدليل الشهادات الموقعة ذاتيا، ولكن الحل الأكثر أمانا هو استخدام الشهادات الصادرة عن المراجع المصدقة الموثوق بها.
ملخص عملية إعداد الوسيط كما يلي:
يتم تكرار الخطوات التالية على كل عقدة من العقد العاملة الثلاثة:
- قم بإنشاء شهادة.
- وأنشئ طلب توقيع الشهادة.
- أرسل طلب توقيع الشهادة إلى المرجع المصدق (CA).
- سجّل الدخول إلى المرجع المصدق ووقّع على الطلب.
- SCP الشهادة الموقعة مرة أخرى إلى عقدة العامل.
- SCP الشهادة العامة لـ CA لعقدة العامل.
بمجرد حصولك على جميع الشهادات، ضع الشهادات في متجر الشهادات.
انتقل إلى Ambari وقم بتغيير التكوينات.
استخدم الإرشادات التفصيلية التالية لإكمال إعداد الوسيط:
هام
في مقتطفات التعليمات البرمجية التالية، يعد wnX اختصارًا لإحدى العقد العاملة الثلاثة ويجب استبداله بـ
wn0
،wn1
أوwn2
حسب الاقتضاء.WorkerNode0_Name
وHeadNode0_Name
ينبغي أن تحل محلها أسماء الآلات المعنية.قم بإجراء الإعداد الأولي على العقدة الرئيسية 0، والتي ل HDInsight تملأ دور المرجع المصدق (CA).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
تنفيذ نفس الإعداد الأولي على كل من الوسطاء (عقد العامل 0 و 1 و 2).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
في كل عقدة من العقد العاملة، قم بتنفيذ الخطوات التالية باستخدام القصاصة البرمجية.
- قم بإنشاء مخزن مفاتيح وملئه بشهادة خاصة جديدة.
- قم بإنشاء طلب توقيع الشهادة.
- SCP طلب توقيع الشهادة إلى المرجع المصدق (headnode0)
keytool -genkey -keystore kafka.server.keystore.jks -keyalg RSA -validity 365 -storepass "MyServerPassword123" -keypass "MyServerPassword123" -dname "CN=FQDN_WORKER_NODE" -ext SAN=DNS:FQDN_WORKER_NODE -storetype pkcs12 keytool -keystore kafka.server.keystore.jks -certreq -file cert-file -storepass "MyServerPassword123" -keypass "MyServerPassword123" scp cert-file sshuser@HeadNode0_Name:~/ssl/wnX-cert-sign-request
إشعار
FQDN_WORKER_NODE هو اسم مجال مؤهل بالكامل لجهاز عقدة العامل. يمكنك الحصول على هذه التفاصيل من ملف /etc/hosts في العقدة الرئيسية
على سبيل المثال،
wn0-espkaf.securehadooprc.onmicrosoft.com wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
على جهاز CA، قم بتشغيل الأمر التالي لإنشاء ملفات ca-cert و ca-key:
openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
غيّر إلى الجهاز CA ووقّع كافة طلبات التوقيع cert المتلقاة:
openssl x509 -req -CA ca-cert -CAkey ca-key -in wn0-cert-sign-request -out wn0-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123" openssl x509 -req -CA ca-cert -CAkey ca-key -in wn1-cert-sign-request -out wn1-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123" openssl x509 -req -CA ca-cert -CAkey ca-key -in wn2-cert-sign-request -out wn2-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123"
أرسل الشهادات الموقعة مرة أخرى إلى عقد العامل من CA (headnode0).
scp wn0-cert-signed sshuser@WorkerNode0_Name:~/ssl/cert-signed scp wn1-cert-signed sshuser@WorkerNode1_Name:~/ssl/cert-signed scp wn2-cert-signed sshuser@WorkerNode2_Name:~/ssl/cert-signed
أرسل الشهادة العامة من CA إلى كل عقدة عاملة.
scp ca-cert sshuser@WorkerNode0_Name:~/ssl/ca-cert scp ca-cert sshuser@WorkerNode1_Name:~/ssl/ca-cert scp ca-cert sshuser@WorkerNode2_Name:~/ssl/ca-cert
في كل عقدة عاملة، أضف شهادة CAs العامة إلى Truststore و keystore. ثم أضف الشهادة الموقعة الخاصة بالعقدة العاملة إلى مخزن المفاتيح
keytool -keystore kafka.server.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt keytool -keystore kafka.server.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt keytool -keystore kafka.server.keystore.jks -import -file cert-signed -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt
قم بتحديث تكوين Kafka لاستخدام TLS وإعادة تشغيل الوسطاء
لقد قمت الآن بإعداد كل وسيط Kafka بمخزن مفاتيح ومخزن ثقة، واستوردت الشهادات الصحيحة. بعد ذلك، قم بتعديل خصائص تكوين Kafka ذات الصلة باستخدام Ambari ثم أعد تشغيل وسطاء Kafka.
لإكمال تعديل التكوين، قم بالخطوات التالية:
سجّل الدخول إلى مدخل Azure وحدد مجموعة Azure HDInsight Apache Kafka.
انتقل إلى واجهة المستخدم Ambari بالنقر فوق الصفحة الرئيسية Ambari ضمن لوحات معلومات المجموعة.
ضمن Kafka Broker عيّن خاصية المستمعين إلى
PLAINTEXT://localhost:9092,SSL://localhost:9093
تحت Advanced kafka-broker عيّن الخاصية security.inter.broker.protocol إلى
SSL
تحت Custom kafka-broker عيّن الخاصية ssl.client.auth إلى
required
.إشعار
ملاحظة: هذه الخطوة مطلوبة فقط إذا كنت تقوم بإعداد المصادقة والتشفير.
إليك لقطة الشاشة التي تعرض واجهة مستخدم تكوين Ambari مع هذه التغييرات.
إشعار
- ssl.keystore.location وssl.truststore.location هو المسار الكامل لمخزن المفاتيح وموقع مخزن الثقة في المرجع المصدق (hn0)
- ssl.keystore.password وssl.truststore.password هي كلمة المرور التي تم تعيينها لمخزن المفاتيح ومخزن الثقة. في هذه الحالة كمثال،
MyServerPassword123
- ssl.key.password هي مجموعة المفاتيح لمخزن المفاتيح ومخزن الثقة. في هذه الحالة كمثال،
MyServerPassword123
لاستخدام TLS 1.3 في Kafka
إضافة التكوينات التالية إلى تكوينات kafka في Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
هام
- يعمل TLS 1.3 مع إصدار HDI 5.1 kafka فقط.
- إذا كنت تستخدم TLS 1.3 على جانب الخادم، يجب عليك استخدام تكوينات TLS 1.3 في العميل أيضا.
بالنسبة إلى HDI الإصدار 4.0 أو 5.0
- إذا كنت تقوم بإعداد المصادقة والتشفير، فستبدو لقطة الشاشة مثل
- إذا كنت تقوم بإعداد التشفير فقط، فستبدو لقطة الشاشة مثل
أعد تشغيل جميع وسطاء Kafka.
إعداد العميل (بدون مصادقة)
إذا لم تكن بحاجة إلى مصادقة، فإن ملخص الخطوات لإعداد تشفير TLS فقط هو:
- سجل الدخول إلى المرجع المصدق (عقدة الرأس النشطة).
- انسخ شهادة المرجع المصدق إلى جهاز العميل من جهاز CA (wn0).
- سجل الدخول إلى جهاز العميل (hn1) وانتقل إلى
~/ssl
المجلد. - قم باستيراد شهادة المرجع المصدق إلى مخزن الثقة.
- استيراد شهادة المرجع المصدق إلى مخزن المفاتيح.
يتم تفصيل هذه الخطوات في أجزاء التعليمات البرمجية التالية.
سجل الدخول إلى عقدة المرجع المصدق.
ssh sshuser@HeadNode0_Name cd ssl
انسخ ca-cert إلى جهاز العميل
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
سجل الدخول إلى الجهاز العميل (عقدة رأس الاستعداد).
ssh sshuser@HeadNode1_Name cd ssl
قم باستيراد شهادة المرجع المصدق إلى مخزن الثقة.
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
استيراد شهادة المرجع المصدق إلى مخزن المفاتيح.
keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
إنشاء الملف
client-ssl-auth.properties
على جهاز العميل (hn1). يجب أن تحتوي على الأسطر التالية:security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123
- لاستخدام TLS 1.3، أضف التكوينات التالية إلى الملف
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- لاستخدام TLS 1.3، أضف التكوينات التالية إلى الملف
ابدأ العميل الإداري بخيارات المنتج والمستهلك للتحقق من عمل المنتجين والمستهلكين على المنفذ 9093. راجع قسم التحقق لمعرفة الخطوات اللازمة للتحقق من الإعداد باستخدام منتج/مستهلك وحدة التحكم.
إعداد العميل (مع المصادقة)
إشعار
الخطوات التالية مطلوبة فقط إذا كنت تقوم بإعداد تشفير TLS والمصادقة. إذا كنت تقوم بإعداد التشفير فقط، فشاهد إعداد العميل بدون مصادقة.
تلخص الخطوات الأربع التالية المهام المطلوبة لإكمال إعداد العميل:
- سجل الدخول إلى الجهاز العميل (عقدة رأس الاستعداد).
- أنشئ java keystore واحصل على شهادة موقّعة للوسيط. ثم انسخ الشهادة إلى الجهاز الظاهري حيث يعمل المرجع المصدق.
- قم بالتبديل إلى جهاز CA (عقدة الرأس النشطة) للتوقيع على شهادة العميل.
- انتقل إلى جهاز العميل (عقدة رأس الاستعداد) وانتقل إلى
~/ssl
المجلد. انسخ الشهادة الموقعة إلى جهاز العميل.
يتم إعطاء تفاصيل كل خطوة.
سجل الدخول إلى الجهاز العميل (عقدة رأس الاستعداد).
ssh sshuser@HeadNode1_Name
قم بإزالة أي دليل SSL موجود.
rm -R ~/ssl mkdir ssl cd ssl
أنشئ ملف تخزين مفاتيح java وأنشئ طلب توقيع شهادة.
keytool -genkey -keystore kafka.client.keystore.jks -validity 365 -storepass "MyClientPassword123" -keypass "MyClientPassword123" -dname "CN=HEADNODE1_FQDN" -storetype pkcs12 keytool -keystore kafka.client.keystore.jks -certreq -file client-cert-sign-request -storepass "MyClientPassword123" -keypass "MyClientPassword123"
انسخ طلب توقيع الشهادة إلى المرجع المصدق
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
قم بالتبديل إلى جهاز CA (عقدة الرأس النشطة) وقم بالتوقيع على شهادة العميل.
ssh sshuser@HeadNode0_Name cd ssl openssl x509 -req -CA ca-cert -CAkey ca-key -in ~/ssl/client-cert-sign-request -out ~/ssl/client-cert-signed -days 365 -CAcreateserial -passin pass:MyClientPassword123
انسخ شهادة العميل الموقعة من CA (العقدة الرئيسية النشطة) إلى جهاز العميل.
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
انسخ ca-cert إلى جهاز العميل
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- سجّل الدخول إلى جهاز العميل (عقدة رأس الاستعداد) وانتقل إلى دليل ssl.
ssh sshuser@HeadNode1_Name cd ssl
إنشاء مخزن عميل مع شهادة موقعة، واستيراد شهادة CA إلى مخزن المفاتيح، و truststore على جهاز العميل (hn1):
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt keytool -keystore kafka.client.keystore.jks -import -file client-signed-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
إنشاء ملف
client-ssl-auth.properties
على جهاز العميل (hn1). يجب أن تحتوي على الأسطر التالية:security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123 ssl.keystore.location=/home/sshuser/ssl/kafka.client.keystore.jks ssl.keystore.password=MyClientPassword123 ssl.key.password=MyClientPassword123
- لاستخدام TLS 1.3، أضف التكوينات التالية إلى الملف
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- لاستخدام TLS 1.3، أضف التكوينات التالية إلى الملف
التحقق من الصحة
قم بتشغيل هذه الخطوات على جهاز العميل.
إشعار
إذا تم تثبيت HDInsight 4.0 و Kafka 2.1، يمكنك استخدام وحدة التحكم المنتج / المستهلكين للتحقق من الإعداد الخاص بك. إذا لم يكن الأمر كذلك، فقم بتشغيل منتج Kafka على المنفذ 9092 وإرسال رسائل إلى الموضوع، ثم استخدم المستهلك Kafka على المنفذ 9093 الذي يستخدم TLS.
Kafka 2.1 أو أحدث
قم بإنشاء موضوع إذا لم يكن موجودًا بالفعل.
/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
ابدء تشغيل منتج وحدة التحكم وقم بتوفير المسار إلى
client-ssl-auth.properties
كملف تكوين للمنتج./usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list <FQDN_WORKER_NODE>:9093 --topic topic1 --producer.config ~/ssl/client-ssl-auth.properties
افتح اتصال ssh آخر بجهاز العميل وابدأ تشغيل وحدة التحكم المستهلك وقم بتوفير المسار إلى
client-ssl-auth.properties
كملف تكوين للمستهلك./usr/hdp/current/kafka-broker/bin/kafka-console-consumer.sh --bootstrap-server <FQDN_WORKER_NODE>:9093 --topic topic1 --consumer.config ~/ssl/client-ssl-auth.properties --from-beginning