Использование MIT Kerberos в Kafka

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

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

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

  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. Проверьте наличие созданных принципалов для каждого сервиса.

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

    $ sudo kadmin.local list_principals

    Вывод списка принципалов показывает, что созданы принципалы для каждого хоста каждого установленного сервиса, принципалы админов и другие технические принципалы для созданной области:

    K/M@ADS-KAFKA.LOCAL
    admin/admin@ADS-KAFKA.LOCAL
    kadmin/admin@ADS-KAFKA.LOCAL
    kadmin/changepw@ADS-KAFKA.LOCAL
    kadmin/sov-ads-test-0.ru-central1.internal@ADS-KAFKA.LOCAL
    kafka-manager/sov-ads1-test.ru-central1.internal@ADS-KAFKA.LOCAL
    kafka/sov-ads1-test.ru-central1.internal@ADS-KAFKA.LOCAL
    kafka/sov-ads2-test.ru-central1.internal@ADS-KAFKA.LOCAL
    kafka/sov-ads3-test.ru-central1.internal@ADS-KAFKA.LOCAL
    kiprop/sov-ads-test-0.ru-central1.internal@ADS-KAFKA.LOCAL
    krbtgt/ADS-KAFKA.LOCAL@ADS-KAFKA.LOCAL
    zookeeper/sov-ads1-test.ru-central1.internal@ADS-KAFKA.LOCAL
    zookeeper/sov-ads2-test.ru-central1.internal@ADS-KAFKA.LOCAL
    zookeeper/sov-ads3-test.ru-central1.internal@ADS-KAFKA.LOCA
  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

Для производителя (producer) и потребителя (consumer) можно создать принципалы соответствующих пользователей.

Для этого поочередно введите команды, используя имя пользователя и пароль:

$ sudo kadmin.local -q "add_principal -pw PASSWORD reader@ADS-KAFKA.LOCAL"
$ sudo kadmin.local -q "add_principal -pw PASSWORD writer@ADS-KAFKA.LOCAL"

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

Principal "reader@ADS-KAFKA.LOCAL" created.
Principal "writer@ADS-KAFKA.LOCAL" created.

Создание 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

Для новых принципалов writer и reader самостоятельно создайте 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. Откройте терминальную сессию 1 и подключитесь к одному из брокеров Kafka.

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

    $ kinit -p writer@ADS-KAFKA.LOCAL

    Введите пароль, указанный при создании пользователя.

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

    $ klist
    Ticket cache: FILE:/tmp/krb5cc_1000
    Default principal: writer@ADS-KAFKA.LOCAL
    
    Valid starting       Expires              Service principal
    08/10/2022 20:44:12  08/11/2022 20:44:12  krbtgt/ADS-KAFKA.LOCAL@ADS-KAFKA.LOCAL
    ПРИМЕЧАНИЕ
    Полное описание функций команды kinit и применяемых опций приведены по ссылке kinit.
  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. Откройте терминальную сессию 2 и подключитесь к одному из брокеров Kafka.

  8. Создайте тикет для пользователя reader:

    $ kinit -k reader@ADS-KAFKA.LOCAL -t /tmp/reader.user.keytab
  9. Проверьте тикет:

    $ klist
    Ticket cache: FILE:/tmp/krb5cc_1000
    Default principal: reader@ADS-KAFKA.LOCAL
    
    Valid starting       Expires              Service principal
    08/10/2022 21:30:47  08/11/2022 21:30:47  krbtgt/ADS-KAFKA.LOCAL@ADS-KAFKA.LOCAL
  10. Экспортируйте созданный файл client.jaas как параметр JVM для данного пользователя при помощи переменной среды KAFKA_OPTS:

    $ export  KAFKA_OPTS="-Djava.security.auth.login.config=/tmp/client.jaas"
  11. Считайте сообщения из топика, указав путь к созданному файлу 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 чтобы сообщить о ней