Configurare la crittografia TLS e l'autenticazione per il cluster Apache Kafka non ESP in Azure HDInsight

Questo articolo illustra come configurare la crittografia TLS (Transport Layer Security), nota in precedenza come crittografia SSL (Secure Sockets Layer), tra i client Apache Kafka e i broker Apache Kafka. Illustra anche come configurare l'autenticazione dei client (talvolta definita TLS bidirezionale).

Importante

Esistono due client che è possibile usare per le applicazioni Kafka: un client Java e un client console. Solo il client ProducerConsumer.java Java può usare TLS per la produzione e l'utilizzo. Il client console-producer.sh producer della console non funziona con TLS.

Configurazione del broker Apache Kafka

L'installazione del broker TLS Kafka usa quattro macchine virtuali del cluster HDInsight nel modo seguente:

  • headnode 0 - Autorità di certificazione (CA)
  • nodo di lavoro 0, 1 e 2 - broker

Nota

Questa guida usa certificati autofirmati, ma la soluzione più sicura consiste nell'usare i certificati emessi da ca attendibili.

Il riepilogo del processo di installazione del broker è il seguente:

  1. I passaggi seguenti vengono ripetuti in ognuno dei tre nodi di lavoro:

    1. Generare un certificato.
    2. Creare una richiesta di firma del certificato.
    3. Inviare la richiesta di firma del certificato all'autorità di certificazione (CA).
    4. Accedere alla CA e firmare la richiesta.
    5. SCP il certificato firmato al nodo di lavoro.
    6. SCP il certificato pubblico della CA nel nodo di lavoro.
  2. Dopo aver ottenuto tutti i certificati, inserire i certificati nell'archivio certificati.

  3. Passare ad Ambari e modificare le configurazioni.

    Usare le istruzioni dettagliate seguenti per completare l'installazione del broker:

    Importante

    Nei frammenti di codice seguenti wnX è un'abbreviazione di uno dei tre nodi di lavoro e deve essere sostituito con wn0wn1 o wn2 in base alle esigenze. WorkerNode0_Name e HeadNode0_Name devono essere sostituiti con i nomi dei rispettivi computer.

  4. Eseguire la configurazione iniziale nel nodo head 0, che per HDInsight occupa il ruolo dell'autorità di certificazione (CA).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. Eseguire la stessa configurazione iniziale in ognuno dei broker (nodi di lavoro 0, 1 e 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. In ognuno dei nodi di lavoro eseguire la procedura seguente usando il frammento di codice.

    1. Creare un archivio chiavi e popolarlo con un nuovo certificato privato.
    2. Creare una richiesta di firma del certificato.
    3. SCP la richiesta di firma del certificato alla 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
    

    Nota

    FQDN_WORKER_NODE è il nome di dominio completo del computer del nodo di lavoro. È possibile ottenere tali dettagli dal file /etc/hosts nel nodo head

    ad esempio:

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

    Screenshot che mostra l'output del file hosts.

  7. Nel computer ca eseguire il comando seguente per creare file ca-cert e ca-key:

    openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
    
  8. Passare al computer ca e firmare tutte le richieste di firma del certificato ricevute:

    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. Inviare di nuovo i certificati firmati ai nodi di lavoro dalla 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. Inviare il certificato pubblico della CA a ogni nodo di lavoro.

    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. In ogni nodo del ruolo di lavoro aggiungere il certificato pubblico CAs all'archivio trust e all'archivio chiavi. Aggiungere quindi il certificato firmato del nodo di lavoro all'archivio chiavi

    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
    
    

Aggiornare la configurazione kafka per usare TLS e riavviare i broker

È ora stato configurato ogni broker Kafka con un archivio chiavi e un archivio attendibilità e sono stati importati i certificati corretti. A questo punto, modificare le proprietà di configurazione Kafka correlate tramite Ambari e quindi riavviare i broker Kafka.

