Spec-Zone.ru › MySQL 9.2

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

Таблица 8.19 Имена плагинов и библиотек для простой аутентификации LDAP
Плагин или файл Имя плагина или файла
Имя плагина на стороне сервера authentication_ldap_simple
Имя плагина на стороне клиента mysql_clear_password
Имя файла библиотеки authentication_ldap_simple.so

Таблица 8.20 Имена плагинов и библиотек для аутентификации LDAP, основанной на SASL

Таблица 8.20 Имена плагинов и библиотек для аутентификации LDAP, основанной на SASL
Плагин или файл Имя плагина или файла
Имя плагина на стороне сервера authentication_ldap_sasl
Имя плагина на стороне клиента authentication_ldap_sasl_client
Имена файлов библиотек authentication_ldap_sasl.so, authentication_ldap_sasl_client.so

Файлы библиотек включают только плагины аутентификации authentication_ldap_XXX. Плагин клиента mysql_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:

  • Предварительные условия для подключаемой аутентификации LDAP

  • Как работает аутентификация пользователей MySQL с помощью LDAP

  • Установка подключаемой аутентификации LDAP

  • Удаление подключаемой аутентификации LDAP

  • Подключаемая аутентификация LDAP и ldap.conf

  • Установка таймаутов для подключаемой аутентификации LDAP

  • Использование подключаемой аутентификации LDAP

  • Простая аутентификация LDAP (без проксирования)

  • Аутентификация LDAP, основанная на SASL (без проксирования)

  • Аутентификация LDAP с проксированием

  • Указание предпочтения и сопоставления групп аутентификации LDAP

  • Суффиксы DN пользователей аутентификации LDAP

  • Методы аутентификации LDAP

  • Метод аутентификации GSSAPI/Kerberos

  • Пересылка запросов поиска 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».

END_OF_DOCUMENT_MARKER
Предварительные условия для подключаемого модуля аутентификации 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, соответствующая имени пользователя клиента, рассматривается как внешний пользователь-прокси.

END_OF_DOCUMENT_MARKER
Установка подключаемого модуля аутентификации 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.

Дополнительные заметки для SELinux

На системах, работающих под EL6 или EL с включенным SELinux, требуются изменения в политике SELinux, чтобы разрешить плагинам MySQL LDAP взаимодействовать с LDAP-службой:

  1. Создайте файл 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;
    
  2. Скомпилируйте модуль политики безопасности в бинарную форму:

    checkmodule -M -m mysqlldap.te -o mysqlldap.mod
    
  3. Создайте пакет модуля политики SELinux:

    semodule_package -m mysqlldap.mod  -o mysqlldap.pp
    
  4. Установите пакет модуля:

    semodule -i mysqlldap.pp
    
  5. После внесения изменений в политику 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).

END_OF_DOCUMENT_MARKER
Настройка таймаутов для подключаемого модуля аутентификации 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

Таблица 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 для использования защищенных подключений».

Процесс аутентификации происходит следующим образом:

  1. Плагин на стороне клиента отправляет betsy и betsy_password в качестве имени пользователя клиента и пароля LDAP серверу MySQL.

  2. Попытка подключения соответствует учетной записи 'betsy'@'localhost'. Плагин LDAP на стороне сервера обнаруживает, что эта учетная запись имеет строку аутентификации 'uid=betsy_ldap,ou=People,dc=example,dc=com' для указания DN пользователя LDAP. Плагин отправляет эту строку и пароль LDAP на сервер LDAP.

  3. Сервер LDAP находит запись LDAP для betsy_ldap и пароль совпадает, поэтому аутентификация по LDAP прошла успешно.

  4. В записи 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 и сервером.

END_OF_DOCUMENT_MARKER
Аутентификация 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 'auth_string' для указания DN пользователя LDAP. Таким образом:

  • При подключении клиента имя пользователя клиента становится именем пользователя 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)

Аутентификация происходит следующим образом:

  1. Сервер аутентифицирует соединение с использованием прокси-учетной записи по умолчанию ''@'%' для пользователя клиента basha.

  2. Соответствующая запись LDAP:

    uid=basha,ou=People,dc=example,dc=com,cn=accounting
    
  3. В соответствующей записи LDAP есть атрибут группы cn=accounting, поэтому accounting становится аутентифицированным проксированным пользователем.

  4. Аутентифицированный пользователь отличается от имени пользователя клиента 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:

  1. Сервер аутентифицирует соединение с использованием прокси-учетной записи по умолчанию ''@'%' для пользователя клиента basil.

  2. Соответствующая запись LDAP:

    uid=basil,ou=People,dc=example,dc=com,cn=front_office
    
  3. В соответствующей записи LDAP есть атрибут группы cn=front_office, поэтому front_office становится аутентифицированным проксированным пользователем.

  4. Аутентифицированный пользователь отличается от имени пользователя клиента 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_name или group_name. Элементы должны быть перечислены в порядке предпочтения имен групп. Для имени группы, выбранного плагином как совпадающее из набора имен групп, возвращенных сервером LDAP, два синтаксиса различаются по своему эффекту следующим образом:

    • Для элемента, указанного как group_name=user_name (с именем пользователя), имя группы сопоставляется с именем пользователя, которое используется как имя прокси-пользователя MySQL.

    • Для элемента, указанного как 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

  • Настройка плагина аутентификации SASL LDAP на стороне сервера для GSSAPI/Kerberos

  • Создание учетной записи MySQL, использующей GSSAPI/Kerberos для аутентификации LDAP

  • Использование учетной записи MySQL для подключения к серверу MySQL

  • Параметры конфигурации клиента для аутентификации LDAP

Проверка доступности 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.)

После выполнения этих предположений, выполните следующие действия:

  1. Проверьте, что библиотека 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
      }
    
  2. Возможно, вам потребуется добавить запись в /etc/hosts для хоста сервера:

    198.51.100.10 ldap_auth ldap_auth.example.com
    
  3. Проверьте, правильно ли работает аутентификация Kerberos:

    1. Используйте kinit для аутентификации в Kerberos:

      $> kinit bredon@MYSQL.LOCAL
      Password for bredon@MYSQL.LOCAL: (enter password here)
      

      Команда выполняет аутентификацию для принципала Kerberos с именем bredon@MYSQL.LOCAL. Введите пароль принципала, когда команда запросит его. KDC возвращает TGT, который кешируется на стороне клиента для использования другими приложениями, поддерживающими Kerberos.

    2. Используйте 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
      
  4. Проверьте, работает ли 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.LOCAL
    Password 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 для проверки.

Аутентификация происходит следующим образом:

  1. Клиент использует TGT для аутентификации с использованием Kerberos.

  2. Сервер находит запись LDAP для принципала и использует её для аутентификации подключения для прокси-аккаунта MySQL bredon@MYSQL.LOCAL.

  3. Информация о сопоставлении групп в строке аутентификации прокси-аккаунта ('#krb_grp=proxied_krb_user') указывает, что аутентифицированный прокси-пользователь должен быть proxied_krb_user.

  4. 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/ldap-pluggable-authentication.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API