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_passwordmysql_native_password(устарело)sha256_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 для присвоения переменных”. Чтобы изменить значение для запущенного экземпляра 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, «Proxy Users».
© 2025 Oracle
Licensed under the GPLv2 License.