Spec-Zone.ru › MySQL 8.4

8.4.1.7 Подключаемая аутентификация LDAP

Примечание

Подключаемая аутентификация LDAP — это расширение, включенное в MySQL Enterprise Edition, коммерческий продукт. Чтобы узнать больше о коммерческих продуктах, посетите https://www.mysql.com/products/.

MySQL Enterprise Edition поддерживает метод аутентификации, который позволяет MySQL Server использовать LDAP (Lightweight Directory Access Protocol) для аутентификации пользователей MySQL, обращаясь к службам каталогов, таким как X.500. MySQL использует LDAP для получения информации о пользователях, учетных данных и группах.

Подключаемая аутентификация LDAP предоставляет следующие возможности:

  • Внешняя аутентификация: аутентификация LDAP позволяет MySQL Server принимать подключения от пользователей, определённых вне таблиц предоставления прав MySQL в каталогах LDAP.

  • Поддержка прокси-пользователей: аутентификация LDAP может возвращать MySQL имя пользователя, отличное от внешнего имени пользователя, переданного программой-клиентом, на основе групп LDAP, членами которых является внешний пользователь. Это означает, что плагин LDAP может возвращать пользователю MySQL, определяющему привилегии, которые должен иметь внешний пользователь, аутентифицированный по LDAP. Например, пользователь LDAP с именем joe может подключиться и иметь привилегии пользователя MySQL с именем developer, если группа LDAP для joe является developer.

  • Безопасность: с помощью TLS подключения к серверу LDAP могут быть защищены.

Доступны плагины сервера и клиента для простой и основанной на SASL аутентификации LDAP. В Microsoft Windows плагин сервера для аутентификации LDAP на основе SASL не поддерживается, но поддерживается плагин клиента.

В следующих таблицах показаны имена плагинов и файлов библиотек для простой и основанной на SASL аутентификации LDAP. Название файла может отличаться на вашей системе. Файлы должны находиться в каталоге, указанном переменной среды plugin_dir.

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

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

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

Таблица 8.21 Имена плагинов и библиотек для аутентификации 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. Плагины LDAP SASL на стороне клиента и сервера используют сообщения SASL для безопасной передачи учетных данных в рамках протокола LDAP, чтобы избежать отправки пароля в открытом виде между MySQL клиентом и сервером.

    В платформах Microsoft Windows поддерживаются как плагин сервера, так и плагин клиента для аутентификации LDAP на основе SASL.

Плагины аутентификации LDAP на стороне сервера включены только в MySQL Enterprise Edition. Они не включены в дистрибутивы MySQL Community. Плагин LDAP SASL на стороне клиента включён во все дистрибутивы, включая дистрибутивы Community, и, как уже упоминалось, плагин клиента 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.4, «Подключаемая аутентификация клиентского cleartext». Информацию о прокси-пользователях см. в Разделе 8.2.19, «Прокси-пользователи».

Примечание

Если ваша система поддерживает PAM и разрешает LDAP в качестве метода аутентификации PAM, другой способ использования LDAP для аутентификации пользователей MySQL — использование плагина сервера authentication_pam. См. Раздел 8.4.1.5, «Подключаемая аутентификация 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 (чтобы плагин знал, куда подключаться) и базовое имя различия для операций LDAP bind (чтобы ограничить область поиска и получить более быстрый поиск). Подробности о всех переменных среды LDAP см. в Разделе 8.4.1.13, «Переменные среды подключаемой аутентификации».

Для загрузки плагинов и установки хоста сервера LDAP и базового имени различия для операций LDAP bind, поместите строки, подобные этим, в ваш файл my.cnf, корректируя суффикс .so в зависимости от вашей платформы:

[mysqld]
plugin-load-add=authentication_ldap_simple.so
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
plugin-load-add=authentication_ldap_sasl.so
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"

После изменения файла my.cnf перезапустите сервер, чтобы новые настройки вступили в силу.

