8.2.15 Управление паролями
MySQL поддерживает следующие возможности управления паролями:
Срок действия пароля, требуя периодической смены паролей.
Ограничения на повторное использование паролей, чтобы предотвратить повторный выбор старых паролей.
Проверка пароля, требуя, чтобы изменения пароля также указывали текущий пароль, который нужно заменить.
Двойные пароли, позволяющие клиентам подключаться, используя основной или дополнительный пароль.
Оценка сложности пароля, для требования сильных паролей.
Генерация случайных паролей, как альтернатива требованию явных паролей, заданных администратором.
Отслеживание неудачных попыток входа, позволяющее временно заблокировать учетную запись после слишком многих последовательных неудачных попыток входа с неверным паролем.
Следующие разделы описывают эти возможности, за исключением оценки сложности паролей, которая реализована с помощью компонента validate_password и описана в разделе 8.4.3, «Компонент проверки паролей».
MySQL реализует возможности управления паролями с использованием таблиц в базе данных системы mysql. Если вы обновляете MySQL с более ранней версии, ваши системные таблицы могут быть не обновлены. В этом случае сервер записывает сообщения, подобные этим, в журнал ошибок во время процесса запуска (точные числа могут отличаться):
[ERROR] Column count of mysql.user is wrong. Expected
49, found 47. The table is probably corrupted
[Warning] ACL table mysql.password_history missing.
Some operations may fail.
Для исправления проблемы выполните процедуру обновления MySQL. Смотрите главу 3, Обновление MySQL. До тех пор, пока это не будет сделано, изменение паролей невозможно.
Внутреннее и внешнее хранение учетных данных
Некоторые плагины аутентификации хранят учетные данные учетных записей внутри MySQL, в таблице системы mysql.user:
caching_sha2_passwordsha256_password(устарело)
Большинство обсуждений в этом разделе относится к таким плагинам аутентификации, потому что большинство возможностей управления паролями, описанных здесь, основаны на внутреннем хранении учетных данных, выполняемом самим MySQL. Другие плагины аутентификации хранят учетные данные учетных записей вне MySQL. Для учетных записей, использующих плагины, которые выполняют аутентификацию по внешней системе учетных данных, управление паролями также должно выполняться внешне по отношению к этой системе.
Исключением является то, что параметры отслеживания неудачных входов и временной блокировки учетной записи применяются ко всем учетным записям, а не только к тем, которые используют внутреннее хранение учетных данных, так как MySQL может оценить состояние попыток входа в любую учетную запись, независимо от того, использует ли она внутреннее или внешнее хранение учетных данных.
Сведения об отдельных плагинах аутентификации см. в разделе 8.4.1, «Плагины аутентификации».
Политика истечения срока действия паролей
MySQL позволяет администраторам баз данных вручную истекать паролями учетных записей и устанавливать политику автоматического истечения срока действия паролей. Политика истечения срока действия может быть установлена глобально, а отдельные учетные записи могут быть настроены на отсылку к глобальной политике или на переопределение глобальной политики с помощью определенного поведения для каждой учетной записи.
Чтобы вручную истечь сроком действия пароля учетной записи, используйте оператор ALTER USER:
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
Эта операция помечает пароль как истекший в соответствующей строке в таблице системы mysql.user.
Автоматическое истечение срока действия паролей в соответствии с политикой основано на возрасте пароля, который для данной учетной записи оценивается со времени и даты последнего изменения пароля. Таблица системы mysql.user указывает для каждой учетной записи, когда пароль был в последний раз изменен, и сервер автоматически обрабатывает пароль как истекший во время подключения клиента, если его возраст больше, чем разрешенный срок действия. Это работает без явного ручного истечения срока действия пароля.
Чтобы установить глобальную политику автоматического истечения срока действия паролей, используйте системную переменную default_password_lifetime. Ее значение по умолчанию равно 0, что отключает автоматическое истечение срока действия паролей. Если значение default_password_lifetime является положительным целым числом N, оно указывает разрешенный срок действия пароля, так что пароли должны меняться каждые N дней.
Примеры:
-
Чтобы установить глобальную политику, при которой пароли имеют срок действия примерно шесть месяцев, запустите сервер со следующими строками в файле сервера
my.cnf:[mysqld] default_password_lifetime=180
-
Чтобы установить глобальную политику, при которой пароли никогда не истекают, установите
default_password_lifetimeв значение 0:[mysqld] default_password_lifetime=0
-
default_password_lifetimeтакже может быть установлено и сохранено во время выполнения:SET PERSIST default_password_lifetime = 180; SET PERSIST default_password_lifetime = 0;
SET PERSISTустанавливает значение для работающей MySQL-инстанции. Он также сохраняет значение, чтобы оно сохранялось при последующих перезапусках сервера; см. Раздел 15.7.6.1, «Синтаксис SET для присваивания переменных». Чтобы изменить значение для работающей MySQL-инстанции без переноса его на последующие перезапуски, используйте ключевое словоGLOBALвместоPERSIST.
Глобальная политика истечения срока действия паролей применяется ко всем учетным записям, которые не были настроены на ее переопределение. Чтобы установить политику для отдельных учетных записей, используйте опцию PASSWORD EXPIRE операторов CREATE USER и ALTER USER. См. Раздел 15.7.1.3, «Оператор CREATE USER», и Раздел 15.7.1.1, «Оператор ALTER USER».
Примеры операторов для отдельных учетных записей:
-
Требовать смены пароля каждые 90 дней:
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
Эта опция истечения срока действия пароля переопределяет глобальную политику для всех учетных записей, указанных в операторе.
-
Отключить истечение срока действия пароля:
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
Эта опция истечения срока действия пароля переопределяет глобальную политику для всех учетных записей, указанных в операторе.
-
Придерживаться глобальной политики истечения срока действия паролей для всех учетных записей, указанных в операторе:
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
При успешном подключении клиента сервер определяет, истек ли срок действия пароля учетной записи:
Сервер проверяет, не истек ли пароль вручную.
В противном случае сервер проверяет, не превышает ли возраст пароля разрешенного срока действия в соответствии с политикой автоматического истечения срока действия паролей. Если да, сервер считает пароль истекшим.
Если срок действия пароля истек (вручную или автоматически), сервер либо отключает клиента, либо ограничивает разрешенные для него операции (см. Раздел 8.2.16, «Обработка сервером истекших паролей»). Операции, выполняемые ограниченным клиентом, приводят к ошибке до тех пор, пока пользователь не установит новый пароль учетной записи:
mysql> SELECT 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.
mysql> ALTER USER USER() IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
После того, как клиент сбросит пароль, сервер восстановит обычный доступ для сеанса, а также для последующих подключений, использующих учетную запись. Также администратор может сбросить пароль учетной записи, но любые существующие ограниченные сеансы для этой учетной записи останутся ограниченными. Клиент, использующий учетную запись, должен отключиться и снова подключиться, прежде чем операторы будут успешно выполнены.
Хотя сбросить истекший пароль, установив его текущее значение, возможно, предпочтительнее, с точки зрения политики, выбрать другой пароль. Администраторы БД могут запретить повторное использование, установив соответствующую политику повторного использования паролей. См. Политику повторного использования паролей.
Политика повторного использования паролей
MySQL позволяет устанавливать ограничения на повторное использование предыдущих паролей. Ограничения повторного использования могут быть установлены на основе количества изменений пароля, прошедшего времени или того и другого. Политика повторного использования может быть установлена глобально, а отдельные учетные записи могут быть настроены на отсылку к глобальной политике или на переопределение глобальной политики с помощью определенного поведения для каждой учетной записи.
История паролей учетной записи состоит из паролей, которые были назначены ей в прошлом. MySQL может ограничивать выбор новых паролей из этой истории:
Если учетная запись ограничена по количеству изменений пароля, новый пароль не может быть выбран из заданного количества последних паролей. Например, если минимальное количество изменений пароля установлено в 3, новый пароль не может быть таким же, как любой из последних 3 паролей.
Если учетная запись ограничена по прошедшему времени, новый пароль не может быть выбран из паролей в истории, которые были выбраны позже, чем в течение заданного числа дней. Например, если интервал повторного использования пароля установлен в 60, новый пароль не должен быть среди тех, которые были выбраны ранее в течение последних 60 дней.
Пустой пароль не учитывается в истории паролей и может быть повторно использован в любое время.
Чтобы установить глобальную политику повторного использования паролей, используйте системные переменные password_history и password_reuse_interval.
Примеры:
-
Чтобы запретить повторное использование любого из последних 6 паролей или паролей, выбранных позже, чем 365 дней, поместите эти строки в файл сервера
my.cnf:[mysqld] password_history=6 password_reuse_interval=365
-
Чтобы установить и сохранить переменные во время выполнения, используйте операторы, подобные этому:
SET PERSIST password_history = 6; SET PERSIST password_reuse_interval = 365;
SET PERSISTустанавливает значение для работающей MySQL-инстанции. Он также сохраняет значение, чтобы оно сохранялось при последующих перезапусках сервера; см. Раздел 15.7.6.1, «Синтаксис SET для присваивания переменных». Чтобы изменить значение для работающей MySQL-инстанции без переноса его на последующие перезапуски, используйте ключевое словоGLOBALвместоPERSIST.
Глобальная политика повторного использования паролей применяется ко всем учетным записям, которые не были настроены на ее переопределение. Чтобы установить политику для отдельных учетных записей, используйте опции PASSWORD HISTORY и PASSWORD REUSE INTERVAL операторов CREATE USER и ALTER USER. См. Раздел 15.7.1.3, «Оператор CREATE USER», и Раздел 15.7.1.1, «Оператор ALTER USER».
Примеры операторов для отдельных учетных записей:
-
Требовать минимум 5 изменений пароля перед повторным использованием:
CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5; ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5;
Эта опция длины истории переопределяет глобальную политику для всех учетных записей, указанных в операторе.
-
Требовать минимум 365 дней прошедшего времени перед повторным использованием:
CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
Эта опция времени переопределяет глобальную политику для всех учетных записей, указанных в операторе.
-
Чтобы объединить оба типа ограничений повторного использования, используйте
PASSWORD HISTORYиPASSWORD REUSE INTERVALвместе:CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
Эти опции переопределяют оба ограничения глобальной политики повторного использования для всех учетных записей, указанных в операторе.
-
Придерживаться глобальной политики для обоих типов ограничений повторного использования:
CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT;
Политика проверки пароля
Можно потребовать проверки попыток изменения пароля учетной записи, указав текущий пароль для замены. Это позволяет администраторам баз данных предотвратить изменение пароля пользователями без подтверждения, что они знают текущий пароль. Такие изменения могут произойти, например, если пользователь временно покинул сеанс терминала без выхода из системы, и злоумышленник использует сеанс для изменения пароля MySQL исходного пользователя. Это может иметь неприятные последствия:
Исходный пользователь не сможет получить доступ к MySQL до тех пор, пока администратор не сбросит пароль учетной записи.
До сброса пароля злоумышленник может получить доступ к MySQL с измененными учетными данными добросовестного пользователя.
Политика проверки пароля может быть установлена глобально, а отдельные учетные записи могут быть настроены на отсылку к глобальной политике или на переопределение глобальной политики с помощью определенного поведения для каждой учетной записи.
Для каждой учетной записи ее строка mysql.user указывает, есть ли специфическое для учетной записи требование проверки текущего пароля при попытке изменения пароля. Настройка устанавливается с помощью параметра PASSWORD
REQUIRE операторов CREATE
USER и ALTER USER:
Если настройка учетной записи равна
PASSWORD REQUIRE CURRENT, для изменения пароля необходимо указать текущий пароль.Если настройка учетной записи равна
PASSWORD REQUIRE CURRENT OPTIONAL, для изменения пароля можно, но не обязательно, указать текущий пароль.-
Если настройка учетной записи равна
PASSWORD REQUIRE CURRENT DEFAULT, системная переменнаяpassword_require_currentопределяет политику обязательной проверки для учетной записи:Если
password_require_currentвключена, для изменения пароля необходимо указать текущий пароль.Если
password_require_currentотключена, для изменения пароля можно, но не обязательно, указать текущий пароль.
Другими словами, если настройка учетной записи не равна PASSWORD
REQUIRE CURRENT DEFAULT, настройка учетной записи имеет приоритет над глобальной политикой, установленной системной переменной password_require_current. В противном случае учетная запись следует настройке password_require_current.
По умолчанию проверка пароля необязательна: password_require_current отключена, и учетные записи, созданные без параметра PASSWORD
REQUIRE, по умолчанию равны PASSWORD REQUIRE
CURRENT DEFAULT.
В следующей таблице показано, как настройки для каждой учетной записи взаимодействуют со значениями системной переменной password_require_current для определения политики проверки пароля учетной записи.
Таблица 8.10 Политика проверки пароля
| Настройка для каждой учетной записи | Системная переменная password_require_current | Требуется ли текущий пароль для изменения пароля? |
|---|---|---|
PASSWORD REQUIRE CURRENT | OFF | Да |
PASSWORD REQUIRE CURRENT | ON | Да |
PASSWORD REQUIRE CURRENT OPTIONAL | OFF | Нет |
PASSWORD REQUIRE CURRENT OPTIONAL | ON | Нет |
PASSWORD REQUIRE CURRENT DEFAULT | OFF | Нет |
PASSWORD REQUIRE CURRENT DEFAULT | ON | Да |
Пользователи с привилегиями могут изменить пароль любой учетной записи без указания текущего пароля, независимо от политики обязательной проверки. Пользователь с привилегиями — это пользователь, имеющий глобальную привилегию CREATE USER или привилегию UPDATE для базы данных системы mysql.
Для глобальной установки политики проверки пароля используйте системную переменную password_require_current. Ее значение по умолчанию равно OFF, поэтому для изменения пароля учетной записи не требуется указывать текущий пароль.
Примеры:
-
Для установки глобальной политики, требующей указания текущего пароля при изменении пароля, запустите сервер с этими строками в файле конфигурации сервера
my.cnf:[mysqld] password_require_current=ON
-
Для установки и сохранения
password_require_currentво время выполнения используйте оператор, подобный одному из этих:SET PERSIST password_require_current = ON; SET PERSIST password_require_current = OFF;
SET PERSISTзадает значение для работающей экземпляра MySQL. Он также сохраняет значение для переноса в последующие перезапуски сервера; см. Раздел 15.7.6.1, «SET Syntax for Variable Assignment». Для изменения значения для работающего экземпляра MySQL без переноса его в последующие перезапуски используйте ключевое словоGLOBALвместоPERSIST.
Глобальная политика обязательной проверки пароля применяется ко всем учетным записям, которые не были настроены на ее переопределение. Для установки политики для отдельных учетных записей используйте параметры PASSWORD
REQUIRE операторов CREATE
USER и ALTER USER. См. Раздел 15.7.1.3, «CREATE USER Statement» и Раздел 15.7.1.1, «ALTER USER Statement».
Примеры операторов для отдельных учетных записей:
-
Требовать указания текущего пароля при изменении пароля:
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
Этот параметр проверки переопределяет глобальную политику для всех учетных записей, указанных в операторе.
-
Не требовать указания текущего пароля при изменении пароля (текущий пароль можно, но не обязательно, указать):
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
Этот параметр проверки переопределяет глобальную политику для всех учетных записей, указанных в операторе.
-
Придерживаться глобальной политики обязательной проверки пароля для всех учетных записей, указанных в операторе:
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
Проверка текущего пароля учитывается при изменении пароля пользователем с помощью оператора ALTER
USER или SET PASSWORD. Примеры используют ALTER
USER, что предпочтительнее SET
PASSWORD, но принципы описаны одинаково для обоих операторов.
В операторах изменения пароля клауза REPLACE указывает текущий пароль для замены. Примеры:
-
Изменить пароль текущего пользователя:
ALTER USER USER() IDENTIFIED BY '
auth_string' REPLACE 'current_auth_string'; -
Изменить пароль указанного пользователя:
ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY '
auth_string' REPLACE 'current_auth_string'; -
Изменить плагин аутентификации и пароль указанного пользователя:
ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH caching_sha2_password BY '
auth_string' REPLACE 'current_auth_string';
Клауза REPLACE работает следующим образом:
REPLACEнеобходимо указать, если для изменения пароля учетной записи требуется указать текущий пароль, как подтверждение того, что пользователь, пытающийся изменить пароль, действительно знает текущий пароль.REPLACEявляется необязательной, если для изменения пароля учетной записи можно, но не обязательно, указать текущий пароль.Если
REPLACEуказан, он должен указывать правильный текущий пароль, в противном случае возникает ошибка. Это верно даже еслиREPLACEнеобязателен.REPLACEможно указать только при изменении пароля учетной записи текущего пользователя. (Это означает, что в приведенных выше примерах операторы, явно указывающие учетную запись дляjeffrey, не работают, если текущий пользователь неjeffrey.) Это верно даже если изменение пытается осуществить другой пользователь с привилегиями; однако такой пользователь может изменить любой пароль без указанияREPLACE.REPLACEисключается из двоичного журнала, чтобы избежать записи открытого текста паролей в него.
Поддержка двойных паролей
Пользовательские учётные записи могут иметь двойные пароли, обозначенные как основной и дополнительный. Возможность двойных паролей позволяет беспрепятственно изменять учетные данные в таких сценариях:
Система имеет большое количество серверов MySQL, возможно, с репликацией.
Несколько приложений подключаются к различным серверам MySQL.
Необходимо периодически изменять учетные данные для учетных записей, используемых приложениями для подключения к серверам.
Рассмотрим, как следует изменять учетные данные в сценарии выше, когда учетной записи разрешен только один пароль. В этом случае необходимо тесное взаимодействие по времени изменения пароля учетной записи и его распространения по всем серверам и обновления всех приложений, использующих учетную запись, для использования нового пароля. Этот процесс может привести к простоям, во время которых серверы или приложения недоступны.
С двойными паролями изменение учетных данных можно выполнить проще, поэтапно, без необходимости тесного взаимодействия и без простоев:
Для каждой затронутой учетной записи установите новый основной пароль на серверах, сохранив текущий пароль в качестве дополнительного. Это позволяет серверам распознавать либо основной, либо дополнительный пароль для каждой учетной записи, а приложения могут продолжать подключаться к серверам с использованием того же пароля, что и ранее (который теперь является дополнительным паролем).
После того, как изменение пароля будет распространено на все серверы, измените приложения, использующие любую затронутую учетную запись, для подключения с использованием основного пароля учетной записи.
После того, как все приложения будут перенесены с дополнительных паролей на основные пароли, дополнительные пароли больше не нужны и могут быть удалены. После того, как это изменение будет распространено на все серверы, для подключения можно использовать только основной пароль каждой учетной записи. Изменение учетных данных завершено.
MySQL реализует возможность двойных паролей с синтаксисом, позволяющим сохранять и удалять дополнительные пароли:
Оператор
RETAIN CURRENT PASSWORDдля операторовALTER USERиSET PASSWORDсохраняет текущий пароль учетной записи в качестве дополнительного пароля, когда вы присваиваете новый основной пароль.Оператор
DISCARD OLD PASSWORDдля оператораALTER USERудаляет дополнительный пароль учетной записи, оставив только основной пароль.
Предположим, что для описанного выше сценария изменения учетных данных учетная запись с именем 'appuser1'@'host1.example.com' используется приложениями для подключения к серверам, и пароль учетной записи нужно изменить с ' на password_a''.password_b'
Для выполнения этого изменения учетных данных используйте ALTER
USER следующим образом:
-
На каждом сервере, который не является репликой, установите
'в качестве нового основного пароляpassword_b'appuser1, сохранив текущий пароль в качестве дополнительного:ALTER USER 'appuser1'@'host1.example.com' IDENTIFIED BY '
password_b' RETAIN CURRENT PASSWORD; Подождите, пока изменение пароля будет реплицировано по всей системе на все реплики.
Измените каждое приложение, использующее учетную запись
appuser1, чтобы оно подключалось к серверам с использованием пароля'вместоpassword_b''.password_a'-
На этом этапе дополнительный пароль больше не нужен. На каждом сервере, который не является репликой, удалите дополнительный пароль:
ALTER USER 'appuser1'@'host1.example.com' DISCARD OLD PASSWORD;
После того, как изменение, удаляющее дополнительный пароль, будет реплицировано на все реплики, изменение учетных данных завершено.
Операторы RETAIN CURRENT PASSWORD и DISCARD OLD PASSWORD имеют следующие эффекты:
RETAIN CURRENT PASSWORDсохраняет текущий пароль учетной записи в качестве дополнительного пароля, заменяя любой существующий дополнительный пароль. Новый пароль становится основным, но клиенты могут использовать учетную запись для подключения к серверу, используя либо основной, либо дополнительный пароль. (Исключение: если новый пароль, указанный операторомALTER USERилиSET PASSWORD, пустой, дополнительный пароль также становится пустым, даже еслиRETAIN CURRENT PASSWORDзадан.)Если вы укажете
RETAIN CURRENT PASSWORDдля учетной записи с пустым основным паролем, оператор завершится с ошибкой.Если у учетной записи есть дополнительный пароль, и вы изменяете ее основной пароль без указания
RETAIN CURRENT PASSWORD, дополнительный пароль остается неизменным.Для оператора
ALTER USER, если вы изменяете плагин аутентификации, назначенный учетной записи, дополнительный пароль удаляется. Если вы изменяете плагин аутентификации и также указываетеRETAIN CURRENT PASSWORD, оператор завершится с ошибкой.Для оператора
ALTER USER,DISCARD OLD PASSWORDудаляет дополнительный пароль, если он существует. Учетная запись сохраняет только свой основной пароль, и клиенты могут использовать учетную запись для подключения к серверу только с основным паролем.
Для операторов, изменяющих дополнительные пароли, требуются следующие привилегии:
Привилегия
APPLICATION_PASSWORD_ADMINтребуется для использования операторовRETAIN CURRENT PASSWORDилиDISCARD OLD PASSWORDдля операторовALTER USERиSET PASSWORD, которые применяются к вашей собственной учетной записи. Привилегия требуется для управления вашим собственным дополнительным паролем, так как большинству пользователей требуется только один пароль.Если учетной записи необходимо разрешить управлять дополнительными паролями для всех учетных записей, ей следует предоставить привилегию
CREATE USER, а неAPPLICATION_PASSWORD_ADMIN.
Генерация случайных паролей
Операторы CREATE USER, ALTER USER и SET PASSWORD имеют возможность генерировать случайные пароли для учетных записей пользователей как альтернативу необходимости явного указания паролей администратором. Подробности синтаксиса см. в описании каждого оператора. В этом разделе описываются общие характеристики сгенерированных случайных паролей.
По умолчанию сгенерированные случайные пароли имеют длину 20 символов. Эта длина контролируется системной переменной generated_random_password_length, которая имеет диапазон от 5 до 255.
Для каждой учетной записи, для которой оператор генерирует случайный пароль, оператор сохраняет пароль в таблице системы mysql.user, соответствующим образом хэшируя его для плагина аутентификации учетной записи. Оператор также возвращает открытый текст пароля в строке набора результатов, чтобы сделать его доступным для пользователя или приложения, выполняющего оператор. Столбцы набора результатов называются user, host, generated password и auth_factor, указывая значения имени пользователя и имени хоста, которые идентифицируют строку в таблице системы mysql.user, сгенерированный открытый текст пароля и фактор аутентификации, к которому относится отображаемое значение пароля.
mysql> CREATE USER
'u1'@'localhost' IDENTIFIED BY RANDOM PASSWORD,
'u2'@'%.example.com' IDENTIFIED BY RANDOM PASSWORD,
'u3'@'%.org' IDENTIFIED BY RANDOM PASSWORD;
+------+---------------+----------------------+-------------+
| user | host | generated password | auth_factor |
+------+---------------+----------------------+-------------+
| u1 | localhost | iOeqf>Mh9:;XD&qn(Hl} | 1 |
| u2 | %.example.com | sXTSAEvw3St-R+_-C3Vb | 1 |
| u3 | %.org | nEVe%Ctw/U/*Md)Exc7& | 1 |
+------+---------------+----------------------+-------------+
mysql> ALTER USER
'u1'@'localhost' IDENTIFIED BY RANDOM PASSWORD,
'u2'@'%.example.com' IDENTIFIED BY RANDOM PASSWORD;
+------+---------------+----------------------+-------------+
| user | host | generated password | auth_factor |
+------+---------------+----------------------+-------------+
| u1 | localhost | Seiei:&cw}8]@3OA64vh | 1 |
| u2 | %.example.com | j@&diTX80l8}(NiHXSae | 1 |
+------+---------------+----------------------+-------------+
mysql> SET PASSWORD FOR 'u3'@'%.org' TO RANDOM;
+------+-------+----------------------+-------------+
| user | host | generated password | auth_factor |
+------+-------+----------------------+-------------+
| u3 | %.org | n&cz2xF;P3!U)+]Vw52H | 1 |
+------+-------+----------------------+-------------+
Оператор CREATE USER, ALTER USER или SET PASSWORD, генерирующий случайный пароль для учетной записи, записывается в бинарный журнал как оператор CREATE USER или ALTER USER с оператором IDENTIFIED WITH , где auth_plugin
AS 'auth_string'auth_plugin — плагин аутентификации учетной записи, а ' — хэшированное значение пароля учетной записи.auth_string'
Если компонент validate_password установлен, реализуемая им политика не влияет на сгенерированные пароли. (Цель проверки паролей — помочь людям создавать лучшие пароли.)
Отслеживание неудачных попыток входа и временная блокировка учетных записей
Администраторы могут настроить учетные записи пользователей таким образом, чтобы слишком много последовательных неудачных попыток входа приводили к временной блокировке учетной записи.
«Неудачная попытка входа» в данном контексте означает неудачу клиента в предоставлении правильного пароля во время попытки подключения. Это не включает в себя неудачу подключения по причинам, таким как неизвестный пользователь или проблемы с сетью. Для учетных записей с двойными паролями (см. Поддержка двойных паролей) любой пароль считается правильным.
Требуемое количество неудачных попыток входа и время блокировки настраиваются для каждой учетной записи, используя параметры FAILED_LOGIN_ATTEMPTS и PASSWORD_LOCK_TIME в операторах CREATE USER и ALTER USER. Примеры:
CREATE USER 'u1'@'localhost' IDENTIFIED BY 'password'
FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3;
ALTER USER 'u2'@'localhost'
FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME UNBOUNDED;
Когда происходит слишком много последовательных неудачных попыток входа, клиент получает ошибку, похожую на эту:
ERROR 3957 (HY000): Access denied for user user.
Account is blocked for D day(s) (R day(s) remaining)
due to N consecutive failed logins.
Используйте параметры следующим образом:
-
FAILED_LOGIN_ATTEMPTSNЭтот параметр указывает, следует ли отслеживать попытки входа в учетную запись, в которых указан неправильный пароль. Число
Nуказывает, сколько последовательных неправильных паролей приводят к временной блокировке учетной записи. -
PASSWORD_LOCK_TIME {N| UNBOUNDED}Этот параметр указывает, на сколько времени заблокировать учетную запись после слишком многих последовательных неудачных попыток входа с неправильным паролем. Значение представляет собой число
N, чтобы указать количество дней, на которое учетная запись будет заблокирована, илиUNBOUNDED, чтобы указать, что когда учетная запись переходит во временное состояние блокировки, продолжительность этого состояния не ограничена и не заканчивается до тех пор, пока учетная запись не будет разблокирована. Условия, при которых происходит разблокировка, описаны ниже.
Допустимые значения N для каждого параметра находятся в диапазоне от 0 до 32767. Значение 0 отключает параметр.
Отслеживание неудачных попыток входа и временная блокировка учетных записей имеют следующие характеристики:
Для того, чтобы отслеживание неудачных попыток входа и временная блокировка произошли для учетной записи, оба параметра
FAILED_LOGIN_ATTEMPTSиPASSWORD_LOCK_TIMEдолжны быть отличны от нуля.Для оператора
CREATE USER, еслиFAILED_LOGIN_ATTEMPTSилиPASSWORD_LOCK_TIMEне указаны, их неявное значение по умолчанию равно 0 для всех учетных записей, названных в операторе. Это означает, что отслеживание неудачных попыток входа и временная блокировка учетных записей отключены.Для оператора
ALTER USER, еслиFAILED_LOGIN_ATTEMPTSилиPASSWORD_LOCK_TIMEне указаны, их значение остается неизменным для всех учетных записей, указанных в операторе.Для того, чтобы произошла временная блокировка учетной записи, попытки ввода пароля должны быть последовательными. Любой успешный вход, произошедший до достижения значения
FAILED_LOGIN_ATTEMPTSдля неудачных попыток входа, приводит к сбросу подсчета неудач. Например, еслиFAILED_LOGIN_ATTEMPTSравно 4, и произошли три последовательных неудачи ввода пароля, для начала блокировки необходима еще одна неудача. Но если следующий вход окажется успешным, подсчет неудачных попыток входа для учетной записи сбрасывается, и для блокировки снова требуются четыре последовательные неудачи.После начала временной блокировки успешный вход невозможен даже с правильным паролем, пока не истечет срок блокировки или учетная запись не будет разблокирована одним из методов сброса учетной записи, перечисленных в следующем обсуждении.
При чтении сервером таблиц предоставления прав он инициализирует информацию о состоянии каждой учетной записи, касающуюся того, включено ли отслеживание неудачных попыток входа, заблокирована ли учетная запись в данный момент, когда началась блокировка (если да), и количество неудач до временной блокировки, если учетная запись не заблокирована.
Информацию о состоянии учетной записи можно сбросить, что означает, что подсчет неудачных попыток входа сбрасывается, и учетная запись разблокируется, если она в данный момент заблокирована. Сбросы учетных записей могут быть глобальными для всех учетных записей или для каждой учетной записи:
-
Глобальный сброс всех учетных записей происходит при любых из этих условий:
Перезапуск сервера.
Выполнение
FLUSH PRIVILEGES. (Запуск сервера с--skip-grant-tablesприводит к тому, что таблицы предоставления прав не читаются, что отключает отслеживание неудачных попыток входа. В этом случае первое выполнениеFLUSH PRIVILEGESприводит к чтению сервером таблиц предоставления прав и включению отслеживания неудачных попыток входа, помимо сброса всех учетных записей.)
-
Сброс для каждой учетной записи происходит при любых из этих условий:
Успешный вход в учетную запись.
Истечение срока блокировки. В этом случае подсчет неудачных попыток входа сбрасывается в момент следующей попытки входа.
-
Выполнение оператора
ALTER USERдля учетной записи, который устанавливает значенияFAILED_LOGIN_ATTEMPTSилиPASSWORD_LOCK_TIME(или обоих) в любое значение (включая текущее значение параметра), или выполнение оператораALTER USER ... UNLOCKдля учетной записи.Другие операторы
ALTER USERдля учетной записи не влияют на текущий счет неудачных попыток входа или состояние блокировки.
Отслеживание неудачных попыток входа связано с учетной записью входа, используемой для проверки учетных данных. Если используется проксирование пользователя, отслеживание происходит для прокси-пользователя, а не для проксируемого пользователя. То есть отслеживание связано с учетной записью, указанной в USER(), а не с учетной записью, указанной в CURRENT_USER(). Сведения о различии между прокси-пользователями и проксируемыми пользователями см. в Раздел 8.2.19, «Прокси-пользователи».
© 2025 Oracle
Licensed under the GPLv2 License.