Spec-Zone.ru › MySQL 5.7

6.4.1.5 SHA-256 Подключаемый модуль аутентификации

MySQL предоставляет два подключаемых модуля аутентификации, которые реализуют хеширование SHA-256 для паролей учетных записей пользователей:

  • sha256_password: Реализует базовая аутентификация SHA-256.

  • caching_sha2_password: Реализует аутентификацию SHA-256 (как sha256_password), но использует кэширование на стороне сервера для повышения производительности и имеет дополнительные возможности для более широкого применения.

В этом разделе описывается исходный подключаемый модуль аутентификации SHA-2 без кэширования. Для получения информации о подключаемом модуле с кэшированием см. раздел 6.4.1.4, «Caching SHA-2 Подключаемый модуль аутентификации».

Важно

Для подключения к серверу с помощью учетной записи, которая проходит аутентификацию с помощью подключаемого модуля sha256_password, необходимо использовать либо подключение TLS, либо нешифрованное подключение, поддерживающее обмен паролями с помощью пары ключей RSA, как описано позднее в этом разделе. В любом случае, подключаемый модуль sha256_password использует возможности шифрования MySQL. См. раздел 6.3, «Использование шифрованных подключений».

Примечание

В названии sha256_password, “sha256” относится к длине дайджеста в 256 бит, которую использует модуль для шифрования. В названии caching_sha2_password, “sha2” относится более обще к классу алгоритмов шифрования SHA-2, одним из которых является 256-битное шифрование. Такой выбор названия позволяет в будущем расширять возможные длины дайджестов без изменения имени модуля.

В следующей таблице показаны имена подключаемых модулей на стороне сервера и клиента.

Таблица 6.11 Имена подключаемых модулей и библиотек для аутентификации SHA-256

Таблица 6.11 Имена подключаемых модулей и библиотек для аутентификации SHA-256
Подключаемый модуль или файл Имя подключаемого модуля или файла
Подключаемый модуль на стороне сервера sha256_password
Подключаемый модуль на стороне клиента sha256_password
Файл библиотеки Нет (подключаемые модули встроенные)

В следующих разделах приводится информация об установке и использовании, специфичная для подключаемого модуля аутентификации SHA-256:

  • Установка подключаемого модуля аутентификации SHA-256

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

Для получения общей информации о подключаемых модулях аутентификации в MySQL см. раздел 6.2.13, «Подключаемые модули аутентификации».

Установка подключаемого модуля аутентификации SHA-256

Подключаемый модуль sha256_password существует в форме для сервера и клиента:

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

  • Подключаемый модуль на стороне клиента встроен в библиотеку клиента libmysqlclient и доступен любой программе, связанной с libmysqlclient.

END_OF_DOCUMENT_MARKER
Использование плагина SHA-256 для аутентификации

Для настройки учетной записи, использующей плагин sha256_password для хеширования паролей SHA-256, используйте следующую команду, где password — желаемый пароль учетной записи:

CREATE USER 'sha256user'@'localhost'
IDENTIFIED WITH sha256_password BY 'password';

Сервер назначит плагин sha256_password для учетной записи и будет использовать его для шифрования пароля с помощью SHA-256, сохраняя эти значения в столбцах plugin и authentication_string таблицы системы mysql.user.

В предыдущих инструкциях не предполагается, что плагин sha256_password является стандартным плагином аутентификации. Если плагин sha256_password является стандартным плагином аутентификации, можно использовать более простую синтаксис CREATE USER.

Для запуска сервера со стандартным плагином аутентификации, установленным на sha256_password, добавьте эти строки в файл опций сервера:

[mysqld]
default_authentication_plugin=sha256_password

Это приведет к тому, что плагин sha256_password будет использоваться по умолчанию для новых учетных записей. В результате, можно создать учетную запись и установить её пароль, не называя плагин явно:

CREATE USER 'sha256user'@'localhost' IDENTIFIED BY 'password';

Другим следствием установки default_authentication_plugin на sha256_password является то, что для использования другого плагина для создания учетной записи необходимо явно указать этот плагин. Например, для использования плагина mysql_native_password используйте следующую команду:

CREATE USER 'nativeuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password';

