Вопрос или проблема
Я переношу наши веб-сайты на нового хоста. Наш кластер баз данных (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 для успешной аутентификации.
Существует несколько методов для устранения этой ошибки и обеспечения безопасного соединения:
-
Активировать SSL на клиенте:
Используйте параметр--ssl-mode=REQUIRED
при подключении:mysql --ssl-mode=REQUIRED -u user -p -h hostname
Это принудительно активирует SSL для клиентского соединения.
-
Использование публичного ключа сервера:
ЕслиSSL
недоступен, можно использовать опцию получения публичного ключа:mysql --get-server-public-key -u user -p -h hostname
Однако это только временное решение, так как кешированный публичный ключ может быть стер в результате перезагрузки или изменения прав пользователей.
-
Указание пути к публичному ключу:
Найдите путь к публичному ключу на сервере с помощью команды: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"
-
Изменение метода аутентификации:
Если использование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 и документацией, чтобы оставаться в курсе изменений и улучшений безопасности. Правильная конфигурация и понимание используемых технологий значительно поспособствуют защите данных и надежности системы.