8.4.1.7 Подключаемая аутентификация LDAP
Подключаемая аутентификация LDAP — это расширение, включенное в MySQL Enterprise Edition, коммерческий продукт. Чтобы узнать больше о коммерческих продуктах, посетите https://www.mysql.com/products/.
MySQL Enterprise Edition поддерживает метод аутентификации, который позволяет MySQL Server использовать LDAP (Lightweight Directory Access Protocol) для аутентификации пользователей MySQL, обращаясь к службам каталогов, таким как X.500. MySQL использует LDAP для получения информации о пользователях, учетных данных и группах.
Подключаемая аутентификация LDAP предоставляет следующие возможности:
Внешняя аутентификация: аутентификация LDAP позволяет MySQL Server принимать подключения от пользователей, определённых вне таблиц предоставления прав MySQL в каталогах LDAP.
Поддержка прокси-пользователей: аутентификация LDAP может возвращать MySQL имя пользователя, отличное от внешнего имени пользователя, переданного программой-клиентом, на основе групп LDAP, членами которых является внешний пользователь. Это означает, что плагин LDAP может возвращать пользователю MySQL, определяющему привилегии, которые должен иметь внешний пользователь, аутентифицированный по LDAP. Например, пользователь LDAP с именем
joeможет подключиться и иметь привилегии пользователя MySQL с именемdeveloper, если группа LDAP дляjoeявляетсяdeveloper.Безопасность: с помощью TLS подключения к серверу LDAP могут быть защищены.
Доступны плагины сервера и клиента для простой и основанной на SASL аутентификации LDAP. В Microsoft Windows плагин сервера для аутентификации LDAP на основе SASL не поддерживается, но поддерживается плагин клиента.
В следующих таблицах показаны имена плагинов и файлов библиотек для простой и основанной на SASL аутентификации LDAP. Название файла может отличаться на вашей системе. Файлы должны находиться в каталоге, указанном переменной среды plugin_dir.
Таблица 8.20 Имена плагинов и библиотек для простой аутентификации LDAP
| Плагин или файл | Название плагина или файла |
|---|---|
| Имя плагина на стороне сервера | authentication_ldap_simple |
| Имя плагина на стороне клиента | mysql_clear_password |
| Название файла библиотеки | authentication_ldap_simple.so |
Таблица 8.21 Имена плагинов и библиотек для аутентификации LDAP на основе SASL
| Плагин или файл | Название плагина или файла |
|---|---|
| Имя плагина на стороне сервера | authentication_ldap_sasl |
| Имя плагина на стороне клиента | authentication_ldap_sasl_client |
| Имена файлов библиотек |
authentication_ldap_sasl.so, authentication_ldap_sasl_client.so
|
Файлы библиотек содержат только плагины аутентификации authentication_ldap_. Плагин клиента XXXmysql_clear_password встроен в библиотеку клиента libmysqlclient.
Каждый плагин LDAP на стороне сервера работает с определённым плагином на стороне клиента:
Плагин сервера
authentication_ldap_simpleвыполняет простую аутентификацию LDAP. Для подключений, использующих этот плагин, программы-клиенты используют плагин клиентаmysql_clear_password, который отправляет пароль на сервер в виде открытого текста. Не используется хэширование или шифрование пароля, поэтому рекомендуется безопасное соединение между MySQL клиентом и сервером для предотвращения раскрытия пароля.-
Плагин сервера
authentication_ldap_saslвыполняет аутентификацию LDAP на основе SASL. Для подключений, использующих этот плагин, программы-клиенты используют плагин клиентаauthentication_ldap_sasl_client. Плагины LDAP SASL на стороне клиента и сервера используют сообщения SASL для безопасной передачи учетных данных в рамках протокола LDAP, чтобы избежать отправки пароля в открытом виде между MySQL клиентом и сервером.В платформах Microsoft Windows поддерживаются как плагин сервера, так и плагин клиента для аутентификации LDAP на основе SASL.
Плагины аутентификации LDAP на стороне сервера включены только в MySQL Enterprise Edition. Они не включены в дистрибутивы MySQL Community. Плагин LDAP SASL на стороне клиента включён во все дистрибутивы, включая дистрибутивы Community, и, как уже упоминалось, плагин клиента mysql_clear_password встроен в библиотеку клиента libmysqlclient, которая также включена во все дистрибутивы. Это позволяет клиентам из любого дистрибутива подключаться к серверу, на котором загружен соответствующий плагин сервера.
В следующих разделах приводится информация об установке и использовании, специфичная для подключаемой аутентификации LDAP:
Для общей информации о подключаемой аутентификации в MySQL см. Раздел 8.2.17, «Подключаемая аутентификация». Для получения информации о плагине mysql_clear_password см. Раздел 8.4.1.4, «Подключаемая аутентификация клиентского cleartext». Информацию о прокси-пользователях см. в Разделе 8.2.19, «Прокси-пользователи».
Если ваша система поддерживает PAM и разрешает LDAP в качестве метода аутентификации PAM, другой способ использования LDAP для аутентификации пользователей MySQL — использование плагина сервера authentication_pam. См. Раздел 8.4.1.5, «Подключаемая аутентификация PAM».
Предварительные условия для подключаемого модуля аутентификации LDAP
Для использования подключаемого модуля аутентификации LDAP для MySQL необходимо выполнить следующие предварительные условия:
Должен быть доступен сервер LDAP для связи с ним подключаемых модулей аутентификации LDAP.
Пользователи LDAP, которых необходимо аутентифицировать MySQL, должны присутствовать в каталоге, управляемом сервером LDAP.
Библиотека клиента LDAP должна быть доступна на системах, где используется серверный подключаемый модуль
authentication_ldap_saslилиauthentication_ldap_simple. В настоящее время поддерживаются собственная библиотека LDAP для Windows или библиотека OpenLDAP для систем, не являющихся Windows.-
Для использования аутентификации LDAP на основе SASL:
Сервер LDAP должен быть настроен для связи с сервером SASL.
Библиотека клиента SASL должна быть доступна на системах, где используется подключаемый модуль клиента
authentication_ldap_sasl_client. В настоящее время единственной поддерживаемой библиотекой является библиотека Cyrus SASL.Для использования определенного метода аутентификации SASL должны быть доступны все другие необходимые службы. Например, для использования GSSAPI/Kerberos должны быть доступны библиотека GSSAPI и службы Kerberos.
Как работает аутентификация пользователей MySQL с помощью LDAP
Этот раздел предоставляет обзор того, как MySQL и LDAP взаимодействуют для аутентификации пользователей MySQL. Примеры настройки учетных записей MySQL для использования определенных подключаемых модулей аутентификации LDAP см. в разделе Использование подключаемого модуля аутентификации LDAP. Сведения о методах аутентификации, доступных подключаемым модулям LDAP, см. в разделе Методы аутентификации LDAP.
Клиент подключается к серверу MySQL, предоставляя имя пользователя MySQL-клиента и пароль:
При простой аутентификации LDAP подключаемые модули клиента и сервера передают пароль в виде открытого текста. Рекомендуется безопасное соединение между MySQL-клиентом и сервером для предотвращения раскрытия пароля.
При аутентификации LDAP на основе SASL подключаемые модули клиента и сервера избегают передачи пароля в открытом виде между MySQL-клиентом и сервером. Например, подключаемые модули могут использовать сообщения SASL для безопасной передачи учетных данных в протоколе LDAP. Для метода аутентификации GSSAPI подключаемые модули клиента и сервера обеспечивают безопасную связь с использованием Kerberos, не используя напрямую сообщения LDAP.
Если имя пользователя клиента и имя хоста не соответствуют никакой учетной записи MySQL, подключение отклоняется.
Если есть соответствующая учетная запись MySQL, происходит аутентификация с помощью LDAP. Сервер LDAP ищет запись, соответствующую пользователю, и аутентифицирует запись по паролю LDAP:
Если в имени учетной записи MySQL указано полное доменное имя (DN) пользователя LDAP, аутентификация LDAP использует это значение и пароль LDAP, предоставленный клиентом. (Чтобы связать полное доменное имя (DN) пользователя LDAP с учетной записью MySQL, добавьте пункт
BY, который указывает строку аутентификации, в оператореCREATE USER, создающем учетную запись.)Если в имени учетной записи MySQL не указано полное доменное имя (DN) пользователя LDAP, аутентификация LDAP использует имя пользователя и пароль LDAP, предоставленные клиентом. В этом случае подключаемый модуль аутентификации сначала подключается к серверу LDAP с использованием корневого полному доменного имени (DN) и пароля в качестве учетных данных, чтобы найти полное доменное имя (DN) пользователя на основе имени пользователя клиента, а затем аутентифицирует это полное доменное имя (DN) пользователя по паролю LDAP. Это подключение с использованием корневых учетных данных терпит неудачу, если корневое полное доменное имя (DN) и пароль имеют неправильные значения или пусты (не заданы), и сервер LDAP не разрешает анонимные подключения.
Если сервер LDAP не находит совпадение или находит несколько совпадений, аутентификация завершается неудачно, и подключение клиента отклоняется.
Если сервер LDAP находит единственное совпадение, аутентификация LDAP успешна (при условии, что пароль правильный), сервер LDAP возвращает запись LDAP, и подключаемый модуль аутентификации определяет имя аутентифицированного пользователя на основе этой записи:
Если запись LDAP имеет атрибут группы (по умолчанию, атрибут
cn), подключаемый модуль возвращает его значение как имя аутентифицированного пользователя.Если запись LDAP не имеет атрибута группы, подключаемый модуль аутентификации возвращает имя пользователя клиента как имя аутентифицированного пользователя.
Сервер MySQL сравнивает имя пользователя клиента с именем аутентифицированного пользователя, чтобы определить, происходит ли переадресация для сеанса клиента:
Если имена совпадают, переадресация не происходит: для проверки привилегий используется учетная запись MySQL, соответствующая имени пользователя клиента.
Если имена различаются, происходит переадресация: MySQL ищет учетную запись, соответствующую имени аутентифицированного пользователя. Эта учетная запись становится прокси-пользователем, который используется для проверки привилегий. Учетная запись MySQL, соответствующая имени пользователя клиента, рассматривается как внешний пользователь-прокси.
Установка подключаемого модуля аутентификации LDAP
В этом разделе описано, как установить плагины аутентификации LDAP на стороне сервера. Для общей информации об установке плагинов см. Раздел 7.6.1, «Установка и удаление плагинов».
Для использования сервером, файлы библиотек плагинов должны располагаться в каталоге плагинов MySQL (каталоге, имя которого задается переменной среды plugin_dir). При необходимости, настройте расположение каталога плагинов, установив значение plugin_dir при запуске сервера.
Базовые имена файлов библиотек плагинов на стороне сервера — authentication_ldap_simple и authentication_ldap_sasl. Суффикс имени файла отличается в зависимости от платформы (например, .so для систем Unix и Unix-подобных систем, .dll для Windows).
В Microsoft Windows серверный плагин для аутентификации LDAP на основе SASL не поддерживается, но поддерживается клиентский плагин. На других платформах поддерживаются как серверные, так и клиентские плагины.
Для загрузки плагинов при запуске сервера используйте опции --plugin-load-add для указания имён файлов библиотек, содержащих плагины. С этим методом загрузки плагинов, опции должны быть указаны каждый раз при запуске сервера. Также укажите значения для любых переменных среды, предоставляемых плагином, которые вы хотите настроить.
Каждый серверный плагин LDAP предоставляет набор переменных среды, которые позволяют настроить его работу. Установка большинства из них необязательна, но вы должны установить переменные, указывающие хост сервера LDAP (чтобы плагин знал, куда подключаться) и базовое имя различия для операций LDAP bind (чтобы ограничить область поиска и получить более быстрый поиск). Подробности о всех переменных среды LDAP см. в Разделе 8.4.1.13, «Переменные среды подключаемой аутентификации».
Для загрузки плагинов и установки хоста сервера LDAP и базового имени различия для операций LDAP bind, поместите строки, подобные этим, в ваш файл my.cnf, корректируя суффикс .so в зависимости от вашей платформы:
[mysqld]
plugin-load-add=authentication_ldap_simple.so
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"
После изменения файла my.cnf перезапустите сервер, чтобы новые настройки вступили в силу.
В качестве альтернативы, для загрузки плагинов во время выполнения используйте следующие инструкции, корректируя суффикс .so для вашей платформы:
INSTALL PLUGIN authentication_ldap_simple
SONAME 'authentication_ldap_simple.so';
INSTALL PLUGIN authentication_ldap_sasl
SONAME 'authentication_ldap_sasl.so';
INSTALL PLUGIN загружает плагин немедленно и также регистрирует его в таблице системной информации mysql.plugins, что заставляет сервер загружать его при каждом последующем обычном запуске без необходимости в --plugin-load-add.
После установки плагинов во время выполнения, доступными становятся переменные среды, которые они предоставляют, и вы можете добавить настройки для них в свой файл my.cnf, чтобы настроить плагины для последующих перезапусков. Например:
[mysqld]
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"
После изменения файла my.cnf перезапустите сервер, чтобы новые настройки вступили в силу.
Для установки и сохранения каждого значения во время выполнения, а не при запуске, используйте следующие инструкции:
SET PERSIST authentication_ldap_simple_server_host='127.0.0.1';
SET PERSIST authentication_ldap_simple_bind_base_dn='dc=example,dc=com';
SET PERSIST authentication_ldap_sasl_server_host='127.0.0.1';
SET PERSIST authentication_ldap_sasl_bind_base_dn='dc=example,dc=com';
SET
PERSIST устанавливает значение для работающего экземпляра MySQL. Он также сохраняет значение, что обеспечивает его сохранение при последующих перезапусках сервера. Чтобы изменить значение для работающего экземпляра MySQL без сохранения его для последующих перезапусков, используйте ключевое слово GLOBAL, а не PERSIST. См. Раздел 15.7.6.1, «Синтаксис SET для присваивания переменных».
Для проверки установки плагинов, просмотрите таблицу Справочника информации PLUGINS или используйте оператор SHOW PLUGINS (см. Раздел 7.6.2, «Получение информации о серверных плагинах»). Например:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%ldap%';
+----------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------------+---------------+
| authentication_ldap_sasl | ACTIVE |
| authentication_ldap_simple | ACTIVE |
+----------------------------+---------------+
Если плагин не удаётся инициализировать, проверьте лог ошибок сервера на наличие диагностических сообщений.
Для ассоциации учетных записей MySQL с плагином LDAP, см. Использование подключаемого модуля аутентификации LDAP.
В системах, работающих под управлением EL6 или EL, где включен SELinux, для разрешения связи плагинов MySQL LDAP с LDAP-сервисом требуются изменения в политике SELinux:
-
Создайте файл
mysqlldap.teсо следующим содержимым:module mysqlldap 1.0; require { type ldap_port_t; type mysqld_t; class tcp_socket name_connect; } #============= mysqld_t ============== allow mysqld_t ldap_port_t:tcp_socket name_connect; -
Скомпилируйте модуль политики безопасности в двоичный формат:
checkmodule -M -m mysqlldap.te -o mysqlldap.mod
-
Создайте пакет модуля политики SELinux:
semodule_package -m mysqlldap.mod -o mysqlldap.pp
-
Установите пакет модуля:
semodule -i mysqlldap.pp
-
После внесения изменений в политику SELinux перезапустите сервер MySQL:
service mysqld restart
Удаление подключаемого модуля аутентификации LDAP
Способ удаления плагинов аутентификации LDAP зависит от способа их установки:
Если вы установили плагины при запуске сервера с помощью опций
--plugin-load-add, перезапустите сервер без этих опций.-
Если вы установили плагины во время выполнения с помощью
INSTALL PLUGIN, они остаются установленным после перезапуска сервера. Для удаления используйтеUNINSTALL PLUGIN:UNINSTALL PLUGIN authentication_ldap_simple; UNINSTALL PLUGIN authentication_ldap_sasl;
Кроме того, удалите из вашего файла my.cnf любые опции запуска, устанавливающие переменные среды, связанные с плагинами LDAP. Если вы использовали SET
PERSIST для сохранения переменных среды LDAP, используйте RESET PERSIST для удаления настроек.
Подключаемый модуль аутентификации LDAP и ldap.conf
Для установок, использующих OpenLDAP, файл ldap.conf предоставляет глобальные значения по умолчанию для LDAP-клиентов. Параметры могут быть установлены в этом файле для влияния на LDAP-клиенты, включая плагины аутентификации LDAP. OpenLDAP использует параметры конфигурации в следующем порядке приоритетов:
Конфигурация, заданная LDAP-клиентом.
-
Конфигурация, заданная в файле
ldap.conf. Чтобы отключить использование этого файла, установите переменную средыLDAPNOINIT. Значения по умолчанию, встроенные в библиотеку OpenLDAP.
Если значения по умолчанию библиотеки или ldap.conf не дают подходящих значений параметров, плагин аутентификации LDAP может установить соответствующие переменные, чтобы напрямую повлиять на конфигурацию LDAP. Например, плагины LDAP могут переопределять ldap.conf для параметров, таких как:
Настройка TLS: доступны переменные среды для включения TLS и управления настройками CA, такие как
authentication_ldap_simple_tlsиauthentication_ldap_simple_ca_pathдля простой аутентификации LDAP, иauthentication_ldap_sasl_tlsиauthentication_ldap_sasl_ca_pathдля аутентификации LDAP с использованием SASL.Перенаправление LDAP. См. Перенаправление поиска LDAP.
Для получения дополнительной информации о ldap.conf обратитесь к странице руководства ldap.conf(5).
Настройка таймаутов для подключаемого модуля аутентификации LDAP
Для подключения учетных записей MySQL к серверу MySQL с использованием подключаемого модуля аутентификации LDAP, сервер LDAP должен быть доступен и работоспособен. Взаимодействие между серверами MySQL и LDAP включает два шага. Во-первых, сервер MySQL устанавливает соединение с сервером LDAP по протоколу TCP. Во-вторых, сервер MySQL отправляет запрос на привязку LDAP по установленному соединению серверу LDAP и ожидает ответа перед аутентификацией учетной записи. Если любой из шагов завершается неудачно, учетная запись MySQL не может подключиться к серверу MySQL.
По умолчанию применяются таймауты с коротким интервалом, которые имеют приоритет над значениями таймаутов системы-хоста, как для шага подключения, так и для шага ответа. Во всех случаях, если таймаут истекает, пользователь учетной записи получает уведомление о том, что попытка подключения к MySQL отклонена. Клиентский и серверный логирование могут предоставить дополнительную информацию. На стороне клиента установите следующую переменную окружения, чтобы повысить уровень детализации, а затем перезапустите клиент MySQL:
AUTHENTICATION_LDAP_CLIENT_LOG=5
export AUTHENTICATION_LDAP_CLIENT_LOG
Следующие системные переменные поддерживают значения таймаутов по умолчанию для аутентификации LDAP на основе SASL и простой аутентификации LDAP только на платформах Linux.
Таблица 8.22 Системные переменные для аутентификации LDAP на основе SASL и простой аутентификации LDAP
| Имя системной переменной | Значение таймаута по умолчанию |
|---|---|
authentication_ldap_sasl_connect_timeout | 30 секунд |
authentication_ldap_sasl_response_timeout | 30 секунд |
authentication_ldap_simple_connect_timeout | 30 секунд |
authentication_ldap_simple_response_timeout | 30 секунд |
Значения таймаутов для аутентификации LDAP можно настроить при запуске сервера и во время работы. Если вы установите таймаут в ноль с помощью одной из этих переменных, вы фактически отключите его, и сервер MySQL вернется к использованию значения таймаута по умолчанию системы-хоста.
При следующих условиях фактическое время ожидания параметра authentication_ldap_sasl_connect_timeout удваивается, потому что (внутренне) серверу необходимо дважды вызвать соединение TCP:
Сервер LDAP недоступен.
authentication_ldap_sasl_connect_timeoutимеет значение больше нуля.Используется пул соединений (точнее, системная переменная
authentication_ldap_sasl_max_pool_sizeимеет значение больше нуля, что включает пул).
Использование подключаемого модуля аутентификации LDAP
Этот раздел описывает, как разрешить учетным записям MySQL подключаться к серверу MySQL с использованием подключаемого модуля аутентификации LDAP. Предполагается, что сервер работает с включенными соответствующими плагинами серверной стороны, как описано в Установка подключаемого модуля аутентификации LDAP, и что соответствующие плагины клиентской стороны доступны на клиентском хосте.
В данном разделе не рассматривается настройка или администрирование LDAP. Предполагается, что вы знакомы с этими темами.
Два плагина LDAP серверной стороны работают с конкретным плагином клиентской стороны:
Плагин серверной стороны
authentication_ldap_simpleвыполняет простую аутентификацию LDAP. Для подключений учетных записей, использующих этот плагин, клиентские программы используют плагин клиентской стороныmysql_clear_password, который отправляет пароль на сервер в виде открытого текста. Не используется хэширование или шифрование пароля, поэтому рекомендуется безопасное соединение между клиентом MySQL и сервером, чтобы предотвратить раскрытие пароля.Плагин серверной стороны
authentication_ldap_saslвыполняет аутентификацию LDAP на основе SASL. Для подключений учетных записей, использующих этот плагин, клиентские программы используют плагин клиентской стороныauthentication_ldap_sasl_client. Плагины клиентской и серверной сторон SASL LDAP используют сообщения SASL для безопасной передачи учетных данных в протоколе LDAP, чтобы избежать отправки пароля в открытом виде между клиентом MySQL и сервером.
Общие требования для аутентификации пользователей MySQL с использованием LDAP:
Для каждого пользователя, подлежащего аутентификации, должна существовать запись в каталоге LDAP.
Должна существовать учетная запись пользователя MySQL, которая указывает плагин аутентификации LDAP серверной стороны и, необязательно, имя соответствующего отличительного имени (DN) пользователя LDAP. (Чтобы связать DN пользователя LDAP с учетной записью MySQL, включите клаузу
BYв инструкцииCREATE USERдля создания учетной записи). Если учетная запись не указывает строку LDAP, аутентификация LDAP использует имя пользователя, указанное клиентом, для поиска записи LDAP.Клиентские программы подключаются с использованием метода подключения, соответствующего плагину аутентификации серверной стороны, используемому учетной записью MySQL. Для аутентификации LDAP требуется имя пользователя MySQL и пароль LDAP. Кроме того, для учетных записей, использующих плагин серверной стороны
authentication_ldap_simple, запустите клиентские программы с опцией--enable-cleartext-plugin, чтобы включить плагин клиентской стороныmysql_clear_password.
Здесь предполагается следующая сценарий:
Пользователи MySQL
betsyиborisвыполняют аутентификацию в записях LDAP дляbetsy_ldapиboris_ldapсоответственно. (Необязательно, чтобы имена пользователей MySQL и LDAP отличались. Использование различных имен в этом обсуждении помогает уточнить, в каком контексте используется операция: MySQL или LDAP.)Записи LDAP используют атрибут
uidдля указания имен пользователей. Это может меняться в зависимости от сервера LDAP. Некоторые серверы LDAP используют атрибутcnдля имен пользователей вместоuid. Чтобы изменить атрибут, измените системную переменнуюauthentication_ldap_simple_user_search_attrилиauthentication_ldap_sasl_user_search_attrсоответственно.-
Эти записи LDAP доступны в каталоге, управляемом сервером LDAP, для предоставления значений отличительного имени, уникально идентифицирующих каждого пользователя:
uid=betsy_ldap,ou=People,dc=example,dc=com uid=boris_ldap,ou=People,dc=example,dc=com
CREATE USERинструкции, которые создают учетные записи MySQL, указывают пользователя LDAP в клаузеBY, чтобы указать, к какой записи LDAP учетная запись MySQL выполняет аутентификацию.
Инструкции по настройке учетной записи, использующей аутентификацию LDAP, зависят от используемого плагина LDAP серверной стороны. В следующих разделах описаны несколько сценариев использования.
Простая аутентификация LDAP (без проксирования)
В данном разделе описанная процедура требует, чтобы authentication_ldap_simple_group_search_attr было установлено в пустую строку, как показано ниже:
SET GLOBAL.authentication_ldap_simple_group_search_attr='';
В противном случае по умолчанию используется проксирование.
Для настройки учетной записи MySQL для простой аутентификации LDAP используйте оператор CREATE USER для указания плагина authentication_ldap_simple, необязательно включая имя пользователя LDAP (DN), как показано ниже:
CREATE USER user
IDENTIFIED WITH authentication_ldap_simple
[BY 'LDAP user DN'];
Предположим, что пользователь MySQL betsy имеет такую запись в каталоге LDAP:
uid=betsy_ldap,ou=People,dc=example,dc=com
Тогда оператор создания учетной записи MySQL для betsy выглядит следующим образом:
CREATE USER 'betsy'@'localhost'
IDENTIFIED WITH authentication_ldap_simple
AS 'uid=betsy_ldap,ou=People,dc=example,dc=com';
Строка аутентификации, указанная в части BY, не включает пароль LDAP. Его должен предоставить пользователь-клиент во время подключения.
Клиенты подключаются к серверу MySQL, предоставляя имя пользователя MySQL и пароль LDAP, а также включив плагин mysql_clear_password со стороны клиента:
$> mysql --user=betsy --password --enable-cleartext-plugin
Enter password: betsy_ldap_password
Плагин аутентификации mysql_clear_password со стороны клиента оставляет пароль без изменений, поэтому клиентские программы отправляют его на сервер MySQL в открытом виде. Это позволяет передавать пароль LDAP-серверу в неизменном виде. Открытый текст пароля необходим для использования библиотеки LDAP сервера без SASL, но в некоторых конфигурациях может представлять угрозу безопасности. Эти меры минимизируют риск:
Чтобы уменьшить вероятность случайного использования плагина
mysql_clear_password, клиенты MySQL должны явно его включить (например, с опцией--enable-cleartext-plugin). См. Раздел 8.4.1.4, «Аутентификация с открытым текстом со стороны клиента».Чтобы избежать раскрытия пароля при включенном плагине
mysql_clear_password, клиенты MySQL должны подключаться к серверу MySQL по зашифрованному соединению. См. Раздел 8.3.1, «Настройка MySQL для использования зашифрованных подключений».
Процесс аутентификации происходит следующим образом:
Плагин со стороны клиента отправляет
betsyиbetsy_passwordкак имя пользователя клиента и пароль LDAP на сервер MySQL.Попытка подключения соответствует учетной записи
'betsy'@'localhost'. Плагин LDAP со стороны сервера обнаруживает, что у этой учетной записи есть строка аутентификации'uid=betsy_ldap,ou=People,dc=example,dc=com', чтобы задать DN пользователя LDAP. Плагин отправляет эту строку и пароль LDAP на сервер LDAP.Сервер LDAP находит запись LDAP для
betsy_ldapи пароль совпадает, поэтому аутентификация LDAP успешна.В записи LDAP нет атрибута группы, поэтому плагин со стороны сервера возвращает имя пользователя клиента (
betsy) в качестве аутентифицированного пользователя. Это то же имя пользователя, которое предоставил клиент, поэтому проксирование не происходит, и сессия клиента использует учетную запись'betsy'@'localhost'для проверки привилегий.
Если оператор CREATE USER не содержал части BY для указания имени пользователя LDAP (DN), попытки аутентификации использовали бы имя пользователя, предоставленное клиентом (в данном случае, betsy). В отсутствие записи LDAP для betsy аутентификация завершилась бы неудачей.
Аутентификация LDAP на основе SASL (без проксирования)
В данном разделе описанная процедура требует, чтобы authentication_ldap_sasl_group_search_attr было установлено в пустую строку, как показано ниже:
SET GLOBAL.authentication_ldap_sasl_group_search_attr='';
В противном случае по умолчанию используется проксирование.
Для настройки учетной записи MySQL для аутентификации LDAP с помощью SASL используйте оператор CREATE USER для указания плагина authentication_ldap_sasl, необязательно включая имя пользователя LDAP (DN), как показано ниже:
CREATE USER user
IDENTIFIED WITH authentication_ldap_sasl
[BY 'LDAP user DN'];
Предположим, что пользователь MySQL boris имеет такую запись в каталоге LDAP:
uid=boris_ldap,ou=People,dc=example,dc=com
Тогда оператор создания учетной записи MySQL для boris выглядит следующим образом:
CREATE USER 'boris'@'localhost'
IDENTIFIED WITH authentication_ldap_sasl
AS 'uid=boris_ldap,ou=People,dc=example,dc=com';
Строка аутентификации, указанная в части BY, не включает пароль LDAP. Его должен предоставить пользователь-клиент во время подключения.
Клиенты подключаются к серверу MySQL, предоставляя имя пользователя MySQL и пароль LDAP:
$> mysql --user=boris --password
Enter password: boris_ldap_password
Для плагина authentication_ldap_sasl со стороны сервера клиенты используют плагин authentication_ldap_sasl_client со стороны клиента. Если клиентская программа не находит плагин со стороны клиента, укажите опцию --plugin-dir, которая указывает каталог, где установлен файл библиотеки плагина.
Процесс аутентификации для boris аналогичен описанному ранее для betsy с простой аутентификацией LDAP, за исключением того, что плагины SASL LDAP со стороны клиента и сервера используют сообщения SASL для безопасной передачи учетных данных по протоколу LDAP, чтобы избежать передачи пароля в открытом виде между клиентом MySQL и сервером.
Аутентификация LDAP с проксированием
Плагины аутентификации LDAP поддерживают проксирование, позволяя пользователю подключаться к серверу MySQL как одному пользователю, но использовать привилегии другого. Этот раздел описывает основную поддержку проксирования плагинов LDAP. Плагины LDAP также поддерживают указание предпочтений группы и сопоставления прокси-пользователей; см. Спецификацию предпочтений и сопоставления групп для аутентификации LDAP.
Реализация проксирования, описанная здесь, основана на использовании значений атрибута группы LDAP для сопоставления подключаемых пользователей MySQL, которые проходят аутентификацию с помощью LDAP, с другими учетными записями MySQL, определяющими различные наборы привилегий. Пользователи не подключаются напрямую через учетные записи, определяющие привилегии. Вместо этого они подключаются через стандартную прокси-учетную запись, аутентифицированную с помощью LDAP, таким образом, все внешние подключения сопоставляются с проксированными учетными записями MySQL, которые хранят привилегии. Любой пользователь, подключающийся с помощью прокси-учетной записи, сопоставляется с одной из этих проксированных учетных записей MySQL, привилегии которой определяют разрешенные операции с базой данных для внешнего пользователя.
Здесь предполагается следующая сценарий:
-
Записи LDAP используют атрибуты
uidиcnдля указания имени пользователя и значений группы соответственно. Чтобы использовать другие имена атрибутов пользователя и группы, установите соответствующие системные переменные плагина:Для плагина
authentication_ldap_simple: Установитеauthentication_ldap_simple_user_search_attrиauthentication_ldap_simple_group_search_attr.Для плагина
authentication_ldap_sasl: Установитеauthentication_ldap_sasl_user_search_attrиauthentication_ldap_sasl_group_search_attr.
-
Эти записи LDAP доступны в каталоге, управляемом сервером LDAP, для предоставления значений distinguished name, которые уникально идентифицируют каждого пользователя:
uid=basha,ou=People,dc=example,dc=com,cn=accounting uid=basil,ou=People,dc=example,dc=com,cn=front_office
Во время подключения значения атрибута группы становятся именами аутентифицированных пользователей, поэтому они называют проксированные учетные записи
accountingиfront_office. Примеры предполагают использование аутентификации LDAP с SASL. Внесите соответствующие изменения для простой аутентификации LDAP.
Создайте стандартную прокси-учетную запись MySQL:
CREATE USER ''@'%'
IDENTIFIED WITH authentication_ldap_sasl;
Определение прокси-учетной записи не содержит пункта AS
' для указания DN пользователя LDAP. Таким образом: auth_string'
При подключении клиента имя пользователя клиента становится именем пользователя LDAP для поиска.
Ожидается, что соответствующая запись LDAP будет содержать атрибут группы, который называет проксированную учетную запись MySQL, определяющую привилегии, которые должен иметь клиент.
Если ваша установка MySQL имеет анонимных пользователей, они могут конфликтовать со стандартным прокси-пользователем. Дополнительную информацию об этой проблеме и способах ее решения см. в разделе Конфликты между стандартным прокси-пользователем и анонимными пользователями.
Создайте проксированные учетные записи и предоставьте каждой из них необходимые привилегии:
CREATE USER 'accounting'@'localhost'
IDENTIFIED WITH mysql_no_login;
CREATE USER 'front_office'@'localhost'
IDENTIFIED WITH mysql_no_login;
GRANT ALL PRIVILEGES
ON accountingdb.*
TO 'accounting'@'localhost';
GRANT ALL PRIVILEGES
ON frontdb.*
TO 'front_office'@'localhost';
Проксированные учетные записи используют плагин аутентификации mysql_no_login, чтобы предотвратить подключение клиентов напрямую к серверу MySQL с помощью этих учетных записей. Вместо этого ожидается, что пользователи, которые проходят аутентификацию с помощью LDAP, будут использовать стандартную прокси-учетную запись ''@'%'. (Это предполагает установку плагина mysql_no_login. Инструкции см. в разделе Раздел 8.4.1.9, «Плагины аутентификации без входа».) Альтернативные способы защиты проксированных учетных записей от прямого использования см. в разделе Предотвращение прямого входа в проксированные учетные записи.
Предоставьте прокси-учетной записи привилегию PROXY для каждой проксированной учетной записи:
GRANT PROXY
ON 'accounting'@'localhost'
TO ''@'%';
GRANT PROXY
ON 'front_office'@'localhost'
TO ''@'%';
Используйте командную строку mysql для подключения к серверу MySQL как basha.
$> mysql --user=basha --password
Enter password: basha_password (basha LDAP password)
Процесс аутентификации происходит следующим образом:
Сервер выполняет аутентификацию подключения с помощью стандартной прокси-учетной записи
''@'%'для пользователя клиентаbasha.-
Соответствующая запись LDAP:
uid=basha,ou=People,dc=example,dc=com,cn=accounting
В соответствующей записи LDAP есть атрибут группы
cn=accounting, поэтомуaccountingстановится аутентифицированным прокси-пользователем.-
Аутентифицированный пользователь отличается от имени пользователя клиента
basha, в результате чегоbashaобрабатывается как прокси дляaccounting, иbashaполучает привилегии проксированной учетной записиaccounting. Следующий запрос возвращает показанный вывод:mysql>
SELECT USER(), CURRENT_USER(), @@proxy_user;+-----------------+----------------------+--------------+ | USER() | CURRENT_USER() | @@proxy_user | +-----------------+----------------------+--------------+ | basha@localhost | accounting@localhost | ''@'%' | +-----------------+----------------------+--------------+
Это демонстрирует, что basha использует привилегии, предоставленные проксированной учетной записи MySQL accounting, и что проксирование происходит через стандартную прокси-учетную запись.
Теперь подключитесь как basil:
$> mysql --user=basil --password
Enter password: basil_password (basil LDAP password)
Процесс аутентификации для basil аналогичен ранее описанному для basha:
Сервер выполняет аутентификацию подключения с помощью стандартной прокси-учетной записи
''@'%'для пользователя клиентаbasil.-
Соответствующая запись LDAP:
uid=basil,ou=People,dc=example,dc=com,cn=front_office
В соответствующей записи LDAP есть атрибут группы
cn=front_office, поэтомуfront_officeстановится аутентифицированным прокси-пользователем.-
Аутентифицированный пользователь отличается от имени пользователя клиента
basil, в результате чегоbasilобрабатывается как прокси дляfront_office, иbasilполучает привилегии проксированной учетной записиfront_office. Следующий запрос возвращает показанный вывод:mysql>
SELECT USER(), CURRENT_USER(), @@proxy_user;+-----------------+------------------------+--------------+ | USER() | CURRENT_USER() | @@proxy_user | +-----------------+------------------------+--------------+ | basil@localhost | front_office@localhost | ''@'%' | +-----------------+------------------------+--------------+
Это демонстрирует, что basil использует привилегии, предоставленные проксированной учетной записи MySQL front_office, и что проксирование происходит через стандартную прокси-учетную запись.
Спецификация предпочтения и сопоставления групп LDAP-аутентификации
Как описано в LDAP-аутентификация с проксированием, базовая LDAP-аутентификация с проксированием работает по принципу, что плагин использует первое имя группы, возвращенное сервером LDAP, в качестве имени учетной записи пользователя MySQL с проксированием. Эта простая возможность не позволяет указать какие-либо предпочтения о том, какое имя группы использовать, если сервер LDAP возвращает несколько имен групп, или указать какое-либо имя, отличное от имени группы, в качестве имени прокси-пользователя.
Для учетных записей MySQL, использующих LDAP-аутентификацию, строка аутентификации может содержать следующую информацию для повышения гибкости проксирования:
Список групп в порядке предпочтения, так что плагин использует первое имя группы из списка, которое совпадает с группой, возвращенной сервером LDAP.
Сопоставление имен групп с именами пользователей с проксированием, таким образом, что имя группы при совпадении может предоставить указанное имя для использования в качестве имени прокси-пользователя. Это предоставляет альтернативу использованию имени группы как имени прокси-пользователя.
Рассмотрим следующее определение прокси-учетной записи MySQL:
CREATE USER ''@'%'
IDENTIFIED WITH authentication_ldap_sasl
AS '+ou=People,dc=example,dc=com#grp1=usera,grp2,grp3=userc';
Строка аутентификации имеет суффикс DN пользователя ou=People,dc=example,dc=com, предваряемый символом +. Таким образом, как описано в Суффиксы DN пользователей LDAP-аутентификации, полный DN пользователя строится из указанного суффикса DN пользователя плюс имя пользователя клиента в качестве атрибута uid.
Остальная часть строки аутентификации начинается с #, что обозначает начало информации о предпочтениях групп и сопоставлениях. В этой части строки аутентификации перечислены имена групп в порядке grp1, grp2, grp3. Плагин LDAP сравнивает этот список со списком имен групп, возвращенных сервером LDAP, ищет совпадение в порядке списка по отношению к возвращенным именам. Плагин использует первое совпадение, или, если совпадения нет, аутентификация завершается неудачей.
Предположим, что сервер LDAP возвращает группы grp3, grp2 и grp7. Плагин LDAP использует grp2, потому что это первая группа в строке аутентификации, которая совпадает, даже если это не первая группа, возвращенная сервером LDAP. Если сервер LDAP возвращает grp4, grp2 и grp1, плагин использует grp1, даже если grp2 также совпадает. grp1 имеет более высокий приоритет, чем grp2, потому что он указан раньше в строке аутентификации.
Предполагая, что плагин находит совпадение имени группы, он выполняет сопоставление этого имени группы с именем прокси-пользователя MySQL, если оно есть. Для примера прокси-аккаунта сопоставление происходит следующим образом:
Если совпадающее имя группы —
grp1илиgrp3, то в строке аутентификации этим группам соответственно сопоставлены имена пользователейuseraиuserc. Плагин использует соответствующее имя пользователя как имя прокси-пользователя.Если совпадающее имя группы —
grp2, в строке аутентификации нет сопоставленного имени пользователя. Плагин используетgrp2как имя прокси-пользователя.
Если сервер LDAP возвращает группу в формате DN, плагин LDAP анализирует DN группы, чтобы извлечь из него имя группы.
Для указания предпочтения и сопоставления LDAP-групп применяются следующие принципы:
Начало части строки аутентификации для предпочтения и сопоставления групп с префиксом
#.-
Спецификация предпочтения и сопоставления групп — это список одного или нескольких элементов, разделенных запятыми. Каждый элемент имеет вид
илиgroup_name=user_namegroup_name. Элементы должны быть перечислены в порядке предпочтения имен групп. Для имени группы, выбранного плагином как совпадающее из набора имен групп, возвращенных сервером LDAP, два синтаксиса различаются по своему эффекту следующим образом:Для элемента, указанного как
(с именем пользователя), имя группы сопоставляется с именем пользователя, которое используется как имя прокси-пользователя MySQL.group_name=user_nameДля элемента, указанного как
group_name(без имени пользователя), имя группы используется как имя прокси-пользователя MySQL.
-
Для цитирования имени группы или пользователя, содержащего специальные символы, такие как пробел, заключите его в двойные кавычки (
"). Например, если элемент имеет имена группы и пользователяmy group nameиmy user name, он должен быть записан в сопоставлении групп с использованием кавычек:"my group name"="my user name"
Если элемент имеет имена группы и пользователя
my_group_nameиmy_user_name(которые не содержат специальных символов), его можно, но не обязательно писать с использованием кавычек. Любой из следующих вариантов допустим:my_group_name=my_user_name my_group_name="my_user_name" "my_group_name"=my_user_name "my_group_name"="my_user_name"
Для экранирования символа используйте обратную косую черту (
\). Это особенно полезно для включения в строку символов, таких как двойная кавычка или обратная косая черта, которые иначе не включаются буквально.DN пользователя не обязательно должен присутствовать в строке аутентификации, но если он присутствует, он должен предшествовать части строки с предпочтением и сопоставлением групп. DN пользователя может быть указан как полный DN пользователя или как суффикс DN пользователя с префиксом
+(см. Суффиксы DN пользователей LDAP-аутентификации).
Суффиксы DN пользователей LDAP-аутентификации
Плагины LDAP-аутентификации допускают, чтобы строка аутентификации, содержащая информацию о DN пользователя, начиналась с префикса +:
В отсутствие символа
+значение строки аутентификации обрабатывается как есть без изменений.Если строка аутентификации начинается с символа
+, плагин строит полное значение DN пользователя из имени пользователя, отправленного клиентом, вместе с DN, указанным в строке аутентификации (с удалённым+). В построенном DN имя пользователя клиента становится значением атрибута, который определяет имена LDAP-пользователей. По умолчанию этоuid; для изменения атрибута, измените соответствующую системную переменную (authentication_ldap_simple_user_search_attrилиauthentication_ldap_sasl_user_search_attr). Строка аутентификации хранится как есть в таблицеmysql.user, а полное DN пользователя строится динамически перед аутентификацией.
У данной строки аутентификации нет + в начале, поэтому она рассматривается как полный DN пользователя:
CREATE USER 'baldwin'
IDENTIFIED WITH authentication_ldap_simple
AS 'uid=admin,ou=People,dc=example,dc=com';
Клиент подключается с именем пользователя, указанным в аккаунте (baldwin). В этом случае это имя не используется, потому что строка аутентификации не имеет префикса и, следовательно, полностью определяет DN пользователя.
У этой строки аутентификации есть + в начале, поэтому она рассматривается как часть DN пользователя:
CREATE USER 'accounting'
IDENTIFIED WITH authentication_ldap_simple
AS '+ou=People,dc=example,dc=com';
Клиент подключается с именем пользователя, указанным в аккаунте (accounting), которое в данном случае используется как атрибут uid вместе со строкой аутентификации для построения DN пользователя: uid=accounting,ou=People,dc=example,dc=com
Учётные записи в предыдущих примерах имеют непустое имя пользователя, поэтому клиент всегда подключается к серверу MySQL с тем же именем, что указано в определении аккаунта. Если у аккаунта пустое имя пользователя, например, у прокси-учётной записи по умолчанию без анонимности ''@'%', описанной в LDAP-аутентификации с проксированием, клиенты могут подключаться к MySQL-серверу с различными именами пользователей. Но принцип тот же: если строка аутентификации начинается с +, плагин использует имя пользователя, отправленное клиентом, вместе со строкой аутентификации для построения DN пользователя.
Методы LDAP-аутентификации
LDAP-плагины аутентификации используют настраиваемый метод аутентификации. Соответствующая системная переменная и доступные варианты методов зависят от конкретного плагина:
Для плагина
authentication_ldap_simple: Установите системную переменнуюauthentication_ldap_simple_auth_method_nameдля настройки метода. Разрешенные варианты —SIMPLEиAD-FOREST.Для плагина
authentication_ldap_sasl: Установите системную переменнуюauthentication_ldap_sasl_auth_method_nameдля настройки метода. Допустимые варианты —SCRAM-SHA-1,SCRAM-SHA-256иGSSAPI. (Чтобы определить, какие методы SASL LDAP фактически доступны на системе хоста, проверьте значение статусной переменнойAuthentication_ldap_sasl_supported_methods.)
Подробную информацию о каждом допустимом методе см. в описаниях системных переменных. Кроме того, в зависимости от метода могут потребоваться дополнительные настройки, как описано в следующих разделах.
Метод аутентификации GSSAPI/Kerberos
Общий интерфейс прикладной программы служб безопасности (GSSAPI) — это интерфейс абстракции безопасности. Kerberos — это пример конкретного протокола безопасности, который может использоваться через этот абстрактный интерфейс. Используя GSSAPI, приложения выполняют аутентификацию в Kerberos для получения учетных данных службы, а затем используют эти учетные данные для обеспечения безопасного доступа к другим службам.
Одна из таких служб — LDAP, которая используется плагинами аутентификации SASL LDAP на стороне клиента и сервера. Когда системная переменная authentication_ldap_sasl_auth_method_name установлена в значение GSSAPI, эти плагины используют метод аутентификации GSSAPI/Kerberos. В этом случае плагины обмениваются данными безопасно с использованием Kerberos без прямого использования сообщений LDAP. Плагин на стороне сервера затем общается с сервером LDAP, чтобы интерпретировать сообщения об аутентификации LDAP и извлечь группы LDAP.
GSSAPI/Kerberos поддерживается как метод аутентификации LDAP для серверов и клиентов MySQL в Linux. Он полезен в средах Linux, где приложения имеют доступ к LDAP через Microsoft Active Directory, в котором Kerberos включён по умолчанию.
В следующем обсуждении приводится информация о требованиях к настройке для использования метода GSSAPI. Предполагается знание концепций и работы Kerberos. В следующем списке кратко определены несколько распространённых терминов Kerberos. Вам также может быть полезна секция «Словарь» в RFC 4120.
: Имя сущности, например, пользователя или сервера.
-
: Центр распределения ключей, состоящий из AS и TGS:
: Сервер аутентификации; предоставляет начальный билет-сертификат, необходимый для получения дополнительных билетов.
: Сервер выдачи билетов; предоставляет дополнительные билеты клиентам Kerberos, обладающим действительным TGT.
: Билет-сертификат; предоставляется TGS для получения билетов на доступ к службам.
Для аутентификации LDAP с использованием Kerberos необходимы как сервер KDC, так и сервер LDAP. Это требование может быть выполнено различными способами:
Active Directory включает оба сервера, причём аутентификация Kerberos включена по умолчанию в сервере LDAP Active Directory.
OpenLDAP предоставляет сервер LDAP, но может потребоваться отдельный сервер KDC с дополнительной настройкой Kerberos.
Kerberos также должен быть доступен на хосте клиента. Клиент обращается к AS с паролем, чтобы получить TGT. Затем клиент использует TGT для получения доступа от TGS к другим службам, таким как LDAP.
В следующих разделах рассматриваются шаги настройки для использования GSSAPI/Kerberos для аутентификации SASL LDAP в MySQL:
Проверка доступности Kerberos и LDAP
Следующий пример демонстрирует, как проверить доступность Kerberos в Active Directory. Пример предполагает следующее:
Active Directory работает на хосте с именем
ldap_auth.example.comи IP-адресом198.51.100.10.Аутентификация Kerberos и поиск LDAP, связанные с MySQL, используют домен
MYSQL.LOCAL.Принципал с именем
bredon@MYSQL.LOCALзарегистрирован в KDC. (В дальнейшем это имя принципала также связывается с учетной записью MySQL, которая выполняет аутентификацию на сервере MySQL с помощью GSSAPI/Kerberos.)
После выполнения этих предположений, выполните следующие действия:
-
Проверьте, что библиотека Kerberos установлена и настроена правильно в операционной системе. Например, для настройки домена
MYSQL.LOCALдля использования во время аутентификации MySQL, файл конфигурации Kerberos/etc/krb5.confдолжен содержать что-то вроде этого:[realms] MYSQL.LOCAL = { kdc = ldap_auth.example.com admin_server = ldap_auth.example.com default_domain = MYSQL.LOCAL } -
Возможно, вам потребуется добавить запись в
/etc/hostsдля хоста сервера:198.51.100.10 ldap_auth ldap_auth.example.com
-
Проверьте, правильно ли работает аутентификация Kerberos:
-
Используйте kinit для аутентификации в Kerberos:
$>
kinit bredon@MYSQL.LOCALPassword for bredon@MYSQL.LOCAL:(enter password here)Команда выполняет аутентификацию для принципала Kerberos с именем
bredon@MYSQL.LOCAL. Введите пароль принципала, когда команда запросит его. KDC возвращает TGT, который кешируется на стороне клиента для использования другими приложениями, поддерживающими Kerberos. -
Используйте klist для проверки правильности получения TGT. Вывод должен быть похож на этот:
$> klist Ticket cache: FILE:/tmp/krb5cc_244306 Default principal: bredon@MYSQL.LOCAL Valid starting Expires Service principal 03/23/2021 08:18:33 03/23/2021 18:18:33 krbtgt/MYSQL.LOCAL@MYSQL.LOCAL
-
-
Проверьте, работает ли ldapsearch с TGT Kerberos, используя эту команду, которая ищет пользователей в домене
MYSQL.LOCAL:ldapsearch -h 198.51.100.10 -Y GSSAPI -b "dc=MYSQL,dc=LOCAL"
Настройка плагина аутентификации SASL LDAP на стороне сервера для GSSAPI/Kerberos
Предполагая, что сервер LDAP доступен через Kerberos, как описано выше, настройте плагин аутентификации SASL LDAP на стороне сервера для использования метода аутентификации GSSAPI/Kerberos. (Для общей информации об установке плагина LDAP см. Установку плагина аутентификации LDAP). Вот пример настроек, связанных с плагином, которые могут содержаться в файле конфигурации сервера my.cnf:
[mysqld]
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_auth_method_name="GSSAPI"
authentication_ldap_sasl_server_host=198.51.100.10
authentication_ldap_sasl_server_port=389
authentication_ldap_sasl_bind_root_dn="cn=admin,cn=users,dc=MYSQL,dc=LOCAL"
authentication_ldap_sasl_bind_root_pwd="password"
authentication_ldap_sasl_bind_base_dn="cn=users,dc=MYSQL,dc=LOCAL"
authentication_ldap_sasl_user_search_attr="sAMAccountName"
Эти параметры файла конфигурации настраивают плагин SASL LDAP следующим образом:
Опция
--plugin-load-addзагружает плагин (исправьте суффикс.so, если необходимо, для вашей платформы). Если вы загрузили плагин ранее с помощью оператораINSTALL PLUGIN, эта опция не нужна.authentication_ldap_sasl_auth_method_nameдолжно быть установлено в значениеGSSAPI, чтобы использовать GSSAPI/Kerberos в качестве метода аутентификации SASL LDAP.authentication_ldap_sasl_server_hostиauthentication_ldap_sasl_server_portуказывают IP-адрес и номер порта хоста сервера Active Directory для аутентификации.-
authentication_ldap_sasl_bind_root_dnиauthentication_ldap_sasl_bind_root_pwdнастраивают корневой DN и пароль для возможности поиска групп. Эта возможность требуется, но пользователи могут не иметь привилегий для поиска. В таких случаях необходимо предоставить информацию о корневом DN:В значении опции DN,
adminдолжно быть имя административной учетной записи LDAP, имеющей права на выполнение поиска пользователей.В значении опции пароля,
passwordдолжен быть пароль учетной записиadmin.
authentication_ldap_sasl_bind_base_dnуказывает базовый путь DN пользователя, чтобы поиски осуществлялись в доменеMYSQL.LOCAL.authentication_ldap_sasl_user_search_attrуказывает стандартный атрибут поиска Active Directory,sAMAccountName. Этот атрибут используется в поисках для соответствия именам входа; значения атрибутов не идентичны значениям DN пользователя.
Создание учетной записи MySQL, использующей GSSAPI/Kerberos для аутентификации LDAP
Аутентификация MySQL с использованием плагина аутентификации SASL LDAP с методом GSSAPI/Kerberos основана на пользователе, являющимся принципалом Kerberos. В данном обсуждении используется принципал с именем bredon@MYSQL.LOCAL в качестве этого пользователя, который должен быть зарегистрирован в нескольких местах:
Администратор Kerberos должен зарегистрировать имя пользователя как Kerberos-принципал. Это имя должно включать доменное имя. Клиенты используют имя принципала и пароль для аутентификации с Kerberos и получения TGT.
-
Администратор LDAP должен зарегистрировать имя пользователя в записи LDAP. Например:
uid=bredon,dc=MYSQL,dc=LOCAL
ПримечаниеВ Active Directory (которая использует Kerberos в качестве метода аутентификации по умолчанию), создание пользователя создает как Kerberos-принципал, так и запись LDAP.
MySQL DBA должен создать учетную запись, которая имеет имя Kerberos-принципала в качестве имени пользователя и которая аутентифицируется с помощью плагина SASL LDAP.
Предполагается, что Kerberos-принципал и запись LDAP были зарегистрированы соответствующими администраторами сервисов, и что, как описано ранее в Установка плагина LDAP Pluggable Authentication и Настройка плагина SASL LDAP для аутентификации GSSAPI/Kerberos на стороне сервера, сервер MySQL был запущен с соответствующими параметрами конфигурации для плагина SASL LDAP на стороне сервера. Затем MySQL DBA создает учетную запись MySQL, которая соответствует имени Kerberos-принципала, включая доменное имя.
Плагин SASL LDAP использует постоянный DN пользователя для аутентификации Kerberos и игнорирует любой DN пользователя, настроенный из MySQL. Это имеет определенные последствия:
Для любой учетной записи MySQL, использующей аутентификацию GSSAPI/Kerberos, строка аутентификации в
CREATE USERилиALTER USERзапросах не должна содержать DN пользователя, так как это не оказывает никакого влияния.Поскольку строка аутентификации не содержит DN пользователя, она должна содержать информацию о сопоставлении групп, чтобы пользователь мог обрабатываться как прокси-пользователь, который сопоставлен с нужным проксируемым пользователем. Сведения о проксировании с помощью плагина аутентификации LDAP см. в Аутентификация LDAP с проксированием.
Следующие операторы создают прокси-пользователя с именем bredon@MYSQL.LOCAL, который принимает привилегии проксируемого пользователя с именем proxied_krb_usr. Другие пользователи GSSAPI/Kerberos, которые должны иметь такие же привилегии, могут быть аналогично созданы как прокси-пользователи для того же проксируемого пользователя.
-- create proxy account
CREATE USER 'bredon@MYSQL.LOCAL'
IDENTIFIED WITH authentication_ldap_sasl
BY '#krb_grp=proxied_krb_user';
-- create proxied account and grant its privileges;
-- use mysql_no_login plugin to prevent direct login
CREATE USER 'proxied_krb_user'
IDENTIFIED WITH mysql_no_login;
GRANT ALL
ON krb_user_db.*
TO 'proxied_krb_user';
-- grant to proxy account the
-- PROXY privilege for proxied account
GRANT PROXY
ON 'proxied_krb_user'
TO 'bredon@MYSQL.LOCAL';
Обратите пристальное внимание на кавычки для имени прокси-учета в первом CREATE USER операторе и в GRANT
PROXY операторе:
Для большинства учетных записей MySQL пользователь и хост являются отдельными частями имени учетной записи, и поэтому они приводятся в кавычки по отдельности как
'.user_name'@'host_name'Для аутентификации LDAP Kerberos, часть имени учетной записи, относящаяся к пользователю, включает домен принципала, поэтому
'bredon@MYSQL.LOCAL'приводится в кавычки как одно значение. Поскольку часть хоста не указана, полное имя учетной записи MySQL использует значение по умолчанию'%'в качестве части хоста:'bredon@MYSQL.LOCAL'@'%'
При создании учетной записи, которая аутентифицируется с помощью плагина SASL LDAP authentication_ldap_sasl с методом аутентификации GSSAPI/Kerberos, оператор CREATE
USER включает область в имени пользователя. Это отличается от создания учетных записей, которые используют плагин authentication_kerberos Kerberos. Для таких учетных записей оператор CREATE
USER не включает область в имени пользователя. Вместо этого укажите область как строку аутентификации в пункте BY. См. Создание учетной записи MySQL, использующей аутентификацию Kerberos.
Проксируемая учетная запись использует плагин mysql_no_login аутентификации для предотвращения подключения клиентов напрямую к серверу MySQL с использованием этой учетной записи. Вместо этого ожидается, что пользователи, которые проходят аутентификацию с помощью LDAP, будут использовать прокси-учетную запись bredon@MYSQL.LOCAL. (Это предполагает, что плагин mysql_no_login установлен. Инструкции см. в Раздел 8.4.1.9, «Плагин аутентификации No-Login»). Для альтернативных методов защиты проксируемых учетных записей от прямого подключения см. Предотвращение прямого входа в прокси-учетные записи.
Использование учетной записи MySQL для подключения к серверу MySQL
После настройки учетной записи MySQL, которая использует аутентификацию GSSAPI/Kerberos, клиенты могут использовать ее для подключения к серверу MySQL. Аутентификация Kerberos может происходить либо до, либо во время запуска программы клиента MySQL:
-
До запуска программы клиента MySQL пользователь-клиент может получить TGT от KDC независимо от MySQL. Например, пользователь-клиент может использовать команду kinit для аутентификации с Kerberos, указав имя Kerberos-принципала и пароль принципала:
$>
kinit bredon@MYSQL.LOCALPassword for bredon@MYSQL.LOCAL:(enter password here)Результирующий TGT кешируется и становится доступен для использования другими приложениями, поддерживающими Kerberos, такими как программы, использующие плагин аутентификации LDAP SASL на стороне клиента. В этом случае программа клиента MySQL аутентифицируется на сервере MySQL с помощью TGT, поэтому запустите клиента без указания имени пользователя или пароля:
mysql --default-auth=authentication_ldap_sasl_client
Как только что описано, когда TGT кешируется, опции имени пользователя и пароля не нужны в команде клиента. Если команда их все же включает, они обрабатываются следующим образом:
Если команда включает имя пользователя, аутентификация завершается неудачей, если это имя не совпадает с именем принципала в TGT.
Если команда включает пароль, плагин на стороне клиента его игнорирует. Поскольку аутентификация основана на TGT, она может быть успешной даже если введённый пользователем пароль неверен. По этой причине плагин выводит предупреждение, если найден действительный TGT, который приводит к игнорированию пароля.
-
Если кеш Kerberos не содержит TGT, сам плагин аутентификации LDAP SASL на стороне клиента может получить TGT от KDC. Запустите клиент с опциями для имени и пароля Kerberos-принципала, связанного с учетной записью MySQL (введите команду в одну строку, затем введите пароль принципала, когда будет запрошено):
mysql --default-auth=authentication_ldap_sasl_client --user=bredon@MYSQL.LOCAL --password
Если кеш Kerberos не содержит TGT, и команда клиента не указывает имя принципала в качестве имени пользователя, аутентификация завершается неудачей.
Если вы не уверены, существует ли TGT, вы можете использовать klist для проверки.
Аутентификация происходит следующим образом:
Клиент использует TGT для аутентификации с помощью Kerberos.
Сервер находит запись LDAP для принципала и использует ее для аутентификации соединения для прокси-учетной записи MySQL
bredon@MYSQL.LOCAL.Информация о сопоставлении групп в строке аутентификации прокси-учета (
'#krb_grp=proxied_krb_user') указывает, что аутентифицированный проксируемый пользователь должен бытьproxied_krb_user.-
bredon@MYSQL.LOCALрассматривается как прокси дляproxied_krb_user, и следующий запрос возвращает вывод, как показано:mysql>
SELECT USER(), CURRENT_USER(), @@proxy_user;+------------------------------+--------------------+--------------------------+ | USER() | CURRENT_USER() | @@proxy_user | +------------------------------+--------------------+--------------------------+ | bredon@MYSQL.LOCAL@localhost | proxied_krb_user@% | 'bredon@MYSQL.LOCAL'@'%' | +------------------------------+--------------------+--------------------------+Значение
USER()указывает имя пользователя, используемое для команды клиента (bredon@MYSQL.LOCAL), и хост, с которого подключился клиент (localhost).Значение
CURRENT_USER()— полное имя проксируемой учетной записи пользователя, которое состоит из части пользователяproxied_krb_userи части хоста%.Значение
@@proxy_userуказывает полное имя учетной записи, используемой для подключения к серверу MySQL, которое состоит из части пользователяbredon@MYSQL.LOCALи части хоста%.Это демонстрирует, что проксирование происходит через прокси-учетную запись пользователя
bredon@MYSQL.LOCAL, и чтоbredon@MYSQL.LOCALпринимает привилегии, предоставленные проксируемой учетной записи пользователяproxied_krb_user.
Полученный TGT кешируется на стороне клиента и может использоваться до истечения срока действия без повторного указания пароля. Независимо от способа получения TGT, плагин на стороне клиента использует его для получения билетов на обслуживание и взаимодействия с плагином на стороне сервера.
Когда плагин аутентификации на стороне клиента сам получает TGT, пользователь-клиент может не захотеть повторного использования TGT. Как описано в Параметры конфигурации клиента для аутентификации LDAP, локальный файл /etc/krb5.conf может быть использован для того, чтобы заставить плагин на стороне клиента уничтожить TGT после его использования.
Плагин на стороне сервера не имеет доступа к самому TGT или паролю Kerberos, используемому для его получения.
Плагины аутентификации LDAP не контролируют механизм кэширования (хранение в локальном файле, в памяти и так далее), но для этой цели могут быть доступны утилиты Kerberos, такие как kswitch.
Параметры конфигурации клиента для аутентификации LDAP
Плагин SASL LDAP на стороне клиента читает локальный файл /etc/krb5.conf. Если этот файл отсутствует или недоступен, возникает ошибка. При условии доступности файла, он может содержать необязательный раздел [appdefaults] для предоставления информации, используемой плагином. Разместите информацию в части mysql раздела. Например:
[appdefaults]
mysql = {
ldap_server_host = "ldap_host.example.com"
ldap_destroy_tgt = true
}
Плагин на стороне клиента распознает эти параметры в разделе mysql:
Значение
ldap_server_hostуказывает хост сервера LDAP и может быть полезно, когда этот хост отличается от хоста сервера KDC, указанного в разделе[realms]. По умолчанию плагин использует хост сервера KDC как хост сервера LDAP.Значение
ldap_destroy_tgtуказывает, уничтожает ли плагин на стороне клиента TGT после получения и использования. По умолчаниюldap_destroy_tgtравноfalse, но может быть установлено вtrue, чтобы избежать повторного использования TGT. (Это значение применяется только к TGT, созданным плагином на стороне клиента, а не к TGT, созданным другими плагинами или внешними для MySQL.)
Пересылка запросов LDAP
Сервер LDAP может быть настроен для делегирования запросов LDAP другому серверу LDAP, функция, известная как пересылка запросов LDAP. Предположим, что сервер a.example.com хранит корневой DN "dc=example,dc=com" и хочет делегировать запросы другому серверу b.example.com. Для этого a.example.com будет настроен с объектом пересылки с именем, имеющим эти атрибуты:
dn: dc=subtree,dc=example,dc=com
objectClass: referral
objectClass: extensibleObject
dc: subtree
ref: ldap://b.example.com/dc=subtree,dc=example,dc=com
Проблема с включением пересылки запросов LDAP заключается в том, что запросы могут завершаться ошибками операций LDAP при поиске по корневому DN, и объекты пересылки не установлены. MySQL DBA может захотеть избежать таких ошибок пересылки для плагинов аутентификации LDAP, даже если пересылка запросов LDAP может быть установлена глобально в файле конфигурации ldap.conf. Чтобы настроить на основе плагина, должен ли сервер LDAP использовать пересылку LDAP при общении с каждым плагином, установите системные переменные authentication_ldap_simple_referral и authentication_ldap_sasl_referral. Установка любой из переменных в ON или OFF сообщает соответствующему плагину аутентификации LDAP серверу LDAP, следует ли использовать пересылку во время аутентификации MySQL. Каждая переменная имеет действие, специфичное для плагина, и не влияет на другие приложения, которые взаимодействуют с сервером LDAP. Обе переменные по умолчанию OFF.
© 2025 Oracle
Licensed under the GPLv2 License.