В качестве альтернативы, для загрузки плагинов во время выполнения используйте следующие инструкции, корректируя суффикс .so для вашей платформы:

INSTALL PLUGIN authentication_ldap_simple
  SONAME 'authentication_ldap_simple.so';
INSTALL PLUGIN authentication_ldap_sasl
  SONAME 'authentication_ldap_sasl.so';

INSTALL PLUGIN загружает плагин немедленно и также регистрирует его в таблице системной информации mysql.plugins, что заставляет сервер загружать его при каждом последующем обычном запуске без необходимости в --plugin-load-add.

После установки плагинов во время выполнения, доступными становятся переменные среды, которые они предоставляют, и вы можете добавить настройки для них в свой файл my.cnf, чтобы настроить плагины для последующих перезапусков. Например:

[mysqld]
authentication_ldap_simple_server_host=127.0.0.1
authentication_ldap_simple_bind_base_dn="dc=example,dc=com"
authentication_ldap_sasl_server_host=127.0.0.1
authentication_ldap_sasl_bind_base_dn="dc=example,dc=com"

После изменения файла my.cnf перезапустите сервер, чтобы новые настройки вступили в силу.

Для установки и сохранения каждого значения во время выполнения, а не при запуске, используйте следующие инструкции:

SET PERSIST authentication_ldap_simple_server_host='127.0.0.1';
SET PERSIST authentication_ldap_simple_bind_base_dn='dc=example,dc=com';
SET PERSIST authentication_ldap_sasl_server_host='127.0.0.1';
SET PERSIST authentication_ldap_sasl_bind_base_dn='dc=example,dc=com';

SET PERSIST устанавливает значение для работающего экземпляра MySQL. Он также сохраняет значение, что обеспечивает его сохранение при последующих перезапусках сервера. Чтобы изменить значение для работающего экземпляра MySQL без сохранения его для последующих перезапусков, используйте ключевое слово GLOBAL, а не PERSIST. См. Раздел 15.7.6.1, «Синтаксис SET для присваивания переменных».

Для проверки установки плагинов, просмотрите таблицу Справочника информации PLUGINS или используйте оператор SHOW PLUGINS (см. Раздел 7.6.2, «Получение информации о серверных плагинах»). Например:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%ldap%';
+----------------------------+---------------+
| PLUGIN_NAME                | PLUGIN_STATUS |
+----------------------------+---------------+
| authentication_ldap_sasl   | ACTIVE        |
| authentication_ldap_simple | ACTIVE        |
+----------------------------+---------------+

Если плагин не удаётся инициализировать, проверьте лог ошибок сервера на наличие диагностических сообщений.

Для ассоциации учетных записей MySQL с плагином LDAP, см. Использование подключаемого модуля аутентификации LDAP.

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

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

  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 обратитесь к странице руководства 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

Следующие системные переменные поддерживают значения таймаутов по умолчанию для аутентификации LDAP на основе SASL и простой аутентификации LDAP только на платформах Linux.

Таблица 8.22 Системные переменные для аутентификации LDAP на основе SASL и простой аутентификации LDAP

Таблица 8.22 Системные переменные для аутентификации LDAP на основе SASL и простой аутентификации LDAP
Имя системной переменной Значение таймаута по умолчанию
authentication_ldap_sasl_connect_timeout 30 секунд
authentication_ldap_sasl_response_timeout 30 секунд
authentication_ldap_simple_connect_timeout 30 секунд
authentication_ldap_simple_response_timeout 30 секунд

Значения таймаутов для аутентификации LDAP можно настроить при запуске сервера и во время работы. Если вы установите таймаут в ноль с помощью одной из этих переменных, вы фактически отключите его, и сервер MySQL вернется к использованию значения таймаута по умолчанию системы-хоста.

Примечание

