Как безопасно подключиться к MySQL 8, когда используется caching_sha2_password?

Вопрос или проблема

Я переношу наши веб-сайты на нового хоста. Наш кластер баз данных (PCS) теперь работает на MySQL 8. У нас есть два сервера баз данных (активный и резервный) с плавающим виртуальным IP, к которому мы подключаемся для MySQL.

У нас также настроена репликация из кластера на другой сервер (с использованием бинарных логов). Я настроил репликацию таким же образом, как и при использовании MySQL 5.x, включая использование SSL с самоподписанным CA и сертификатами.

После создания сертификатов я применяю эту конфигурацию на мастере:

ssl
ssl-ca=/var/lib/mysql/ssl/ca.pem
ssl-cert=/var/lib/mysql/ssl/server-cert.pem
ssl-key=/var/lib/mysql/ssl/server-key.pem

Репликация теперь работает нормально на слейве. Однако, когда я пытаюсь подключиться к кластеру mysql через командную строку (с активного сервера БД), я получаю следующую ошибку:

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

Почитав об этом, я подумал, что дело в том, что caching_sha2_password теперь по умолчанию, и в документации говорится, что требуется защищенное соединение. Я попробовал следующее:

mysql --ssl-mode=DISABLED

и это не принесло никакой пользы. Я также пытался изменить пользователя:

mysql> ALTER USER 'root'@'db-01' IDENTIFIED WITH mysql_native_password BY 'passwordhere'

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

mysql --get-server-public-key

Но я не уверен, что это лучшее решение.

Как лучше всего настроить мои подключения в MySQL 8, используя SSL таким образом? Будет несколько учетных записей как с серверов баз данных, составляющих кластер, так и с веб-серверов в той же внутренней сети, так и извне (например, репликация и удаленное управление базой данных).

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

Все, что мне нужно было сделать, это добавить следующую строку в мой конфигурационный файл mysql вместе с остальными настройками групповой репликации

group_replication_recovery_get_public_key           = on

Насколько я могу судить, это нигде не задокументировано. Я просто наткнулся на это, просматривая переменные mysql в надежде найти что-то полезное.

Эта команда

mysql --get-server-public-key

кэшируется и является временной. Кэшированный открытый ключ стирается при перезагрузках, сбросе привилегий или после изменений прав пользователей.

Вместо попытки сохранить его в кэше, у меня больше получилось использовать открытый файл ключа, скопированный с исходного сервера.
вы можете найти имя файла открытого ключа (на исходном сервере, не на клиентском) с помощью команды show global variables как это:

 show global variables like "caching_sha2_password_public_key_path";

скопируйте файл открытого ключа на клиент.

для старта реплики / репликации с использованием
CHANGE REPLICATION SOURCE
включите опцию

SOURCE_PUBLIC_KEY_PATH='public_key.pem'

убедитесь, что имя файла и путь к нему правильные, и у пользователя mysql есть разрешения на его чтение.

для клиентских подключений mysql включите командную опцию –server-public-key-path
пример:

mysql -u my_user -p -h my_server_hostname --server-public-key-path="public_key.pem"

снова убедитесь, что имя файла и путь к нему правильные.

эта страница документации MySQL помогла мне это выяснить.
https://dev.mysql.com/doc/refman/8.4/en/sha256-pluggable-authentication.html

Интересно, удалось ли вам это решить. Я столкнулся с той же или похожей проблемой.
Вот моя тема на Reddit:
https://www.reddit.com/r/mysql/comments/10pa60k/group_replication_and_ssl_configuring_issues/

Любое предложение было бы отличным. Спасибо.
DD

Чтобы избежать упомянутой ошибки “Authentication requires secure connection”, просто активируйте SSL шифрование на клиентском подключении, используя опцию --ssl-mode как это:

mysql --ssl-mode=REQUIRED ...

.

Ответ или решение

Для безопасного подключения к MySQL 8, когда используется плагин аутентификации caching_sha2_password, необходимо обеспечить использование защищенного соединения. Это связано с тем, что MySQL 8 по умолчанию требует безопасности при аутентификации с использованием caching_sha2_password. Ваша ситуация осложняется перемещением ваших веб-сайтов на новый хост и обновлением базы данных до MySQL 8, с использованием SSL для репликации и самоподписанных сертификатов. Давайте подробно рассмотрим, как можно исправить ошибку «Authentication requires secure connection» и обеспечить корректное соединение с MySQL.

Теория

Сначала разберемся, почему возникает ошибка. Плагин caching_sha2_password требует наличия защищенного соединения для передачи учетных данных. Это может быть достигнуто с помощью SSL, или MySQL может использовать "Public Key Retrieval", чтобы зашифровать пароль перед отправкой на сервер.

Когда был использован параметр --ssl-mode=DISABLED, вы фактически отключили SSL, что стало причиной отказа в соединении, поскольку оно не соответствовало требованиям безопасности caching_sha2_password.

Пример

В своем конфигурационном файле сервера MySQL вы уже указали использование SSL:

ssl
ssl-ca=/var/lib/mysql/ssl/ca.pem
ssl-cert=/var/lib/mysql/ssl/server-cert.pem
ssl-key=/var/lib/mysql/ssl/server-key.pem

Это правильно и обеспечивает SSL для репликации, но командный клиент должен также использовать SSL для успешной аутентификации.

Существует несколько методов для устранения этой ошибки и обеспечения безопасного соединения:

  1. Активировать SSL на клиенте:
    Используйте параметр --ssl-mode=REQUIRED при подключении:

    mysql --ssl-mode=REQUIRED -u user -p -h hostname

    Это принудительно активирует SSL для клиентского соединения.

  2. Использование публичного ключа сервера:
    Если SSL недоступен, можно использовать опцию получения публичного ключа:

    mysql --get-server-public-key -u user -p -h hostname

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

  3. Указание пути к публичному ключу:
    Найдите путь к публичному ключу на сервере с помощью команды:

    show global variables like 'caching_sha2_password_public_key_path';

    Затем скопируйте этот ключ на клиент и используйте команду:

    mysql -u user -p -h hostname --server-public-key-path="path/to/public_key.pem"
  4. Изменение метода аутентификации:
    Если использование caching_sha2_password не является критичным, вы можете изменить метод аутентификации на mysql_native_password с использованием команды:

    ALTER USER 'root'@'db-01' IDENTIFIED WITH mysql_native_password BY 'passwordhere';

    Однако это может иметь побочные эффекты для безопасности, так как mysql_native_password является менее надежным по сравнению с caching_sha2_password.

Применение

Через комбинацию вышеперечисленных стратегий, вы сможете поддержать безопасность и стабильность соединений с базой данных. Основной упор следует сделать на использование SSL, так как это самый безопасный подход. Убедитесь, что все требуемые сертификаты установлены и доступны как на сервере, так и на клиенте. Также правильно настройте права доступа для файлов сертификатов, чтобы избежать проблем с правами.

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

Оцените материал
Добавить комментарий

Капча загружается...