6.4.1.3 Миграция от хэширования паролей до версии 4.1 и плагина mysql_old_password
Сервер MySQL аутентифицирует попытки подключения для каждого пользователя, перечисленных в таблице системы mysql.user, используя плагин аутентификации, указанный в столбце plugin. Если столбец plugin пустой, сервер выполняет аутентификацию пользователя следующим образом:
До MySQL 5.7 сервер неявно использует плагин
mysql_native_passwordилиmysql_old_password, в зависимости от формата хэша пароля в столбцеPassword. Если значениеPasswordпустое или хэш пароля версии 4.1 (41 символ), сервер используетmysql_native_password. Если значение пароля — хэш пароля до версии 4.1 (16 символов), сервер используетmysql_old_password. (Дополнительную информацию об этих форматах хэшей см. в разделе 6.1.2.4, «Хэширование паролей в MySQL».)Начиная с MySQL 5.7, сервер требует, чтобы столбец
pluginне был пустым, и отключает пользователей, у которых значениеpluginпустое.
Хэши паролей до версии 4.1 и плагин mysql_old_password устарели в MySQL 5.6, а поддержка их удалена в MySQL 5.7. Они обеспечивают уровень безопасности, уступающий уровню безопасности, предлагаемому хэшированием паролей версии 4.1 и плагином mysql_native_password.
Учитывая требование MySQL 5.7 о том, что столбец plugin должен быть непустым, в сочетании с удалением поддержки mysql_old_password, администраторам баз данных рекомендуется обновлять пользователей следующим образом:
Обновить пользователей, которые неявно используют
mysql_native_password, чтобы использовать его явноОбновить пользователей, которые используют
mysql_old_password(неявно или явно), чтобы использоватьmysql_native_passwordявно
В этом разделе описано, как выполнить эти обновления. В результате у ни одного пользователя не будет пустого значения в столбце plugin и ни один пользователь не будет использовать хэширование паролей до версии 4.1 или плагин mysql_old_password.
В качестве варианта этих инструкций администраторы баз данных могут предложить пользователям возможность обновления до плагина sha256_password, который выполняет аутентификацию с использованием хэшей паролей SHA-256. Подробную информацию о данном плагине см. в разделе 6.4.1.5, «Плагин аутентификации SHA-256».
В следующей таблице перечислены типы пользователей mysql.user, рассматриваемые в этом обсуждении.
Столбец plugin |
Столбец Password | Результат аутентификации | Действие по обновлению |
|---|---|---|---|
| Пустой | Пустой | Неявно использует mysql_native_password
| Назначить плагин |
| Пустой | Хэш 4.1 | Неявно использует mysql_native_password
| Назначить плагин |
| Пустой | Хэш до 4.1 | Неявно использует mysql_old_password
| Назначить плагин, перехэшировать пароль |
mysql_native_password | Пустой | Явно использует mysql_native_password
| Нет |
mysql_native_password | Хэш 4.1 | Явно использует mysql_native_password
| Нет |
mysql_old_password | Пустой | Явно использует mysql_old_password
| Обновить плагин |
mysql_old_password | Хэш до 4.1 | Явно использует mysql_old_password
| Обновить плагин, перехэшировать пароль |
Пользователи, соответствующие строкам для плагина mysql_native_password, не требуют действий по обновлению (поскольку не требуется изменение плагина или формата хэша). Для пользователей, соответствующих строкам, для которых пароль пустой, можно попросить владельцев пользователей выбрать пароль (или потребовать его, используя ALTER
USER для истечения срока действия пустых паролей).
Обновление пользователей с неявного использования mysql_native_password до явного
Пользователи, у которых пустой плагин и хэш пароля версии 4.1, неявно используют mysql_native_password. Чтобы обновить этих пользователей для явного использования mysql_native_password, выполните следующие операторы:
UPDATE mysql.user SET plugin = 'mysql_native_password'
WHERE plugin = '' AND (Password = '' OR LENGTH(Password) = 41);
FLUSH PRIVILEGES;
До MySQL 5.7 вы можете выполнить эти операторы для предварительного обновления пользователей. Начиная с MySQL 5.7, вы можете запустить mysql_upgrade, который выполняет ту же операцию в рамках своих действий по обновлению.
Примечания:
Операция обновления, описанная выше, безопасна для выполнения в любое время, поскольку она делает плагин
mysql_native_passwordявным только для пользователей, которые уже неявно его используют.Эта операция не требует изменений паролей, поэтому ее можно выполнить без влияния на пользователей или без необходимости их участия в процессе обновления.
Обновление пользователей с mysql_old_password на mysql_native_password
Пользователи, использующие mysql_old_password (неявно или явно), должны быть обновлены для явного использования mysql_native_password. Это требует изменения плагина и изменения пароля с формата хэша до 4.1.
Для пользователей, подлежащих обновлению на этом шаге, истинно одно из этих условий:
Пользователь неявно использует
mysql_old_password, потому что столбецpluginпустой, а пароль имеет формат хэша до 4.1 (16 символов).Пользователь явно использует
mysql_old_password.
Чтобы определить таких пользователей, используйте этот запрос:
SELECT User, Host, Password FROM mysql.user
WHERE (plugin = '' AND LENGTH(Password) = 16)
OR plugin = 'mysql_old_password';
Ниже приведены два способа обновления этой группы пользователей. Они имеют различные характеристики, поэтому ознакомьтесь с обоими и решите, какой из них наиболее подходит для вашей установки MySQL.
Способ 1.
Характеристики этого метода:
Он требует, чтобы сервер и клиенты работали с
secure_auth=0до тех пор, пока все пользователи не будут обновлены до использованияmysql_native_password. (В противном случае пользователи не смогут подключиться к серверу с помощью своих паролей старого формата для обновления до хэша нового формата.)Он работает в MySQL 5.5 и 5.6. В 5.7 он не работает, поскольку сервер требует, чтобы у пользователей был непустой плагин и отключает их в противном случае. Поэтому, если вы уже перешли на 5.7, выберите Способ 2, описанный ниже.
Вам следует убедиться, что сервер работает с secure_auth=0.
Для всех пользователей, которые явно используют mysql_old_password, установите для них пустой плагин:
UPDATE mysql.user SET plugin = ''
WHERE plugin = 'mysql_old_password';
FLUSH PRIVILEGES;
Чтобы также истечь срок действия пароля для затронутых пользователей, используйте следующие операторы:
UPDATE mysql.user SET plugin = '', password_expired = 'Y'
WHERE plugin = 'mysql_old_password';
FLUSH PRIVILEGES;
Теперь затронутые пользователи могут сбросить свой пароль для использования хэширования версии 4.1. Попросите каждого пользователя, у которого теперь пустой плагин, подключиться к серверу и выполнить следующие операторы:
SET old_passwords = 0;
SET PASSWORD = PASSWORD('user-chosen-password');
Опция клиентской стороны --secure-auth включена по умолчанию, поэтому напомните пользователям отключить ее; в противном случае они не смогут подключиться:
$> mysql -u user_name -p --secure-auth=0
После того, как затронутый пользователь выполнит эти операторы, можно установить соответствующий плагин пользователя на mysql_native_password, чтобы сделать плагин явным. Или можно периодически выполнять эти операторы, чтобы найти и исправить тех пользователей, чьи пароли были сброшены:
UPDATE mysql.user SET plugin = 'mysql_native_password'
WHERE plugin = '' AND (Password = '' OR LENGTH(Password) = 41);
FLUSH PRIVILEGES;
Когда больше не останется пользователей с пустым плагином, этот запрос вернет пустой результат:
SELECT User, Host, Password FROM mysql.user
WHERE plugin = '' AND LENGTH(Password) = 16;
На этом этапе все пользователи будут перенесены от использования хэширования паролей до версии 4.1, и серверу больше не нужно работать с secure_auth=0.
Способ 2.
Характеристики этого метода:
Он назначает каждому затронутому пользователю новый пароль, поэтому вы должны сообщить каждому такому пользователю новый пароль и попросить его выбрать новый. Передача паролей пользователям выходит за рамки MySQL, но должна выполняться с осторожностью.
Он не требует работы сервера или клиентов с
secure_auth=0.Он работает с любой версией MySQL 5.5 или более поздней (и для 5.7 имеет более простой вариант).
В этом методе вы обновляете каждого пользователя отдельно из-за необходимости задавать пароли индивидуально. Выберите другой пароль для каждого пользователя.
Предположим, что 'user1'@'localhost' — один из пользователей, которые должны быть обновлены. Измените его следующим образом:
-
В MySQL 5.7,
ALTER USERпредоставляет возможность изменить как пароль учетной записи, так и её подключаемый модуль аутентификации, поэтому вам не нужно изменять системную таблицуmysql.userнапрямую:ALTER USER 'user1'@'localhost' IDENTIFIED WITH mysql_native_password BY '
DBA-chosen-password';Чтобы также сбросить срок действия пароля учетной записи, используйте эту команду вместо:
ALTER USER 'user1'@'localhost' IDENTIFIED WITH mysql_native_password BY '
DBA-chosen-password' PASSWORD EXPIRE;Затем сообщите пользователю новый пароль и попросите пользователя подключиться к серверу с этим паролем и выполнить эту команду, чтобы выбрать новый пароль:
ALTER USER USER() IDENTIFIED BY '
user-chosen-password'; -
До MySQL 5.7, вы должны были изменять системную таблицу
mysql.userнапрямую, используя эти команды:SET old_passwords = 0; UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('DBA-chosen-password') WHERE (User, Host) = ('user1', 'localhost'); FLUSH PRIVILEGES;Чтобы также сбросить срок действия пароля учетной записи, используйте эти команды вместо:
SET old_passwords = 0; UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('DBA-chosen-password'), password_expired = 'Y' WHERE (User, Host) = ('user1', 'localhost'); FLUSH PRIVILEGES;Затем сообщите пользователю новый пароль и попросите пользователя подключиться к серверу с этим паролем и выполнить эти команды, чтобы выбрать новый пароль:
SET old_passwords = 0; SET PASSWORD = PASSWORD('user-chosen-password');
Повторите для каждой учетной записи, которую нужно обновить.
© 2025 Oracle
Licensed under the GPLv2 License.