При следующих условиях фактическое время ожидания параметра authentication_ldap_sasl_connect_timeout удваивается, потому что (внутренне) серверу необходимо дважды вызвать соединение TCP:

  • Сервер LDAP недоступен.

  • authentication_ldap_sasl_connect_timeout имеет значение больше нуля.

  • Используется пул соединений (точнее, системная переменная authentication_ldap_sasl_max_pool_size имеет значение больше нуля, что включает пул).

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

Этот раздел описывает, как разрешить учетным записям MySQL подключаться к серверу MySQL с использованием подключаемого модуля аутентификации LDAP. Предполагается, что сервер работает с включенными соответствующими плагинами серверной стороны, как описано в Установка подключаемого модуля аутентификации LDAP, и что соответствующие плагины клиентской стороны доступны на клиентском хосте.

В данном разделе не рассматривается настройка или администрирование LDAP. Предполагается, что вы знакомы с этими темами.

Два плагина LDAP серверной стороны работают с конкретным плагином клиентской стороны:

  • Плагин серверной стороны authentication_ldap_simple выполняет простую аутентификацию LDAP. Для подключений учетных записей, использующих этот плагин, клиентские программы используют плагин клиентской стороны mysql_clear_password, который отправляет пароль на сервер в виде открытого текста. Не используется хэширование или шифрование пароля, поэтому рекомендуется безопасное соединение между клиентом MySQL и сервером, чтобы предотвратить раскрытие пароля.

  • Плагин серверной стороны authentication_ldap_sasl выполняет аутентификацию LDAP на основе SASL. Для подключений учетных записей, использующих этот плагин, клиентские программы используют плагин клиентской стороны authentication_ldap_sasl_client. Плагины клиентской и серверной сторон SASL LDAP используют сообщения SASL для безопасной передачи учетных данных в протоколе LDAP, чтобы избежать отправки пароля в открытом виде между клиентом MySQL и сервером.

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

  • Для каждого пользователя, подлежащего аутентификации, должна существовать запись в каталоге LDAP.

  • Должна существовать учетная запись пользователя MySQL, которая указывает плагин аутентификации LDAP серверной стороны и, необязательно, имя соответствующего отличительного имени (DN) пользователя LDAP. (Чтобы связать DN пользователя LDAP с учетной записью MySQL, включите клаузу BY в инструкции CREATE USER для создания учетной записи). Если учетная запись не указывает строку LDAP, аутентификация LDAP использует имя пользователя, указанное клиентом, для поиска записи LDAP.

  • Клиентские программы подключаются с использованием метода подключения, соответствующего плагину аутентификации серверной стороны, используемому учетной записью MySQL. Для аутентификации LDAP требуется имя пользователя MySQL и пароль LDAP. Кроме того, для учетных записей, использующих плагин серверной стороны authentication_ldap_simple, запустите клиентские программы с опцией --enable-cleartext-plugin, чтобы включить плагин клиентской стороны mysql_clear_password.

Здесь предполагается следующая сценарий:

  • Пользователи MySQL betsy и boris выполняют аутентификацию в записях LDAP для betsy_ldap и boris_ldap соответственно. (Необязательно, чтобы имена пользователей MySQL и LDAP отличались. Использование различных имен в этом обсуждении помогает уточнить, в каком контексте используется операция: MySQL или LDAP.)

  • Записи LDAP используют атрибут uid для указания имен пользователей. Это может меняться в зависимости от сервера LDAP. Некоторые серверы LDAP используют атрибут cn для имен пользователей вместо uid. Чтобы изменить атрибут, измените системную переменную authentication_ldap_simple_user_search_attr или authentication_ldap_sasl_user_search_attr соответственно.

  • Эти записи LDAP доступны в каталоге, управляемом сервером LDAP, для предоставления значений отличительного имени, уникально идентифицирующих каждого пользователя:

    uid=betsy_ldap,ou=People,dc=example,dc=com
    uid=boris_ldap,ou=People,dc=example,dc=com
    
  • CREATE USER инструкции, которые создают учетные записи MySQL, указывают пользователя LDAP в клаузе BY, чтобы указать, к какой записи LDAP учетная запись MySQL выполняет аутентификацию.

