MySQL 8.4: Замена mysql_native_password на caching_sha2_password
В предыдущем посте с ошибкой unknown variable default-authentication-plugin=mysql_native_password мы смягчили последствия обновления до последней версии MySQL 8.4.
Но разработчики MySQL не просто так же удалили устаревший плагин mysql_native_password, значит нужно не просто сделать фикс системы, но сделать все правильно с точки зрения безопасности.
Например здесь можно узнать что теперь по-умолчанию в MySQL плагин аутентификации является caching_sha2_password. MySQL предоставляет два плагина аутентификации, которые реализуют хеширование SHA-256 для паролей учетных записей пользователей:
sha256_password(устарело): реализует базовую аутентификацию SHA-256. Устарел и может быть удален. Не используйте этот плагин аутентификации.
caching_sha2_password: реализует аутентификацию SHA-256 (как и sha256_password), но использует кэширование на стороне сервера для повышения производительности и имеет дополнительные функции для более широкого применения.
Решение
Обновить старые пароли с помощью caching_sha2_password
Перед всеми операциями советую сделать резервную копию базы данных
Итак, первым делом надо вывести список пользователей, использующих плагин mysql_native_password, делаем запрос в MySQL (не важно какой клиент для подключения к MySQL вы используете, например оболочку):
mysql> SELECT user, host, plugin from mysql.user WHERE plugin="mysql_native_password";
Результат будет примерно такой:
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | mysql_native_password |
| mysql.sys | localhost | mysql_native_password |
| root | localhost | caching_sha2_password |
| mukhin | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
Поскольку caching_sha2_password это новый плагин аутентификации по умолчанию в MySQL 8.x, нам не нужно переопределять метод шифрования пароля дополнительной директивой или флагом. Единственное требование - заново создать/обновить пользователей базы данных с паролем.
Для этого надо будет сделать запрос по шаблону, для каждого пользователя, использующего старый mysql_native_password:
ALTER USER "%user%"@"%host%" IDENTIFIED WITH caching_sha2_password BY "%password%";
Например, чтобы обновить пользователя mukhin на хосту localhost, я обновляю пароль:
ALTER USER "mukhin"@"localhost" IDENTIFIED WITH caching_sha2_password BY "its_not_my_really_password";
После обновления можно проверить, что ваше приложение нормально подключается к MySQL, и после повторного запроса на получение списка пользователей, использующих плагин mysql_native_password уже не выводится.
Почистить директивы или флаги
После обновления паролей можно почистить за собой конфигурационные файлы или флаги в докере, т.е. например в том же файле:
sudo nano /etc/mysql/mysql.conf.d/default-auth-override.cnf
можно закомментировать или удалить строку, которые мы вставляли в прошлый раз, т.е. привести к виду
# This file is automatically generated by MySQL Maintainer Scripts
[mysqld]
#mysql-native-password=ON
а в докере поубирать упоминание с установкой дефолтного плагина аутентификации:
"--default-authentication-plugin=mysql_native_password"
Делаем рестарт сервиса MySQL:
sudo service mysql restart
и не должны получить ошибок :)
Если вдруг вы удалите или закомментируете директиву #mysql-native-password=ON, а пароль забудете обновить с помощью caching_sha2_password и приложение перестанет работать, вы всегда можете вернуть или расскомментировать конфиг назад и попытаться сделать это снова.
Что думаешь?