sha256_password поддерживает подключения через безопасный транспорт. sha256_password также поддерживает обмен зашифрованными паролями с использованием RSA по незащищенным подключениям, если выполнены следующие условия:

  • MySQL скомпилирован с использованием OpenSSL, а не yaSSL. sha256_password работает с дистрибутивами, скомпилированными с использованием любого из пакетов, но поддержка RSA требует OpenSSL.

    Примечание

    Возможно скомпилировать MySQL с использованием yaSSL как альтернативы OpenSSL только до версии MySQL 5.7.28. Начиная с MySQL 5.7.28, поддержка yaSSL удалена, и все сборки MySQL используют OpenSSL.

  • Сервер MySQL, к которому вы хотите подключиться, настроен на поддержку RSA (используя процедуру конфигурации RSA, описанную далее в этом разделе).

Поддержка RSA обладает следующими характеристиками:

  • На стороне сервера две системные переменные указывают на файлы с закрытым и открытым ключами RSA: sha256_password_private_key_path и sha256_password_public_key_path. Администратор базы данных должен установить эти переменные при запуске сервера, если используемые файлы ключей имеют имена, отличные от значений по умолчанию системных переменных.

  • Сервер использует системную переменную sha256_password_auto_generate_rsa_keys, чтобы определить, нужно ли автоматически генерировать файлы пар ключей RSA. См. Раздел 6.3.3, «Создание сертификатов и ключей SSL и RSA».

  • Переменная состояния Rsa_public_key отображает значение открытого ключа RSA, используемого плагином аутентификации sha256_password.

  • Клиенты, обладающие открытым ключом RSA, могут выполнять обмен паролями на основе пар ключей RSA с сервером во время процесса подключения, как описано ниже.

  • Для подключений учетными записями, которые проходят аутентификацию с использованием sha256_password и обменом паролями на основе пар открытых и закрытых ключей RSA, сервер посылает открытый ключ RSA клиенту при необходимости. Однако, если копия открытого ключа доступна на хосте клиента, клиент может использовать её, чтобы сэкономить раунд в протоколе клиент/сервер:

    • Для этих командных клиентов используйте параметр --server-public-key-path, чтобы указать файл с открытым ключом RSA: mysql, mysqltest, и (начиная с MySQL 5.7.23) mysqladmin, mysqlbinlog, mysqlcheck, mysqldump, mysqlimport, mysqlpump, mysqlshow, mysqlslap, mysqltest.

    • Для программ, использующих C API, вызовите функцию, чтобы указать файл с открытым ключом RSA, передав параметр MYSQL_SERVER_PUBLIC_KEY и имя файла.

    • Для реплик, обмен паролями на основе пар ключей RSA не может использоваться для подключения к источникам серверов для учетных записей, которые проходят аутентификацию с использованием плагина sha256_password. Для таких учетных записей можно использовать только безопасные подключения.

Для клиентов, использующих плагин sha256_password, пароли никогда не передаются в открытом виде при подключении к серверу. Способ передачи паролей зависит от того, используется ли безопасное соединение или шифрование RSA:

  • Если подключение защищено, пара ключей RSA не нужна и не используется. Это относится к подключениям, зашифрованным с помощью TLS. Пароль отправляется в открытом виде, но его нельзя перехватить, так как подключение защищено.

    Примечание

    В отличие от caching_sha2_password, плагин sha256_password не рассматривает подключения через общую память как безопасные, даже если транспорт через общую память по умолчанию защищен.

  • Если подключение не защищено и пара ключей RSA доступна, подключение остается незащищенным. Это относится к подключениям, не зашифрованным с помощью TLS. RSA используется только для обмена паролями между клиентом и сервером, чтобы предотвратить перехват пароля. Когда сервер получает зашифрованный пароль, он его расшифровывает. В шифровании используется кодирование, чтобы предотвратить повторные атаки.

  • Если не используется защищенное подключение и шифрование RSA недоступно, попытка подключения завершается ошибкой, поскольку пароль не может быть отправлен без раскрытия в открытом виде.

