Menyiapkan enkripsi dan autentikasi TLS untuk kluster Apache Kafka Non-ESP di Azure HDInsight

Artikel ini menunjukkan kepada Anda cara mengatur enkripsi Transport Layer Security (TLS), yang sebelumnya dikenal sebagai enkripsi Secure Sockets Layer (SSL), antara klien Apache Kafka dan broker Apache Kafka. Ini juga menunjukkan kepada Anda cara mengatur autentikasi klien (kadang-kadang disebut sebagai TLS dua arah).

Penting

Ada dua klien yang dapat Anda gunakan untuk aplikasi Kafka: klien Java dan klien konsol. Hanya klien Java ProducerConsumer.java yang dapat menggunakan TLS untuk memproduksi dan mengkonsumsi. Klien produsen konsol console-producer.sh tidak berfungsi dengan TLS.

Pengaturan broker Apache Kafka

Penyiapan broker Kafka TLS menggunakan empat VM kluster HDInsight dengan cara berikut:

  • headnode 0 - Otoritas Sertifikat (CA)
  • node pekerja 0, 1, dan 2 - broker

Catatan

Panduan ini menggunakan sertifikat yang ditandatangani sendiri, tetapi solusi yang paling aman adalah menggunakan sertifikat yang dikeluarkan oleh CA tepercaya.

