8.4.1.6 Подключаемая аутентификация 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.19 Имена плагинов и библиотек для простой аутентификации LDAP
| Плагин или файл | Имя плагина или файла |
|---|---|
| Имя плагина на стороне сервера | authentication_ldap_simple |
| Имя плагина на стороне клиента | mysql_clear_password |
| Имя файла библиотеки | authentication_ldap_simple.so |
Таблица 8.20 Имена плагинов и библиотек для аутентификации 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на стороне клиента. Клиентские и серверные плагины SASL LDAP используют сообщения SASL для безопасной передачи учетных данных в протоколе LDAP, чтобы избежать отправки пароля в открытом тексте между MySQL-клиентом и сервером.В платформах Microsoft Windows поддерживаются как плагин сервера, так и плагин клиента для аутентификации LDAP, основанной на SASL.
Плагины аутентификации LDAP на стороне сервера включены только в MySQL Enterprise Edition. Они не включены в дистрибутивы MySQL сообщества. Плагин SASL LDAP на стороне клиента включён во все дистрибутивы, включая дистрибутивы сообщества, и, как упоминалось ранее, плагин mysql_clear_password на стороне клиента встроен в библиотеку клиента libmysqlclient, которая также включена во все дистрибутивы. Это позволяет клиентам из любого дистрибутива подключаться к серверу, на котором загружен соответствующий плагин на стороне сервера.
В следующих разделах приведена информация об установке и использовании, специфичная для подключаемой аутентификации LDAP:
Для общей информации о подключаемой аутентификации в MySQL см. Раздел 8.2.17, «Подключаемая аутентификация». Для получения информации о плагине mysql_clear_password см. Раздел 8.4.1.3, «Подключаемая аутентификация в открытом тексте на стороне клиента». Для информации о прокси-пользователях см. Раздел 8.2.19, «Прокси-пользователи».
Если ваша система поддерживает PAM и позволяет LDAP как метод аутентификации PAM, другой способ использования LDAP для аутентификации пользователей MySQL — использовать плагин authentication_pam на стороне сервера. См. Раздел 8.4.1.4, «Подключаемая аутентификация 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 (чтобы плагин знал, с каким сервером подключаться) и базовый отличительный идентификатор (Distinguished Name) для операций привязки LDAP (чтобы ограничить область поиска и получить более быстрый поиск). Подробности о всех переменных системы LDAP см. в разделе 8.4.1.13 «Переменные системы подключаемой аутентификации».
Чтобы загрузить плагины и установить хост сервера LDAP и базовый отличительный идентификатор для операций привязки LDAP, поместите строки, подобные этим, в ваш файл 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, требуются изменения в политике SELinux, чтобы разрешить плагинам MySQL LDAP взаимодействовать с LDAP-службой:
-
Создайте файл
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, обратитесь к странице справки man для 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
Следующие системные переменные поддерживают значения таймаутов по умолчанию для аутентификации на основе SASL и простой аутентификации LDAP только на платформах Linux.
Таблица 8.21 Системные переменные для аутентификации на основе 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 на стороне сервера и необязательно имя соответствующего отличительного имени пользователя LDAP (DN). (Чтобы связать DN пользователя LDAP с учетной записью MySQL, включите в оператор
CREATE USER, который создает учетную запись, предложениеBY). Если учетная запись не указывает строку 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, необязательно включая имя (DN) пользователя LDAP, как показано здесь:
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.3, «Клиентская аутентификация с открытым текстом».Чтобы избежать раскрытия пароля при включенном плагине
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 для указания DN пользователя LDAP, попытки аутентификации использовали бы имя пользователя, предоставленное клиентом (в данном случае, 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, необязательно включая имя (DN) пользователя LDAP, как показано здесь:
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. В примерах предполагается использование аутентификации SASL LDAP. Внесите соответствующие коррективы для простой аутентификации 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.8, «Плагины аутентификации без входа».) Альтернативные методы защиты проксированных учетных записей от прямого использования см. в разделе Предотвращение прямого входа в проксированные учетные записи.
Предоставьте прокси-учетной записи привилегию 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 аутентификации и Настройка серверного плагина 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.8, «Плагин аутентификации без входа».) Для альтернативных способов защиты прокси-учётных записей от прямого доступа см. Предотвращение прямого входа в прокси-аккаунты.
Подключение к серверу 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, такими как программы, использующие плагин аутентификации SASL LDAP на стороне клиента. В этом случае программа MySQL-клиента выполняет аутентификацию на сервере MySQL с помощью TGT, поэтому вызывайте клиент без указания имени пользователя или пароля:
mysql --default-auth=authentication_ldap_sasl_client
Как только что описано, когда TGT кэшируется, параметры имени пользователя и пароля не нужны в команде клиента. Если команда их всё же включает, они обрабатываются следующим образом:
Если команда включает имя пользователя, аутентификация завершается неудачно, если это имя не совпадает с именем принципала в TGT.
Если команда включает пароль, плагин на стороне клиента игнорирует его. Поскольку аутентификация основана на TGT, она может быть успешной даже если предоставленный пользователем пароль неверен. По этой причине плагин выводит предупреждение, если найден действительный TGT, из-за которого пароль игнорируется.
-
Если кеш Kerberos не содержит TGT, сам плагин аутентификации SASL LDAP на стороне клиента может получить 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.