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:
I passaggi seguenti vengono ripetuti in ognuno dei tre nodi di lavoro:
- Generare un certificato.
- Creare una richiesta di firma del certificato.
- Inviare la richiesta di firma del certificato all'autorità di certificazione (CA).
- Accedere alla CA e firmare la richiesta.
- SCP il certificato firmato al nodo di lavoro.
- SCP il certificato pubblico della CA nel nodo di lavoro.
Dopo aver ottenuto tutti i certificati, inserire i certificati nell'archivio certificati.
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
wn0
wn1
own2
in base alle esigenze.WorkerNode0_Name
eHeadNode0_Name
devono essere sostituiti con i nomi dei rispettivi computer.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
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
In ognuno dei nodi di lavoro eseguire la procedura seguente usando il frammento di codice.
- Creare un archivio chiavi e popolarlo con un nuovo certificato privato.
- Creare una richiesta di firma del certificato.
- 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
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
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"
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
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
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:
Accedere al portale di Azure e selezionare il cluster Apache Kafka di Azure HDInsight.
Passare all'interfaccia utente di Ambari facendo clic su Home Ambari in Dashboard cluster.
In Kafka Broker (Broker Kafka) impostare la proprietà listeners su
PLAINTEXT://localhost:9092,SSL://localhost:9093
In Advanced kafka-broker (Kafka-broker avanzato) impostare la proprietà security.inter.broker.protocol su
SSL
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.
Ecco lo screenshot che mostra l'interfaccia utente di configurazione di Ambari con queste modifiche.
Nota
- ssl.keystore.location e ssl.truststore.location è il percorso completo dell'archivio chiavi, il percorso dell'archivio trust in Autorità di certificazione (hn0)
- ssl.keystore.password e ssl.truststore.password è la password impostata per l'archivio chiavi e l'archivio attendibilità. In questo caso come esempio,
MyServerPassword123
- ssl.key.password è il set di chiavi per l'archivio chiavi e l'archivio attendibilità. In questo caso come esempio,
MyServerPassword123
Per usare TLS 1.3 in Kafka
Aggiungere le configurazioni seguenti alle configurazioni kafka in Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Importante
- TLS 1.3 funziona solo con la versione kafka di HDI 5.1.
- Se si usa TLS 1.3 sul lato server, è consigliabile usare anche le configurazioni TLS 1.3 nel client.
Per HDI versione 4.0 o 5.0
- Se si configura l'autenticazione e la crittografia, lo screenshot sarà simile al seguente
- Se si configura solo la crittografia, lo screenshot sarà simile al seguente:
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 è:
- Accedere alla CA (nodo head attivo).
- Copiare il certificato della CA nel computer client dal computer CA (wn0).
- Accedere al computer client (hn1) e passare alla
~/ssl
cartella . - Importare il certificato della CA nell'archivio attendibilità.
- Importare il certificato della CA nell'archivio chiavi.
Questi passaggi sono descritti in dettaglio nei frammenti di codice seguenti.
Accedere al nodo DELLA CA.
ssh sshuser@HeadNode0_Name cd ssl
Copiare il certificato ca nel computer client
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Accedere al computer client (nodo head di standby).
ssh sshuser@HeadNode1_Name cd ssl
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
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
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
- Per usare TLS 1.3, aggiungere le configurazioni seguenti al file
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Per usare TLS 1.3, aggiungere le configurazioni seguenti al file
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:
- Accedere al computer client (nodo head di standby).
- 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.
- Passare al computer CA (nodo head attivo) per firmare il certificato client.
- 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.
Accedere al computer client (nodo head di standby).
ssh sshuser@HeadNode1_Name
Rimuovere qualsiasi directory SSL esistente.
rm -R ~/ssl mkdir ssl cd ssl
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"
Copiare la richiesta di firma del certificato nella CA
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
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
Copiare il certificato client firmato dalla CA (nodo head attivo) al computer client.
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
Copiare il certificato ca nel computer client
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- Accedere al computer client (nodo head di standby) e passare alla directory SSL.
ssh sshuser@HeadNode1_Name cd ssl
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
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
- Per usare TLS 1.3, aggiungere le configurazioni seguenti al file
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Per usare TLS 1.3, aggiungere le configurazioni seguenti al file
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
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
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
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