Spec-Zone.ru › MySQL 5.7

6.4.1.4 Кэшируемая аутентификация SHA-2

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

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

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

В этом разделе описывается плагин кэшируемой аутентификации SHA-2, доступный начиная с MySQL 5.7.23. Для получения информации об исходном базовом (не кэшируемом) плагине, см. Раздел 6.4.1.5, «Плагин аутентификации SHA-256».

Важно

В MySQL 5.7, плагином аутентификации по умолчанию является mysql_native_password. Начиная с MySQL 8.0, плагином аутентификации по умолчанию стал caching_sha2_password. Для того, чтобы клиенты MySQL 5.7 могли подключаться к серверам 8.0 и выше, используя учетные записи, аутентифицирующиеся с помощью caching_sha2_password, библиотека и клиентские программы MySQL 5.7 поддерживают плагин аутентификации caching_sha2_password на стороне клиента. Это повышает совместимость клиентов MySQL 5.7 с серверами MySQL 8.0 и выше, несмотря на различия в плагинах аутентификации по умолчанию.

Ограничение поддержки caching_sha2_password в MySQL 5.7 плагином на стороне клиента в клиентской библиотеке имеет следующие последствия по сравнению с MySQL 8.0:

  • Плагин caching_sha2_password на стороне сервера не реализован в MySQL 5.7.

  • Серверы MySQL 5.7 не поддерживают создание учетных записей, аутентифицирующихся с помощью caching_sha2_password.

  • Серверы MySQL 5.7 не реализуют системные и статусные переменные, специфичные для поддержки caching_sha2_password на стороне сервера: , , , .

Кроме того, нет поддержки подключения реплик MySQL 5.7 к серверам репликации MySQL 8.0, используя учетные записи, аутентифицирующиеся с помощью caching_sha2_password. Это предполагало бы репликацию источника на реплику с номером версии ниже, чем у источника, в то время как источники обычно реплицируют на реплики с номером версии равным или выше, чем у источника.

Важно

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

Примечание

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

Плагин caching_sha2_password имеет следующие преимущества по сравнению с sha256_password:

  • На стороне сервера кэш в оперативной памяти позволяет быстрее повторно аутентифицировать пользователей, которые ранее подключались, при их повторном подключении. (Это поведение на стороне сервера реализовано только в MySQL 8.0 и выше.)

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

В следующей таблице показано имя плагина на стороне клиента.

Таблица 6.10 Имена плагина и библиотеки для аутентификации SHA-2

Таблица 6.10 Имена плагина и библиотеки для аутентификации SHA-2
Плагин или файл Имя плагина или файла
Плагин на стороне клиента caching_sha2_password
Файл библиотеки Нет (плагин встроен)

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

  • Установка плагина аутентификации SHA-2

  • Использование плагина аутентификации SHA-2

  • Работа кэша для плагина аутентификации SHA-2

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

Установка плагина аутентификации SHA-2

В MySQL 5.7, плагин caching_sha2_password существует в форме клиента. Плагин на стороне клиента встроен в клиентскую библиотеку libmysqlclient и доступен любой программе, связанной с libmysqlclient.

Использование плагиновой аутентификации SHA-2

В MySQL 5.7 плагин клиента caching_sha2_password позволяет подключаться к серверам MySQL 8.0 или выше с использованием учётных записей, которые аутентифицируются с помощью плагина сервера caching_sha2_password. В данном обсуждении предполагается, что на сервере MySQL 8.0 или выше существует учётная запись с именем 'sha2user'@'localhost'. Например, следующее утверждение создаёт такую учётную запись, где password — желаемый пароль учётной записи:

CREATE USER 'sha2user'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';

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

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

    Примечание

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

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

Поддержка RSA характеризуется следующими особенностями, причём все аспекты, относящиеся к стороне сервера, требуют сервера MySQL 8.0 или выше:

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

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

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

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

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

    Использование надёжной локальной копии открытого ключа позволяет клиенту избежать дополнительных запросов в протоколе клиент/сервер и обеспечивает большую безопасность по сравнению с запросом открытого ключа у сервера. С другой стороны, запрос открытого ключа у сервера более удобен (не требует управления файлом на стороне клиента) и может быть приемлем в безопасных сетевых средах.

    • Для командных клиентов используйте опцию --server-public-key-path для указания файла открытого ключа RSA. Используйте опцию --get-server-public-key для запроса открытого ключа у сервера. Следующие программы поддерживают две опции: mysql, mysqladmin, mysqlbinlog, mysqlcheck, mysqldump, mysqlimport, mysqlpump, mysqlshow, mysqlslap, mysqltest.

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

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

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

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

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

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

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

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

Важно

Аспекты этой процедуры, относящиеся к настройке сервера, должны выполняться на сервере MySQL 8.0 или выше, к которому вы хотите подключиться с помощью клиентов MySQL 5.7, а не на вашем сервере MySQL 5.7.

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

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

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

    [mysqld]
    caching_sha2_password_private_key_path=myprivkey.pem
    caching_sha2_password_public_key_path=mypubkey.pem
    

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

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

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

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

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

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

Для этой попытки подключения учётной записи sha2user, сервер определяет, что caching_sha2_password — подходящий плагин аутентификации, и вызывает его (потому что этот плагин был указан в момент CREATE USER). Плагин определяет, что соединение не зашифровано и, следовательно, требует передачи пароля с использованием шифрования RSA. Однако сервер не отправляет открытый ключ клиенту, и клиент не предоставил открытый ключ, поэтому он не может зашифровать пароль, и соединение прерывается:

ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password'
reported error: Authentication requires secure connection.

Чтобы запросить открытый ключ RSA у сервера, укажите опцию --get-server-public-key:

$> mysql --ssl-mode=DISABLED -u sha2user -p --get-server-public-key
Enter password: password

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

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

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

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

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

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

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

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

Операция кэширования для плагина аутентификации SHA-2

На стороне сервера плагин caching_sha2_password использует кэш в оперативной памяти для более быстрого аутентифицирования клиентов, которые подключались ранее. Для MySQL 5.7, который поддерживает только плагин caching_sha2_password со стороны клиента, этот кэширование на стороне сервера выполняется на сервере MySQL 8.0 или выше, к которому вы подключаетесь с помощью клиентов MySQL 5.7. Для получения информации об операции кэширования см. в Справочном руководстве MySQL 8.0.

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

Spec-Zone.ru

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