Аутентификация MySQL GSSAPI не удалась с ошибкой “Отказано в доступе”.

Вопрос или проблема

Все зашифрованные части указаны в [скобках].

У меня настроен MySQL на Rocky Linux v9.5 с MySQL Enterprise v9.1.0-1.1el9.

Используя пробную версию MySQL Enterprise Edition, я пытаюсь настроить и запустить плагин GSSAPI для аутентификации учетных записей в нашем домене Active Directory. Я получаю стандартное сообщение “Доступ запрещён для пользователя ‘[user]‘@’[client host name]‘ (с использованием пароля: НЕТ)”

Контекст:

  • Около года назад мне удалось запустить это для MariaDB, но из-за специфических требований мы планируем перейти на MySQL, и Enterprise Edition необходим для аутентификации с использованием Kerberos Pluggable Authentication.
  • Сервер подключён к домену Active Directory.

Я сгенерировал файл keytab на контроллере домена с помощью команды ktpass.exe /princ mysql/[server_hostname]@[realm_fqdn] /mapuser svc_mysql /pass [service account password] /out mysql.keytab /crypto all /ptype KRB5_NT_PRINCIPAL /mapop set, затем переместил сгенерированный файл keytab в /var/mysql/data/

В Windows-домене для учетной записи сервиса следующие SPN и UPN:

  • SPN: mysql/[server_hostname]@[realm_fqdn]
  • UPN: mysql/[server_hostname]@[realm_fqdn]
$ ls -l /var/mysql/data/
total 4
-rw-------. 1 mysql mysql 412 Jan 13 09:20 mysql.keytab

Содержимое файла /etc/my.cnf:

[client-server]
port = 3306
socket = /run/mysqld/mysqld.sock

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

plugin-load-add=authentication_kerberos.so
authentication_kerberos_service_principal=mysql/[server_hostname]@[realm_fqdn]
authentication_kerberos_service_key_tab=/var/mysql/data/mysql.keytab

[mysql]
plugin_authentication_kerberos_client_mode=GSSAPI

Подтверждено, что плагин активен с помощью:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    ->        FROM INFORMATION_SCHEMA.PLUGINS
    ->        WHERE PLUGIN_NAME = 'authentication_kerberos';
+-------------------------+---------------+
| PLUGIN_NAME             | PLUGIN_STATUS |
+-------------------------+---------------+
| authentication_Kerberos | ACTIVE        |
+-------------------------+---------------+
1 row in set (0.00 sec)

Затем я создал пользователя с помощью:

CREATE USER [sAMaccountName]
  IDENTIFIED WITH authentication_kerberos
  BY '[realm_fqdn]';

Авторизация этим пользователем на сервере даёт ошибку:

$ mysql
ERROR 1045 (28000): Access denied for user '[UPN]'@'localhost' (using password: NO)

Вот вывод из klist & kinit:

$ kinit [sAMAccountName]
Password for [UPN]:
$ klist
Ticket cache: KCM:1930002249:43752
Default principal: [UPN]
Valid starting       Expires              Service principal
01/13/2025 10:45:22  01/13/2025 20:45:22  krbtgt/[fqdn]@[fqdn]
        renew until 01/20/2025 10:45:15

Мне не удалось найти никаких ошибок, которые были бы более полезными или информативными, чем стандартная ошибка “Доступ запрещён”.

Есть ли у кого-нибудь предложения по поиску и устранению неисправностей или потенциальные журналы ошибок?

Ответ или решение

Ваша проблема связана с ошибками аутентификации MySQL через GSSAPI при использовании Active Directory. Для решения этой проблемы нужно учесть несколько важных аспектов.

Теория

Во-первых, необходимо убедиться, что все элементы экосистемы Kerberos настроены корректно. Это включает в себя правильную настройку службы имен (SPN) и учетной записи пользователя службы (UPN) в Active Directory, корректную генерацию и размещение файла keytab, а также правильные параметры конфигурации MySQL. Ваша среда должна позволять MySQL успешно взаимодействовать с Active Directory для проверки аутентификации.

Пример

Вы уже сделали важные шаги, включая:

  1. Создание keytab файла с помощью ktpass.exe.
  2. Настройку конфигурации MySQL для использования Kerberos (например, через plugin-load-add и указание параметров keytab и service principal).
  3. Проверку активации плагина через INFORMATION_SCHEMA.PLUGINS.

Тем не менее, есть несколько областей для дальнейшего изучения и коррекции.

Применение

  1. Проверка Keytab и Уровней доступа: Убедитесь, что права доступа к файлу mysql.keytab корректны и что MySQL сервер имеет необходимые привилегии для его чтения. Несмотря на то, что права на файл уже установлены (что видно из вывода ls -l), можно дополнительно проверить контекст безопасности SELinux (если применимо) с помощью ls -Z /var/mysql/data/mysql.keytab.

  2. Точность SPN и UPN:

    • Дважды проверьте SPN и UPN на соответствие ожидаемым форматам в вашей Active Directory. Также убедитесь, что они уникальны и не дублируются.
    • Попробуйте использовать SPN и UPN в одном формате mysql/[server_hostname]@[realm_fqdn].
  3. Версия MySQL и Плагины:

    • Убедитесь, что версия MySQL поддерживает и корректно активирует Kerberos. Несмотря на то, что плагин "ACTIVE", иногда могут потребоваться последние обновления или патчи.
    • Проверьте logs MySQL в /var/log/mysqld.log для получения дополнительных данных об ошибках аутентификации.
  4. Проверка Kerberos:

    • Запустите kinit для получения нового билета и убедитесь, что он сохраняется в кэш.
    • Используйте klist для проверки всех активных билетов и подтверждения, что SPN в билете соответствует ожидаемому.
  5. Ошибка аутентификации:

    • Скорее всего, проблема заключается либо в неверном формате предоставленных данных аккаунта, либо в некорректной настройке сервиса аутентификации на стороне MySQL.
    • Рассмотрите возможность использования утилит как tcpdump для мониторинга трафика и откладочного режима MySQL для сбора более детальных логов.

Если после этих шагов проблема сохраняется, следует рассмотреть более детальную диагностику с помощью инструментов MySQL Enterprise Support или обновление до самой стабильной версии сервера MySQL.

Оцените материал
Добавить комментарий

Капча загружается...