Инструкции по настройке учетной записи, использующей аутентификацию LDAP, зависят от используемого плагина LDAP серверной стороны. В следующих разделах описаны несколько сценариев использования.

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

В данном разделе описанная процедура требует, чтобы authentication_ldap_simple_group_search_attr было установлено в пустую строку, как показано ниже:

SET GLOBAL.authentication_ldap_simple_group_search_attr='';

В противном случае по умолчанию используется проксирование.

Для настройки учетной записи MySQL для простой аутентификации LDAP используйте оператор CREATE USER для указания плагина authentication_ldap_simple, необязательно включая имя пользователя LDAP (DN), как показано ниже:

CREATE USER user
  IDENTIFIED WITH authentication_ldap_simple
  [BY 'LDAP user DN'];

Предположим, что пользователь MySQL betsy имеет такую запись в каталоге LDAP:

uid=betsy_ldap,ou=People,dc=example,dc=com

Тогда оператор создания учетной записи MySQL для betsy выглядит следующим образом:

CREATE USER 'betsy'@'localhost'
  IDENTIFIED WITH authentication_ldap_simple
  AS 'uid=betsy_ldap,ou=People,dc=example,dc=com';

Строка аутентификации, указанная в части BY, не включает пароль LDAP. Его должен предоставить пользователь-клиент во время подключения.

Клиенты подключаются к серверу MySQL, предоставляя имя пользователя MySQL и пароль LDAP, а также включив плагин mysql_clear_password со стороны клиента:

$> mysql --user=betsy --password --enable-cleartext-plugin
Enter password: betsy_ldap_password
Примечание

Плагин аутентификации mysql_clear_password со стороны клиента оставляет пароль без изменений, поэтому клиентские программы отправляют его на сервер MySQL в открытом виде. Это позволяет передавать пароль LDAP-серверу в неизменном виде. Открытый текст пароля необходим для использования библиотеки LDAP сервера без SASL, но в некоторых конфигурациях может представлять угрозу безопасности. Эти меры минимизируют риск:

  • Чтобы уменьшить вероятность случайного использования плагина mysql_clear_password, клиенты MySQL должны явно его включить (например, с опцией --enable-cleartext-plugin). См. Раздел 8.4.1.4, «Аутентификация с открытым текстом со стороны клиента».

  • Чтобы избежать раскрытия пароля при включенном плагине mysql_clear_password, клиенты MySQL должны подключаться к серверу MySQL по зашифрованному соединению. См. Раздел 8.3.1, «Настройка MySQL для использования зашифрованных подключений».

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

  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 для указания имени пользователя LDAP (DN), попытки аутентификации использовали бы имя пользователя, предоставленное клиентом (в данном случае, betsy). В отсутствие записи LDAP для betsy аутентификация завершилась бы неудачей.

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

В данном разделе описанная процедура требует, чтобы authentication_ldap_sasl_group_search_attr было установлено в пустую строку, как показано ниже:

SET GLOBAL.authentication_ldap_sasl_group_search_attr='';

В противном случае по умолчанию используется проксирование.

Для настройки учетной записи MySQL для аутентификации LDAP с помощью SASL используйте оператор CREATE USER для указания плагина authentication_ldap_sasl, необязательно включая имя пользователя LDAP (DN), как показано ниже:

CREATE USER user
  IDENTIFIED WITH authentication_ldap_sasl
  [BY 'LDAP user DN'];

Предположим, что пользователь MySQL boris имеет такую запись в каталоге LDAP:

uid=boris_ldap,ou=People,dc=example,dc=com

Тогда оператор создания учетной записи MySQL для boris выглядит следующим образом:

CREATE USER 'boris'@'localhost'
  IDENTIFIED WITH authentication_ldap_sasl
  AS 'uid=boris_ldap,ou=People,dc=example,dc=com';

