6.4.1.9 Плагин аутентификации LDAP
Плагин аутентификации LDAP является расширением, включённым в MySQL Enterprise Edition, коммерческий продукт. Для получения дополнительной информации о коммерческих продуктах, см. https://www.mysql.com/products/.
Начиная с MySQL 5.7.19, 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 могут быть защищены.
В следующих таблицах показаны имена плагина и библиотечного файла для аутентификации LDAP в простых и основанных на SASL вариантах. Суффикс имени файла может отличаться на вашей системе. Файлы должны быть расположены в каталоге, указанном переменной системы plugin_dir.
Таблица 6.15 Имена плагина и библиотеки для простой аутентификации LDAP
| Плагин или Файл | Имя плагина или файла |
|---|---|
| Имя плагина на стороне сервера | authentication_ldap_simple |
| Имя плагина на стороне клиента | mysql_clear_password |
| Имя файла библиотеки | authentication_ldap_simple.so |
Таблица 6.16 Имена плагина и библиотеки для аутентификации 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-клиентом и сервером.
Плагины аутентификации LDAP на стороне сервера включены только в MySQL Enterprise Edition. Они не включены в дистрибутивы MySQL community. Плагин LDAP SASL на стороне клиента включен во все дистрибутивы, включая community, и, как упоминалось ранее, плагин mysql_clear_password на стороне клиента встроен в библиотеку клиента libmysqlclient, которая также включена во все дистрибутивы. Это позволяет клиентам из любого дистрибутива подключаться к серверу, на котором загружен соответствующий плагин на стороне сервера.
В следующих разделах содержится информация об установке и использовании, специфичная для плагина аутентификации LDAP:
Для общей информации об аутентификации плагинов в MySQL, см. Раздел 6.2.13, «Плагины аутентификации». Для получения информации о плагине mysql_clear_password, см. Раздел 6.4.1.6, «Плагин аутентификации открытого текста на стороне клиента». Для информации о прокси-пользователях, см. Раздел 6.2.14, «Прокси-пользователи».
Если ваша система поддерживает PAM и разрешает LDAP как метод аутентификации PAM, другой способ использования LDAP для аутентификации пользователей MySQL — использование плагина authentication_pam на стороне сервера. См. Раздел 6.4.1.7, «Плагин аутентификации 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.
Как работает аутентификация MySQL-пользователей по LDAP
Этот раздел предоставляет общее описание взаимодействия MySQL и LDAP для аутентификации MySQL-пользователей. Примеры настройки MySQL-аккаунтов для использования конкретных плагинов аутентификации LDAP см. в разделе Использование плагинов аутентификации LDAP.
Клиент подключается к серверу MySQL, предоставляя имя пользователя MySQL-клиента и пароль LDAP:
Для простой аутентификации LDAP плагины на стороне клиента и сервера передают пароль в открытом виде. Рекомендуется использовать защищённое соединение между MySQL-клиентом и сервером для предотвращения раскрытия пароля.
Для аутентификации LDAP на основе SASL плагины на стороне клиента и сервера избегают передачи пароля в открытом виде между MySQL-клиентом и сервером. Например, плагины могут использовать сообщения SASL для безопасной передачи учетных данных в протоколе LDAP.
Если имя пользователя и имя хоста клиента не соответствуют ни одному MySQL-аккаунту, подключение отклоняется.
Если существует соответствующий MySQL-аккаунт, происходит аутентификация против 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-аутентификации на стороне сервера. Общие сведения об установке плагинов см. в разделе Раздел 5.5.1, “Установка и удаление плагинов”.
Для использования плагином сервером, файлы библиотек плагинов должны находиться в каталоге плагинов MySQL (каталог, указанный переменной среды plugin_dir). При необходимости, конфигурируйте расположение каталога плагинов, установив значение переменной plugin_dir при запуске сервера.
Имена файлов библиотек плагинов на стороне сервера — authentication_ldap_simple и authentication_ldap_sasl. Суффикс имени файла зависит от платформы (например, .so для Unix и Unix-подобных систем, .dll для Windows).
Для загрузки плагинов при запуске сервера используйте опции --plugin-load-add, чтобы указать имена файлов библиотек, содержащие плагины. При этом способе загрузки плагины должны указываться каждый раз при запуске сервера. Также необходимо указать значения для всех переменных среды, предоставляемых плагином, которые вы хотите настроить.
Каждый плагин LDAP на стороне сервера предоставляет набор переменных среды, которые позволяют настроить его работу. Установка большинства из них необязательна, но вы должны установить переменные, указывающие хост LDAP-сервера (чтобы плагин знал, куда подключаться) и базовое отличительное имя для операций связывания LDAP (для ограничения области поиска и ускорения поиска). Подробную информацию обо всех переменных среды LDAP см. в разделе Раздел 6.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 перезапустите сервер, чтобы новые настройки вступили в силу.
Для проверки установки плагинов, обратитесь к таблице Информационной Схемы PLUGINS или используйте оператор SHOW PLUGINS (см. Раздел 5.5.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.
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.conf обратитесь к странице справки ldap.conf(5).
Использование плагиновой аутентификации LDAP
В этом разделе описывается, как настроить учетные записи MySQL для подключения к серверу MySQL с помощью плагиновой аутентификации LDAP. Предполагается, что сервер работает с включенными соответствующими плагинами на стороне сервера, как описано в Установка плагиновой аутентификации LDAP, и что соответствующие плагины на стороне клиента доступны на клиентском узле.
Этот раздел не описывает конфигурацию или администрирование LDAP. Предполагается, что вы знакомы с этими темами.
Два плагина LDAP на стороне сервера работают с соответствующими плагинами на стороне клиента:
Плагин
authentication_ldap_simpleна стороне сервера выполняет простую аутентификацию LDAP. Для подключений учетными записями, использующими этот плагин, клиентские программы используют плагинmysql_clear_passwordна стороне клиента, который отправляет пароль на сервер в виде открытого текста. Не используется хэширование или шифрование пароля, поэтому рекомендуется безопасное подключение между MySQL-клиентом и сервером, чтобы предотвратить раскрытие пароля.Плагин
authentication_ldap_saslна стороне сервера выполняет аутентификацию LDAP на основе SASL. Для подключений учетными записями, использующими этот плагин, клиентские программы используют плагинauthentication_ldap_sasl_clientна стороне клиента. Плагины LDAP с SASL на стороне клиента и сервера используют сообщения SASL для безопасной передачи учетных данных по протоколу LDAP, чтобы избежать отправки пароля в открытом виде между MySQL-клиентом и сервером.
Общие требования к аутентификации LDAP для пользователей MySQL:
Для каждого пользователя, подлежащего аутентификации, должна существовать запись в LDAP-каталоге.
Должна быть учетная запись MySQL-пользователя, которая указывает плагин аутентификации LDAP на стороне сервера и необязательно имя соответствующего имени выделенного пользователя LDAP (DN). (Чтобы связать 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). См. Раздел 6.4.1.6, «Клиентская аутентификация в открытом тексте».Чтобы избежать раскрытия пароля при включенном плагине
mysql_clear_password, клиенты MySQL должны подключаться к MySQL-серверу с помощью зашифрованного подключения. См. Раздел 6.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-пользователя, попытки аутентификации использовали бы имя пользователя, предоставленное клиентом (в этом случае betsy). В отсутствие LDAP-записи для betsy аутентификация завершилась бы ошибкой.
Аутентификация по SASL через LDAP (без проксирования)
Процедура, описанная в этом разделе, требует, чтобы authentication_ldap_sasl_group_search_attr было установлено в пустую строку, как показано ниже:
SET GLOBAL.authentication_ldap_sasl_group_search_attr='';
В противном случае, проксирование используется по умолчанию.
Для настройки учетной записи MySQL для аутентификации по SASL через LDAP используйте оператор 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, для предоставления значений имени различения, уникально идентифицирующих каждого пользователя:
uid=basha,ou=People,dc=example,dc=com,cn=accounting uid=basil,ou=People,dc=example,dc=com,cn=front_office
Во время подключения значения атрибута группы становятся именами аутентифицированного пользователя, следовательно, они называют проксированные учетные записи MySQL, определяющие разные наборы привилегий.
Примеры предполагают использование аутентификации через 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 установлен. Инструкции см. в Разделе 6.4.1.10, «Плагины аутентификации без входа».) Альтернативные методы защиты проксированных учетных записей от прямого входа см. в Разделе о предотвращении прямого входа в проксированные учетные записи.
Предоставьте учетной записи-прокси привилегию 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 5.7.25, для учетных записей 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-аутентификации
Начиная с MySQL 5.7.21, 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.
См. описания системных переменных для получения информации о каждом разрешенном методе.
© 2025 Oracle
Licensed under the GPLv2 License.