Система привилегий 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 Раздел 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
Раздел 4.2.10, «Управление доступом, этап 2: верификация запросов».
Таблицы tables_priv и
columns_priv подобны
таблице db, но областью
их действия является уже уровень
таблиц и столбцов, а не баз
данных.
Заметим, что привилегии
администрирования (RELOAD,
SHUTDOWN и т.д..) задаются
только в таблице user. Это
связано с тем, что операции
администрирования являются
операциями над самим сервером, а не
над базами данных, поэтому не
смысла перечислять такие
привилегии в других таблицах
привилегий. Фактически для того,
чтобы выяснить, имеете ли вы
привилегии выполнять операции
администрирования, достаточно
обратиться только к таблице
user.
Привилегия FILE также
задается только в таблице
user. Она не является
привилегией администрирования как
таковой, но возможность
производить чтение или запись
файлов на серверном хосте не
связана с базой данных, к которой
вы получаете доступ.
Сервер mysqld считывает
содержимое таблиц привилегий
единожды, при его запуске. О том,
каким образом изменения, вносимые
в таблицы привилегий, вступают в
силу, рассказывается в разделе See
Раздел 4.3.3, «Когда изменения в привилегиях вступают в силу».
При внесении изменений в таблицы
привилегий стоит убедиться в том,
что ваши изменения задают
привилегии именно так, как
задумано вами. Помощь по
диагностике проблем вы найдете в
разделе See Раздел 4.2.11, «Причины появления ошибок Access denied ('в доступе отказано')». По
вопросам, связанным с
безопасностью, следует обращаться
к разделу See Раздел 4.2.2, «Как обезопасить MySQL от хакеров».
Полезным диагностическим
инструментом является скрипт
mysqlaccess, которым Ив Карлье
(Yves Carlier) укомплектовал дистрибутив
MySQL. Запустите mysqlaccess с
опцией --help чтобы
посмотреть, как он работает.
Заметим, что mysqlaccess
контролирует доступ, используя
только таблицы user,
db и host. Он не
проверяет привилегии на уровне
таблиц или столбцов.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.
© 1995-2005 MySQL AB. All rights reserved.
