8.2.17 Подключаемые модули аутентификации
При подключении клиента к серверу MySQL сервер использует имя пользователя, предоставленное клиентом, и хост клиента для выбора соответствующей записи учетной записи из таблицы системы mysql.user. Затем сервер выполняет аутентификацию клиента, определяя из записи учетной записи, какой плагин аутентификации применяется к клиенту:
Если сервер не может найти плагин, возникает ошибка, и попытка подключения отклоняется.
В противном случае сервер вызывает этот плагин для проверки подлинности пользователя, и плагин возвращает серверу статус, указывающий, предоставил ли пользователь правильный пароль и разрешено ли ему подключиться.
Подключаемые модули аутентификации обеспечивают следующие важные возможности:
Выбор методов аутентификации. Подключаемые модули аутентификации облегчают выбор и изменение метода аутентификации, используемого для отдельных учетных записей MySQL.
Внешняя аутентификация. Подключаемые модули аутентификации позволяют клиентам подключаться к серверу MySQL с учетными данными, подходящими для методов аутентификации, которые хранят учетные данные не в таблице системы
mysql.user. Например, могут быть созданы плагины для использования внешних методов аутентификации, таких как PAM, идентификаторы входа в Windows, LDAP или Kerberos.Пользователи-прокси: Если пользователю разрешено подключение, плагин аутентификации может вернуть серверу имя пользователя, отличное от имени пользователя, подключающегося к серверу, чтобы указать, что подключающийся пользователь является прокси-сервером для другого пользователя (проксируемого пользователя). Пока подключение длится, пользователь-прокси рассматривается с точки зрения контроля доступа как имеющий привилегии проксируемого пользователя. По сути, один пользователь имитирует другого. Более подробную информацию см. в разделе 8.2.19 «Пользователи-прокси».
Если вы запускаете сервер с параметром --skip-grant-tables, плагины аутентификации не используются, даже если они загружены, поскольку сервер не выполняет аутентификацию клиента и позволяет любому клиенту подключиться. Поскольку это небезопасно, если сервер запущен с параметром --skip-grant-tables, он также отключает удаленные подключения, включив skip_networking.
Доступные плагины аутентификации
MySQL 8.4 предоставляет следующие плагины аутентификации:
-
Плагин, выполняющий родную аутентификацию; т.е. аутентификацию, основанную на методе хеширования паролей, используемом до внедрения подключаемых модулей аутентификации в MySQL. Плагин
mysql_native_passwordреализует аутентификацию, основанную на этом методе родного хеширования паролей. См. раздел 8.4.1.1 «Родная подключаемая аутентификация».ПримечаниеПлагин аутентификации
mysql_native_passwordустарел и может быть удален в будущих версиях MySQL. Плагины, выполняющие аутентификацию с использованием хеширования паролей SHA-256. Это более сильное шифрование, чем то, которое доступно с родной аутентификацией. См. раздел 8.4.1.2 «Кэшируемая аутентификация SHA-2» и раздел 8.4.1.3 «Аутентификация SHA-256».
Плагин на стороне клиента, который отправляет пароль на сервер без хеширования или шифрования. Этот плагин используется совместно с плагинами на стороне сервера, которые требуют доступа к паролю в точности так, как он предоставлен пользователем-клиентом. См. раздел 8.4.1.4 «Аутентификация на стороне клиента с открытым текстом».
- ...
Дополнительная информация о текущих ограничениях использования подключаемых модулей аутентификации, в том числе о том, какие коннекторы поддерживают какие плагины, доступна в разделе «Ограничения подключаемых модулей аутентификации».
Разработчики сторонних коннекторов должны прочитать этот раздел, чтобы определить, в какой степени коннектор может воспользоваться возможностями подключаемых модулей аутентификации и какие шаги необходимо предпринять для повышения совместимости.
Если вы заинтересованы в написании собственных плагинов аутентификации, см. написание плагинов аутентификации.
Подключаемый модуль аутентификации по умолчанию
В операторах CREATE USER и ALTER USER имеется синтаксис для указания способа аутентификации учётной записи. Некоторые формы этого синтаксиса не явно указывают подключаемый модуль аутентификации (нет никакой фразы IDENTIFIED WITH). Например:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
В таких случаях сервер назначает учётной записи подключаемый модуль аутентификации по умолчанию. MySQL 8.4 поддерживает многофакторную аутентификацию и до трёх фрагментов, которые указывают способ аутентификации учётной записи. Правила, определяющие подключаемый модуль аутентификации по умолчанию для методов аутентификации, не указывающих модуль, зависят от фактора:
-
Фактор 1: Если элемент 1 из
authentication_policyназывает подключаемый модуль аутентификации, то этот модуль является модулем по умолчанию. Если элемент 1 изauthentication_policyравен*, тоcaching_sha2_passwordявляется модулем по умолчанию.С учётом вышеуказанных правил, следующий оператор создаёт учётную запись с двухфакторной аутентификацией, причём метод аутентификации первого фактора определяется
authentication_policy, как показано здесь:CREATE USER 'wei'@'localhost' IDENTIFIED BY '
password' AND IDENTIFIED WITH authentication_ldap_simple;Аналогично, этот пример создаёт учётную запись с трёхфакторной аутентификацией:
CREATE USER 'mateo'@'localhost' IDENTIFIED BY '
password' AND IDENTIFIED WITH authentication_ldap_simple AND IDENTIFIED WITH authentication_fido;Вы можете использовать
SHOW CREATE USERдля просмотра применённых методов аутентификации. -
Фактор 2 или 3: Если соответствующий элемент из
authentication_policyназывает подключаемый модуль аутентификации, то этот модуль является модулем по умолчанию. Если элементauthentication_policyравен*или пуст, то модуль по умолчанию отсутствует; попытка определить метод аутентификации учётной записи для фактора без указания модуля — ошибка, как в следующих примерах:mysql>
CREATE USER 'sofia'@'localhost' IDENTIFIED WITH authentication_ldap_simpleAND IDENTIFIED BY 'abc';ERROR 1524 (HY000): Plugin '' is not loaded mysql>CREATE USER 'sofia'@'localhost' IDENTIFIED WITH authentication_ldap_simpleAND IDENTIFIED BY 'abc';ERROR 1524 (HY000): Plugin '*' is not loaded
Использование подключаемых модулей аутентификации
Этот раздел содержит общие инструкции по установке и использованию подключаемых модулей аутентификации. Инструкции, специфичные для данного модуля, см. в соответствующем разделе под Разделом 8.4.1, «Подключаемые модули аутентификации».
В целом, подключаемые модули аутентификации используют пару соответствующих модулей на серверной и клиентской сторонах, поэтому вы используете данный метод аутентификации следующим образом:
При необходимости установите библиотеку или библиотеки с необходимыми подключаемыми модулями. На серверном хосте установите библиотеку с серверным подключаемым модулем, чтобы сервер мог его использовать для аутентификации подключений клиентов. Аналогично, на каждом клиентском хосте установите библиотеку с клиентским подключаемым модулем для использования клиентскими программами. Встроенные подключаемые модули аутентификации устанавливать не нужно.
Для каждой учётной записи MySQL, которую вы создаёте, укажите соответствующий серверный подключаемый модуль для аутентификации. Если учётная запись должна использовать подключаемый модуль аутентификации по умолчанию, то в операторе создания учётной записи нет необходимости явно указывать модуль. Сервер назначает подключаемый модуль аутентификации по умолчанию, как описано в Подключаемом модуле аутентификации по умолчанию.
При подключении клиента серверный подключаемый модуль сообщает клиентской программе, какой клиентский подключаемый модуль использовать для аутентификации.
В случае, когда учётная запись использует метод аутентификации, который является модулем по умолчанию как для сервера, так и для клиентской программы, сервер не должен сообщать клиенту, какой клиентский подключаемый модуль использовать, и можно избежать обмена данными между клиентом и сервером.
Для стандартных клиентских программ MySQL, таких как mysql и mysqladmin, опцию --default-auth= можно указать в командной строке как подсказку о том, какой клиентский подключаемый модуль программа может ожидать, хотя сервер переопределяет эту информацию, если серверный подключаемый модуль, связанный с учётной записью пользователя, требует другой клиентский подключаемый модуль. plugin_name
Если клиентская программа не находит файл библиотеки клиентского подключаемого модуля, укажите опцию --plugin-dir=, чтобы указать расположение каталога библиотек подключаемых модулей. dir_name
Совместимость подключаемых модулей аутентификации (клиент/сервер)
Подключаемые модули аутентификации обеспечивают гибкость в выборе методов аутентификации для учётных записей MySQL, но в некоторых случаях подключение клиентов невозможно из-за несовместимости подключаемых модулей аутентификации между клиентом и сервером.
Общее правило совместимости для успешного подключения клиента к данной учётной записи на данном сервере заключается в том, что клиент и сервер должны обе поддерживать метод аутентификации, необходимый для учётной записи. Поскольку методы аутентификации реализуются подключаемыми модулями аутентификации, клиент и сервер должны обе поддерживать требуемый подключаемый модуль аутентификации.
Несовместимость подключаемых модулей аутентификации может возникнуть по разным причинам. Примеры:
Подключение с помощью клиентской программы MySQL 5.7 версии 5.7.22 или ниже к серверу MySQL 8.4 с учётной записью, которая аутентифицируется с помощью
caching_sha2_password. Это завершается ошибкой, поскольку клиентская программа 5.7 не распознаёт этот модуль. (Эта проблема решена в MySQL 5.7 начиная с версии 5.7.23, когда поддержка клиентского подключаемого модуляcaching_sha2_passwordбыла добавлена в библиотеку клиентской программы MySQL и клиентские программы.)Подключение с помощью клиентской программы MySQL 5.7 к учётной записи сервера версии до 5.7, которая аутентифицируется с помощью
mysql_old_password. Это завершается ошибкой по нескольким причинам. Во-первых, такое подключение требует--secure-auth=0, которое больше не поддерживается. Даже если бы оно поддерживалось, клиентская программа 5.7 не распознаёт этот модуль, поскольку он был удалён в MySQL 5.7.Подключение с помощью клиентской программы MySQL 5.7 из дистрибутива Community к серверу MySQL 5.7 Enterprise с учётной записью, которая использует один из подключаемых модулей аутентификации LDAP, доступных только для Enterprise. Это завершается ошибкой, поскольку клиентская программа Community не имеет доступа к модулю Enterprise.
В целом, эти проблемы совместимости не возникают при подключении между клиентом и сервером из одного и того же дистрибутива MySQL. При подключении между клиентом и сервером из разных версий MySQL могут возникнуть проблемы. Эти проблемы являются неотъемлемой частью процесса разработки, когда MySQL вводит новые подключаемые модули аутентификации или удаляет старые. Чтобы свести к минимуму потенциальную несовместимость, регулярно обновляйте сервер, клиенты и коннекторы.
Рекомендации по разработке коннекторов подключаемых модулей аутентификации
Существует несколько реализаций протокола клиент/сервер MySQL. Библиотека клиентской программы libmysqlclient C API — одна из них. Некоторые коннекторы MySQL (как правило, не написанные на C) предоставляют собственную реализацию. Однако не все реализации протокола обрабатывают аутентификацию с помощью подключаемых модулей одинаково. В этом разделе описывается проблема аутентификации, которую должны учитывать разработчики протоколов.
В протоколе клиент/сервер сервер сообщает подключающимся клиентам, какой подключаемый модуль аутентификации он считает модулем по умолчанию. Если реализация протокола, используемая клиентом, пытается загрузить модуль по умолчанию, а этот модуль отсутствует на клиентской стороне, операция загрузки завершается ошибкой. Это ненужная ошибка, если подключаемый модуль по умолчанию не является модулем, фактически требуемым учётной записью, к которой клиент пытается подключиться.
Если реализация протокола клиент/сервер не имеет собственного понятия о подключаемом модуле аутентификации по умолчанию и всегда пытается загрузить модуль по умолчанию, указанный сервером, она завершается ошибкой, если этот модуль недоступен.
Чтобы избежать этой проблемы, реализация протокола, используемая клиентом, должна иметь свой собственный подключаемый модуль по умолчанию и использовать его в качестве первого выбора (или, в качестве альтернативы, использовать его как резервный вариант в случае неудачи загрузки подключаемого модуля по умолчанию, указанного сервером). Пример:
В MySQL 5.7,
libmysqlclientиспользует в качестве своего варианта по умолчанию либоmysql_native_password, либо подключаемый модуль, указанный с помощью опцииMYSQL_DEFAULT_AUTHдля .Когда клиент 5.7 пытается подключиться к серверу 8.4, сервер указывает
caching_sha2_passwordв качестве подключаемого модуля аутентификации по умолчанию, но клиент по-прежнему отправляет данные учетных данных в соответствии с либоmysql_native_password, либо любым указанным с помощьюMYSQL_DEFAULT_AUTH.Единственный случай, когда клиент загружает подключаемый модуль, указанный сервером, — это запрос изменения подключаемого модуля, но в этом случае это может быть любой подключаемый модуль в зависимости от учётной записи пользователя. В этом случае клиент должен попытаться загрузить подключаемый модуль, и если этот модуль недоступен, ошибка является обязательной.
Ограничения на использование подключаемого модуля аутентификации
Первая часть этого раздела описывает общие ограничения на применение подключаемого модуля аутентификации, описанного в разделе 8.2.17 «Подключаемый модуль аутентификации». Вторая часть описывает, как разработчики сторонних соединителей могут определить, в какой степени соединитель может использовать возможности подключаемого модуля аутентификации, и какие шаги необходимо предпринять для большей совместимости.
Термин «“родная аутентификация”» здесь относится к аутентификации по паролям, хранящимся в таблице системы mysql.user. Это тот же метод аутентификации, что и в более старых серверах MySQL, до внедрения подключаемого модуля аутентификации. «“родная аутентификация Windows”» относится к аутентификации с использованием учетных данных пользователя, уже авторизованного в Windows, как реализовано плагином родной аутентификации Windows («“плагин Windows” для краткости).
Общие ограничения на использование подключаемого модуля аутентификации
-
Connector/C++: Клиенты, использующие этот соединитель, могут подключаться к серверу только через учетные записи, использующие родную аутентификацию.
Исключение: соединитель поддерживает подключаемый модуль аутентификации, если он был разработан для динамической (а не статической) связи с
libmysqlclientи загружает текущую версиюlibmysqlclient, если она установлена, или если соединитель перекомпилирован из исходного кода для связи с текущейlibmysqlclient.Дополнительную информацию о разработке соединителей для обработки информации от сервера о стандартном серверном плагине аутентификации см. в разделе Учёт при написании соединителей плагинов аутентификации.
Connector/NET: Клиенты, использующие Connector/NET, могут подключаться к серверу через учетные записи, использующие родную аутентификацию или родную аутентификацию Windows.
Connector/PHP: Клиенты, использующие этот соединитель, могут подключаться к серверу только через учетные записи, использующие родную аутентификацию, при компиляции с использованием родного драйвера MySQL для PHP (
mysqlnd).Родная аутентификация Windows: Подключение через учетную запись, использующую плагин Windows, требует настройки домена Windows. Без этого используется аутентификация NTLM, и возможны только локальные подключения; то есть клиент и сервер должны работать на одном компьютере.
Пользователи-прокси: Поддержка пользователей-прокси доступна в той мере, в какой клиенты могут подключаться через учетные записи, аутентифицированные плагинами, реализующими возможность пользователя-прокси (то есть плагинами, которые могут возвращать имя пользователя, отличное от имени подключившегося пользователя). Например, плагины PAM и Windows поддерживают пользователей-прокси. Плагины аутентификации
mysql_native_password(устаревший) иsha256_password(устаревший) по умолчанию не поддерживают пользователей-прокси, но могут быть настроены на это; см. Поддержка сервера для сопоставления пользователей-прокси.Репликация: Реплики могут использовать учетные записи пользователей репликации с родной аутентификацией, а также подключаться через учетные записи пользователей репликации, использующие неродную аутентификацию, если доступен требуемый плагин на стороне клиента. Если плагин встроен в
libmysqlclient, он доступен по умолчанию. В противном случае плагин должен быть установлен на стороне реплики в каталоге, указанном переменной системы репликиplugin_dir.FEDERATEDтаблицы: ТаблицаFEDERATEDможет получить доступ к удалённой таблице только через учетные записи на удалённом сервере, использующие родную аутентификацию.
Подключаемый модуль аутентификации и сторонние соединители
Разработчики сторонних соединителей могут использовать следующие рекомендации, чтобы определить готовность соединителя к использованию возможностей подключаемого модуля аутентификации и какие шаги необходимо предпринять для повышения совместимости:
-
Существующий соединитель, в который не вносились изменения, использует родную аутентификацию, и клиенты, использующие соединитель, могут подключаться к серверу только через учетные записи, использующие родную аутентификацию. Однако вы должны протестировать соединитель на последней версии сервера, чтобы убедиться, что такие подключения по-прежнему работают без проблем.
Исключение: соединитель может работать с подключаемым модулем аутентификации без изменений, если он связан с
libmysqlclientдинамически (а не статически) и загружает текущую версиюlibmysqlclient, если она установлена. -
Чтобы воспользоваться возможностями подключаемого модуля аутентификации, соединитель, основанный на
libmysqlclient, должен быть пересоединён с текущей версиейlibmysqlclient. Это позволит соединителю поддерживать подключения через учетные записи, требующие теперь плагинов на стороне клиента, встроенных вlibmysqlclient(например, плагин cleartext, необходимый для аутентификации PAM, и плагин Windows, необходимый для родной аутентификации Windows). Связь с текущейlibmysqlclientтакже позволит соединителю получить доступ к плагинам на стороне клиента, установленным в стандартном каталоге плагинов MySQL (обычно каталог, указанный значением по умолчанию локальной переменной сервераplugin_dir).Если соединитель связывается с
libmysqlclientдинамически, необходимо убедиться, что на клиентском узле установлена более новая версияlibmysqlclientи что соединитель загружает её во время выполнения. Другой способ, чтобы соединитель поддерживал данный метод аутентификации, — реализовать его непосредственно в протоколе клиент/сервер. Connector/NET использует этот подход для поддержки родной аутентификации Windows.
Если соединителю необходимо загружать плагины на стороне клиента из каталога, отличного от стандартного каталога плагинов, он должен реализовать способ для клиентов указать каталог. Возможные варианты включают опцию командной строки или переменную среды, из которой соединитель может получить имя каталога. Стандартные программы MySQL-клиентов, такие как mysql и mysqladmin, реализуют опцию
--plugin-dir. См. также.Поддержка пользователей-прокси соединителем зависит, как описано ранее в этом разделе, от того, допускают ли поддерживаемые им методы аутентификации пользователей-прокси.
© 2025 Oracle
Licensed under the GPLv2 License.