إعداد تشفير 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 - الوسطاء

إشعار

يستخدم هذا الدليل الشهادات الموقعة ذاتيا، ولكن الحل الأكثر أمانا هو استخدام الشهادات الصادرة عن المراجع المصدقة الموثوق بها.

ملخص عملية إعداد الوسيط كما يلي:

  1. يتم تكرار الخطوات التالية على كل عقدة من العقد العاملة الثلاثة:

    1. قم بإنشاء شهادة.
    2. وأنشئ طلب توقيع الشهادة.
    3. أرسل طلب توقيع الشهادة إلى المرجع المصدق (CA).
    4. سجّل الدخول إلى المرجع المصدق ووقّع على الطلب.
    5. SCP الشهادة الموقعة مرة أخرى إلى عقدة العامل.
    6. SCP الشهادة العامة لـ CA لعقدة العامل.
  2. بمجرد حصولك على جميع الشهادات، ضع الشهادات في متجر الشهادات.

  3. انتقل إلى Ambari وقم بتغيير التكوينات.

    استخدم الإرشادات التفصيلية التالية لإكمال إعداد الوسيط:

    هام

    في مقتطفات التعليمات البرمجية التالية، يعد wnX اختصارًا لإحدى العقد العاملة الثلاثة ويجب استبداله بـ wn0، wn1 أو wn2 حسب الاقتضاء. WorkerNode0_Name وHeadNode0_Name ينبغي أن تحل محلها أسماء الآلات المعنية.

  4. قم بإجراء الإعداد الأولي على العقدة الرئيسية 0، والتي ل HDInsight تملأ دور المرجع المصدق (CA).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. تنفيذ نفس الإعداد الأولي على كل من الوسطاء (عقد العامل 0 و 1 و 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. في كل عقدة من العقد العاملة، قم بتنفيذ الخطوات التالية باستخدام القصاصة البرمجية.

    1. قم بإنشاء مخزن مفاتيح وملئه بشهادة خاصة جديدة.
    2. قم بإنشاء طلب توقيع الشهادة.
    3. 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
    

    لقطة شاشة تعرض إخراج ملف المضيفين.

  7. على جهاز 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
    
  8. غيّر إلى الجهاز 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"
    
  9. أرسل الشهادات الموقعة مرة أخرى إلى عقد العامل من 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
    
  10. أرسل الشهادة العامة من 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
    
  11. في كل عقدة عاملة، أضف شهادة 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.

لإكمال تعديل التكوين، قم بالخطوات التالية:

  1. سجّل الدخول إلى مدخل Azure وحدد مجموعة Azure HDInsight Apache Kafka.

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

  3. ضمن Kafka Broker عيّن خاصية المستمعين إلى PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. تحت Advanced kafka-broker عيّن الخاصية security.inter.broker.protocol إلى SSL

    تحرير خصائص تكوين Kafka ssl في Ambari.

  5. تحت Custom kafka-broker عيّن الخاصية ssl.client.auth إلى required.

    إشعار

    ملاحظة: هذه الخطوة مطلوبة فقط إذا كنت تقوم بإعداد المصادقة والتشفير.

    تحرير خصائص تكوين kafka ssl في Ambari.

  6. إليك لقطة الشاشة التي تعرض واجهة مستخدم تكوين Ambari مع هذه التغييرات.

    إشعار

    1. ssl.keystore.location وssl.truststore.location هو المسار الكامل لمخزن المفاتيح وموقع مخزن الثقة في المرجع المصدق (hn0)
    2. ssl.keystore.password وssl.truststore.password هي كلمة المرور التي تم تعيينها لمخزن المفاتيح ومخزن الثقة. في هذه الحالة كمثال، MyServerPassword123
    3. ssl.key.password هي مجموعة المفاتيح لمخزن المفاتيح ومخزن الثقة. في هذه الحالة كمثال، MyServerPassword123
  7. لاستخدام TLS 1.3 في Kafka

    إضافة التكوينات التالية إلى تكوينات kafka في Ambari

    1. ssl.enabled.protocols=TLSv1.3
    2. ssl.protocol=TLSv1.3

    هام

    1. يعمل TLS 1.3 مع إصدار HDI 5.1 kafka فقط.
    2. إذا كنت تستخدم TLS 1.3 على جانب الخادم، يجب عليك استخدام تكوينات TLS 1.3 في العميل أيضا.
  8. بالنسبة إلى HDI الإصدار 4.0 أو 5.0

    1. إذا كنت تقوم بإعداد المصادقة والتشفير، فستبدو لقطة الشاشة مثل

    تحرير خاصية قالب kafka-env في Ambari أربعة.

    1. إذا كنت تقوم بإعداد التشفير فقط، فستبدو لقطة الشاشة مثل

    لقطة شاشة توضح كيفية تحرير حقل خاصية قالب kafka-env في Ambari للتشفير فقط.

  9. أعد تشغيل جميع وسطاء Kafka.

إعداد العميل (بدون مصادقة)

إذا لم تكن بحاجة إلى مصادقة، فإن ملخص الخطوات لإعداد تشفير TLS فقط هو:

  1. سجل الدخول إلى المرجع المصدق (عقدة الرأس النشطة).
  2. انسخ شهادة المرجع المصدق إلى جهاز العميل من جهاز CA (wn0).
  3. سجل الدخول إلى جهاز العميل (hn1) وانتقل إلى ~/ssl المجلد.
  4. قم باستيراد شهادة المرجع المصدق إلى مخزن الثقة.
  5. استيراد شهادة المرجع المصدق إلى مخزن المفاتيح.

يتم تفصيل هذه الخطوات في أجزاء التعليمات البرمجية التالية.

  1. سجل الدخول إلى عقدة المرجع المصدق.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. انسخ ca-cert إلى جهاز العميل

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. سجل الدخول إلى الجهاز العميل (عقدة رأس الاستعداد).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. قم باستيراد شهادة المرجع المصدق إلى مخزن الثقة.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. استيراد شهادة المرجع المصدق إلى مخزن المفاتيح.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. إنشاء الملف client-ssl-auth.properties على جهاز العميل (hn1). يجب أن تحتوي على الأسطر التالية:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. لاستخدام TLS 1.3، أضف التكوينات التالية إلى الملف client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. ابدأ العميل الإداري بخيارات المنتج والمستهلك للتحقق من عمل المنتجين والمستهلكين على المنفذ 9093. راجع قسم التحقق لمعرفة الخطوات اللازمة للتحقق من الإعداد باستخدام منتج/مستهلك وحدة التحكم.

إعداد العميل (مع المصادقة)

إشعار

الخطوات التالية مطلوبة فقط إذا كنت تقوم بإعداد تشفير TLS والمصادقة. إذا كنت تقوم بإعداد التشفير فقط، فشاهد إعداد العميل بدون مصادقة.

تلخص الخطوات الأربع التالية المهام المطلوبة لإكمال إعداد العميل:

  1. سجل الدخول إلى الجهاز العميل (عقدة رأس الاستعداد).
  2. أنشئ java keystore واحصل على شهادة موقّعة للوسيط. ثم انسخ الشهادة إلى الجهاز الظاهري حيث يعمل المرجع المصدق.
  3. قم بالتبديل إلى جهاز CA (عقدة الرأس النشطة) للتوقيع على شهادة العميل.
  4. انتقل إلى جهاز العميل (عقدة رأس الاستعداد) وانتقل إلى ~/ssl المجلد. انسخ الشهادة الموقعة إلى جهاز العميل.

يتم إعطاء تفاصيل كل خطوة.

  1. سجل الدخول إلى الجهاز العميل (عقدة رأس الاستعداد).

    ssh sshuser@HeadNode1_Name
    
  2. قم بإزالة أي دليل SSL موجود.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. أنشئ ملف تخزين مفاتيح 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"
    
  4. انسخ طلب توقيع الشهادة إلى المرجع المصدق

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. قم بالتبديل إلى جهاز 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
    
  6. انسخ شهادة العميل الموقعة من CA (العقدة الرئيسية النشطة) إلى جهاز العميل.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. انسخ ca-cert إلى جهاز العميل

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. سجّل الدخول إلى جهاز العميل (عقدة رأس الاستعداد) وانتقل إلى دليل ssl.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. إنشاء مخزن عميل مع شهادة موقعة، واستيراد شهادة 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
    
  9. إنشاء ملف 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
    
    1. لاستخدام TLS 1.3، أضف التكوينات التالية إلى الملف client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

التحقق من الصحة

قم بتشغيل هذه الخطوات على جهاز العميل.

إشعار

إذا تم تثبيت HDInsight 4.0 و Kafka 2.1، يمكنك استخدام وحدة التحكم المنتج / المستهلكين للتحقق من الإعداد الخاص بك. إذا لم يكن الأمر كذلك، فقم بتشغيل منتج Kafka على المنفذ 9092 وإرسال رسائل إلى الموضوع، ثم استخدم المستهلك Kafka على المنفذ 9093 الذي يستخدم TLS.

Kafka 2.1 أو أحدث

  1. قم بإنشاء موضوع إذا لم يكن موجودًا بالفعل.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  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
    
  3. افتح اتصال 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
    

الخطوات التالية