Справочное руководство по MySQL версии 4.0.11-gamma
4.2.6 Как работает система привилегий
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. Ниже перечислены поля этих таблиц привилегий:
Таблица 1
Имя таблицы
Таблица 1
Имя таблицы
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. Поля этих таблиц
привилегий перечислены ниже:
Таблица 2
Имя таблицы
Таблица 2
Имя таблицы
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: верификация запросов.
Поля контекста - это строковые значения, объявленные, как показано ниже;
устанавливаемым по умолчанию значением для каждого из них является пустая
строка:
Таблица 3
Имя поля
Таблица 3
Имя поля
Тип
Тип
Примечания
Примечания
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:
Если кратко, то сервер использует таблицы привилегий следующим образом:
Поля контекста таблицы 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 Когда изменения в привилегиях вступают в силу.
Полезным диагностическим инструментом является скрипт mysqlaccess,
которым Ив Карлье (Yves Carlier) укомплектовал дистрибутив MySQL.
Запустите mysqlaccess с опцией --help чтобы посмотреть, как он работает.
Заметим, что mysqlaccess контролирует доступ, используя только таблицы
user, db и host. Он не проверяет привилегии на уровне таблиц или
столбцов.