Решение проблему с root-паролем в MySQL

11 января 2020 г.

Решение проблему в MySQL — "Your password does not satisfy the current policy requirements"

На вновь установленном сервере с Oracle MySQL 5.7.21 при создании пользователя может возникнуть ошибка:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
или
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Давайте быстро разберемся откуда она появилась и как её устранить.

Исходные данные: Oracle MySQL 5.7.21;
Задача: Разрешить проблему с ошибкой ERROR 1819 (HY000): Your password does not satisfy the current policy requirements;

Корень проблемы кроется в активированном по умолчанию плагине validate_password которому не нравятся даже такого рода пароли ‘admin’, что довольно странно, ведь пароль достаточно стойкий.

Посмотрим активирован ли плагин у нас:

# mysql -u root -p
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'validate%';
+-------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------------+---------------+
| validate_password | ACTIVE |
+-------------------+---------------+
1 row in set (0.00 sec)

Как мы видим, плагин активирован. Посмотрим на настройки плагина:

mysql> SHOW GLOBAL VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | OFF|
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

Что же MySQL не понравилось в пароле вида ‘admin’ ?
А не понравилось то, что в соответствии с настройкой validate_password_special_char_count в пароле должен был указан хотя бы один специальный символ, например восклицательный знак (!).

Самым правильным решением будет конечно соблюдение установленных правил при генерации пароля, но если хочется немного их подправить, то сделаем:

Для mysql5.7:

mysql> SET GLOBAL validate_password_check_user_name = OFF;
mysql> SET GLOBAL validate_password_length = 5;
mysql> SET GLOBAL validate_password_mixed_case_count = 0;
mysql> SET GLOBAL validate_password_number_count = 0;
mysql> SET GLOBAL validate_password_policy = LOW;
mysql> SET GLOBAL validate_password_special_char_count = 0;

Для mysql8:

mysql> SET GLOBAL validate_password.check_user_name = OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password.length = 5;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password.mixed_case_count = 0;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password.number_count = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password.policy = LOW;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL validate_password.special_char_count = 0;
Query OK, 0 rows affected (0.00 sec)

Теперь при создании пользователя с паролем ‘admin’ проблем возникнуть не должно.
Пробуем:

mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY 'admin';
Query OK, 0 rows affected (0.00 sec)

Если Вас устраивает такая политика, то не забудьте добавить в /etc/my.cnf в секцию [mysqld] настройку validate_password_special_char_count=0

[mysqld]
validate_password_special_char_count=0

Если Вы хотите, чтобы никто не смог выгрузить плагин validate_password, то в /etc/my.cnf в секцию [mysqld] нужно добавить настройку validate-password=FORCE_PLUS_PERMANENT

[mysqld]
validate-password=FORCE_PLUS_PERMANENT

Если Вы хотите отключить плагин на совсем, то выполните:

mysql> UNINSTALL PLUGIN validate_password;

Для повторной активации плагина выполните:

mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';

Источник