Давайте посмотрим на функции управления паролями, доступные в MySQL 8.0.
Мы рассмотрим управление паролями в MySQL в 5 разделах:
Проверка пароля означает, что новый пароль должен соответствовать некоторой политике, чтобы убедиться, что пароль не является слабым. Эта работа выполняется компонентом в MySQL 8.0: validate_password.
Чтобы иметь возможность использовать этот компонент, вам необходимо установить его. Вы можете проверить, установлен ли он, проверив таблицу mysql.component (эта информация скоро будет доступна и в Information_Schema ):
mysql> select * from mysql.component; Empty set (0.02 sec
Если он еще не установлен, то его можно очень просто установить:
mysql> INSTALL COMPONENT 'file://component_validate_password'; Query OK, 0 rows affected (0.12 sec) mysql> select * from mysql.component; +--------------+--------------------+------------------------------------+ | component_id | component_group_id | component_urn | +--------------+--------------------+------------------------------------+ | 1 | 1 | file://component_validate_password | +--------------+--------------------+------------------------------------+ 1 row in set (0.01 sec)
После установки у вас будет доступ к новым переменным пароля проверки :
mysql> SHOW VARIABLES LIKE 'validate_password.%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password.check_user_name | ON | | 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.44 sec)
Как видите, можно определить несколько опций.
Давайте проверим параметры по умолчанию:
mysql> create user 'andreyex' identified by 'andreyex'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements mysql> create user 'andreyex' identified by 'andreyex1#'; Query OK, 0 rows affected (0.02 sec)
Поддерживается любой символ, например, акценты:
mysql> set password for 'andreyex'='Lefréd#1'; Query OK, 0 rows affected (0.17 sec)
Или даже лучше (или, по крайней мере, более забавно, чем борьба с клавиатурой Azerty против Qwerty при входе на консоль сервера).
Для администраторов MySQL возможно истечение срока действия пароля учетной записи. Это может быть установлено по умолчанию или для учетной записи пользователя.
Давайте создадим нашу последнюю учетную запись, срок действия которой истекает через 10 дней:
mysql> ALTER USER 'andreyex' PASSWORD EXPIRE INTERVAL 90 DAY; Query OK, 0 rows affected (0.04 sec
Давайте сверимся с запросом из этого поста :
mysql> select user, password_last_changed, -> concat( -> cast( -> IFNULL(password_lifetime, @@default_password_lifetime) as signed) -> + cast(datediff(password_last_changed, now()) as signed), " days") expires_in -> from mysql.user -> where -> cast( -> IFNULL(password_lifetime, @@default_password_lifetime) as signed) -> + cast(datediff(password_last_changed, now()) as signed) >= 0 -> and user not like 'mysql.%'; +----------+-----------------------+------------+ | user | password_last_changed | expires_in | +----------+-----------------------+------------+ | andreyex | 2019-05-23 21:12:44 | 90 days | | root | 2019-05-23 12:23:22 | 0 days | +----------+-----------------------+------------+ 2 rows in set (0.03 sec)
Администраторы MySQL также могут запретить пользователю повторно использовать его старый пароль.
Эта политика может быть глобальной или для учетной записи.
Администратор базы данных может определить количество изменений пароля перед повторным использованием ( PASSWORD HISTORY). Или минимальная задержка перед разрешением повторного использования ( PASSWORD REUSE INTERVAL). Также возможно смешать оба.
mysql> ALTER USER 'andreyex' PASSWORD HISTORY 2; Query OK, 0 rows affected (0.00 sec) mysql> set password for 'andreyex'='Lefréd#1'; ERROR 3638 (HY000): Cannot use these credentials for 'andreyex@%' because they contradict the password history polic
Начиная с MySQL 8.0.13, можно требовать, чтобы попытки изменить пароль учетной записи были проверены путем указания текущего пароля, подлежащего замене.
Этот параметр управляется ключевыми словами PASSWORD REQUIRE.
Это позволяет следующие значения:
Давай попробуем:
mysql> ALTER user 'andreyex' PASSWORD REQUIRE CURRENT; Query OK, 0 rows affected (0.00 sec)
Теперь мы можем связаться с пользователем andreyex и попытаться сменить пароль:
mysql> set password='andreyex#2'; ERROR 13226 (HY000): Current password needs to be specified in the REPLACE clause in order to change it. mysql> set password='andreyex#2' replace 'andreyex#1'; Query OK, 0 rows affected (0.02 sec)
Как вы могли видеть, что ключевое слово replace было обязательным.
В MySQL 8.0.14 (скоро) учетные записи пользователей могут иметь двойные пароли, обозначенные как первичные и вторичные пароли. Возможность двойного пароля позволяет беспрепятственно выполнять изменения учетных данных в процессе производства.
Изменение может быть сделано в два этапа:
Давайте проиллюстрируем это:
mysql> alter user 'andreyex' identified by 'andreyex#3' retain current password; Query OK, 0 rows affected (0.03 sec)
Попробуем снова подключиться со старым паролем и новым:
$ mysql -uandreyex -pandreyex#2 -e 'select now()'; mysql: [Warning] Using a password on the command line interface can be insecure. +---------------------+ | now() | +---------------------+ | 2019-05-23 18:23:55 | +---------------------+ $ mysql -uandreyex -pandreyex#3 -e 'select now()'; mysql: [Warning] Using a password on the command line interface can be insecure. +---------------------+ | now() | +---------------------+ | 2019-05-23 18:24:42 | +---------------------+
Работает как положено.
Из таблицы mysql.user видно, активен ли у пользователя старый пароль, проверив значение User_attributes :
mysql> select User_attributes from mysql.user where user='andreyex'\G * 1. row * User_attributes: {"additional_password": "$A$005$\f>v1,@=g{u\u0019_%!4G\nYTzinrMiGWldNLrJVqI.7XTfUD5tOfw/s8EMLu8WokukD"} 1 row in set (0.00 sec)
Теперь пришло время сбросить старый пароль:
mysql> ALTER USER 'andreyex' DISCARD OLD PASSWORD; Query OK, 0 rows affected (0.04 sec)
Теперь невозможно установить соединение со старым паролем:
$ mysql -uandreyex -pandreyex#2 -e 'select now()'; ERROR 1045 (28000): Access denied for user 'andreyex'@'localhost' (using password: YES)
И наконец, не забывайте, что всегда можно заблокировать или разблокировать учетную запись:
mysql> ALTER USER 'andreyex' ACCOUNT LOCK; Query OK, 0 rows affected (0.01 sec)
И если вы попытаетесь подключиться снова с заблокированной учетной записью, вы увидите следующую ошибку:
$ mysql -uandreyex -pandreyex#3 ERROR 3118 (HY000): Access denied for user 'andreyex'@'localhost'. Account is locked.
Мы надеемся, что этот пост даст вам лучший обзор возможностей управления паролями учетных записей в MySQL 8.0.