Обзор подключаемой аутентификации
Когда пользователь пытается войти в систему, плагин аутентификации контролирует, как сервер MariaDB определяет, является ли подключение от законного пользователя.
При создании или изменении учетной записи пользователя с помощью операторов GRANT, CREATE USER или ALTER USER, вы можете указать плагин аутентификации, который должна использовать учетная запись пользователя, указав IDENTIFIED VIA предложение. По умолчанию, при создании учетной записи пользователя без указания плагина аутентификации, MariaDB использует плагин mysql_native_password.
В MariaDB 10.4 и более поздних версиях есть некоторые заметные изменения, такие как:
- Вы можете указать несколько плагинов аутентификации для каждой учетной записи пользователя.
- Пользователь
root@localhostсозданный командой mariadb-install-db создается с возможностью использования двух плагинов аутентификации. Во-первых, он настроен для попытки использования плагина аутентификации unix_socket. Это позволяет пользователюroot@localhostвойти без пароля через локальный файл сокета Unix, определенный системной переменной socket, при условии, что вход осуществляется из процесса, принадлежащего учетной записи пользователя операционной системыroot. Во-вторых, если аутентификация завершится неудачно с плагином аутентификации unix_socket, то он настроен на попытку использования плагина аутентификации mysql_native_password. Однако, первоначально устанавливается недопустимый пароль, поэтому для аутентификации таким образом необходимо установить пароль с помощью SET PASSWORD.
Поддерживаемые плагины аутентификации
Процесс аутентификации представляет собой диалог между сервером и клиентом. MariaDB реализует плагины аутентификации как на стороне сервера, так и на стороне клиента.
Поддерживаемые плагины аутентификации на стороне сервера
MariaDB предоставляет семь плагинов аутентификации на стороне сервера:
- mysql_native_password
- mysql_old_password
- ed25519
- gssapi
- pam (только Unix)
- unix_socket (только Unix)
- named_pipe (только Windows)
Поддерживаемые плагины аутентификации на стороне клиента
MariaDB предоставляет восемь плагинов аутентификации на стороне клиента:
- mysql_native_password
- mysql_old_password
- client_ed25519
- auth_gssapi_client
- dialog
- mysql_clear_password
- sha256_password
- caching_sha256_password
Параметры, связанные с плагинами аутентификации
Параметры сервера, связанные с плагинами аутентификации
MariaDB поддерживает следующие параметры сервера, связанные с плагинами аутентификации:
| Параметр сервера | Описание |
|---|---|
old_passwords={1 | 0} |
Если установлено значение 1 (0 — по умолчанию), MariaDB по умолчанию использует плагин аутентификации mysql_old_password для вновь созданных пользователей и паролей вместо плагина аутентификации mysql_native_password. |
plugin_dir=path |
Путь к каталогу плагинов plugin. Из соображений безопасности убедитесь, что этот каталог доступен только для чтения сервером, или установите secure_file_priv. |
plugin_maturity=level |
Минимальный уровень зрелости плагина plugin. MariaDB не загрузит плагины с уровнем зрелости ниже указанного. |
secure_auth |
Подключения будут заблокированы, если они используют плагин аутентификации mysql_old_password. Сервер также не запустится, если таблицы привилегий имеют старый формат, предшествующий MySQL 4.1. |
Параметры клиента, связанные с плагинами аутентификации
Большинство клиентов и утилит поддерживают некоторые параметры командной строки, связанные с плагинами аутентификации клиента:
| Параметр клиента | Описание |
|---|---|
--connect-expired-password |
Уведомляет сервер о том, что этот клиент готов обрабатывать срок действия пароля даже если было указано --batch. С версии MariaDB 10.4.3. |
--default-auth=name |
Плагин аутентификации на стороне клиента по умолчанию. |
--plugin-dir=path |
Каталог для плагинов на стороне клиента. |
--secure-auth |
Отклонить подключение к серверу, если сервер использует плагин аутентификации mysql_old_password. Этот режим по умолчанию выключен, что отличается от поведения в MySQL 5.6 и более поздних версиях, где он включен по умолчанию. |
Разработчики, использующие MariaDB Connector/C, могут реализовать аналогичную функциональность в своем приложении, установив следующие параметры с помощью функции mysql_optionsv:
-
MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS -
MYSQL_PLUGIN_DIR -
MYSQL_DEFAULT_AUTH -
MYSQL_SECURE_AUTH
Например:
mysql_optionsv(mysql, MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, 1); mysql_optionsv(mysql, MYSQL_DEFAULT_AUTH, "name"); mysql_optionsv(mysql, MYSQL_PLUGIN_DIR, "path"); mysql_optionsv(mysql, MYSQL_SECURE_AUTH, 1);
Параметры установки, связанные с плагинами аутентификации
mariadb-install-db поддерживает следующие параметры установки, связанные с плагинами аутентификации:
| Параметр установки | Описание |
|---|---|
--auth-root-authentication-method={normal |
Если установлено значение normal, создается учетная запись root@localhost, которая аутентифицируется с помощью плагина аутентификации mysql_native_password и не имеет начального пароля, что может быть небезопасно. Если установлено значение socket, создается учетная запись root@localhost, которая аутентифицируется с помощью плагина аутентификации unix_socket. По умолчанию установлено normal. Доступно с MariaDB 10.1. |
--auth-root-socket-user=USER |
Используется с --auth-root-authentication-method=socket. Указывает имя второй учетной записи, создаваемой с привилегиями SUPER помимо root, а также имя системной учетной записи, разрешенной для доступа к ней. По умолчанию используется значение --user. |
Расширенный синтаксис SQL
MariaDB расширила стандартные операторы SQL GRANT, CREATE USER и ALTER USER, чтобы они поддерживали указание различных плагинов аутентификации для конкретных пользователей. Плагин аутентификации может быть указан в этих операторах с помощью IDENTIFIED VIA предложения.
Например, синтаксис GRANT:
GRANT <privileges> ON <level> TO <user> IDENTIFIED VIA <plugin> [ USING <string> ]
А синтаксис CREATE USER:
CREATE USER <user> IDENTIFIED VIA <plugin> [ USING <string> ]
И синтаксис ALTER USER:
ALTER USER <user> IDENTIFIED VIA <plugin> [ USING <string> ]
Необязательное USING предложение позволяет пользователям предоставить строку аутентификации для плагина. Формат и значение строки аутентификации полностью определяются плагином.
Например, для плагина аутентификации mysql_native_password строка аутентификации должна быть хэшем пароля:
CREATE USER mysqltest_up1 IDENTIFIED VIA mysql_native_password USING '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB';
Поскольку mysql_native_password является плагином аутентификации по умолчанию, вышесказанное — это просто другой способ сказать следующее:
CREATE USER mysqltest_up1 IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB';
В отличие от этого, для плагина аутентификации pam строка аутентификации должна ссылаться на имя службы PAM: PAM service name:
CREATE USER mysqltest_up1 IDENTIFIED VIA pam USING 'mariadb';
В MariaDB 10.4 и более поздних версиях учетной записи пользователя можно назначить несколько плагинов аутентификации.
Например, чтобы настроить учетную запись пользователя root@localhost для попытки использования плагина аутентификации unix_socket, а в качестве резервного плагина — mysql_native_password, можно выполнить следующее:
CREATE USER root@localhost
IDENTIFIED VIA unix_socket
OR mysql_native_password USING PASSWORD("verysecret");
Для получения дополнительной информации см. Аутентификация от MariaDB 10.4.
Плагины аутентификации, установленные по умолчанию
Плагины аутентификации сервера, установленные по умолчанию
Не все плагины аутентификации на стороне сервера устанавливаются по умолчанию. Если конкретный плагин аутентификации на стороне сервера не установлен по умолчанию, то процедуру его установки можно найти на странице документации по данному плагину аутентификации.
В MariaDB 10.4 и более поздних версиях по умолчанию установлены следующие плагины аутентификации на стороне сервера:
- Плагины аутентификации mysql_native_password и mysql_old_password устанавливаются по умолчанию во всех сборках.
- Плагин аутентификации unix_socket устанавливается по умолчанию во всех сборках на Unix и Linux.
- Плагин аутентификации named_pipe устанавливается по умолчанию во всех сборках на Windows.
В MariaDB 10.3 и ниже по умолчанию установлены следующие плагины аутентификации на стороне сервера:
- Плагины аутентификации mysql_native_password и mysql_old_password устанавливаются по умолчанию во всех сборках.
- Плагин аутентификации unix_socket устанавливается по умолчанию в новых установках, использующих пакеты .deb от стандартных репозиториев Debian в Debian 9 и более поздних версиях и репозиториев Ubuntu в Ubuntu 15.10 и более поздних версиях. Дополнительную информацию см. в разделе Различия в MariaDB в Debian (и Ubuntu).
- Плагин аутентификации named_pipe устанавливается по умолчанию во всех сборках на Windows.
Плагины аутентификации клиента, установленные по умолчанию
Плагины аутентификации на стороне клиента не нужно устанавливать так же, как плагины аутентификации на стороне сервера. Если клиент использует библиотеку libmysqlclient или MariaDB Connector/C, то библиотека автоматически загружает плагины аутентификации клиента из каталога плагинов библиотеки по мере необходимости.
Большинство клиентов и утилит поддерживают аргумент командной строки --plugin-dir, который можно использовать для задания пути к каталогу плагинов библиотеки:
| Параметр клиента | Описание |
|---|---|
--plugin-dir=path |
Каталог для плагинов на стороне клиента. |
Разработчики, использующие MariaDB Connector/C, могут реализовать аналогичную функциональность в своём приложении, задав параметр MYSQL_PLUGIN_DIR с помощью функции mysql_optionsv.
Например:
mysql_optionsv(mysql, MYSQL_PLUGIN_DIR, "path");
Если ваш клиент получает ошибки, похожие на следующие, вам может потребоваться задать путь к каталогу плагинов библиотеки:
ERROR 2059 (HY000): Authentication plugin 'dialog' cannot be loaded: /usr/lib/mysql/plugin/dialog.so: cannot open shared object file: No such file or directory
Если клиент не использует ни библиотеку libmysqlclient , ни MariaDB Connector/C, то вам нужно определить, какие плагины аутентификации поддерживаются конкретной библиотекой клиента, используемой клиентом.
Если клиент использует библиотеку libmysqlclient или MariaDB Connector/C, но клиент не поставляется с необязательными плагинами аутентификации клиента библиотеки, то можно использовать только стандартные плагины аутентификации (например, mysql_native_password и mysql_old_password) и нестандартные плагины аутентификации, которые не требуют специальных плагинов аутентификации на стороне клиента (например, unix_socket и named_pipe).
Плагин аутентификации по умолчанию
Плагин аутентификации сервера по умолчанию
Плагин аутентификации mysql_native_password в настоящее время является плагином аутентификации по умолчанию во всех версиях MariaDB, если переменная системы old_passwords установлена в значение 0, что является значением по умолчанию.
На системе с переменной системы old_passwords, установленной в 0, это означает, что если вы создаёте учётную запись пользователя с помощью GRANT или CREATE USER statements, and if you do not specify an authentication plugin with the IDENTIFIED VIA clause, then MariaDB will use the mysql_native_password authentication plugin for the user account.
Например, эта учётная запись пользователя будет использовать плагин аутентификации mysql_native_password:
CREATE USER username@hostname;
И так же будет эта учётная запись пользователя:
CREATE USER username@hostname IDENTIFIED BY 'notagoodpassword';
Плагин аутентификации mysql_old_password становится плагином аутентификации по умолчанию во всех версиях MariaDB, если переменная системы old_passwords явно установлена в значение 1.
Однако, плагин аутентификации mysql_old_password не считается безопасным, поэтому рекомендуется избегать использования этого плагина. Для предотвращения нежелательного использования плагина аутентификации mysql_old_password сервер поддерживает переменную системы secure_auth, которая может использоваться для настройки сервера с отказом от подключений, пытающихся использовать плагин аутентификации mysql_old_password:
| Параметр сервера | Описание |
|---|---|
old_passwords={1 | 0} |
Если установлено в 1 (0 значение по умолчанию), MariaDB возвращается к использованию плагина аутентификации mysql_old_password по умолчанию для вновь созданных пользователей и паролей вместо плагина аутентификации mysql_native_password. |
secure_auth |
Подключения будут заблокированы, если они используют плагин аутентификации mysql_old_password. Сервер также не запустится, если таблицы привилегий находятся в старом формате, предшествующем MySQL 4.1. |
Большинство клиентов и утилит также поддерживают аргумент командной строки --secure-auth, который также может быть использован для настройки клиента на отказ от подключения к серверам, использующим плагин аутентификации mysql_old_password:
| Параметр клиента | Описание |
|---|---|
--secure-auth |
Отказаться от подключения к серверу, если сервер использует плагин аутентификации mysql_old_password. Этот режим выключен по умолчанию, что является отличием в поведении по сравнению с MySQL 5.6 и более поздними версиями, где он включён по умолчанию. |
Разработчики, использующие MariaDB Connector/C, могут реализовать аналогичную функциональность в своём приложении, задав параметр MYSQL_SECURE_AUTH с помощью функции mysql_optionsv.
Например:
mysql_optionsv(mysql, MYSQL_SECURE_AUTH, 1);
Плагин аутентификации клиента по умолчанию
Плагин аутентификации клиента по умолчанию зависит от нескольких факторов.
Если клиент явно не задаёт плагин аутентификации клиента по умолчанию, то клиент определит используемый плагин аутентификации, проверив длину кода в пакете рукопожатия сервера.
Если пакет рукопожатия сервера содержит код длиной 9 байт, то клиент по умолчанию будет использовать плагин аутентификации mysql_old_password.
Если пакет рукопожатия сервера содержит код длиной 20 байт, то клиент по умолчанию будет использовать плагин аутентификации mysql_native_password.
Установка плагина аутентификации клиента по умолчанию
Большинство клиентов и утилит поддерживают аргумент командной строки --default-auth, который может быть использован для установки плагина аутентификации клиента по умолчанию:
| Параметр клиента | Описание |
|---|---|
--default-auth=name |
Плагин аутентификации клиента по умолчанию. |
Разработчики, использующие MariaDB Connector/C, могут реализовать аналогичную функциональность в своём приложении, задав параметр MYSQL_DEFAULT_AUTH с помощью функции mysql_optionsv.
Например:
mysql_optionsv(mysql, MYSQL_DEFAULT_AUTH, "name");
Если вы знаете, что ваша учётная запись пользователя настроена на требование плагина аутентификации клиента, который не является mysql_old_password или mysql_native_password, то это может ускорить процесс подключения, если явно установить плагин аутентификации клиента по умолчанию.
Согласно протоколу клиент-сервер, сервер сначала отправляет пакет рукопожатия клиенту, затем клиент отвечает пакетом, содержащим имя пользователя учетной записи пользователя, запрашивающей доступ. Пакет рукопожатия сервера первоначально сообщает клиенту использовать плагин аутентификации сервера по умолчанию, а ответ клиента первоначально сообщает серверу, что он будет использовать плагин аутентификации клиента по умолчанию.
Однако плагины аутентификации на стороне сервера и клиента, упомянутые в этих начальных пакетах, могут быть неверными для этой конкретной учетной записи пользователя. Сервер узнает, какой плагин аутентификации использовать для этой конкретной учетной записи пользователя только после прочтения имени пользователя из пакета ответа клиента и нахождения соответствующей строки для учетной записи пользователя в таблице mysql.user или таблице mysql.global_priv, в зависимости от версии MariaDB.
Если сервер обнаружит, что плагин аутентификации по умолчанию на стороне сервера или клиента не соответствует фактическому плагину аутентификации, который должен использоваться для данной учетной записи пользователя, то сервер перезапускает аутентификацию на стороне сервера или клиента.
Это означает, что если вы знаете, какой плагин аутентификации клиента требуется вашей учетной записи пользователя, вы можете избежать ненужного перезапуска аутентификации и сэкономить два пакета и две поездки туда и обратно между клиентом и сервером, настроив своего клиента на использование правильного плагина аутентификации по умолчанию.
Плагины аутентификации
Плагины аутентификации сервера
mysql_native_password
Плагин аутентификации mysql_native_password использует алгоритм хеширования паролей, введенный в MySQL 4.1, который также используется функцией PASSWORD() function when old_passwords=0 is set. This hashing algorithm is based on SHA-1..
mysql_old_password
Плагин аутентификации mysql_old_password использует алгоритм хеширования паролей, предшествующий MySQL 4.1, который также используется функцией OLD_PASSWORD() и функцией PASSWORD(), когда установлено old_passwords=1.
ed25519
Плагин аутентификации ed25519 использует алгоритм цифровой подписи эллиптических кривых для безопасного хранения паролей пользователей и аутентификации пользователей. Алгоритм ed25519 — тот же алгоритм, что и используется OpenSSH. Он основан на эллиптической кривой и коде, созданном Дэниелом Дж. Бернштайном.
С точки зрения пользователя, плагин аутентификации ed25519 по-прежнему обеспечивает традиционную аутентификацию на основе паролей.
gssapi
Плагин аутентификации gssapi позволяет пользователю аутентифицироваться с помощью сервисов, использующих интерфейс прикладных программ безопасности общего назначения (GSSAPI). Windows имеет немного другой, но очень похожий API под названием интерфейс поддержки безопасности (SSPI).
В Windows этот плагин поддерживает аутентификацию Kerberos и NTLM. Аутентификация Windows поддерживается независимо от того, используется ли домен в среде.
В системах Unix наиболее распространённой службой GSSAPI является Kerberos. Однако она используется реже в системах Unix, чем в Windows. Независимо от этого, этот плагин также поддерживает аутентификацию Kerberos в системах Unix.
Плагин аутентификации gssapi чаще всего используется для аутентификации с Microsoft Active Directory.
pam
Плагин аутентификации pam позволяет MariaDB перенаправлять аутентификацию пользователя в фреймворк модулей аутентификации (PAM) системы. PAM — это фреймворк аутентификации, используемый в Linux, FreeBSD, Solaris и других Unix-подобных операционных системах.
unix_socket
Плагин аутентификации unix_socket позволяет пользователю использовать учетные данные операционной системы при подключении к MariaDB через локальный файл сокета Unix. Этот файл сокета Unix определяется переменной системы socket.
Плагин аутентификации unix_socket работает, вызывая системный вызов getsockopt с параметром сокета SO_PEERCRED, который позволяет получить uid процесса, подключенного к сокету. После этого он может получить имя пользователя, связанное с этим uid. После получения имени пользователя он выполнит аутентификацию подключаемого пользователя как учетной записи MariaDB с таким же именем пользователя.
Например:
$ mysql -uroot MariaDB []> CREATE USER serg IDENTIFIED VIA unix_socket; MariaDB []> CREATE USER monty IDENTIFIED VIA unix_socket; MariaDB []> quit Bye $ whoami serg $ mysql --user=serg Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.2.0-MariaDB-alpha-debug Source distribution MariaDB []> quit Bye $ mysql --user=monty ERROR 1045 (28000): Access denied for user 'monty'@'localhost' (using password: NO)
В этом примере пользователь serg уже вошел в систему и имеет полный доступ к оболочке. Он уже прошел аутентификацию в операционной системе, и его учетная запись MariaDB настроена на использование плагина аутентификации unix_socket, поэтому ему не нужно повторно проходить аутентификацию для базы данных. MariaDB принимает его учетные данные операционной системы и разрешает подключение. Однако любая попытка подключиться к базе данных как другому пользователю операционной системы будет отклонена.
named_pipe
Плагин аутентификации named_pipe позволяет пользователю использовать учетные данные операционной системы при подключении к MariaDB через именованную трубу в Windows. Подключения через именованные трубы включены переменной системы named_pipe.
Плагин аутентификации named_pipe работает с помощью имитации именованных труб и вызова GetUserName() для получения имени пользователя процесса, подключенного к именованной трубе. После получения имени пользователя он выполняет аутентификацию подключаемого пользователя как учетной записи MariaDB с таким же именем пользователя.
Например:
CREATE USER wlad IDENTIFIED VIA named_pipe; CREATE USER monty IDENTIFIED VIA named_pipe; quit C:\>echo %USERNAME% wlad C:\> mysql --user=wlad --protocol=PIPE Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 10.1.12-MariaDB-debug Source distribution Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> quit Bye C:\> mysql --user=monty --protocol=PIPE ERROR 1698 (28000): Access denied for user 'monty'@'localhost'
API плагина аутентификации
API плагина аутентификации подробно описан в исходном коде в следующих файлах:
-
mysql/plugin_auth.h(серверная часть) -
mysql/client_plugin.h(клиентская часть) -
mysql/plugin_auth_common.h(общие части)
Исходный код MariaDB также содержит некоторые плагины аутентификации, предназначенные специально в качестве примеров для разработчиков. Они расположены в plugin/auth_examples.
Определения двух плагинов аутентификации под названиями two_questions и three_attempts можно увидеть в plugin/auth_examples/dialog_examples.c. Эти плагины аутентификации демонстрируют, как взаимодействовать с пользователем, используя плагин аутентификации клиента dialog.
Плагин аутентификации two_questions запрашивает у пользователя пароль и подтверждение («Вы уверены?»).
Плагин аутентификации three_attempts предоставляет пользователю три попытки ввода правильного пароля.
Пароль для обоих этих плагинов должен быть указан в виде обычного текста в разделе USING:
CREATE USER insecure IDENTIFIED VIA two_questions USING 'notverysecret';
Плагин аутентификации клиента Dialog — расширение библиотеки клиента
Плагин аутентификации клиента dialog, строго говоря, не является частью API клиент-сервер или плагина аутентификации. Но его можно загрузить в любое клиентское приложение, использующее библиотеки libmysqlclient или MariaDB Connector/C. Этот плагин позволяет приложению настраивать пользовательский интерфейс функции диалога.
Для использования плагина аутентификации клиента dialog для взаимодействия с пользователем в настраиваемом режиме, приложение должно реализовать функцию со следующей сигнатурой:
extern "C" char *mysql_authentication_dialog_ask( MYSQL *mysql, int type, const char *prompt, char *buf, int buf_len)
Функция принимает следующие аргументы:
- Дескриптор подключения.
- Тип вопроса, который принимает одно из следующих значений:
-
1— обычный вопрос -
2— пароль (без отображения)
-
- Подсказка.
- Буфер.
- Длина буфера.
Функция возвращает указатель на строку символов, введенную пользователем. Она может быть храниться в buf или выделена с помощью malloc().
С помощью этой функции приложение GUI может отобразить окно диалога, приложение сети может отправить вопрос по сети, как требуется. Если приложение не предоставляет функцию mysql_authentication_dialog_ask, плагин аутентификации клиента dialog использует fputs() и fgets() по умолчанию.
Предоставление этого обратного вызова особенно важно в Windows, так как приложения Windows GUI не имеют связанной консоли, и функция диалога по умолчанию не сможет связаться с пользователем. Пример корректного клиентского приложения Windows GUI — HeidiSQL.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/pluggable-authentication-overview/