Как упоминалось ранее, шифрование паролей RSA доступно только если MySQL скомпилирован с использованием OpenSSL. Следствием для дистрибутивов MySQL, скомпилированных с использованием yaSSL, является то, что для использования паролей SHA-256 клиенты должны использовать защищенное подключение для доступа к серверу. См. Раздел 6.3.1, «Настройка MySQL для использования защищенных подключений».

Примечание

Для использования шифрования паролей RSA с sha256_password, клиент и сервер должны быть оба скомпилированы с использованием OpenSSL, а не только один из них.

Предполагая, что MySQL скомпилирован с использованием OpenSSL, следуйте процедуре для включения использования пары ключей RSA для обмена паролями во время подключения клиента:

  1. Создайте файлы закрытого и открытого ключей RSA, используя инструкции в Разделе 6.3.3, «Создание сертификатов и ключей SSL и RSA».

  2. Если файлы закрытого и открытого ключей находятся в каталоге данных и называются private_key.pem и public_key.pem (значения по умолчанию для sha256_password_private_key_path и sha256_password_public_key_path системных переменных), сервер использует их автоматически при запуске.

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

    [mysqld]
    sha256_password_private_key_path=myprivkey.pem
    sha256_password_public_key_path=mypubkey.pem
    

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

    [mysqld]
    sha256_password_private_key_path=/usr/local/mysql/myprivkey.pem
    sha256_password_public_key_path=/usr/local/mysql/mypubkey.pem
    
  3. Перезапустите сервер, затем подключитесь к нему и проверьте значение переменной состояния Rsa_public_key. Фактическое значение отличается от показанного здесь, но должно быть непустым:

    mysql> SHOW STATUS LIKE 'Rsa_public_key'\G
    *************************** 1. row ***************************
    Variable_name: Rsa_public_key
            Value: -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6
    MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa
    aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ
    g8aV7EtKwyhHb0c30QIDAQAB
    -----END PUBLIC KEY-----
    

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

После того, как сервер настроен с файлами ключей RSA, учетные записи, которые проходят аутентификацию с помощью плагина sha256_password, могут использовать эти файлы ключей для подключения к серверу. Как упоминалось ранее, такие учетные записи могут использовать как защищенное подключение (в этом случае RSA не используется), так и незащищенное подключение, которое выполняет обмен паролями с использованием RSA. Предположим, используется незащищенное подключение. Например:

$> mysql --ssl-mode=DISABLED -u sha256user -p
Enter password: password

Для этой попытки подключения от sha256user сервер определяет, что sha256_password является подходящим модулем аутентификации и вызывает его (потому что этот модуль был указан во время CREATE USER). Модуль обнаруживает, что подключение не зашифровано и, следовательно, требует передачи пароля с использованием шифрования RSA. В этом случае модуль отправляет открытый ключ RSA клиенту, который использует его для шифрования пароля и возвращает результат серверу. Модуль использует закрытый ключ RSA на стороне сервера для расшифровки пароля и принимает или отклоняет подключение в зависимости от того, правильный ли пароль.

Сервер отправляет открытый ключ RSA клиенту по мере необходимости. Однако если у клиента есть файл с локальной копией открытого ключа RSA, требуемого сервером, он может указать этот файл с помощью опции --server-public-key-path:

$> mysql --ssl-mode=DISABLED -u sha256user -p --server-public-key-path=file_name
Enter password: password

Значение открытого ключа в файле, указанном опцией --server-public-key-path, должно совпадать со значением ключа в файле на стороне сервера, указанном переменной системы sha256_password_public_key_path. Если файл ключа содержит корректное значение открытого ключа, но значение неверно, возникает ошибка доступа запрещён. Если файл ключа не содержит корректного открытого ключа, клиентская программа не может его использовать. В этом случае модуль sha256_password отправляет открытый ключ клиенту так, как будто опция --server-public-key-path не была указана.

Клиентские пользователи могут получить открытый ключ RSA двумя способами:

  • Администратор базы данных может предоставить копию файла открытого ключа.

  • Клиентский пользователь, который может подключиться к серверу каким-либо другим способом, может использовать оператор SHOW STATUS LIKE 'Rsa_public_key' и сохранить возвращённое значение ключа в файле.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/sha256-pluggable-authentication.html

Spec-Zone.ru

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