Настройка односторонней аутентификации (One-Way SSL) для kafka

от автора

Настройка односторонней аутентификации (One-Way SSL) для kafka предполагает, что сервер проверяет свою подлинность перед клиентами с использованием SSL-сертификата, но клиенты не предоставляют свои сертификаты. Это наиболее распространенный сценарий использования SSL в kafka.

Ниже приведен пошаговый процесс настройки односторонней аутентификации:

Подготовка SSL-сертификатов

Если у вас еще нет SSL-сертификатов, выполните следующие шаги для их создания:

Генерация корневого сертификата (CA)

# Создаем директорию для SSL mkdir -p ssl && cd ssl  # Генерируем корневой сертификат (CA) openssl req -new -x509 -keyout ca.key -out ca.crt -days 365 -nodes \     -subj "/CN=kafka-Security-CA" 

Генерация приватного ключа и сертификата для сервера

# Генерируем приватный ключ для сервера openssl genrsa -out server.key 2048  # Создаем CSR (Certificate Signing Request) для сервера openssl req -new -key server.key -out server.csr \     -subj "/CN=kafka-server"  # Подписываем серверный сертификат с помощью CA openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 

Создание truststore для клиентов

# Генерируем truststore для клиентов keytool -keystore client.truststore.jks -alias CARoot -import -file ca.crt -storepass password -noprompt 

После выполнения этих команд у вас будут:

  • ca.crt — корневой сертификат.

  • server.crt и server.key — сертификат и приватный ключ сервера.

  • client.truststore.jks — truststore для клиентов.

Настройка kafka с SSL

Создание keystore для сервера

kafka требует, чтобы серверные сертификаты хранились в формате JKS (Java KeyStore). Создайте keystore:

# Преобразуем серверный сертификат и ключ в PKCS12 формат openssl pkcs12 -export -in server.crt -inkey server.key -name kafka-server -out server.keystore.p12 -password pass:password  # Конвертируем PKCS12 в JKS keytool -importkeystore -srckeystore server.keystore.p12 -srcstoretype PKCS12 -destkeystore server.keystore.jks -deststoretype JKS -storepass password 

Настройка файла docker-compose.yml

Создайте файл docker-compose.yml для запуска Kafka с SSL:

version: '3.8'  services:   zookeeper:     image: confluentinc/cp-zookeeper:latest     container_name: zookeeper     ports:       - "2181:2181"     environment:       ZOOKEEPER_CLIENT_PORT: 2181       ZOOKEEPER_TICK_TIME: 2000    kafka:     image: confluentinc/cp-kafka:latest     container_name: kafka     depends_on:       - zookeeper     ports:       - "9092:9092"  # Порт без SSL       - "9093:9093"  # Порт с SSL     environment:       KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181       KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9093       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,SSL://localhost:9093       KAFKA_SSL_KEYSTORE_FILENAME: server.keystore.jks       KAFKA_SSL_KEYSTORE_CREDENTIALS: keystore_creds       KAFKA_SSL_KEY_CREDENTIALS: key_creds       KAFKA_SSL_TRUSTSTORE_FILENAME: server.truststore.jks       KAFKA_SSL_TRUSTSTORE_CREDENTIALS: truststore_creds     volumes:       - ./ssl/server.keystore.jks:/etc/kafka/secrets/server.keystore.jks       - ./ssl/ca.crt:/etc/kafka/secrets/ca.crt       - ./ssl/client.truststore.jks:/etc/kafka/secrets/server.truststore.jks       - ./ssl_credentials:/etc/kafka/secrets/credentials 

Создание файлов с паролями

Создайте файлы с паролями для доступа к хранилищам:

echo "password" > ssl_credentials/keystore_creds echo "password" > ssl_credentials/key_creds echo "password" > ssl_credentials/truststore_creds 

В результате должна получиться следующая структура файлов:

. ├── client.properties ├── docker-compose.yml ├── ssl │   ├── ca.crt │   ├── ca.key │   ├── ca.srl │   ├── client.truststore.jks │   ├── server.crt │   ├── server.csr │   ├── server.key │   ├── server.keystore.jks │   ├── server.keystore.p12 │   └── server.truststore.jks └── ssl_credentials     ├── key_creds     ├── keystore_creds     └── truststore_creds 

Запуск kafka

Запустите kafka с помощью команды:

docker-compose up -d 

Настройка клиента

Для подключения клиента к kafka через SSL (например, из командной строки или Offset Explorer), используйте следующие параметры:

###Пример конфигурации клиента (client.properties):

security.protocol=SSL ssl.truststore.location=/path/to/client.truststore.jks ssl.truststore.password=password ssl.endpoint.identification.algorithm= 

Пример использования командной строки:

kafka-console-producer --broker-list localhost:9093 --topic test-topic \   --producer.config client.properties 

Проверка работы

Чтобы убедиться, что все работает корректно:

  1. Запустите kafka и создайте топик:

    kafka-topics --bootstrap-server localhost:9093 --create --topic test-topic --partitions 1 --replication-factor 1 
  2. Отправьте сообщение в топик:

    kafka-console-producer --broker-list 127.0.0.1:9093 --topic test-topic \   --producer.config client.properties 
  3. Прочитайте сообщение из топика:

    kafka-console-consumer --bootstrap-server 127.0.0.1:9093 --topic test-topic --from-beginning \   --consumer.config client.properties 


ссылка на оригинал статьи https://habr.com/ru/articles/897624/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *