Использование Kerberos с MS Active Directory в Kafka

В данной статье описаны первые шаги в Kafka c установленным Kerberos LDAP.

ПРИМЕЧАНИЕ
Включение аутентификации про протоколу Kerberos LDAP осуществляется в соответствии со статьей Kerberos с MS Active Directory.

Проверка установленного Kerberos LDAP

  1. Проверьте настройки, установленные для Kerberos в конфигурациях кластера.

    Зайдите в конфигурации кластера, выберите Show advanced, найдите раздел с конфигурациями Kerberos, разверните его.

    Установленные настройки конфигурации кластера ADS для Kerberos
    Установленные настройки конфигурации кластера ADS для Kerberos
  2. Проверьте конфигурацию безопасности и аутентификации брокеров Kafka.

    На каждом хосте с брокером Kafka введите команду:

    $ sudo vim /usr/lib/kafka/config/server.properties

    Убедитесь, что в файле server.properties для каждого брокера Kafka строки, определяющие протокол безопасности, изменены на SASL_PLAINTEXT; строки, определяющие механизм аутентификации - на GSSAPI.

    security.inter.broker.protocol=SASL_PLAINTEXT
    
    
    sasl.mechanism.inter.broker.protocol=GSSAPI
    sasl.enabled.mechanisms=GSSAPI
  3. Проверьте, что после установки Kerberos SASL в настройках сервиса Kafka в группе Main изменился параметр listeners с PLAINTEXT://:9092 на SASL_PLAINTEXT://:9092.

    Настройки сервиса Kafka
    Настройки сервиса Kafka
  4. При помощи утилиты командной строки для поиска в каталоге LDAP ldapsearch с хоста брокера Kafka существует возможность проверить созданные принципиалы в среде AD.RANGER-TEST в заданном Container DN.

    Ввести команду, указав Admin DN, Container DN и пароль пользователя, указанные при запуске LDAP на ADCM:

    $ ldapsearch -v -H ldaps://ldap_host -x -D "cn=admin,ou=kerberos,ou=adh,dc=ad,dc=ranger-test" -b "ou=admin_ou,ou=kerberos,ou=adh,dc=ad,dc=ranger-test" -w Password

    В результате выводится информация по каждой созданной учетной записи в LDAP для каждого хоста каждого сервиса ADS. Вариант вывода для одной учетной записи:

    # kafka/sov-ads-test-5.ru-central1.internal, admin_ou, kerberos, adh, ad.ranger-test
    dn: CN=kafka/sov-ads-test-5.ru-central1.internal,OU=admin_ou,OU=kerberos,OU=adh,DC=ad,DC=ranger-test
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: user
    cn: kafka/sov-ads-test-5.ru-central1.internal
    distinguishedName: CN=kafka/sov-ads-test-5.ru-central1.internal,OU=admin_ou,OU=kerberos,OU=adh,DC=ad,DC=ranger-test
    instanceType: 4
    whenCreated: 20220816100038.0Z
    whenChanged: 20220816100042.0Z
    uSNCreated: 14950769
    uSNChanged: 14950786
    name: kafka/sov-ads-test-5.ru-central1.internal
    objectGUID:: S/7BU9kZcE6pOwqxKUDJRQ==
    userAccountControl: 66048
    badPwdCount: 0
    codePage: 0
    countryCode: 0
    badPasswordTime: 0
    lastLogoff: 0
    lastLogon: 133053546143620502
    pwdLastSet: 133051176384557312
    primaryGroupID: 513
    objectSid:: AQUAAAAAAAUVAAAAKcXXWJ6nBwdKJbrR0v8QAA==
    accountExpires: 0
    logonCount: 50
    sAMAccountName: $IUV110-ESD8M6LCFJGL
    sAMAccountType: 805306368
    userPrincipalName: kafka/sov-ads-test-5.ru-central1.internal@AD.RANGER-TEST
    servicePrincipalName: kafka/sov-ads-test-5.ru-central1.internal
    objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=ad,DC=ranger-test
    dSCorePropagationData: 16010101000000.0Z
    lastLogonTimestamp: 133051176422839302
    ПРИМЕЧАНИЕ
    Полное описание функций утилиты командной строки ldapsearch и применяемых опций приведены по ссылке ldapsearch.
  5. Проверьте наличие на хостах c установленными сервисами файлов для хранения паролей *.service.keytab.

    На каждом хосте с установленными сервисами введите команду:

    $ ls -la /etc/security/keytabs/

    Вывод списка файлов показывает, что созданы файлы *.service.keytab для каждого сервиса, установленного на хост:

    total 16
    drwxr-xr-x. 2 root       root        102 Aug  9 20:55 .
    drwxr-xr-x. 7 root       root       4096 Aug  9 19:38 ..
    -rw-------. 1 dockerroot dockerroot  890 Aug  9 20:55 kafka-manager.service.keytab
    -rw-------. 1 kafka      kafka       826 Aug  9 20:54 kafka.service.keytab
    -rw-------. 1 zookeeper  zookeeper   858 Aug  9 20:55 zookeeper.service.keytab

