Spec-Zone.ru › MySQL 9.2

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

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

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

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

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

Важно

В MySQL 9.2, caching_sha2_password является плагином аутентификации по умолчанию; mysql_native_password больше недоступен. Сведения о последствиях этого изменения для работы сервера и совместимости сервера с клиентами и коннекторами см. .

Важно

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

Примечание

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

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

  • На стороне сервера кэш в оперативной памяти позволяет быстрее повторно авторизовать пользователей, которые ранее подключались, при повторном подключении.

  • Обмен паролями на основе RSA доступен независимо от библиотеки SSL, с которой связан MySQL.

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

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

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

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

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

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

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

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

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

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

Плагин caching_sha2_password существует в форматах для сервера и клиента:

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

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

Плагин на стороне сервера использует плагин аудита sha2_cache_cleaner в качестве помощника для управления кэшем паролей. sha2_cache_cleaner, как и caching_sha2_password, встроен и не требует установки.

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

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

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

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

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

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

Стандартный плагин определяется значением системной переменной authentication_policy; по умолчанию используется caching_sha2_password.

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

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

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

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

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

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

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

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

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

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

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

    • Для реплик используйте утверждение CHANGE REPLICATION SOURCE TO с опцией SOURCE_PUBLIC_KEY_PATH для указания файла открытого ключа RSA или опцией GET_SOURCE_PUBLIC_KEY для запроса открытого ключа у источника. Для Group Replication системные переменные group_replication_recovery_public_key_path и group_replication_recovery_get_public_key выполняют ту же функцию.

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

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

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

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

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

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

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

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

    [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. Если вы хотите изменить количество раундов хеширования, используемых caching_sha2_password при генерации пароля, установите системную переменную caching_sha2_password_digest_rounds. Например:

    [mysqld]
    caching_sha2_password_digest_rounds=10000
    
  4. Перезапустите сервер, затем подключитесь к нему и проверьте значение статусной переменной Caching_sha2_password_rsa_public_key. Фактическое значение отличается от показанного здесь, но должно быть непустым:

    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, должно быть таким же, как значение ключа в файле на стороне сервера, указанном системной переменной caching_sha2_password_public_key_path. Если файл ключа содержит действительное значение открытого ключа, но значение неверно, возникает ошибка доступа запрещено. Если файл ключа не содержит действительного значения открытого ключа, программа клиента не может его использовать.

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

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

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

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

На стороне сервера плагин caching_sha2_password использует кэш в оперативной памяти для более быстрого аутентификации клиентов, которые подключались ранее. Элементы кэша состоят из пар имя_аккаунта/хеш_пароля. Кэш работает следующим образом:

  1. Когда клиент подключается, caching_sha2_password проверяет, соответствует ли клиент и пароль какой-либо записи в кэше. Если да, аутентификация проходит успешно.

  2. Если нет совпадения в кэше, плагин пытается проверить клиента по учетным данным в таблице системной таблицы mysql.user. Если это успешно, caching_sha2_password добавляет запись о клиенте в хеш. В противном случае аутентификация не удается, и подключение отклоняется.

Таким образом, когда клиент подключается впервые, происходит аутентификация по таблице системной таблице mysql.user. При последующих подключениях происходит более быстрая аутентификация по кэшу.

Операции с кэшем паролей, помимо добавления записей, обрабатываются плагином аудита sha2_cache_cleaner, который выполняет эти действия от имени caching_sha2_password:

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

  • Он очищает кэш, когда выполняется оператор FLUSH PRIVILEGES.

  • Он очищает кэш при выключении сервера. (Это означает, что кэш не сохраняется между перезагрузками сервера.)

Операции очистки кэша влияют на требования к аутентификации для последующих подключений клиентов. Для каждого пользовательского аккаунта первое подключение пользователя после любой из следующих операций должно использовать защищенное подключение (созданное с использованием TCP с TLS-удостоверениями, файла Unix-сокет или общей памяти) или обмен паролем на основе пары ключей RSA:

  • После создания аккаунта.

  • После смены пароля для аккаунта.

  • После оператора RENAME USER для аккаунта.

  • После оператора FLUSH PRIVILEGES.

FLUSH PRIVILEGES очищает весь кэш и влияет на все аккаунты, которые используют плагин caching_sha2_password. Другие операции очищают определенные записи в кэше и влияют только на аккаунты, которые участвуют в операции.

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

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

Spec-Zone.ru

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