Настройка проверки сложности паролей в 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.