Подключение клиента к Kafka с аутентификацией по протоколу LDAP

По умолчанию каждый пользователь из базы данных службы каталогов Active Directory, имеющий принципал в заданной области (realm), имеет права на подключение к кластеру Kafka и выполнение действий с топиками.

Создание JAAS-файла для пользователя

Для всех принципалов должен быть создан JAAS-файл (Java Authentication and Authorization Service). В нем указывается, как будут использованы тикеты для конкретного принципала.

ПРИМЕЧАНИЕ
  • Описание JAAS-файла и применяемых опций приведены в статье Krb5LoginModule.

  • Данные клиентских подключений можно также указать в разделе KafkaClient файла kafka-jaas.conf при использовании шаблона JAAS-файла для сервиса Kafka.

Для принципалов брокеров после керберизации автоматически создаются параметры подключения в файле kafka-jaas.conf. Для того чтобы посмотреть cодержимое файла, введите команду:

$ sudo vim /usr/lib/kafka/config/kafka-jaas.conf

Для принципалов клиента необходимо самостоятельно создать файл JAAS.

  1. Выполните команду:

    $ sudo vim /tmp/client.jaas
  2. Введите данные в файл:

    KafkaClient {
    com.sun.security.auth.module.Krb5LoginModule required
    useTicketCache=true;
    };

     — где useTicketCache — параметр, определяющий, будет ли тикет для этого пользователя получен из кеша тикетов. При установке данного параметра в true перед подключением в Kafka необходимо создать тикет пользователя.

Создание файла конфигурации .properties для пользователя

Для создания файла конфигурации .properties для пользователя выполните команду:

$ sudo vim /tmp/client.properties

Заполните файл данными:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka

Подключение пользователя к Kafka (создание тикетов) и работа с .sh файлами (скриптами)

  1. Открыть терминальную сессию и подключиться к одному из брокеров Kafka.

  2. Создать тикет для пользователя, введя пароль:

    $ kinit -p admin-kafka@AD.RANGER-TEST
    Password for admin-kafka@AD.RANGER-TEST:
    ПРИМЕЧАНИЕ
    • В данном примере admin-kafka - пользователь, имеющий запись в базе данных службы каталогов Active Directory и принципал для области AD.RANGER-TEST.

    • Полное описание функций команды kinit и применяемых опций приведены по ссылке kinit.

  3. Проверить тикет:

    $ klist
    Ticket cache: FILE:/tmp/krb5cc_1000
    Default principal: admin-kafka@AD.RANGER-TEST
    
    Valid starting       Expires              Service principal
    08/19/2022 14:18:33  08/20/2022 00:18:33  krbtgt/AD.RANGER-TEST@AD.RANGER-TEST
    	renew until 08/20/2022 14:17:35
  4. Экспортируйте созданный файл client.jaas как параметр JVM для данного пользователя при помощи переменной среды KAFKA_OPTS:

    $ export  KAFKA_OPTS="-Djava.security.auth.login.config=/tmp/client.jaas"
  5. Создайте топик, указав путь к созданному файлу client.properties:

    $ /usr/lib/kafka/bin/kafka-topics.sh --create --topic test-topic --bootstrap-server sov-ads-test-1.ru-central1.internal:9092,sov-ads-test-2.ru-central1.internal:9092,sov-ads-test-3.ru-central1.internal:9092 --command-config /tmp/client.properties

    Получите подтверждение:

    Created topic test-topic.
  6. Запишите сообщение в топик, указав путь к созданному файлу client.properties:

    $ /usr/lib/kafka/bin/kafka-console-producer.sh --topic test-topic --bootstrap-server sov-ads-test-1.ru-central1.internal:9092,sov-ads-test-2.ru-central1.internal:9092,sov-ads-test-3.ru-central1.internal:9092 --producer.config /tmp/client.properties
    >One
    >Two
    >Three
    >Four
    >Five
  7. Считайте сообщения из топика, указав путь к созданному файлу client.properties:

    $/usr/lib/kafka/bin/kafka-console-consumer.sh --topic test-topic --from-beginning  --bootstrap-server sov-ads-test-1.ru-central1.internal:9092,sov-ads-test-2.ru-central1.internal:9092,sov-ads-test-3.ru-central1.internal:9092 --consumer.config /tmp/client.properties

    Полученные сообщения:

    One
    Two
    Three
    Four
    Five

    Убедитесь в корректности принятых сообщений.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней