4.2.6 Как работает система привилегий
Система привилегий MySQL обеспечивает пользователям возможность выполнять
только те действия, которые им разрешены в соответствии с их
обязанностями. Когда вы подсоединяетесь к серверу MySQL, ваша личность
устанавливается по имени хоста, с которого вы подсоединяетесь, и имени
пользователя, которое вы указываете. Система предоставляет привилегии в
соответствии с вашей личностью и тем, что вы хотите делать.
MySQL идентифицирует пользователя как по имени хоста, так и по имени
пользователя, т.к. нет оснований полагать что данное имя пользователя
принадлежит во всей Сети единственному человеку. Например, пользователь
joe
, устанавливающий соединение с office.com
, вовсе не обязательно один и
тот же человек, что и пользователь joe
, подсоединяющийся с elsewhere.com
.
MySQL решает эту проблему, обеспечивая возможность различать
пользователей, подсоединяющихся с различных хостов под одним и тем же
именем пользователя: вы можете предоставлять joe
один набор привилегий,
если он подсоединяется с office.com
, и другой набор привилегий, если joe
подсоединяется с elsewhere.com
.
Управление доступом в MySQL осуществляется в два этапа:
-
Этап 1: сервер проверяет, имеется ли у вас вообще разрешение на
подсоединение.
2item
Этап 2: если таковое имеется, сервер проверяет каждый из ваших
запросов, чтобы убедиться в том, что у вас имеется достаточно
привилегий для его выполнения. Например, если вы пытаетесь выбрать
строки в таблице базы данных или удалить таблицу из базы данных,
сервер в первом случае проверяет, имеется ли у вас для этой таблицы
привилегия
SELECT
, а во втором - имеется ли у вас для этой базы данных
привилегия DROP
.
На обеих стадиях управления доступом сервер использует таблицы user
, db
и
host
из базы данных mysql
. Ниже перечислены поля этих таблиц привилегий:
Имя таблицы | user | db | host
|
Поля контекста | Host | Host | Host
|
| User | Db | Db
|
| Password | User |
|
Поля привилегий | Select_priv | Select_priv | Select_priv
|
| Insert_priv | Insert_priv | Insert_priv
|
| Update_priv | Update_priv | Update_priv
|
| Delete_priv | Delete_priv | Delete_priv
|
| Index_priv | Index_priv | Index_priv
|
| Alter_priv | Alter_priv | Alter_priv
|
| Create_priv | Create_priv | Create_priv
|
| Drop_priv | Drop_priv | Drop_priv
|
| Grant_priv | Grant_priv | Grant_priv
|
| References_priv | |
|
| Reload_priv | |
|
| Shutdown_priv | |
|
| Process_priv | |
|
| File_priv | |
|
На втором этапе управления доступом (верификация запросов) сервер может (в
случае, если запрос относится к таблицам базы данных) дополнительно
обратиться к таблицам 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 |
|
Каждая таблица привилегий включает в себя поля контекста и поля
привилегий.
Поля контекста определяют область действия каждой из записей в таблицах,
т.е. контекст, к которому имеет отношение та или иная запись. Например,
запись в таблице user
, в полях Host
и User
которой указаны значения
'thomas.loc.gov'
'bob'
, предназначена для аутентификации подсоединений к
серверу с хоста thomas.loc.gov
под именем пользователя bob
. Аналогично
запись в таблице db
, в полях Host
, User
и Db
которой указаны значения
'thomas.loc.gov'
, 'bob'
и 'reports'
, будет использоваться при попытке
пользователя по именем bob
подсоединиться с хоста thomas.loc.gov
и
получить доступ к базе данных reports
. В полях контекста в таблицах
tables_priv
и columns_priv
указаны таблицы или комбинации таблиц/столбцов,
к которым применяется каждая запись.
При контроле доступа сравнение значений в полях Host
осуществляется без
учета регистра. Значения в полях User
, Password
, Db
и Table_name
также
являются независимыми от регистра символов. Значения в поле Column_name
являются независимыми от регистра символов, начиная с MySQL 3.22.12.
В полях привилегий указываются привилегии, предоставляемые записью в
таблице, т.е. то, какие операции разрешено выполнять. Сервер формирует
полное описание привилегий пользователя, комбинируя информацию, хранящуюся
в разных таблицах привилегий. Это осуществляется по правилам, которые
описаны в разделе See section 4.2.10 Управление доступом, этап 2: верификация запросов.
Поля контекста - это строковые значения, объявленные, как показано ниже;
устанавливаемым по умолчанию значением для каждого из них является пустая
строка:
Имя поля | Тип | Примечания
|
Host | CHAR(60) |
|
User | CHAR(16) |
|
Password | CHAR(16) |
|
Db | CHAR(64) | (CHAR(60) для таблиц
tables_priv и columns_priv tables)
|
Table_name | CHAR(60) |
|
Column_name | CHAR(60) |
|
В таблицах user
, db
и host
все поля привилегий имеют объявленный тип
ENUM('N','Y')
, т.е. возможно одно из двух значений - 'N'
и 'Y'
, а
устанавливаемым по умолчанию является 'N'
.
В таблицах tables_priv
and columns_priv
поля привилегий объявляются как
SET
:
Имя таблицы
| Имя поля
| Допустимые элементы набора
|
tables_priv
| Table_priv
| 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
|
tables_priv
| Column_priv
| 'Select', 'Insert', 'Update', 'References'
|
columns_priv
| Column_priv
| 'Select', 'Insert', 'Update', 'References'
|
Если кратко, то сервер использует таблицы привилегий следующим образом:
-
Поля контекста таблицы
user
определяют, разрешить входящее
подсоединение или отказать в нем. Для разрешенных подсоединений любые
привилегии, предоставленные в таблице user
, означают глобальные
привилегии пользователя (привилегии суперпользователя). Эти привилегии
распространяются на все базы данных, размещенные на сервере.
-
Таблицы
db
и host
используются совместно:
-
Поля контекста таблицы
db
определяют, каким пользователям, при
подсоединении с каких хостов разрешен доступ к каким базам
данных. Поля привилегий определяют разрешенные операции.
-
Таблица
host
используется в качестве расширения таблицы db
в
случае, если необходимо применить некоторую запись из таблицы db
к разным хостам. Например, если вы хотите предоставить
пользователю возможность обращаться к базе данных с различных
хостов сети, оставьте пустым поле в записи этого пользователя в
таблице db
, а затем внесите в таблицу host
запись для каждого из
этих хостов. Более подробно данный механизм описан в разделе
See section 4.2.10 Управление доступом, этап 2: верификация запросов.
-
Таблицы
tables_priv
и columns_priv
подобны таблице db
, но областью их
действия является уже уровень таблиц и столбцов, а не баз данных.
Заметим, что привилегии администрирования (RELOAD
, SHUTDOWN
и т.д..)
задаются только в таблице user
. Это связано с тем, что операции
администрирования являются операциями над самим сервером, а не над базами
данных, поэтому не смысла перечислять такие привилегии в других таблицах
привилегий. Фактически для того, чтобы выяснить, имеете ли вы привилегии
выполнять операции администрирования, достаточно обратиться только к
таблице user
.
Привилегия FILE
также задается только в таблице user
. Она не является
привилегией администрирования как таковой, но возможность производить
чтение или запись файлов на серверном хосте не связана с базой данных, к
которой вы получаете доступ.
Сервер mysqld
считывает содержимое таблиц привилегий единожды, при его
запуске. О том, каким образом изменения, вносимые в таблицы привилегий,
вступают в силу, рассказывается в разделе See section 4.3.3 Когда изменения в привилегиях вступают в силу.
При внесении изменений в таблицы привилегий стоит убедиться в том, что
ваши изменения задают привилегии именно так, как задумано вами. Помощь по
диагностике проблем вы найдете в разделе See section 4.2.11 Причины появления ошибок Access denied
("в доступе отказано"). По вопросам, связанным с безопасностью, следует обращаться к разделу See section 4.2.2 Как обезопасить MySQL от хакеров.
Полезным диагностическим инструментом является скрипт mysqlaccess
,
которым Ив Карлье (Yves Carlier) укомплектовал дистрибутив MySQL.
Запустите mysqlaccess
с опцией --help
чтобы посмотреть, как он работает.
Заметим, что mysqlaccess
контролирует доступ, используя только таблицы
user
, db
и host
. Он не проверяет привилегии на уровне таблиц или
столбцов.