Аутентификация Kafka API
Включение аутентификации
При самостоятельном развертывании YDB по умолчанию используется анонимная аутентификация
, не требующая логина-пароля.
Чтобы включить обязательную аутентификацию, следуйте инструкции в статье Аутентификация.
Аутентификация всегда включена при использовании Kafka API в Yandex Cloud
Механизмы аутентификации
В Kafka API поддержано два механизма SASL аутентификации: PLAIN и SCRAM-SHA-256, а также mTLS аутентификация.
Аутентификация с помощью PLAIN и SCRAM-SHA-256
Оба механизма могут осуществляться как внутри протокола TLS, так и вне, порождая соответственно комбинации:
SASL_PLAINTEXT/PLAIN;SASL_SSL/PLAIN;SASL_PLAINTEXT/SCRAM-SHA-256;SASL_SSL/SCRAM-SHA-256.
Важно
Для использования механизма SCRAM-SHA-256 при аутентификации существующих пользователей может потребоваться смена пароля.
Для аутентификации необходимы:
<user-name>— имя пользователя. Об управлении пользователями читайте в разделе Аутентификация.<password>— пароль пользователя. Об управлении пользователями читайте в разделе Аутентификация.<database>— путь к базе данных, с которой предполагается дальнейшее взаимодействие. (Необходим только для механизмаPLAIN).
Для механизма SCRAM-SHA-256 база данных определяется на основе настроек подключения Kafka Connect.
Целевой базой данных считается та база, к которой относится узел базы данных, имеющий указанный <ydb-endpoint>.
Из этих параметров формируются следующие переменные, которые вы можете использовать в
sasl.jaas.config параметре конфигурации клиента Kafka:
<sasl.username>=<user-name>[@<database>]<sasl.password>=<password>
Важно
Обратите внимание, логика формирования <sasl.username> и <sasl.password> в облачных инсталляциях YDB может отличаться от приведенной здесь.
Примеры аутентификации смотрите в Чтение и запись.
Аутентификация по mTLS
Чтобы Kafka-клиент мог аутентифицироваться по mTLS, нужно выполнить следующие шаги.
Создание серверного и клиентского сертификатов
Для каждого шага ниже представлены примеры команд. Замените *** на ваши значения.
- Создайте Certificate Authority (CA)
openssl genrsa -out ca-key.pem 4096
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/C=***/ST=***/L=***/O=***/CN=MyKafkaRootCA"
- Создайте сертификат для сервера
openssl genrsa -out server-key.pem 4096
В следующей команде вместо serverhost.com также укажите название вашего хоста.
openssl req -new -key server-key.pem -out server-cert.csr -subj "/C=***/ST=***/L=***/O=***/CN=serverhost.com"
cat > server-ext.cnf << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = DNS:serverhost.com
EOF
openssl x509 -req -in server-cert.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 365 -extfile server-ext.cnf
- Создайте клиентский сертификат
openssl genrsa -out client-key.pem 4096
Замените clienthost.com на hostname вашего клиента.
openssl req -new -key client-key.pem -out client-cert.csr -subj "/C=***/ST=***/L=***/O=***/CN=clienthost.com"
cat > client-ext.cnf << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = DNS:clienthost.com
EOF
openssl x509 -req -in client-cert.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 365 -extfile client-ext.cnf
- Добавьте сертификаты в keystore и truststore
Для сервера:
openssl pkcs12 -export -in server-cert.pem -inkey server-key.pem -out server.p12 -name kafka-server -CAfile ca-cert.pem -caname root -password pass:changeit
keytool -importkeystore -deststorepass changeit -destkeystore server.keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass changeit -alias kafka-server
keytool -import -trustcacerts -alias ca -file ca-cert.pem -keystore server.truststore.jks -storepass changeit -noprompt
Для клиента:
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client.p12 -name kafka-client -CAfile ca-cert.pem -caname root -password pass:changeit
keytool -importkeystore -deststorepass changeit -destkeystore client.keystore.jks -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass changeit -alias kafka-client
keytool -import -trustcacerts -alias ca -file ca-cert.pem -keystore client.truststore.jks -storepass changeit -noprompt
После этих пунктов у вас должны появиться нужные keystore и truststore, а также файлы с сертификатами и ключами.
Конфигурация клиента
Пример для Java SDK
props.put("security.protocol", "SSL");
props.put("ssl.truststore.password", "changeit");
props.put("ssl.truststore.location", "/full/path/to/client.truststore.jks");
props.put("ssl.keystore.location", "/full/path/to/client.keystore.jks");
props.put("ssl.keystore.password", "changeit");
props.put("ssl.key.password", "changeit");
props.put("ssl.endpoint.identification.algorithm", "");
Пример для Kafka cli
security.protocol=SSL
ssl.truststore.password=changeit
ssl.truststore.location=/full/path/to/client.truststore.jks
ssl.keystore.location=/full/path/to/client.keystore.jks
ssl.keystore.password=changeit
ssl.key.password=changeit
ssl.endpoint.identification.algorithm=
Конфигурация YDB
Требуется указать нужные поля в конфигурации kafka_proxy_config.
kafka_proxy_config:
enable_kafka_proxy: true
listening_port: your_port
mtls_enable: true
key: "server-key.pem" # укажите правильные пути до файлов
cert: "server-cert.pem"
ca: "ca-cert.pem"
enable_self_signed_certs: true # разрешаете ли вы самоподписанные сертификаты
Также укажите в конфигурации client_certificate_authorization правила, по которым будет проходить аутентификация:
client_certificate_authorization:
client_certificate_definitions:
- require_same_issuer: true
subject_terms:
- short_name: CN
suffixes:
- '.myhost.net' # нужно заменить на нужный суффикс
member_groups:
- user@cert # заменить на нужную member группу
request_client_certificate: true
Для корректной работы нужно использовать тот же сертификат, что и в настройках grpc, поэтому нужно указать путь до этого же серверного сертификата в конфигурации grpc.
Сейчас настроить конфигурации Kafka и grpc с разными серверными сертификатами или указать серверный сертификат только в настройках kafka_proxy_config при использовании mtls нельзя.
grpc_config:
cert: "/path/to/server-cert.pem"