8.2.3 Таблицы разрешений
База данных системы mysql включает несколько таблиц разрешений, содержащих информацию об учётных записях пользователей и привилегиях, которыми они обладают. В этом разделе описываются эти таблицы. Сведения об остальных таблицах базы данных системы см. в разделе 7.3, «Схема базы данных mysql».
Здесь рассматривается внутренняя структура таблиц разрешений и как сервер использует их содержимое при взаимодействии с клиентами. Однако обычно вы не изменяете таблицы разрешений напрямую. Изменения происходят косвенно, когда вы используете операторы управления учётными записями, такие как CREATE
USER, GRANT и REVOKE для создания учётных записей и управления доступными каждой из них привилегиями. См. раздел 15.7.1, «Операторы управления учётными записями». При использовании таких операторов для управления учётными записями сервер модифицирует таблицы разрешений от вашего имени.
Прямое изменение таблиц разрешений с помощью операторов, таких как INSERT, UPDATE или DELETE, не рекомендуется и осуществляется на ваш страх и риск. Сервер свободен игнорировать строки, которые становятся некорректными в результате таких изменений.
Для любой операции, изменяющей таблицу разрешений, сервер проверяет, соответствует ли таблица ожидаемой структуре, и выводит ошибку, если нет. Чтобы обновить таблицы до ожидаемой структуры, выполните процедуру обновления MySQL. См. главу 3, «Обновление MySQL».
Обзор таблиц предоставления прав
В этих mysql таблицах базы данных содержится информация о предоставлении прав:
-
user: Аккаунты пользователей, статические глобальные привилегии и другие столбцы, не являющиеся привилегиями. -
global_grants: Динамические глобальные привилегии. -
db: Привилегии на уровне базы данных. -
tables_priv: Привилегии на уровне таблиц. -
columns_priv: Привилегии на уровне столбцов. -
procs_priv: Привилегии на хранимые процедуры и функции. -
proxies_priv: Привилегии прокси-пользователей. -
default_roles: Роли пользователей по умолчанию. -
role_edges: Связи для подграфов ролей. -
password_history: История смен паролей.
Для получения информации о различиях между статическими и динамическими глобальными привилегиями, см. Статические и динамические привилегии).
Таблицы предоставления прав используют InnoDB движок хранения и являются транзакционными. Каждое утверждение либо выполняется для всех указанных пользователей, либо отменяется и не оказывает никакого эффекта, если возникает какая-либо ошибка.
Каждая таблица предоставления прав содержит столбцы области применения и столбцы привилегий:
Столбцы области применения определяют область применения каждой строки в таблицах, то есть контекст, в котором применяется строка. Например, строка таблицы
userсо значениямиHostиUserравными'h1.example.net'и'bob'применяется к аутентифицированным соединениям, подключенным к серверу с хостаh1.example.netклиентом, который указывает имя пользователяbob. Аналогично, строка таблицыdbсо значениями столбцовHost,UserиDbравными'h1.example.net','bob'и'reports'применяется, когдаbobподключается с хостаh1.example.netдля доступа к базе данныхreports. Таблицыtables_privиcolumns_privсодержат столбцы области применения, указывающие таблицы или сочетания таблица/столбец, к которым относится каждая строка. Столбцы области примененияprocs_privуказывают хранимую процедуру, к которой относится каждая строка.Столбцы привилегий указывают, какие привилегии предоставляет строка таблицы, то есть какие операции она разрешает выполнять. Сервер объединяет информацию из различных таблиц предоставления прав, чтобы сформировать полное описание привилегий пользователя. Раздел 8.2.7 «Контроль доступа, этап 2: Проверка запроса» описывает правила для этого.
Кроме того, таблица предоставления прав может содержать столбцы, используемые для целей, отличных от оценки области применения или привилегий.
Сервер использует таблицы предоставления прав следующим образом:
-
Столбцы области применения таблицы
userопределяют, отклонить или разрешить входящие подключения. Для разрешенных подключений любые привилегии, предоставленные в таблицеuser, указывают статические глобальные привилегии пользователя. Любые привилегии, предоставленные в этой таблице, применяются к всем базам данных на сервере.ВниманиеПоскольку любая статическая глобальная привилегия рассматривается как привилегия для всех баз данных, любая статическая глобальная привилегия позволяет пользователю видеть все имена баз данных с помощью
SHOW DATABASESили путем проверки таблицыSCHEMATAбазы данныхINFORMATION_SCHEMA, за исключением баз данных, которые были ограничены на уровне базы данных частичными отзывами прав. Таблица
global_grantsперечисляет текущие назначения динамических глобальных привилегий для учетных записей пользователей. Для каждой строки столбцы области применения определяют, какой пользователь обладает привилегией, указанной в столбце привилегий.Столбцы области применения таблицы
dbопределяют, какие пользователи могут получить доступ к каким базам данных с каких хостов. Столбцы привилегий определяют разрешенные операции. Привилегия, предоставленная на уровне базы данных, применяется к базе данных и ко всем объектам в базе данных, таким как таблицы и хранимые программы.Таблицы
tables_privиcolumns_privаналогичны таблицеdb, но более детализированы: они применяются на уровне таблиц и столбцов, а не на уровне базы данных. Привилегия, предоставленная на уровне таблицы, применяется к таблице и ко всем ее столбцам. Привилегия, предоставленная на уровне столбца, применяется только к определенному столбцу.Таблица
procs_privприменяется к хранимым процедурам (хранимым процедурам и функциям). Привилегия, предоставленная на уровне процедуры, применяется только к одной процедуре или функции.Таблица
proxies_privуказывает, какие пользователи могут действовать в качестве прокси для других пользователей и может ли пользователь предоставить привилегиюPROXYдругим пользователям.Таблицы
default_rolesиrole_edgesсодержат информацию об отношениях между ролями.Таблица
password_historyсохраняет ранее выбранные пароли, чтобы обеспечить ограничения на повторное использование паролей. См. Раздел 8.2.15, «Управление паролями».
Сервер загружает содержимое таблиц предоставления прав в память при запуске. Вы можете перегрузить таблицы, выполнив оператор FLUSH PRIVILEGES или выполнив команду mysqladmin flush-privileges или mysqladmin reload. Изменения в таблицах предоставления прав вступают в силу, как указано в разделе 8.2.13 «Когда изменения привилегий вступают в силу».
При изменении учетной записи рекомендуется проверить, что изменения имеют желаемый эффект. Чтобы проверить привилегии для данной учетной записи, используйте оператор SHOW
GRANTS. Например, чтобы определить привилегии, предоставленные учетной записи с именем пользователя и именем хоста bob и pc84.example.com, используйте этот оператор:
SHOW GRANTS FOR 'bob'@'pc84.example.com';
Чтобы отобразить свойства учетной записи, не являющиеся привилегиями, используйте SHOW CREATE USER:
SHOW CREATE USER 'bob'@'pc84.example.com';
Таблицы разрешений пользователя и базы данных
Сервер использует таблицы user и db в базе данных mysql на обоих этапах контроля доступа (см. раздел 8.2, «Контроль доступа и управление учётными записями»). Столбцы в таблицах user и db показаны здесь.
Таблица 8.4 Столбцы таблиц пользователей и баз данных
| Имя таблицы | user | db |
|---|---|---|
| Столбцы области действия | Host | Host |
User | Db | |
User | ||
| Столбцы привилегий | Select_priv | Select_priv |
Insert_priv | Insert_priv | |
Update_priv | Update_priv | |
Delete_priv | Delete_priv | |
Index_priv | Index_priv | |
Alter_priv | Alter_priv | |
Create_priv | Create_priv | |
Drop_priv | Drop_priv | |
Grant_priv | Grant_priv | |
Create_view_priv | Create_view_priv | |
Show_view_priv | Show_view_priv | |
Create_routine_priv | Create_routine_priv | |
Alter_routine_priv | Alter_routine_priv | |
Execute_priv | Execute_priv | |
Trigger_priv | Trigger_priv | |
Event_priv | Event_priv | |
Create_tmp_table_priv | Create_tmp_table_priv | |
Lock_tables_priv | Lock_tables_priv | |
References_priv | References_priv | |
Reload_priv | ||
Shutdown_priv | ||
Process_priv | ||
File_priv | ||
Show_db_priv | ||
Super_priv | ||
Repl_slave_priv | ||
Repl_client_priv | ||
Create_user_priv | ||
Create_tablespace_priv | ||
Create_role_priv | ||
Drop_role_priv | ||
| Столбцы безопасности | ssl_type | |
ssl_cipher | ||
x509_issuer | ||
x509_subject | ||
plugin | ||
authentication_string | ||
password_expired | ||
password_last_changed | ||
password_lifetime | ||
account_locked | ||
Password_reuse_history | ||
Password_reuse_time | ||
Password_require_current | ||
User_attributes | ||
| Столбцы управления ресурсами | max_questions | |
max_updates | ||
max_connections | ||
max_user_connections |
Таблица user содержит столбцы plugin и authentication_string, хранящие информацию о плагине аутентификации и учетных данных.
Сервер использует плагин, указанный в столбце plugin строки учётной записи, для аутентификации попыток подключения к данной учётной записи.
Столбец plugin должен быть непустым. При запуске и при выполнении FLUSH
PRIVILEGES, сервер проверяет строки таблицы user. Для любой строки с пустым столбцом plugin сервер записывает предупреждение в журнал ошибок в следующем формате:
[Warning] User entry 'user_name'@'host_name' has an empty plugin
value. The user will be ignored and no one can login with this user
anymore.
Чтобы назначить плагин учётной записи, которой он отсутствует, используйте оператор ALTER USER.
Столбец password_expired позволяет администраторам баз данных истекать пароли учётных записей и требовать от пользователей сброс пароля. Значение по умолчанию password_expired равно 'N', но может быть установлено в 'Y' с помощью оператора ALTER
USER. После истечения срока действия пароля учётной записи все операции, выполненные данной учётной записью в последующих подключениях к серверу, приводят к ошибке, пока пользователь не выполнит оператор ALTER USER для установки нового пароля учётной записи.
Хотя возможно “сбросить” истекший пароль, установив его в текущее значение, предпочтительнее выбрать другой пароль. Администраторы баз данных могут обеспечить неиспользование старых паролей, установив соответствующую политику повторного использования паролей. См. Политику повторного использования паролей.
password_last_changed — это столбец TIMESTAMP, указывающий, когда пароль был изменён в последний раз. Значение непустое только для учётных записей, использующих встроенный плагин аутентификации MySQL (sha256_password или caching_sha2_password). Значение пустое для других учётных записей, таких как учётные записи, аутентифицированные с помощью внешней системы аутентификации.
password_last_changed обновляется операторами CREATE USER, ALTER USER и SET PASSWORD, а также операторами GRANT, создающими учётную запись или изменяющими пароль учётной записи.
password_lifetime указывает срок действия пароля учётной записи в днях. Если срок действия пароля истек (определяется по столбцу password_last_changed), сервер считает пароль истекшим при подключении клиентов с помощью данной учётной записи. Значение, большее нуля, означает, что пароль должен быть изменён каждые N дней. Значение 0 отключает автоматическое истечение срока действия пароля. Если значение равно NULL (значение по умолчанию), применяется глобальная политика истечения, определённая системной переменной default_password_lifetime.
account_locked указывает, заблокирована ли учётная запись (см. раздел 8.2.20, «Блокировка учётных записей»).
Password_reuse_history — это значение опции PASSWORD HISTORY для учётной записи или NULL для истории по умолчанию.
Password_reuse_time — это значение опции PASSWORD REUSE INTERVAL для учётной записи или NULL для интервала по умолчанию.
Password_require_current соответствует значению опции PASSWORD REQUIRE для учётной записи, как показано в следующей таблице.
Таблица 8.5 Разрешённые значения Password_require_current
| Значение Password_require_current | Соответствующая опция PASSWORD REQUIRE |
|---|---|
'Y' | PASSWORD REQUIRE CURRENT |
'N' | PASSWORD REQUIRE CURRENT OPTIONAL |
NULL | PASSWORD REQUIRE CURRENT DEFAULT |
User_attributes — это столбец в формате JSON, который хранит атрибуты учётной записи, не хранящиеся в других столбцах. INFORMATION_SCHEMA предоставляет доступ к этим атрибутам через таблицу USER_ATTRIBUTES.
В столбце User_attributes могут содержаться следующие атрибуты:
additional_password: Дополнительный пароль, если таковой имеется. См. Поддержка двойных паролей.Restrictions: Список ограничений, если таковой имеется. Ограничения добавляются операциями частичного отзыва. Значение атрибута — массив элементов, каждый из которых содержит ключиDatabaseиRestrictions, указывающие имя ограниченной базы данных и применимые к ней ограничения (см. Раздел 8.2.12, «Ограничение привилегий с помощью частичного отзыва»).Password_locking: Условия для отслеживания неудачных попыток входа и временной блокировки учетной записи, если таковые имеются (см. Отслеживание неудачных попыток входа и временная блокировка учетной записи). АтрибутPassword_lockingобновляется в соответствии с опциямиFAILED_LOGIN_ATTEMPTSиPASSWORD_LOCK_TIMEв операцияхCREATE USERиALTER USER. Значение атрибута — хеш-таблица с ключамиfailed_login_attemptsиpassword_lock_time_days, указывающими значения указанных опций для учетной записи. Если ключ отсутствует, его значение неявно равно 0. Если значение ключа неявно или явно равно 0, соответствующая возможность отключена.-
multi_factor_authentication: Строки в таблице системыmysql.userсодержат столбецplugin, указывающий на плагин аутентификации. Для однофакторной аутентификации этот плагин является единственным фактором аутентификации. Для двух- или трехфакторных форм многофакторной аутентификации этот плагин соответствует первому фактору аутентификации, но для второго и третьего факторов должна храниться дополнительная информация. Атрибутmulti_factor_authenticationсодержит эту информацию.Значение
multi_factor_authentication— массив, где каждый элемент массива — хеш-таблица, описывающая фактор аутентификации с помощью следующих атрибутов:plugin: Название плагина аутентификации.authentication_string: Значение строки аутентификации.passwordless: Флаг, указывающий, предназначен ли пользователь для использования без пароля (с токеном безопасности в качестве единственного метода аутентификации).requires_registration: Флаг, определяющий, зарегистрировала ли учетная запись пользователя токен безопасности.
Первый и второй элементы массива описывают факторы многофакторной аутентификации 2 и 3.
Если атрибуты не применимы, то User_attributes равно NULL.
Пример: для учетной записи, у которой есть дополнительный пароль и частично отозваны привилегии базы данных, в значении столбца имеются атрибуты additional_password и Restrictions:
mysql> SELECT User_attributes FROM mysql.User WHERE User = 'u'\G
*************************** 1. row ***************************
User_attributes: {"Restrictions":
[{"Database": "mysql", "Privileges": ["SELECT"]}],
"additional_password": "hashed_credentials"}
Для определения присутствия атрибутов используйте функцию JSON_KEYS():
SELECT User, Host, JSON_KEYS(User_attributes)
FROM mysql.user WHERE User_attributes IS NOT NULL;
Для извлечения конкретного атрибута, например, Restrictions, выполните следующие действия:
SELECT User, Host, User_attributes->>'$.Restrictions'
FROM mysql.user WHERE User_attributes->>'$.Restrictions' <> '';
Вот пример того, какая информация хранится для multi_factor_authentication:
{
"multi_factor_authentication": [
{
"plugin": "authentication_ldap_simple",
"passwordless": 0,
"authentication_string": "ldap auth string",
"requires_registration": 0
},
{
"plugin": "authentication_webauthn",
"passwordless": 0,
"authentication_string": "",
"requires_registration": 1
}
]
}
Таблицы разрешений tables_priv и columns_priv
На втором этапе управления доступом сервер проверяет запросы, чтобы убедиться, что каждый клиент имеет достаточные привилегии для каждого отправленного запроса. Помимо таблиц разрешений user и db, сервер также может использовать таблицы tables_priv и columns_priv для запросов, связанных с таблицами. Последние таблицы обеспечивают более точный контроль привилегий на уровне таблиц и столбцов. Они имеют столбцы, показанные в следующей таблице.
Таблица 8.6 Столбцы таблиц tables_priv и columns_priv
| Имя таблицы | tables_priv | columns_priv |
|---|---|---|
| Столбцы области применения | Host | Host |
Db | Db | |
User | User | |
Table_name | Table_name | |
Column_name | ||
| Столбцы привилегий | Table_priv | Column_priv |
Column_priv | ||
| Другие столбцы | Timestamp | Timestamp |
Grantor |
Столбцы Timestamp и Grantor устанавливаются на текущую метку времени и значение функции CURRENT_USER соответственно, но в остальном не используются.
Таблица разрешений procs_priv
Для проверки запросов, связанных со хранимыми процедурами, сервер может использовать таблицу procs_priv, которая содержит столбцы, показанные в следующей таблице.
Таблица 8.7 Столбцы таблицы procs_priv
| Имя таблицы | procs_priv |
|---|---|
| Столбцы области применения | Host |
Db | |
User | |
Routine_name | |
Routine_type | |
| Столбцы привилегий | Proc_priv |
| Другие столбцы | Timestamp |
Grantor |
Столбец Routine_type — это столбец типа ENUM со значениями 'FUNCTION' или 'PROCEDURE', указывающими на тип процедуры, к которой относится строка. Этот столбец позволяет предоставлять привилегии отдельно для функции и процедуры с одинаковым именем.
Столбцы Timestamp и Grantor не используются.
Таблица разрешений proxies_priv
Таблица proxies_priv записывает информацию об учетных записях-прокси. Она содержит следующие столбцы:
Host,User: Учетная запись-прокси, то есть учетная запись, имеющая привилегиюPROXYдля проксируемой учетной записи.Proxied_host,Proxied_user: Проксируемая учетная запись.Grantor,Timestamp: Не используются.With_grant: Может ли учетная запись-прокси предоставить привилегиюPROXYдругим учетным записям.
Чтобы учетная запись могла предоставить привилегию PROXY другим учетным записям, она должна иметь строку в таблице proxies_priv со значением With_grant, равным 1, и значениями Proxied_host и Proxied_user, указывающими на учетные записи, которым может быть предоставлена привилегия. Например, учетная запись 'root'@'localhost', созданная во время установки MySQL, имеет строку в таблице proxies_priv, которая позволяет предоставлять привилегию PROXY для ''@'', то есть для всех пользователей и всех хостов. Это позволяет пользователю root настраивать прокси-пользователей, а также делегировать другим учетным записям право на настройку прокси-пользователей. См. Раздел 8.2.19, «Прокси-пользователи».
Таблица разрешений global_grants
Таблица global_grants перечисляет текущие назначения динамических глобальных привилегий учетным записям пользователей. Таблица содержит следующие столбцы:
USER,HOST: Имя пользователя и имя хоста учетной записи, которой предоставлена привилегия.PRIV: Название привилегии.WITH_GRANT_OPTION: Может ли учетная запись предоставить привилегию другим учетным записям.
Таблица прав доступа default_roles
Таблица default_roles перечисляет стандартные роли пользователей. Она имеет следующие столбцы:
HOST,USER: Учётная запись или роль, к которой применяется стандартная роль.DEFAULT_ROLE_HOST,DEFAULT_ROLE_USER: Стандартная роль.
Таблица прав доступа role_edges
Таблица role_edges перечисляет связи для подграфов ролей. Она имеет следующие столбцы:
FROM_HOST,FROM_USER: Учётная запись, которой предоставлена роль.TO_HOST,TO_USER: Роль, предоставленная учётной записи.WITH_ADMIN_OPTION: Может ли учётная запись предоставлять и отзывать роль другим учётным записям, используяWITH ADMIN OPTION.
Таблица прав доступа password_history
Таблица password_history содержит информацию о смене паролей. Она имеет следующие столбцы:
Host,User: Учётная запись, для которой произошла смена пароля.Password_timestamp: Время изменения пароля.Password: Значение нового хэша пароля.
Таблица password_history накапливает достаточное количество непустых паролей на учетную запись, чтобы MySQL мог выполнять проверки по длине истории пароля учетной записи и интервалу повторного использования. Автоматическое удаление записей, которые выходят за пределы обоих ограничений, происходит при попытке смены пароля.
Пустой пароль не учитывается в истории паролей и может быть повторно использован в любое время.
Если имя учётной записи изменено, её записи переименовываются соответственно. Если учётная запись удалена или её модуль аутентификации изменён, её записи удаляются.
Свойства столбцов области в таблицах прав доступа
Столбцы области в таблицах прав доступа содержат строки. Значение по умолчанию для каждого из них — пустая строка. Следующая таблица показывает количество символов, разрешенных в каждом столбце.
Таблица 8.8 Длины столбцов области таблиц прав доступа
| Имя столбца | Максимальное количество разрешенных символов |
|---|---|
Host, Proxied_host
| 255 |
User, Proxied_user
| 32 |
Db | 64 |
Table_name | 64 |
Column_name | 64 |
Routine_name | 64 |
Значения Host и Proxied_host преобразуются в нижний регистр перед сохранением в таблицах прав доступа.
Для целей проверки доступа сравнения значений User, Proxied_user, authentication_string, Db и Table_name регистрозависимые. Сравнения значений Host, Proxied_host, Column_name и Routine_name не регистрозависимые.
Свойства столбцов привилегий в таблицах прав доступа
Таблицы user и db перечисляют каждую привилегию в отдельном столбце, объявленном как ENUM('N','Y') DEFAULT 'N'. Другими словами, каждая привилегия может быть отключена или включена, по умолчанию она отключена.
Таблицы tables_priv, columns_priv и procs_priv объявляют столбцы привилегий как столбцы типа SET. Значения в этих столбцах могут содержать любую комбинацию привилегий, контролируемых таблицей. Включены только те привилегии, которые указаны в значении столбца.
Таблица 8.9 Значения столбцов привилегий типа set
| Имя таблицы | Имя столбца | Возможные элементы множества |
|---|---|---|
tables_priv | Table_priv | 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
'Grant', 'References', 'Index', 'Alter', 'Create View',
'Show view', 'Trigger' |
tables_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' |
columns_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' |
procs_priv | Proc_priv | 'Execute', 'Alter Routine', 'Grant' |
Только таблицы user и global_grants указывают административные привилегии, такие как RELOAD, SHUTDOWN и SYSTEM_VARIABLES_ADMIN. Административные операции — это операции над самим сервером, а не конкретной базой данных, поэтому нет смысла перечислять эти привилегии в других таблицах прав доступа. Следовательно, серверу достаточно проконсультироваться только с таблицами user и global_grants, чтобы определить, может ли пользователь выполнить административную операцию.
Привилегия FILE также указана только в таблице user. Это не административная привилегия как таковая, но способность пользователя читать или писать файлы на хосте сервера не зависит от базы данных, к которой осуществляется доступ.
Конкурентность таблиц прав доступа
Для разрешения одновременных операций DML и DDL над таблицами прав доступа MySQL, операции чтения, которые ранее получали блокировки строк в таблицах прав доступа MySQL, выполняются как операции чтения без блокировки. К операциям, выполняемым как операции чтения без блокировки над таблицами прав доступа MySQL, относятся:
SELECTоператоры и другие операторы только для чтения, которые считывают данные из таблиц прав доступа через списки объединений и подзапросы, включаяSELECT ... FOR SHAREоператоры, используя любой уровень изоляции транзакций.Операции DML, которые считывают данные из таблиц прав доступа (через списки объединений или подзапросы), но не изменяют их, используя любой уровень изоляции транзакций.
Операторы, которые больше не получают блокировки строк при чтении данных из таблиц прав доступа, сообщают об ошибке, если они выполняются при использовании репликации на уровне операторов.
При использовании -binlog_format=mixed, операции DML, которые считывают данные из таблиц прав доступа, записываются в бинарный журнал как события строк, чтобы сделать операции безопасными для репликации в смешанном режиме.
SELECT ...
FOR SHARE операторы, которые считывают данные из таблиц прав доступа, сообщают об ошибке. С помощью фразы FOR SHARE блокировки чтения не поддерживаются в таблицах прав доступа.
Операции DML, которые считывают данные из таблиц прав доступа и выполняются с уровнем изоляции SERIALIZABLE, сообщают об ошибке. Блокировки чтения, которые обычно приобретаются при использовании уровня изоляции SERIALIZABLE, не поддерживаются в таблицах прав доступа.
© 2025 Oracle
Licensed under the GPLv2 License.