Apache Kafka'de tlS şifrelemesi ve kimlik doğrulamasını Azure HDInsight

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

Önemli

Kafka uygulamaları için kullanabileceğiniz iki istemci vardır: Java istemcisi ve konsol istemcisi. ProducerConsumer.javaTlS'yi hem üretim hem de tüketim için yalnızca Java istemcisi kullanabilir. Konsol üreticisi istemcisi console-producer.sh TLS ile çalışmıyor.

Not

Sürüm 1.1 ile HDInsight Kafka konsol üreticisi SSL'yi desteklemez.

Apache Kafka aracısı kurulumu

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

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

Not

Bu kılavuz otomatik olarak imzalanan sertifikaları kullanı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 biri için tekrarlanır:

    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çma ve isteği imzalama.
    5. İmzalı sertifikayı çalışan düğümüne geri SCP ile geri verin.
    6. Çalışan düğümüne CA'nın genel sertifikası SCP.SCP.
  2. Tüm sertifikalara sahip olduktan sonra sertifikaları sertifika deposuna alın.

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

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üne yönelik bir kısaltmadır ve uygun şekilde veya ile wn0 wn1 wn2 değiştirilemeleri gerekir. WorkerNode0_Name ve, HeadNode0_Name ilgili makinelerin adları ile değiştir değiştir değiştiri.

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

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

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

    1. Bir anahtar deposu oluşturun ve bunu yeni bir özel sertifikayla doldurmak.
    2. Sertifika imzalama isteği oluşturun.
    3. CA'ya (headnode0) sertifika imzalama isteği SCP
    keytool -genkey -keystore kafka.server.keystore.jks -validity 365 -storepass "MyServerPassword123" -keypass "MyServerPassword123" -dname "CN=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
    
  4. CA makinesi üzerinde 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
    
  5. CA makinesine değişiklik yapmak ve alınan tüm sertifika imzalama isteklerini imzalamak:

    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"
    
  6. İmzalı sertifikaları CA'dan (headnode0) çalışan düğümlerine geri gönderin.

    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
    
  7. 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
    
  8. Her çalışan düğümünde, CA'lar ortak sertifikasını güven deposuna ve anahtar deposuna ekleyin. Ardından çalışan düğümünün kendi imzalı sertifikasını anahtar deposuna 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 kullanmak ve aracıları yeniden başlatmak için güncelleştirme

Artık her Kafka aracısını bir anahtar deposu ve truststore ile ayarladınız ve doğru sertifikaları içe aktardınız. Ardından Ambari kullanarak ilgili Kafka yapılandırma özelliklerini değiştirin ve ardından 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. Kümede oturum Azure portal kümenizi Azure HDInsight Apache Kafka 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-aracısı altında security.inter.broker.protocol özelliğini olarak ayarlayın SSL

    Ambari'de Kafka ssl yapılandırma özelliklerini düzenleme

  5. Özel kafka-aracısı altında ssl.client.auth özelliğini olarak required ayarlayın. Bu adım yalnızca kimlik doğrulaması ve şifrelemeyi ayar farklı ayarlarsanız gereklidir.

    Ambari'de kafka ssl yapılandırma özelliklerini düzenleme

  6. HDI sürüm 3.6 için Ambari kullanıcı arabirimine gidin ve Gelişmiş kafka-env ve kafka-env şablon özelliği altında aşağıdaki yapılandırmaları ekleyin.

    # Configure Kafka to advertise IP addresses instead of FQDN
    IP_ADDRESS=$(hostname -i)
    echo advertised.listeners=$IP_ADDRESS
    sed -i.bak -e '/advertised/{/advertised@/!d;}' /usr/hdp/current/kafka-broker/conf/server.properties
    echo "advertised.listeners=PLAINTEXT://$IP_ADDRESS:9092,SSL://$IP_ADDRESS:9093" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.keystore.location=/home/sshuser/ssl/kafka.server.keystore.jks" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.keystore.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.key.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.truststore.location=/home/sshuser/ssl/kafka.server.truststore.jks" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.truststore.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties
    
  7. Bu değişikliklerle Ambari yapılandırma kullanıcı arabirimini gösteren ekran görüntüsü.

    HDI sürüm 3.6 için:

    Ambari'de kafka-env şablon özelliğini düzenleme

    HDI sürüm 4.0 için:

    Ambari'de kafka-env şablon özelliğini düzenleme dört

  8. 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 şifrelemesi ayarlama adımlarının özeti:

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

Bu adımlar aşağıdaki kod parçacıklarında ayrıntılı olarak ve ayrıntılı olarak açık bir şekilde ve açıklama içerir.

  1. CA düğümünde oturum açma.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Ca-cert sertifikayı istemci makinesine kopyalama

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. İstemci makinede (hazır bekleyen baş düğüm) oturum açma.

    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 sertifikalarını anahtar deposuna aktarın.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. İstemci client-ssl-auth.properties makinede (hn1) dosyasını oluşturun. Aşağıdaki satırlara sahip olması gerekir:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
  7. Hem üreticilerin hem de tüketicilerin 9093 bağlantı noktası üzerinde çalıştığını doğrulamak için yönetici istemcisini üretici ve tüketici seçenekleriyle başlatabilirsiniz. Konsol üreticisi/tüketici kullanarak kurulumu doğrulamak için gereken adımlar için lütfen aşağıdaki 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ını ayarıyorsanız gereklidir. Yalnızca şifrelemeyi ayar görüyorsanız 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 makinede (hazır bekleyen baş düğüm) oturum açma.
  2. Bir Java anahtar deposu oluşturun ve aracı için imzalı bir sertifika alın. Ardından sertifikayı CA'nın çalıştır olduğu VM'ye kopyalayın.
  3. İstemci sertifikasını imzalamak için CA makinesine (etkin baş düğüm) geçiş.
  4. İstemci makinesine (hazır bekleyen baş düğüm) gidin ve klasörüne ~/ssl gidin. İmzalı sertifikayı istemci makinesine kopyalayın.

Her adımın ayrıntıları aşağıda verilmiştir.

  1. İstemci makinede (hazır bekleyen baş düğüm) oturum açma.

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

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Java anahtar deposu 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çiş ve istemci sertifikasını imzalama.

    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 sertifikaları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 sertifikayı istemci makinesine kopyalama

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. İstemci makinede (beklemede baş düğüm) oturum açma ve ssl dizinine gidin.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. İmzalı sertifika ile istemci deposu oluşturun ve ca sertifikalarını istemci makinesi (hn1) üzerinde anahtar deposuna ve güven deposuna aktarın:

    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 makinede client-ssl-auth.properties (hn1) bir dosya oluşturun. Aşağıdaki satırlara sahip olması gerekir:

    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
    

Doğrulama

bu adımları istemci makinede ç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. Yoksa, 9092 bağlantı noktası üzerinden Kafka üreticisini çalıştırın ve konuya ileti gönderin ve ardından TLS kullanan 9093 bağlantı noktası üzerinde Kafka tüketicisi 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 üretici client-ssl-auth.properties için yapılandırma dosyası olarak yolunu sağlar.

    /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 başlatın ve yolunu tüketici client-ssl-auth.properties için bir yapılandırma dosyası olarak sağlar.

    /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
    

Kafka 1.1

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

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

    /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list <FQDN_WORKER_NODE>:9092 --topic topic1 
    
  3. İstemci makinesine başka bir SSH bağlantısı açın ve konsol tüketicisini başlatın ve yolunu tüketici client-ssl-auth.properties için bir yapılandırma dosyası olarak sağlar.

    $ /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