Ringkasan proses penyiapan broker adalah sebagai berikut:

  1. Langkah-langkah berikut diulangi pada masing-masing dari tiga node pekerja:

    1. Buat sertifikat.
    2. Buat permintaan penandatanganan sertifikasi.
    3. Kirim permintaan penandatanganan sertifikasi ke Otoritas Sertifikat (CA).
    4. Masuk ke CA dan tanda tangani permintaan.
    5. SCP sertifikat yang ditandatangani kembali ke node pekerja.
    6. SCP sertifikat publik CA ke node pekerja.
  2. Setelah Anda memiliki semua sertifikat, masukkan certs ke cert store.

  3. Buka Ambari dan ubah konfigurasi.

    Gunakan instruksi terperinci berikut untuk menyelesaikan pengaturan broker:

    Penting

    Dalam cuplikan kode berikut wnX adalah singkatan untuk salah satu dari tiga node pekerja dan harus diganti dengan wn0, wn1 atau wn2 sebagaimana mestinya. WorkerNode0_Name dan HeadNode0_Name harus diganti dengan nama masing-masing mesin.

  4. Lakukan pengaturan awal pada head node 0, yang untuk HDInsight mengisi peran Otoritas Sertifikat (CA).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. Lakukan pengaturan awal yang sama pada masing-masing broker (node pekerja 0, 1 dan 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. Pada setiap simpul pekerja, jalankan langkah-langkah berikut menggunakan cuplikan kode.

    1. Buat keystore dan isi dengan sertifikat pribadi baru.
    2. Buat permintaan penandatanganan sertifikat.
    3. SCP permintaan penandatanganan sertifikat ke CA (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
    

    Catatan

    FQDN_WORKER_NODE adalah Nama Domain mesin simpul pekerja yang Sepenuhnya Memenuhi Syarat. Anda bisa mendapatkan detail itu dari file /etc/hosts di head node

    Contohnya,

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

    Cuplikan layar memperlihatkan output file host.

  7. Pada komputer CA, jalankan perintah berikut untuk membuat file ca-cert dan ca-key:

    openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
    
  8. Ubah ke mesin CA dan tanda tangani semua permintaan penandatanganan sertifikasi yang diterima:

    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. Kirim sertifikat yang ditandatangani kembali ke node pekerja dari 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. Kirim sertifikat publik CA ke setiap node pekerja.

    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. Pada setiap node pekerja, tambahkan sertifikat publik CAs ke truststore dan keystore. Kemudian tambahkan sertifikat yang ditandatangani node pekerja sendiri ke 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
    
    

Perbarui konfigurasi Kafka untuk menggunakan TLS dan restart broker

Anda sekarang telah mengatur setiap broker Kafka dengan keystore dan truststore, dan mengimpor sertifikat yang benar. Selanjutnya, modifikasi properti konfigurasi Kafka terkait menggunakan Ambari dan kemudian mulai ulang broker Kafka.

Untuk menyelesaikan modifikasi konfigurasi, lakukan langkah-langkah berikut:

  1. Masuk ke portal Microsoft Azure dan pilih klaster Azure HDInsight Apache Kafka Anda.

  2. Buka UI Ambari dengan mengklik beranda Ambari di bawah Dasbor kluster.

  3. Di bagian Perantara Kafka atur properti pendengar ke PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. Di bawah Advanced kafka-broker atur properti security.inter.broker.protocol ke SSL

    Mengedit properti konfigurasi ssl Kafka di Ambari.

  5. Di bawah Broker kafka kustom atur properti ssl.client.auth ke required.

    Catatan

    Catatan: Langkah ini hanya diperlukan jika Anda menyiapkan autentikasi dan enkripsi.

    Mengedit properti konfigurasi kafka ssl di Ambari.

  6. Berikut adalah cuplikan layar yang memperlihatkan UI konfigurasi Ambari dengan perubahan ini.

    Catatan

    1. ssl.keystore.location dan ssl.truststore.location adalah jalur lengkap keystore Anda, lokasi truststore di Otoritas Sertifikat (hn0)
    2. ssl.keystore.password dan ssl.truststore.password adalah kata sandi yang ditetapkan untuk keystore dan truststore. Dalam hal ini sebagai contoh, MyServerPassword123
    3. ssl.key.password adalah kunci yang ditetapkan untuk keystore dan penyimpanan kepercayaan. Dalam hal ini sebagai contoh, MyServerPassword123
  7. Untuk Menggunakan TLS 1.3 di Kafka

    Tambahkan konfigurasi berikut ke konfigurasi kafka di Ambari

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

    Penting

    1. TLS 1.3 hanya berfungsi dengan versi kafka HDI 5.1.
    2. Jika Anda menggunakan TLS 1.3 di sisi server, Anda harus menggunakan konfigurasi TLS 1.3 di klien juga.
  8. Untuk HDI versi 4.0 atau 5.0

    1. Jika Anda menyiapkan autentikasi dan enkripsi, cuplikan layar terlihat seperti

    Mengedit properti templat kafka-env di Ambari empat.

    1. Jika Anda hanya menyiapkan enkripsi, cuplikan layar terlihat seperti

    Cuplikan layar memperlihatkan cara mengedit bidang properti templat kafka-env di Ambari hanya untuk enkripsi.

  9. Mulai ulang semua broker Kafka.

Penyetelan klien (tanpa autentikasi)

Jika Anda tidak memerlukan autentikasi, ringkasan langkah-langkah untuk menyiapkan enkripsi TLS saja adalah:

  1. Masuk ke CA (simpul kepala aktif).
  2. Salin sertifikat CA ke komputer klien dari komputer CA (wn0).
  3. Masuk ke mesin klien (hn1) dan navigasi ke ~/ssl folder.
  4. Impor sertifikat CA ke truststore.
  5. Impor sertifikat CA ke keystore.

Langkah-langkah ini dirinci dalam cuplikan kode berikut.

  1. Masuk ke node CA.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Salin ca-cert ke mesin klien

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Masuk ke mesin klien (node kepala siaga).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Impor sertifikat CA ke truststore.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. Impor sertifikat CA ke keystore.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. Buat file client-ssl-auth.properties pada komputer klien (hn1). Ini harus memiliki pola berikut:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. Untuk Menggunakan TLS 1.3, tambahkan konfigurasi berikut ke file client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. Mulai klien admin dengan opsi produsen dan konsumen untuk memverifikasi bahwa produsen dan konsumen bekerja pada port 9093. Lihat bagian Verifikasi untuk langkah-langkah yang diperlukan untuk memverifikasi penyiapan menggunakan produsen/konsumen konsol.

Penyetelan klien (dengan autentikasi)

Catatan

Langkah-langkah berikut diperlukan hanya jika Anda menyiapkan enkripsi dan autentikasi TLS. Jika Anda hanya menyiapkan enkripsi, maka lihat Penyetelan klien tanpa autentikasi.

Empat langkah berikut ini meringkas tugas yang diperlukan untuk menyelesaikan penyetelan klien:

  1. Masuk ke mesin klien (node kepala siaga).
  2. Buat keystore Java dan dapatkan sertifikat yang ditandatangani untuk broker. Kemudian salin sertifikat ke VM tempat CA berjalan.
  3. Beralih ke mesin CA (active head node) untuk menandatangani sertifikat klien.
  4. Buka mesin klien (simpul kepala siaga) dan navigasi ke folder ~/ssl. Salin sertifikasi yang ditandatangani ke mesin klien.

Detail setiap langkah diberikan.

  1. Masuk ke mesin klien (node kepala siaga).

    ssh sshuser@HeadNode1_Name
    
  2. Hapus direktori ssl yang ada.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Buat keystore Java dan buat permintaan penandatanganan sertifikat.

    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. Menyalin permintaan penandatanganan sertifikat ke CA

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. Beralih ke mesin CA (node kepala aktif) dan tanda tangani sertifikat klien.

    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. Salin sertifikasi klien yang ditandatangani dari CA (node kepala aktif) ke mesin klien.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Salin ca-cert ke mesin klien

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Masuk ke mesin klien (simpul kepala siaga) dan navigasi ke direktori ssl.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Buat penyimpanan klien dengan sertifikasi yang ditandatangani, impor sertifikasi CA ke keystore, dan truststore pada komputer klien (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. Buat file client-ssl-auth.properties di komputer klien (hn1). Ini harus memiliki pola berikut:

    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. Untuk Menggunakan TLS 1.3, tambahkan konfigurasi berikut ke file client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

Verifikasi

Jalankan langkah-langkah ini pada mesin klien.

Catatan

Jika HDInsight 4.0 dan Kafka 2.1 diinstal, Anda dapat menggunakan produsen/ konsumen konsol untuk memverifikasi pengaturan Anda. Jika tidak, jalankan produsen Kafka di port 9092 dan kirim pesan ke topik tersebut, lalu gunakan konsumen Kafka di port 9093 yang menggunakan TLS.

Kafka 2.1 atau lebih tinggi

  1. Buat topik jika belum ada.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  2. Mulai produsen konsol dan berikan jalur client-ssl-auth.properties sebagai file konfigurasi untuk produsen.

    /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. Buka koneksi ssh lain ke mesin klien dan mulai konsumen konsol dan berikan jalur ke client-ssl-auth.properties sebagai file konfigurasi untuk konsumen.

    /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
    

Langkah berikutnya