8.2.11 Категории учетных записей
MySQL использует концепцию категорий учетных записей пользователей, основанную на привилегии SYSTEM_USER.
Системные и обычные учетные записи
MySQL использует концепцию категорий учетных записей пользователей, разделяя системных и обычных пользователей в зависимости от наличия привилегии SYSTEM_USER:
Пользователь с привилегией
SYSTEM_USERявляется системным пользователем.Пользователь без привилегии
SYSTEM_USERявляется обычным пользователем.
Привилегия SYSTEM_USER влияет на учетные записи, к которым данный пользователь может применять свои другие привилегии, а также на защиту пользователя от других учетных записей:
Системный пользователь может изменять как системные, так и обычные учетные записи. То есть, если пользователь обладает необходимыми привилегиями для выполнения определённой операции с обычными записями, то наличие привилегии
SYSTEM_USERпозволяет ему также выполнить эту операцию с системными записями. Системную учетную запись может изменить только системный пользователь с соответствующими привилегиями, а не обычный пользователь.Обычный пользователь с соответствующими привилегиями может изменять обычные учетные записи, но не системные. Обычную учетную запись могут изменить как системные, так и обычные пользователи с соответствующими привилегиями.
Если у пользователя есть необходимые привилегии для выполнения определённой операции с обычными учетными записями, то SYSTEM_USER позволяет ему также выполнить эту операцию с системными учетными записями. SYSTEM_USER не подразумевает никаких других привилегий, поэтому возможность выполнения данной операции с учетной записью все равно зависит от наличия других необходимых привилегий. Например, если пользователь может предоставить привилегии SELECT и UPDATE обычным учетным записям, то с привилегией SYSTEM_USER он также может предоставить привилегии SELECT и UPDATE системным учетным записям.
Различие между системными и обычными учетными записями обеспечивает лучший контроль над определёнными проблемами администрирования учетных записей, защищая учетные записи с привилегией SYSTEM_USER от учетных записей, не имеющих этой привилегии. Например, привилегия CREATE USER позволяет не только создавать новые учетные записи, но и изменять и удалять существующие. Без понятия системного пользователя, пользователь, обладающий привилегией CREATE USER, может изменять или удалять любую существующую учетную запись, включая учетную запись root. Понятие системного пользователя позволяет ограничить изменения в учетной записи root (сама по себе являющейся системной учетной записью) только для системных пользователей. Обычные пользователи с привилегией CREATE
USER все ещё могут изменять или удалять существующие учетные записи, но только обычные.
Операции, затронутые привилегией SYSTEM_USER
Привилегия SYSTEM_USER затрагивает следующие операции:
-
Манипуляции с учетными записями.
Манипуляции с учетными записями включают создание и удаление учетных записей, предоставление и отозв привилегий, изменение характеристик аутентификации учетных записей, таких как учетные данные или плагин аутентификации, и изменение других характеристик учетной записи, таких как политика истечения срока действия пароля.
Для манипулирования системными учетными записями с помощью операторов управления учетными записями, таких как
CREATE USERиGRANT, требуется привилегияSYSTEM_USER. Чтобы предотвратить изменение системных учетных записей таким образом, сделайте учетную запись обычной, не предоставляя ей привилегиюSYSTEM_USER. (Однако, для полной защиты системных учетных записей от обычных учетных записей, необходимо также запретить обычным учетным записям модифицировать схемуmysql. См. Защита системных учетных записей от манипуляций обычными учетными записями.) -
Прерывание текущих сессий и выполнение заявок внутри них.
Для прерывания сессии или запроса, выполняющегося с привилегией
SYSTEM_USER, собственная сессия должна иметь привилегиюSYSTEM_USER, помимо любых других необходимых привилегий (CONNECTION_ADMINили устаревшую привилегиюSUPER).Если пользователь, который выключает сервер, не имеет привилегии
SYSTEM_USER, подключённые клиенты, обладающие привилегиейSYSTEM_USER, также не будут отключены. Однако эти пользователи не могут инициировать новые подключения к серверу, пока он выключен, если у них нет также привилегииCONNECTION_ADMINилиSUPER. Только их существующее подключение не прерывается, так как для этого требуется привилегияSYSTEM_USER. -
Установка атрибута
DEFINERдля хранимых объектов.Для установки атрибута
DEFINERхранимого объекта для учетной записи с привилегиейSYSTEM_USER, необходимо иметь привилегиюSYSTEM_USER, помимо любых других необходимых привилегий. -
Указание обязательных ролей.
Роль, имеющая привилегию
SYSTEM_USER, не может быть указана в значении системной переменнойmandatory_roles. -
Переопределение пунктов “abort” в фильтре журналов аудита MySQL Enterprise Audit.
Учетным записям с привилегией
SYSTEM_USERавтоматически назначается привилегияAUDIT_ABORT_EXEMPT, чтобы запросы от учетной записи всегда выполнялись, даже если пункт “abort” в фильтре журнала аудита их заблокирует. Учетные записи с привилегиейSYSTEM_USERмогут быть использованы для восстановления доступа к системе после неправильной настройки аудита. См. Раздел 8.4.5, «MySQL Enterprise Audit».
Системные и обычные сеансы
Сеансы, выполняемые на сервере, различаются как системные или обычные, аналогично различию между системными и обычными пользователями:
Сеанс, обладающий привилегией
SYSTEM_USER, является системным сеансом.Сеанс, не обладающий привилегией
SYSTEM_USER, является обычным сеансом.
Обычный сеанс может выполнять только операции, разрешенные обычным пользователям. Системный сеанс дополнительно может выполнять операции, разрешенные только системным пользователям.
Привилегии, которыми обладает сеанс, — это те, которые прямо предоставлены его базовому счету, плюс те, которые предоставлены всем ролям, активным в данном сеансе. Таким образом, сеанс может быть системным сеансом, потому что его счету напрямую предоставлена привилегия SYSTEM_USER, или потому что сеанс активировал роль, обладающую привилегией SYSTEM_USER. Роли, предоставленные счету, но не активные в сеансе, не влияют на привилегии сеанса.
Поскольку активация и деактивация ролей могут изменить привилегии, которыми обладают сеансы, сеанс может измениться с обычного на системный или наоборот. Если сеанс активирует или деактивирует роль, обладающую привилегией SYSTEM_USER, соответствующее изменение между обычным и системным сеансом происходит немедленно, только для этого сеанса:
Если обычный сеанс активирует роль с привилегией
SYSTEM_USER, сеанс становится системным сеансом.Если системный сеанс деактивирует роль с привилегией
SYSTEM_USER, сеанс становится обычным, если только не остаётся активной какая-либо другая роль с привилегиейSYSTEM_USER.
Эти операции не влияют на существующие сеансы:
Если привилегия
SYSTEM_USERпредоставляется или отзывается у счета, существующие сеансы для данного счета не меняют статус между обычным и системным сеансом. Операция предоставления или отзыва привилегии влияет только на сеансы последующих подключений по этому счету.Выражения, выполняемые сохранённым объектом, вызываемым в рамках сеанса, выполняются с системным или обычным статусом родительского сеанса, даже если объект
DEFINERзадаёт имя системного счета.
Поскольку активация роли влияет только на сеансы, а не на счета, предоставление роли, обладающей привилегией SYSTEM_USER, обычной учётной записи не защищает её от обычных пользователей. Роль защищает только сеансы для учётной записи, в которой роль была активирована, и защищает сеанс только от завершения обычными сеансами.
Защита системных счетов от манипуляций обычными счетами
Манипуляции со счётом включают создание и удаление счетов, предоставление и отзыв привилегий, изменение характеристик аутентификации счёта, таких как учётные данные или плагин аутентификации, и изменение других характеристик счёта, таких как политика истечения срока действия пароля.
Манипуляции со счетами могут осуществляться двумя способами:
Используя операторы управления счетами, такие как
CREATE USERиGRANT. Это предпочтительный метод.Путем прямого изменения таблицы предоставления прав, используя операторы, такие как
INSERTиUPDATE. Этот метод не рекомендуется, но возможен для пользователей с соответствующими привилегиями в схемеmysqlсистемы, содержащей таблицы предоставления прав.
Для полной защиты системных счетов от модификации данной учётной записью, сделайте её обычной учётной записью и не предоставляйте ей привилегий модификации для схемы mysql:
Для манипулирования системными счетами с помощью операторов управления счетами требуется привилегия
SYSTEM_USER. Чтобы предотвратить возможность модификации системных счетов таким образом, сделайте данную учётную запись обычной, не предоставляя ей привилегиюSYSTEM_USER. Это включает в себя и не предоставление привилегииSYSTEM_USERдля всех ролей, предоставленных данной учётной записи.Привилегии для схемы
mysqlпозволяют манипулировать системными счетами путём прямого изменения таблиц предоставления прав, даже если модифицирующая учётная запись является обычной. Чтобы ограничить несанкционированное прямое изменение системных счетов обычной учётной записью, не предоставляйте привилегии модификации для схемыmysqlданной учётной записи (или любым ролям, предоставленным данной учётной записи). Если обычной учётной записи необходимы глобальные привилегии, применимые ко всем схемам, модификации схемыmysqlмогут быть предотвращены путём ограничения привилегий с помощью частичных отзывов. Смотрите раздел 8.2.12, «Ограничение привилегий с помощью частичных отзывов».
В отличие от лишения привилегии SYSTEM_USER, которое предотвращает изменение системных счетов, но не обычных, лишение привилегий схемы mysql предотвращает изменение как системных, так и обычных счетов. Это не должно быть проблемой, потому что, как уже упоминалось, прямое изменение таблиц предоставления прав не рекомендуется.
Предположим, что вы хотите создать пользователя u1, который имеет все привилегии на всех схемах, за исключением того, что u1 должен быть обычным пользователем без возможности изменения системных счетов. При условии, что системная переменная partial_revokes включена, настройте u1 следующим образом:
CREATE USER u1 IDENTIFIED BY 'password';
GRANT ALL ON *.* TO u1 WITH GRANT OPTION;
-- GRANT ALL includes SYSTEM_USER, so at this point
-- u1 can manipulate system or regular accounts
REVOKE SYSTEM_USER ON *.* FROM u1;
-- Revoking SYSTEM_USER makes u1 a regular user;
-- now u1 can use account-management statements
-- to manipulate only regular accounts
REVOKE ALL ON mysql.* FROM u1;
-- This partial revoke prevents u1 from directly
-- modifying grant tables to manipulate accounts
Чтобы предотвратить доступ ко всем схемам mysql системы учётной записью, отозвать все её привилегии на схеме mysql, как показано выше. Также возможно разрешить частичный доступ к схеме mysql, например, только для чтения. В следующем примере создаётся учётная запись, которая имеет привилегии SELECT, INSERT, UPDATE и DELETE глобально для всех схем, но только SELECT для схемы mysql:
CREATE USER u2 IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u2;
REVOKE INSERT, UPDATE, DELETE ON mysql.* FROM u2;
Другой вариант — отозвать все привилегии схемы mysql, но предоставить доступ к конкретным таблицам mysql или столбцам. Это можно сделать даже с частичным отказом от mysql. В следующих операторах разрешается только чтение для u1 в рамках схемы mysql, но только для таблицы db и столбцов Host и User таблицы user:
CREATE USER u3 IDENTIFIED BY 'password';
GRANT ALL ON *.* TO u3;
REVOKE ALL ON mysql.* FROM u3;
GRANT SELECT ON mysql.db TO u3;
GRANT SELECT(Host,User) ON mysql.user TO u3;
© 2025 Oracle
Licensed under the GPLv2 License.