Строка аутентификации, указанная в части BY, не включает пароль LDAP. Его должен предоставить пользователь-клиент во время подключения.

Клиенты подключаются к серверу MySQL, предоставляя имя пользователя MySQL и пароль LDAP:

$> mysql --user=boris --password
Enter password: boris_ldap_password

Для плагина authentication_ldap_sasl со стороны сервера клиенты используют плагин authentication_ldap_sasl_client со стороны клиента. Если клиентская программа не находит плагин со стороны клиента, укажите опцию --plugin-dir, которая указывает каталог, где установлен файл библиотеки плагина.

Процесс аутентификации для boris аналогичен описанному ранее для betsy с простой аутентификацией LDAP, за исключением того, что плагины SASL LDAP со стороны клиента и сервера используют сообщения SASL для безопасной передачи учетных данных по протоколу LDAP, чтобы избежать передачи пароля в открытом виде между клиентом MySQL и сервером.

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.

  • Примеры предполагают использование аутентификации LDAP с SASL. Внесите соответствующие изменения для простой аутентификации 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.9, «Плагины аутентификации без входа».) Альтернативные способы защиты проксированных учетных записей от прямого использования см. в разделе Предотвращение прямого входа в проксированные учетные записи.

Предоставьте прокси-учетной записи привилегию PROXY для каждой проксированной учетной записи:

GRANT PROXY
  ON 'accounting'@'localhost'
  TO ''@'%';
GRANT PROXY
  ON 'front_office'@'localhost'
  TO ''@'%';

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

$> mysql --user=basha --password
Enter password: basha_password (basha LDAP password)

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

  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 Pluggable Authentication и Настройка плагина SASL LDAP для аутентификации GSSAPI/Kerberos на стороне сервера, сервер MySQL был запущен с соответствующими параметрами конфигурации для плагина SASL LDAP на стороне сервера. Затем MySQL DBA создает учетную запись MySQL, которая соответствует имени Kerberos-принципала, включая доменное имя.

Примечание

Плагин SASL LDAP использует постоянный DN пользователя для аутентификации Kerberos и игнорирует любой DN пользователя, настроенный из MySQL. Это имеет определенные последствия:

  • Для любой учетной записи MySQL, использующей аутентификацию GSSAPI/Kerberos, строка аутентификации в CREATE USER или ALTER USER запросах не должна содержать DN пользователя, так как это не оказывает никакого влияния.

  • Поскольку строка аутентификации не содержит DN пользователя, она должна содержать информацию о сопоставлении групп, чтобы пользователь мог обрабатываться как прокси-пользователь, который сопоставлен с нужным проксируемым пользователем. Сведения о проксировании с помощью плагина аутентификации LDAP см. в Аутентификация LDAP с проксированием.

Следующие операторы создают прокси-пользователя с именем bredon@MYSQL.LOCAL, который принимает привилегии проксируемого пользователя с именем proxied_krb_usr. Другие пользователи GSSAPI/Kerberos, которые должны иметь такие же привилегии, могут быть аналогично созданы как прокси-пользователи для того же проксируемого пользователя.

-- create proxy account
CREATE USER 'bredon@MYSQL.LOCAL'
  IDENTIFIED WITH authentication_ldap_sasl
  BY '#krb_grp=proxied_krb_user';

-- create proxied account and grant its privileges;
-- use mysql_no_login plugin to prevent direct login
CREATE USER 'proxied_krb_user'
  IDENTIFIED WITH mysql_no_login;
GRANT ALL
  ON krb_user_db.*
  TO 'proxied_krb_user';

-- grant to proxy account the
-- PROXY privilege for proxied account
GRANT PROXY
  ON 'proxied_krb_user'
  TO 'bredon@MYSQL.LOCAL';

