Настройка проверки сложности паролей в MySQL
Содержание
Введение
Для проверки сложности паролей пользователей MySQL предназначен плагин validate_password
, который поставляется в пакете с сервером MySQL:
# dpkg -L percona-server-server-5.7 | grep validate_password
/usr/lib/mysql/plugin/debug/validate_password.so
/usr/lib/mysql/plugin/validate_password.so
Проверка сложности пароля происходит при его изменении командами ALTER USER
, CREATE USER
и SET PASSWORD
, а также проверяются пароли, переданные в функцию PASSWORD()
.
Если нужно проверить сложность пароля в других случаях, то для этого можно воспользоваться функцией VALIDATE_PASSWORD_STRENGTH()
, которая возвращает оценку сложности пароля по шкале от 0 до 100.
Плагин поддерживает три уровня сложности паролей:
LOW
- проверяется только длина пароля, пароли должны иметь длину минимум 8 символов,MEDIUM
- также проверятеся, что пароль содержит хотя бы один цифровой символ, один символ в нижнем регистре и один специальный символ,STRONG
- дополнительно проверяется, чтобы последовательности из 4 и более символов не встречаются в словаре, если словарь был указан.
Используемый уровень сложности задаётся с помощью переменной validate_password_policy
и по умолчанию имеет значение MEDIUM
.
Кроме этого плагин позволяет проверять, не совпадает ли часть пароля с именем или идентификатором текущего пользователя. Эту функцию можно включить с помощью переменной validate_password_check_user_name
.
Настройка плагина
Для включения плагина впишем его настройки в файл /etc/mysql/percona-server.conf.d/mysqld.cnf
:
plugin_load_add = validate_password.so
validate_password = FORCE_PLUS_PERMANENT
validate_password_policy = LOW
validate_password_check_user_name = ON
И перезапустим сервер MySQL:
# systemctl restart mysql
Проверка работы плагина
Проверить, включен ли плагин, можно с помощью запроса:
SELECT plugin_name, plugin_status
FROM information_schema.plugins
WHERE plugin_name = 'validate_password';
Если плагин включен, запрос вернёт следующий результат:
+-------------------+---------------+
| plugin_name | plugin_status |
+-------------------+---------------+
| validate_password | ACTIVE |
+-------------------+---------------+
Проверить, работает ли плагин, можно, например, попытавшись создать пользователя с простым паролем:
mysql> CREATE USER test@localhost IDENTIFIED BY 'test';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
Проблемы с pt-show-grants
В выводе утилиты pt-show-grants
для создания пользователя с нужными свойствами выводятся две команды:
- сначала с помощью команды
CREATE USER IF NOT EXISTS
создаётся пользователь без пароля, - затем у созданного пользователя с помощью команды
ALTER USER
выставляется пароль и другие свойства.
Восстановить пользователей, воспользовавшись файлом с сохранённым выводом команды pt-show-grants
, при включенном плагине validate_password
не получится, т.к. плагин не позволяет создать пользователя без пароля.
Для решения этой проблемы можно прибегнуть к скрипту следующего вида:
#!/bin/sh
pt-show-grants $@ \
| awk '/^CREATE USER IF NOT EXISTS/ {
u = $6;
}
/^ALTER USER/ {
if (u == $3 ";") {
a = $0;
gsub("ALTER USER ", "CREATE USER IF NOT EXISTS ", $0);
print $0;
print a;
}
}
!/^CREATE USER IF NOT EXISTS|ALTER USER/ {
u = "";
print $0;
}'
В этом скрипте пароль и другие свойства пользователя из команды ALTER TABLE
добавляются также к команде CREATE USER IF NOT EXISTS
так, что если пользователь не существует, он сразу создаётся с нужным паролем и свойствами. Но затем пароль и свойства пользователя всё равно меняются с помощи команды ALTER USER
на случай, если этот пользователь уже существовал до команды CREATE USER IF NOT EXISTS
.