Per completare la configurazione, seguire questa procedura:

  1. Accedere al portale di Azure e selezionare il cluster Apache Kafka di Azure HDInsight.

  2. Passare all'interfaccia utente di Ambari facendo clic su Home Ambari in Dashboard cluster.

  3. In Kafka Broker (Broker Kafka) impostare la proprietà listeners su PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. In Advanced kafka-broker (Kafka-broker avanzato) impostare la proprietà security.inter.broker.protocol su SSL

    Modifica delle proprietà di configurazione ssl Kafka in Ambari.

  5. In Custom kafka-broker (Kafka-broker personalizzato) impostare la proprietà ssl.client.auth su required.

    Nota

    Nota: questo passaggio è obbligatorio solo se si configura l'autenticazione e la crittografia.

    Modifica delle proprietà di configurazione ssl kafka in Ambari.

  6. Ecco lo screenshot che mostra l'interfaccia utente di configurazione di Ambari con queste modifiche.

    Nota

    1. ssl.keystore.location e ssl.truststore.location è il percorso completo dell'archivio chiavi, il percorso dell'archivio trust in Autorità di certificazione (hn0)
    2. ssl.keystore.password e ssl.truststore.password è la password impostata per l'archivio chiavi e l'archivio attendibilità. In questo caso come esempio, MyServerPassword123
    3. ssl.key.password è il set di chiavi per l'archivio chiavi e l'archivio attendibilità. In questo caso come esempio, MyServerPassword123
  7. Per usare TLS 1.3 in Kafka

    Aggiungere le configurazioni seguenti alle configurazioni kafka in Ambari

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

    Importante

    1. TLS 1.3 funziona solo con la versione kafka di HDI 5.1.
    2. Se si usa TLS 1.3 sul lato server, è consigliabile usare anche le configurazioni TLS 1.3 nel client.
  8. Per HDI versione 4.0 o 5.0

    1. Se si configura l'autenticazione e la crittografia, lo screenshot sarà simile al seguente

    Modifica della proprietà del modello kafka-env in Ambari quattro.

    1. Se si configura solo la crittografia, lo screenshot sarà simile al seguente:

    Screenshot che mostra come modificare il campo della proprietà del modello kafka-env in Ambari solo per la crittografia.

  9. Riavviare tutti i broker Kafka.

Configurazione del client (senza autenticazione)

Se non è necessaria l'autenticazione, il riepilogo dei passaggi per configurare solo la crittografia TLS è:

  1. Accedere alla CA (nodo head attivo).
  2. Copiare il certificato della CA nel computer client dal computer CA (wn0).
  3. Accedere al computer client (hn1) e passare alla ~/ssl cartella .
  4. Importare il certificato della CA nell'archivio attendibilità.
  5. Importare il certificato della CA nell'archivio chiavi.

Questi passaggi sono descritti in dettaglio nei frammenti di codice seguenti.

  1. Accedere al nodo DELLA CA.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Copiare il certificato ca nel computer client

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Accedere al computer client (nodo head di standby).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Importare il certificato della CA nell'archivio attendibilità.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. Importare il certificato della CA nell'archivio chiavi.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. Creare il file client-ssl-auth.properties nel computer client (hn1). Dovrebbe includere le righe seguenti:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. Per usare TLS 1.3, aggiungere le configurazioni seguenti al file client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. Avviare il client amministratore con le opzioni producer e consumer per verificare che sia i produttori che i consumer lavorino sulla porta 9093. Vedere la sezione Verifica per i passaggi necessari per verificare l'installazione usando il producer/consumer della console.

Configurazione del client (con autenticazione)

Nota

I passaggi seguenti sono necessari solo se si configurano sia la crittografia TLS che l'autenticazione. Se si configura solo la crittografia, vedere Configurazione client senza autenticazione.

I quattro passaggi seguenti riepilogano le attività necessarie per completare la configurazione del client:

  1. Accedere al computer client (nodo head di standby).
  2. Creare un archivio chiavi Java e ottenere un certificato firmato per il broker. Copiare quindi il certificato nella macchina virtuale in cui è in esecuzione la CA.
  3. Passare al computer CA (nodo head attivo) per firmare il certificato client.
  4. Passare al computer client (nodo head di standby) e passare alla ~/ssl cartella . Copiare il certificato firmato nel computer client.

Vengono forniti i dettagli di ogni passaggio.

  1. Accedere al computer client (nodo head di standby).

    ssh sshuser@HeadNode1_Name
    
  2. Rimuovere qualsiasi directory SSL esistente.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Creare un archivio chiavi Java e creare una richiesta di firma del certificato.

    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. Copiare la richiesta di firma del certificato nella CA

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. Passare al computer CA (nodo head attivo) e firmare il certificato client.

    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. Copiare il certificato client firmato dalla CA (nodo head attivo) al computer client.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Copiare il certificato ca nel computer client

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Accedere al computer client (nodo head di standby) e passare alla directory SSL.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Creare un archivio client con certificato firmato, importare un certificato ca nell'archivio chiavi e truststore nel computer client (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. Creare un file client-ssl-auth.properties nel computer client (hn1). Dovrebbe includere le righe seguenti:

    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. Per usare TLS 1.3, aggiungere le configurazioni seguenti al file client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

Verifica

Eseguire questi passaggi nel computer client.

Nota

Se HDInsight 4.0 e Kafka 2.1 sono installati, è possibile usare il producer/consumer della console per verificare la configurazione. In caso contrario, eseguire il producer Kafka sulla porta 9092 e inviare messaggi all'argomento e quindi usare il consumer Kafka sulla porta 9093 che usa TLS.

Kafka 2.1 o versione successiva

  1. Creare un argomento se non esiste già.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  2. Avviare il producer della console e specificare il percorso di client-ssl-auth.properties come file di configurazione per il producer.

    /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. Aprire un'altra connessione SSH al computer client e avviare il consumer della console e specificare il percorso di client-ssl-auth.properties come file di configurazione per il consumer.

    /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
    

Passaggi successivi