Azure HDInsight'ta ESP Dışı Apache Kafka kümesi için TLS şifrelemesi ve kimlik doğrulaması ayarlama

Bu makalede, Apache Kafka istemcileri ile Apache Kafka aracıları arasında daha önce Güvenli Yuva Katmanı (SSL) şifrelemesi olarak bilinen Aktarım Katmanı Güvenliği (TLS) şifrelemesini ayarlama işlemleri gösterilmektedir. Ayrıca istemcilerin kimlik doğrulamasını ayarlamayı da gösterir (bazen iki yönlü TLS olarak da adlandırılır).

Önemli

Kafka uygulamaları için kullanabileceğiniz iki istemci vardır: Java istemcisi ve konsol istemcisi. Hem üretim hem de kullanım için yalnızca Java istemcisi ProducerConsumer.java TLS kullanabilir. Konsol üreticisi istemcisi console-producer.sh TLS ile çalışmaz.

Apache Kafka aracı kurulumu

Kafka TLS aracı kurulumu aşağıdaki şekilde dört HDInsight kümesi VM'sini kullanır:

  • headnode 0 - Sertifika Yetkilisi (CA)
  • çalışan düğümü 0, 1 ve 2 - aracılar

Not

Bu kılavuzda otomatik olarak imzalanan sertifikalar kullanılır, ancak en güvenli çözüm güvenilen CA'lar tarafından verilen sertifikaları kullanmaktır.

