Настройка SSL и SASL аутентификации Kafka
Kafka широко используется множеством компаний в целях оргнизации потоковой передачи данных, их интеграции и так далее.
Установка Kafka довольно проста - следуя укаааниям, описанным в официальной документации, Вы сможете создать свой первый топик менее чем за 30 минут.
Однако если Вам нужно использовать Kafka безопасным способом, Вам понадобится больше 30 минут, особенно если у Вас нет опыта работы с данным продуктом. Моя цель в этой статье - помочь людям вроде меня, у которых нет большого опыта работы с Kafka и которым нужно настроить SSL или SASL для соединения Kafka с другими приложениями.
Приступим.
Keystore, Truststore, CA …
KeyStore - адаптер для аутентификации клиентов, а TrustStore – адаптер для аутентификации сервера при SSL-аутентификации. [1]
Хранилище ключей состоит из базы данных, содержащей закрытый ключ и связанный с ним сертификат или связанную цепочку сертификатов. Цепочка сертификатов состоит из сертификата клиента и одного или нескольких сертификатов центра сертификации (ЦС). [1]
TrustStore содержит только те сертификаты, которым доверяет клиент («доверительное» хранилище). Эти сертификаты являются корневыми сертификатами СА, то есть самоподписными сертификатами. [1]
Настройка SSL и SASL
После некоторых исследований и часов, потраченных на поиск неисправностей, я наконец-таки смог настроить Kafka с использованием SSL и SASL.
Большинство команд нужно выполнять с помощью Keytool. Чтобы найти Keytool, выполните эту команду:
sudo find / -name jre You should find something like this path: cd /usr/java/jdk1.8.0_271-amd64/jre/bin/
Создадим хранилище ключей сервера. В параметре SAN=DNS используем FQDN. В данном случае я использую вычислительный экземпляр на Oracle Cloud под названием developerinstance. Замените его на имя Вашего хоста.
./keytool -keystore /home/opc/kafka/server.keystore.jks -alias localhost -validity 365 -genkey -keyalg RSA -ext SAN=DNS:developerinstance.subnet.vcn.oraclevcn.com#It will ask you to introduce the following parameters, very important to put the same hostname in first and last nameEnter keystore password: Re-enter new password: What is your first and last name? [Unknown]: developerinstance.subnet.vcn.oraclevcn.com What is the name of your organizational unit? [Unknown]: Example What is the name of your organization? [Unknown]: Example What is the name of your City or Locality? [Unknown]: Example What is the name of your State or Province? [Unknown]: Example What is the two-letter country code for this unit? [Unknown]: PT Is CN=developerinstance.subnet.vcn.oraclevcn.com, OU=Example, O=Example, L=Example, ST=Example, C=PT correct? [no]: yesEnter key password for <localhost> (RETURN if same as keystore password): Re-enter new password:Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /home/opc/kafka/server.keystore.jks -destkeystore /home/opc/kafka/server.keystore.jks -deststoretype pkcs12".#Step 2./keytool -keystore /home/opc/kafka/kafka.server.keystore.jks -alias localhost -keyalg RSA -genkey#again, it will ask you to fill in the different parameters, very important to put the same hostname Enter keystore password: Re-enter new password: What is your first and last name? [Unknown]: developerinstance.subnet.vcn.oraclevcn.com What is the name of your organizational unit? [Unknown]: Example What is the name of your organization? [Unknown]: Example What is the name of your City or Locality? [Unknown]: Example What is the name of your State or Province? [Unknown]: Example What is the two-letter country code for this unit? [Unknown]: PT Is CN=developerinstance.subnet.vcn.oraclevcn.com, OU=Example, O=Example, L=Example, ST=Example, C=PT correct? [no]: yesEnter key password for <localhost> (RETURN if same as keystore password): Re-enter new password:Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /home/opc/kafka/kafka.server.keystore.jks -destkeystore /home/opc/kafka/kafka.server.keystore.jks -deststoretype pkcs12".#Step 3openssl req -new -x509 -keyout ca-key -out ca-cert -days 365#Introduce pass phrase and the same parameters as before.Generating a RSA private key ................+++++ ......................................+++++ writing new private key to 'ca-key' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:PT State or Province Name (full name) []:Example Locality Name (eg, city) [Default City]:Example Organization Name (eg, company) [Default Company Ltd]:Example Organizational Unit Name (eg, section) []:Example Common Name (eg, your name or your server's hostname) []:developerinstance.subnet.vcn.oraclevcn.com Email Address []:eloi.lopes@example.com#Step 4./keytool -keystore /home/opc/kafka/kafka.client.truststore.jks -alias CARoot -importcert -file /home/opc/kafka/ca-cert#put the password and say yes#Step 5 ./keytool -keystore /home/opc/kafka/kafka.server.truststore.jks -alias CARoot -importcert -file /home/opc/kafka/ca-cert#put the password and say yes#Step 5./keytool -keystore /home/opc/kafka/kafka.server.keystore.jks -alias localhost -certreq -file /home/opc/kafka/cert-file#Step 6openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial -passin pass:<YOUR_PASS PHRASE>#Step 7./keytool -keystore /home/opc/kafka/kafka.server.keystore.jks -alias CARoot -importcert -file /home/opc/kafka/ca-cert #put the password and say yes#Step 8./keytool -keystore /home/opc/kafka/kafka.server.keystore.jks -alias localhost -importcert -file /home/opc/kafka/cert-signed #put the password and say yes
Создайте файл с именем zookeeper_jaas.conf . Создайте этот файл в <Kafka home>/config и поместите в него следующий код:
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required user_super="admin-secret"
user_kafka="kafka-secret";
};
Запустите Zookepeeper с помощью следующих команд:
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/opc/kafka/kafka_2.13-3.0.0/config/zookeeper_jaas.conf"bin/zookeeper-server-start.sh config/zookeeper.properties
Давайте настроим брокеры Kafka. Отредактируйте файл <kafka home>/config/server.properties и добавьте следующие строки:
listeners=PLAINTEXT://:9092,SSL://:9093,SASL_SSL://:9094security.inter.broker.protocol=SSL ssl.client.auth=required ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1 ssl.truststore.location=/home/opc/kafka/kafka.server.truststore.jks ssl.truststore.password=<password>ssl.keystore.location=/home/opc/kafka/kafka.server.keystore.jks ssl.keystore.password=<password> ssl.key.password=<password> ssl.endpoint.identification.algorithm= sasl.enabled.mechanisms=PLAIN allow.everyone.if.no.acl.found=trueauthorizer.class.name=kafka.security.authorizer.AclAuthorizer
Теперь создайте новый файл с именем kafka_server_jaas.conf. Создайте этот файл в <Kafka home>/config и добавьте в него следующий код:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required username="kafkabroker" password="kafkabroker-secret" user_kafkabroker="kafkabroker-secret" user_kafka-broker-metric-reporter="kafkabroker-metric-reporter-secret" user_client="client-secret"; };Client { org.apache.zookeeper.server.auth.DigestLoginModule required username="kafka" password="kafka-secret"; };
Чтобы получить доступ к ресурсу, давайте добавим суперпользователя в server.properties. Суперпользователь - это имя, которое Вы указали при создании сертификата. В моем случае это:
super.users=User:CN=developerinstance.subnet.vcn.oraclevcn.com,OU=Example,O=Example,L=Example,ST=Example,C=PT
Теперь запустите сервер kafka
export KAFKA_OPTS=-Djava.security.auth.login.config=/home/opc/kafka/kafka_2.13-3.0.0/config/kafka_server_jaas.confbin/kafka-server-start.sh config/server.properties
Вы можете проверить, правильно ли настроен SSL, выполнив эту команду:
openssl s_client -debug -connect developerinstance.subnet.vcn.oraclevcn.com:9093 -tls1
Настройка клиентов
Настроим сертификат клиента для SSL:
./keytool -keystore /home/opc/kafka/client-certificate/client.keystore.jks -alias localhost -validity 365 -genkey -keyalg RSA -ext SAN=DNS:developerinstance.subnet.vcn.oraclevcn.com#again, fill in with the same parameters./keytool -keystore /home/opc/kafka/client-certificate/client.keystore.jks -alias localhost -certreq -file /home/opc/kafka/client-certificate/client.unsigned.certopenssl x509 -req -CA /home/opc/kafka/ca-cert -CAkey /home/opc/kafka/ca-key -in /home/opc/kafka/client-certificate/client.unsigned.cert -out /home/opc/kafka/client-certificate/client.signed.cert -days 365 -CAcreateserial#Attention is the pass phrase./keytool -keystore /home/opc/kafka/client-certificate/client.keystore.jks -alias CARoot -import -file /home/opc/kafka/ca-cert./keytool -keystore /home/opc/kafka/client-certificate/client.keystore.jks -alias localhost -import -file /home/opc/kafka/client-certificate/client.signed.cert
Теперь создайте файл с именем client_ssl.properties в папке «<kafka_home>/config» и добавьте в него следующие строки:
security.protocol=SSL ssl.truststore.location=/home/opc/kafka/kafka.client.truststore.jks ssl.truststore.password=<password> ssl.keystore.location=/home/opc/kafka/client-certificate/client.keystore.jks ssl.keystore.password=<password> ssl.key.password=<password> ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1 ssl.client.auth=required
Давайте проверим нашу конфигурацию для SSL, создав топик:
bin/kafka-topics.sh --create --topic osa-topic-ssl --partitions 1 --replication-factor 1 --bootstrap-server developerinstance.subnet.vcn.oraclevcn.com:9093 --command-config /home/opc/kafka/kafka_2.13-3.0.0/config/client_ssl.properties#In a new tab run the producer:bin/kafka-console-producer.sh --broker-list developerinstance.subnet.vcn.oraclevcn.com:9093 --topic osa-topic-ssl --producer.config /home/opc/kafka/kafka_2.13-3.0.0/config/client_ssl.properties#Open a new tab and run the consumer:bin/kafka-console-consumer.sh --bootstrap-server developerinstance.subnet.vcn.oraclevcn.com:9093 --topic osa-topic-ssl --consumer.config /home/opc/kafka/kafka_2.13-3.0.0/config/client_ssl.propertiesNow, try to write something on producer tab and should see instantaneously on consumer tab.
Для SASL нужно создать файл (client_sasl.properties) с такой конфигурацией:
security.protocol=SASL_SSL ssl.truststore.location=/home/opc/kafka/kafka.client.truststore.jks ssl.truststore.password=<password> sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="client" \ password="client-secret";
Создаем топик Kafka:
bin/kafka-topics.sh --create --topic osa-topic-sasl --partitions 1 --replication-factor 1 --bootstrap-server developerinstance.subnet.vcn.oraclevcn.com:9094 --command-config /home/opc/kafka/kafka_2.13-3.0.0/config/client_sasl.propertiesbin/kafka-console-producer.sh --broker-list developerinstance.subnet.vcn.oraclevcn.com:9094 --topic osa-topic-sasl --producer.config /home/opc/kafka/kafka_2.13-3.0.0/config/client_sasl.propertiesbin/kafka-console-consumer.sh --bootstrap-server developerinstance.subnet.vcn.oraclevcn.com:9094 --topic osa-topic-sasl --consumer.config /home/opc/kafka/kafka_2.13-3.0.0/config/client_sasl.properties
Теперь создадим пользователя:
bin/kafka-configs.sh --bootstrap-server developerinstance.subnet.vcn.oraclevcn.com:9094 --alter --add-config 'SCRAM-SHA-512=[password='kafkabroker-secret']' --entity-type users --entity-name kafkabroker --command-config /home/opc/kafka/kafka_2.13-3.0.0/config/client_sasl.properties
Надеюсь, это поможет новичкам в освоении SSL/SASL Kafka.




