Настройка односторонней аутентификации (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
Проверка работы
Чтобы убедиться, что все работает корректно:
-
Запустите kafka и создайте топик:
kafka-topics --bootstrap-server localhost:9093 --create --topic test-topic --partitions 1 --replication-factor 1
-
Отправьте сообщение в топик:
kafka-console-producer --broker-list 127.0.0.1:9093 --topic test-topic \ --producer.config client.properties
-
Прочитайте сообщение из топика:
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/
Добавить комментарий