Можно ли предоставить Kafka собственный LoginModule для поддержки LDAP?

Kafka можно настроить для использования нескольких механизмов аутентификации: открытого текста имени пользователя и пароля, Kerberos или SSL. Первые 2 используют SASL, где требуется файл конфигурации JAAS.

Для метода аутентификации с использованием обычного текста конфигурация выглядит так (взято из документация):

KafkaServer {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="admin-secret"
   user_admin="admin-secret"
   user_alice="alice-secret";
};

Я хочу аутентифицироваться, если это возможно, с помощью LDAP. У меня такой вопрос: если я заменю PlainLoginModule классом, реализующим LoginModule и поместите этот класс в путь к классам брокера. Могу ли я реализовать аутентификацию любым способом (например, LDAP)?

Я не могу использовать Kerberos разумным образом из-за того, как его участники определены в организации, в которой я работаю, поэтому я хочу использовать LDAP, поскольку мне нужно поддерживать RBAC.


person John    schedule 14.11.2017    source источник


Ответы (1)


Да, вы можете предоставить Kafka собственный класс, реализующий LoginModule и имеющий в нем нужную вам логику аутентификации.

Затем обновите файл JAAS, указав имя вашего класса и убедитесь, что он указан в пути к классам.

Вам нужно будет добавить шаблонный код, чтобы все правильно настроить, но вы можете использовать PlainLoginModule, PlainSaslServerProvider, PlainSaslServerFactory и PlainSaslServer в качестве примеров.

Ваш LoginModule класс должен иметь ту же логику, что и PlainLoginModule, но вместо этого инициализируйте вашу реализацию Provider (в статическом блоке).

Ваш Provider класс должен иметь ту же логику, что и PlainSaslServerProvider, но вместо этого ссылаться на вашу SaslServerFactory реализацию.

Ваш SaslFactory класс снова должен иметь ту же логику, что и PlainSaslServerFactory, но создавать экземпляр вашей SaslServer реализации.

Наконец, ваш SaslServer класс должен реализовать необходимую логику LDAP в своем evaluateResponse() методе. Просто убедитесь, что правильно установили this.authorizationId, так как он станет основным пользователем и установит complete на true (как PlainSaslServer.evaluateResponse()).

person Mickael Maison    schedule 14.11.2017
comment
У вас есть пример того, где это было сделано? - person John; 15.11.2017
comment
К сожалению, у меня нет примера, которым я мог бы поделиться, но я добавил подробности о том, как все настроить. Вам нужно определить несколько классов, но в основном это строительные леса с очень небольшой логикой. - person Mickael Maison; 16.11.2017
comment
Отлично, спасибо - хорошо записать, что вам нужно реализовать все эти классы, а не только LoginModule, поскольку я на собственном горьком опыте узнал, что PlainSaslServer жестко кодирует зависимость от PlainLoginModule, и вы получите неудачные ошибки аутентификации (без журналов). , если вы не включили DEBUG, для версий ‹v1.0). - person John; 17.11.2017
comment
@John Confluent Enterprise теперь имеет авторизатор LDAP docs.confluent.io/ текущие / confluent-security-plugins / kafka / - person OneCricketeer; 01.10.2018