javascript

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

  • суббота, 5 апреля 2025 г. в 00:00:08
https://habr.com/ru/articles/897624/

Настройка односторонней аутентификации (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