Обратите пристальное внимание на кавычки для имени прокси-учета в первом CREATE USER операторе и в GRANT PROXY операторе:

  • Для большинства учетных записей MySQL пользователь и хост являются отдельными частями имени учетной записи, и поэтому они приводятся в кавычки по отдельности как 'user_name'@'host_name'.

  • Для аутентификации LDAP Kerberos, часть имени учетной записи, относящаяся к пользователю, включает домен принципала, поэтому 'bredon@MYSQL.LOCAL' приводится в кавычки как одно значение. Поскольку часть хоста не указана, полное имя учетной записи MySQL использует значение по умолчанию '%' в качестве части хоста: 'bredon@MYSQL.LOCAL'@'%'

Примечание

При создании учетной записи, которая аутентифицируется с помощью плагина SASL LDAP authentication_ldap_sasl с методом аутентификации GSSAPI/Kerberos, оператор CREATE USER включает область в имени пользователя. Это отличается от создания учетных записей, которые используют плагин authentication_kerberos Kerberos. Для таких учетных записей оператор CREATE USER не включает область в имени пользователя. Вместо этого укажите область как строку аутентификации в пункте BY. См. Создание учетной записи MySQL, использующей аутентификацию Kerberos.

Проксируемая учетная запись использует плагин mysql_no_login аутентификации для предотвращения подключения клиентов напрямую к серверу MySQL с использованием этой учетной записи. Вместо этого ожидается, что пользователи, которые проходят аутентификацию с помощью LDAP, будут использовать прокси-учетную запись bredon@MYSQL.LOCAL. (Это предполагает, что плагин mysql_no_login установлен. Инструкции см. в Раздел 8.4.1.9, «Плагин аутентификации No-Login»). Для альтернативных методов защиты проксируемых учетных записей от прямого подключения см. Предотвращение прямого входа в прокси-учетные записи.

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

После настройки учетной записи MySQL, которая использует аутентификацию GSSAPI/Kerberos, клиенты могут использовать ее для подключения к серверу MySQL. Аутентификация Kerberos может происходить либо до, либо во время запуска программы клиента MySQL:

  • До запуска программы клиента MySQL пользователь-клиент может получить TGT от KDC независимо от MySQL. Например, пользователь-клиент может использовать команду kinit для аутентификации с Kerberos, указав имя Kerberos-принципала и пароль принципала:

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

    Результирующий TGT кешируется и становится доступен для использования другими приложениями, поддерживающими Kerberos, такими как программы, использующие плагин аутентификации LDAP SASL на стороне клиента. В этом случае программа клиента MySQL аутентифицируется на сервере MySQL с помощью TGT, поэтому запустите клиента без указания имени пользователя или пароля:

    mysql --default-auth=authentication_ldap_sasl_client
    

    Как только что описано, когда TGT кешируется, опции имени пользователя и пароля не нужны в команде клиента. Если команда их все же включает, они обрабатываются следующим образом:

    • Если команда включает имя пользователя, аутентификация завершается неудачей, если это имя не совпадает с именем принципала в TGT.

    • Если команда включает пароль, плагин на стороне клиента его игнорирует. Поскольку аутентификация основана на TGT, она может быть успешной даже если введённый пользователем пароль неверен. По этой причине плагин выводит предупреждение, если найден действительный TGT, который приводит к игнорированию пароля.

  • Если кеш Kerberos не содержит TGT, сам плагин аутентификации LDAP SASL на стороне клиента может получить TGT от KDC. Запустите клиент с опциями для имени и пароля Kerberos-принципала, связанного с учетной записью MySQL (введите команду в одну строку, затем введите пароль принципала, когда будет запрошено):

    mysql --default-auth=authentication_ldap_sasl_client
      --user=bredon@MYSQL.LOCAL
      --password
    
  • Если кеш Kerberos не содержит TGT, и команда клиента не указывает имя принципала в качестве имени пользователя, аутентификация завершается неудачей.

Если вы не уверены, существует ли TGT, вы можете использовать klist для проверки.

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

  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-8.4-en/ldap-pluggable-authentication.html

Spec-Zone.ru

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