6.2.3 Таблицы предоставления прав
База данных системы mysql содержит несколько таблиц предоставления прав, которые содержат информацию об учётных записях пользователей и правах, которыми они обладают. В этом разделе описываются эти таблицы. Сведения об остальных таблицах базы данных системы см. в разделе 5.3, «База данных системы mysql».
Здесь рассматривается внутренняя структура таблиц предоставления прав и то, как сервер использует их содержимое при взаимодействии с клиентами. Однако обычно вы не изменяете таблицы предоставления прав напрямую. Изменения происходят косвенно, когда вы используете операторы управления учётными записями, такие как CREATE
USER, GRANT и REVOKE, для создания учётных записей и управления доступными для них правами. См. раздел 13.7.1, «Операторы управления учётными записями». При использовании таких операторов для выполнения операций с учётными записями сервер изменяет таблицы предоставления прав от вашего имени.
Не рекомендуется напрямую изменять таблицы предоставления прав, используя операторы, такие как INSERT, UPDATE или DELETE. Это делается на ваш страх и риск. Сервер может игнорировать строки, которые становятся некорректными в результате таких изменений.
Начиная с MySQL 5.7.18, для любой операции, изменяющей таблицу предоставления прав, сервер проверяет, соответствует ли структура таблицы ожидаемой, и выводит ошибку, если нет. Чтобы обновить таблицы до ожидаемой структуры, выполните процедуру обновления MySQL. См. раздел 2.10, «Обновление MySQL».
Обзор таблиц предоставления прав
Эти mysql таблицы базы данных содержат информацию о правах:
-
user: Учётные записи пользователей, глобальные права и другие столбцы, не связанные с правами. -
db: Права на уровне базы данных. -
tables_priv: Права на уровне таблиц. -
columns_priv: Права на уровне столбцов. -
procs_priv: Права на хранимые процедуры и функции. -
proxies_priv: Права прокси-пользователей.
Каждая таблица предоставления прав содержит столбцы области действия и столбцы прав:
Столбцы области действия определяют область действия каждой строки в таблицах, то есть контекст, в котором применяется эта строка. Например, строка в таблице
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указывают на хранимую процедуру, к которой относится каждая строка.Столбцы прав указывают, какие права предоставляет строка таблицы, то есть какие операции она разрешает выполнять. Сервер объединяет информацию из различных таблиц предоставления прав, чтобы сформировать полное описание прав пользователя. Раздел 6.2.6, «Контроль доступа, этап 2: Проверка запроса» описывает правила для этого.
Кроме того, таблица предоставления прав может содержать столбцы, используемые для целей, отличных от оценки области действия или прав.
Сервер использует таблицы предоставления прав следующим образом:
-
Столбцы области действия таблицы
userопределяют, отклонять или разрешать входящие подключения. Для разрешённых подключений любые права, предоставленные в таблицеuser, указывают глобальные права пользователя. Любые права, предоставленные в этой таблице, применяются к всем базам данных на сервере.ВниманиеПоскольку глобальные права считаются правами для всех баз данных, любые глобальные права позволяют пользователю просмотреть все имена баз данных с помощью
SHOW DATABASESили путём просмотра таблицыINFORMATION_SCHEMASCHEMATA. Столбцы области действия таблицы
dbопределяют, какие пользователи могут получить доступ к каким базам данных с каких хостов. Столбцы прав определяют разрешённые операции. Право, предоставленное на уровне базы данных, относится к базе данных и ко всем объектам в базе данных, таким как таблицы и хранимые программы.Таблицы
tables_privиcolumns_privаналогичны таблицеdb, но более детализированы: они применяются на уровне таблиц и столбцов, а не на уровне базы данных. Право, предоставленное на уровне таблицы, относится к таблице и ко всем её столбцам. Право, предоставленное на уровне столбца, относится только к определённому столбцу.Таблица
procs_privотносится к хранимым процедурам (хранимым процедурам и функциям). Право, предоставленное на уровне процедуры, относится только к одной процедуре или функции.Таблица
proxies_privуказывает, какие пользователи могут действовать в качестве прокси для других пользователей, и может ли пользователь предоставить правоPROXYдругим пользователям.
Сервер загружает содержимое таблиц предоставления прав в память при запуске. Вы можете заставить его перезагрузить таблицы, выполнив оператор FLUSH PRIVILEGES или выполнив команду mysqladmin flush-privileges или mysqladmin reload. Изменения в таблицах предоставления прав вступают в силу, как указано в разделе 6.2.9, «Когда изменения прав вступают в силу».
При изменении учётной записи рекомендуется проверить, что изменения произведены как предполагалось. Чтобы проверить права для данной учётной записи, используйте оператор 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 на обоих этапах контроля доступа (см. Раздел 6.2, «Контроль доступа и управление учетными записями»). Здесь показаны столбцы в таблицах user и db.
Таблица 6.3 Столбцы таблиц пользователей и баз данных
| Имя таблицы | 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 | ||
| Столбцы безопасности | ssl_type | |
ssl_cipher | ||
x509_issuer | ||
x509_subject | ||
plugin | ||
authentication_string | ||
password_expired | ||
password_last_changed | ||
password_lifetime | ||
account_locked | ||
| Столбцы управления ресурсами | 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.
Для решения этой проблемы см. Раздел 6.4.1.3, «Миграция от хэширования паролей до версии 4.1 и плагина mysql_old_password».
Столбец password_expired позволяет администраторам БД истекать срок действия паролей учетных записей и требовать от пользователей сброса пароля. Значение по умолчанию для password_expired — 'N', но может быть установлено в 'Y' с помощью оператора ALTER
USER. После истечения срока действия пароля учетной записи все операции, выполненные этой учетной записью в последующих подключениях к серверу, приведут к ошибке, пока пользователь не выполнит оператор ALTER USER для установления нового пароля учетной записи.
Хотя возможно «сбросить» истекший пароль, установив его текущее значение, предпочтительнее выбрать новый пароль.
password_last_changed — столбец TIMESTAMP, указывающий дату последнего изменения пароля. Значение непустое только для учетных записей, использующих встроенные методы аутентификации MySQL (учетные записи, использующие плагин аутентификации mysql_native_password или sha256_password). Значение пустое для других учетных записей, таких как учетные записи, аутентифицированные с помощью внешней системы аутентификации.
password_last_changed обновляется операторами CREATE USER, ALTER USER и SET PASSWORD, а также операторами GRANT, создающими учетную запись или изменяющими пароль учетной записи.
password_lifetime указывает срок действия пароля учетной записи в днях. Если пароль вышел за пределы срока действия (определяется по столбцу password_last_changed), сервер считает пароль истекшим при подключении клиентов с использованием этой учетной записи. Значение N больше нуля означает, что пароль необходимо менять каждые N дней. Значение 0 отключает автоматическое истечение срока действия пароля. Если значение равно NULL (значение по умолчанию), применяется глобальная политика истечения срока действия, определенная системной переменной default_password_lifetime.
account_locked указывает, заблокирована ли учетная запись (см. Раздел 6.2.15, «Блокировка учетных записей»).
Таблицы разрешений tables_priv и columns_priv
На втором этапе управления доступом сервер проверяет запросы, чтобы убедиться, что каждый клиент обладает достаточными привилегиями для каждого отправленного запроса. Помимо таблиц разрешений user и db, сервер может также использовать таблицы tables_priv и columns_priv для запросов, связанных с таблицами. Последние таблицы обеспечивают более точный контроль привилегий на уровне таблиц и столбцов. Они содержат следующие столбцы, показанные в таблице ниже.
Таблица 6.4 Столбцы таблиц 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, которая содержит следующие столбцы, показанные в таблице ниже.
Таблица 6.5 Столбцы таблицы 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 содержит информацию о прокси-аккаунтах. Она имеет следующие столбцы:
Для того, чтобы аккаунт мог предоставить разрешение PROXY другим аккаунтам, в таблице proxies_priv должна быть строка со значением With_grant равным 1, а Proxied_host и Proxied_user должны указывать на аккаунт или аккаунты, которым это разрешение может быть предоставлено. Например, аккаунт 'root'@'localhost', созданный во время установки MySQL, имеет строку в таблице proxies_priv, которая позволяет предоставлять разрешение PROXY для ''@'', то есть для всех пользователей и всех хостов. Это позволяет аккаунту root настраивать прокси-пользователей и делегировать другим аккаунтам полномочия по настройке прокси-пользователей. См. Раздел 6.2.14, «Прокси-пользователи».
Свойства столбцов области в таблицах разрешений
Столбцы области в таблицах разрешений содержат строки. Значение по умолчанию для каждого из них — пустая строка. В следующей таблице показана допустимая длина каждого столбца.
Таблица 6.6 Длины столбцов области в таблицах разрешений
| Имя столбца | Максимальное количество символов |
|---|---|
Host, Proxied_host
| 60 |
User, Proxied_user
| 32 |
Password | 41 |
Db | 64 |
Table_name | 64 |
Column_name | 64 |
Routine_name | 64 |
Значения Host и Proxied_host преобразуются в нижний регистр перед сохранением в таблицах разрешений.
Для целей проверки доступа сравнения значений User, Proxied_user, Password, 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. Значения в этих столбцах могут содержать любую комбинацию привилегий, управляемых таблицей. Только те привилегии, которые указаны в значении столбца, включены.
Таблица 6.7 Значения столбцов привилегий типа 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 указывает административные привилегии, такие как RELOAD и SHUTDOWN. Административные операции — это операции на самом сервере, а не на конкретной базе данных, поэтому нет необходимости перечислять эти привилегии в других таблицах разрешений. Следовательно, серверу нужно обращаться только к таблице user, чтобы определить, может ли пользователь выполнить административную операцию.
Разрешение FILE также указано только в таблице user. Это не административная привилегия как таковая, но способность пользователя читать или записывать файлы на хост-сервере независима от базы данных, к которой осуществляется доступ.
© 2025 Oracle
Licensed under the GPLv2 License.