Aracı kurulum işleminin özeti aşağıdaki gibidir:

  1. Aşağıdaki adımlar üç çalışan düğümünün her birinde yinelenir:

    1. Bir sertifika oluşturun.
    2. Sertifika imzalama isteği oluşturun.
    3. Sertifika imzalama isteğini Sertifika Yetkilisi'ne (CA) gönderin.
    4. CA'da oturum açın ve isteği imzalayın.
    5. İmzalı sertifikayı çalışan düğümüne geri SCP ile gönderin.
    6. CA'nın çalışan düğümüne genel sertifikasını SCP.
  2. Tüm sertifikaları aldıktan sonra sertifikaları sertifika deposuna yerleştirin.

  3. Ambari'ye gidin ve yapılandırmaları değiştirin.

    Aracı kurulumunu tamamlamak için aşağıdaki ayrıntılı yönergeleri kullanın:

    Önemli

    Aşağıdaki kod parçacıklarında wnX, üç çalışan düğümünden birinin kısaltmasıdır ve yerine wn0veya wn1wn2 yerine uygun şekilde yazılmalıdır. WorkerNode0_Name ve HeadNode0_Name yerine ilgili makinelerin adları kullanılmalıdır.

  4. HDInsight için Sertifika Yetkilisi 'nin (CA) rolünü dolduran baş düğüm 0'da ilk kurulumu gerçekleştirin.

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. Aracıların her birinde aynı ilk kurulumu gerçekleştirin (çalışan düğümleri 0, 1 ve 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. Çalışan düğümlerinin her birinde kod parçacığını kullanarak aşağıdaki adımları yürütebilirsiniz.

    1. Bir anahtar deposu oluşturun ve bunu yeni bir özel sertifikayla doldurun.
    2. Sertifika imzalama isteği oluşturun.
    3. SERTIFIKA yetkilisine sertifika imzalama isteğini 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
    

    Not

    FQDN_WORKER_NODE, çalışan düğümü makinesinin Tam Etki Alanı Adı'dır. Bu ayrıntıları baş düğümdeki /etc/hosts dosyasından alabilirsiniz

    Örneğin,

    wn0-espkaf.securehadooprc.onmicrosoft.com
    wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
    

    Konaklar dosya çıkışını gösteren ekran görüntüsü.

  7. CA makinesinde ca-cert ve ca-key dosyaları oluşturmak için aşağıdaki komutu çalıştırın:

    openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
    
  8. CA makinesine değiştirin ve alınan sertifika imzalama isteklerinin tümünü imzalayın:

    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. İmzalı sertifikaları CA'dan çalışan düğümlerine geri gönderin (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'nın genel sertifikasını her çalışan düğümüne gönderin.

    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. Her çalışan düğümünde CA'ların ortak sertifikasını güven deposuna ve anahtar deposuna ekleyin. Ardından çalışan düğümünü kendi imzalı sertifikasını keystore'a ekleyin

    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 yapılandırmasını TLS kullanacak şekilde güncelleştirme ve aracıları yeniden başlatma

Şimdi her Kafka aracısını bir keystore ve truststore ile ayarladınız ve doğru sertifikaları içeri aktarmış oldunuz. Ardından Ambari kullanarak ilgili Kafka yapılandırma özelliklerini değiştirin ve kafka aracılarını yeniden başlatın.

Yapılandırma değişikliğini tamamlamak için aşağıdaki adımları uygulayın:

  1. Azure portalında oturum açın ve Azure HDInsight Apache Kafka kümenizi seçin.

  2. Küme panoları altında Ambari giriş'e tıklayarak Ambari kullanıcı arabirimine gidin.

  3. Kafka Aracısı altında listeners özelliğini olarak ayarlayınPLAINTEXT://localhost:9092,SSL://localhost:9093

  4. Gelişmiş kafka-broker altında security.inter.broker.protocol özelliğini olarak ayarlayın SSL

    Ambari'de Kafka ssl yapılandırma özellikleri düzenleniyor.

  5. Özel kafka-broker altında ssl.client.auth özelliğini olarak requiredayarlayın.

    Not

    Not: Bu adım yalnızca kimlik doğrulaması ve şifreleme ayarlanıyorsa gereklidir.

    Ambari'de kafka ssl yapılandırma özellikleri düzenleniyor.

  6. Ambari yapılandırma kullanıcı arabirimini bu değişikliklerle gösteren ekran görüntüsü aşağıdadır.

    Not

    1. ssl.keystore.location ve ssl.truststore.location, Sertifika Yetkilisi'nde (hn0) keystore, truststore konumunuzun tam yoludur
    2. ssl.keystore.password ve ssl.truststore.password, anahtar deposu ve truststore için ayarlanan paroladır. Bu örnekte, MyServerPassword123
    3. ssl.key.password, anahtar deposu ve güven deposu için ayarlanan anahtardır. Bu örnekte, MyServerPassword123
  7. Kafka'da TLS 1.3 Kullanmak için

    Ambari'deki kafka yapılandırmalarına aşağıdaki yapılandırmaları ekleyin

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

    Önemli

    1. TLS 1.3 yalnızca HDI 5.1 kafka sürümüyle çalışır.
    2. Sunucu tarafında TLS 1.3 kullanıyorsanız, istemcide de TLS 1.3 yapılandırmalarını kullanmanız gerekir.
  8. HDI sürüm 4.0 veya 5.0 için

    1. Kimlik doğrulaması ve şifreleme ayarlanıyorsa ekran görüntüsü şu şekilde görünür:

    Ambari four'da kafka-env şablon özelliği düzenleniyor.

    1. Yalnızca şifreleme ayarlanıyorsa ekran görüntüsü şöyle görünür:

    Ambari'de kafka-env şablonu özellik alanının yalnızca şifreleme için nasıl düzenleyebileceğinizi gösteren ekran görüntüsü.

  9. Tüm Kafka aracılarını yeniden başlatın.

İstemci kurulumu (kimlik doğrulaması olmadan)

Kimlik doğrulamasına ihtiyacınız yoksa, yalnızca TLS şifrelemesini ayarlama adımlarının özeti şunlardır:

  1. CA'da (etkin baş düğüm) oturum açın.
  2. CA sertifikasını CA makinesinden (wn0) istemci makinesine kopyalayın.
  3. İstemci makinesinde (hn1) oturum açın ve klasöre ~/ssl gidin.
  4. CA sertifikasını güven deposuna aktarın.
  5. CA sertifikasını anahtar deposuna aktarın.

Bu adımlar aşağıdaki kod parçacıklarında ayrıntılı olarak yer alır.

  1. CA düğümünde oturum açın.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. ca-cert'i istemci makinesine kopyalama

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. İstemci makinesinde (bekleme baş düğümü) oturum açın.

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. CA sertifikasını güven deposuna aktarın.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. CA sertifikasını keystore'a aktarın.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. dosyayı client-ssl-auth.properties istemci makinesinde (hn1) oluşturun. Aşağıdaki satırlara sahip olmalıdır:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. TLS 1.3 kullanmak için dosyasına aşağıdaki yapılandırmaları ekleyin client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. Hem üreticilerin hem de tüketicilerin 9093 numaralı bağlantı noktası üzerinde çalıştığını doğrulamak için üretici ve tüketici seçenekleriyle yönetici istemcisini başlatın. Konsol üreticisini/tüketicisini kullanarak kurulumu doğrulamak için gereken adımlar için Doğrulama bölümüne bakın.

İstemci kurulumu (kimlik doğrulaması ile)

Not

Aşağıdaki adımlar yalnızca hem TLS şifrelemesi hem de kimlik doğrulaması ayarlanıyorsa gereklidir. Yalnızca şifreleme ayarlanıyorsa bkz . Kimlik doğrulaması olmadan istemci kurulumu.

Aşağıdaki dört adımda, istemci kurulumunu tamamlamak için gereken görevler özetlenmiştir:

  1. İstemci makinesinde (bekleme baş düğümü) oturum açın.
  2. Bir Java keystore oluşturun ve aracı için imzalı bir sertifika alın. Ardından sertifikayı CA'nın çalıştığı VM'ye kopyalayın.
  3. İstemci sertifikasını imzalamak için CA makinesine (etkin baş düğüm) geçin.
  4. İstemci makinesine (bekleme baş düğümü) gidin ve klasöre ~/ssl gidin. İmzalı sertifikayı istemci makinesine kopyalayın.

Her adımın ayrıntıları verilir.

  1. İstemci makinesinde (bekleme baş düğümü) oturum açın.

    ssh sshuser@HeadNode1_Name
    
  2. Mevcut ssl dizinlerini kaldırın.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Bir Java keystore oluşturun ve bir sertifika imzalama isteği oluşturun.

    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. Sertifika imzalama isteğini CA'ya kopyalama

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. CA makinesine (etkin baş düğüm) geçin ve istemci sertifikasını imzalayın.

    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. İmzalı istemci sertifikasını CA'dan (etkin baş düğümü) istemci makinesine kopyalayın.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. ca-cert'i istemci makinesine kopyalama

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. İstemci makinesinde (bekleme baş düğümü) oturum açın ve ssl dizinine gidin.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. İmzalı sertifika ile istemci deposu oluşturun, CA sertifikasını anahtar deposuna aktarın ve istemci makinesinde güven deposu (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. İstemci makinesinde (hn1) bir dosya client-ssl-auth.properties oluşturun. Aşağıdaki satırlara sahip olmalıdır:

    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 kullanmak için dosyasına aşağıdaki yapılandırmaları ekleyin client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

Doğrulama

İstemci makinesinde bu adımları çalıştırın.

Not

HDInsight 4.0 ve Kafka 2.1 yüklüyse, kurulumunuzu doğrulamak için konsol üreticisini/tüketicilerini kullanabilirsiniz. Aksi takdirde Kafka üreticisini 9092 numaralı bağlantı noktasında çalıştırın ve konuya ileti gönderin ve ardından TLS kullanan 9093 numaralı bağlantı noktasında Kafka tüketicisini kullanın.

Kafka 2.1 veya üzeri

  1. Henüz yoksa bir konu oluşturun.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  2. Konsol üreticisini başlatın ve öğesinin yolunu client-ssl-auth.properties üretici için bir yapılandırma dosyası olarak sağlayın.

    /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. İstemci makinesine başka bir ssh bağlantısı açın ve konsol tüketicisini client-ssl-auth.properties başlatın ve yolunu tüketici için bir yapılandırma dosyası olarak sağlayın.

    /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
    

Sonraki adımlar