Вопрос или проблема
Все зашифрованные части указаны в [скобках].
У меня настроен 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 для проверки аутентификации.
Пример
Вы уже сделали важные шаги, включая:
- Создание keytab файла с помощью
ktpass.exe
. - Настройку конфигурации MySQL для использования Kerberos (например, через
plugin-load-add
и указание параметров keytab и service principal). - Проверку активации плагина через
INFORMATION_SCHEMA.PLUGINS
.
Тем не менее, есть несколько областей для дальнейшего изучения и коррекции.
Применение
-
Проверка Keytab и Уровней доступа: Убедитесь, что права доступа к файлу
mysql.keytab
корректны и что MySQL сервер имеет необходимые привилегии для его чтения. Несмотря на то, что права на файл уже установлены (что видно из выводаls -l
), можно дополнительно проверить контекст безопасности SELinux (если применимо) с помощьюls -Z /var/mysql/data/mysql.keytab
. -
Точность SPN и UPN:
- Дважды проверьте
SPN
иUPN
на соответствие ожидаемым форматам в вашей Active Directory. Также убедитесь, что они уникальны и не дублируются. - Попробуйте использовать SPN и UPN в одном формате
mysql/[server_hostname]@[realm_fqdn]
.
- Дважды проверьте
-
Версия MySQL и Плагины:
- Убедитесь, что версия MySQL поддерживает и корректно активирует Kerberos. Несмотря на то, что плагин "ACTIVE", иногда могут потребоваться последние обновления или патчи.
- Проверьте logs MySQL в
/var/log/mysqld.log
для получения дополнительных данных об ошибках аутентификации.
-
Проверка Kerberos:
- Запустите
kinit
для получения нового билета и убедитесь, что он сохраняется в кэш. - Используйте
klist
для проверки всех активных билетов и подтверждения, что SPN в билете соответствует ожидаемому.
- Запустите
-
Ошибка аутентификации:
- Скорее всего, проблема заключается либо в неверном формате предоставленных данных аккаунта, либо в некорректной настройке сервиса аутентификации на стороне MySQL.
- Рассмотрите возможность использования утилит как
tcpdump
для мониторинга трафика и откладочного режима MySQL для сбора более детальных логов.
Если после этих шагов проблема сохраняется, следует рассмотреть более детальную диагностику с помощью инструментов MySQL Enterprise Support или обновление до самой стабильной версии сервера MySQL.