Как работает система привилегий
Система привилегий MySQL обеспечивает пользователям возможность выполнять только те действия, которые им разрешены в соответствии с их обязанностями. Когда вы подсоединяетесь к серверу MySQL, ваша личность устанавливается по имени хоста, с которого вы подсоединяетесь, и имени пользователя, которое вы указываете. Система предоставляет привилегии в соответствии с вашей личностью и тем, что вы хотите делать.
MySQL идентифицирует пользователя как по имени хоста, так и по имени пользователя, т.к. нет оснований полагать что данное имя пользователя принадлежит во всей Сети единственному человеку. Например, пользователь joe , устанавливающий соединение с office.com , вовсе не обязательно один и тот же человек, что и пользователь joe , подсоединяющийся с elsewhere.com . MySQL решает эту проблему, обеспечивая возможность различать пользователей, подсоединяющихся с различных хостов под одним и тем же именем пользователя: вы можете предоставлять joe один набор привилегий, если он подсоединяется с office.com , и другой набор привилегий, если joe подсоединяется с elsewhere.com .
Управление доступом в MySQL осуществляется в два этапа:
Этап 1: сервер проверяет, имеется ли у вас вообще разрешение на подсоединение.
Этап 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 | | | | code>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.
В полях привилегий указываются привилегии, предоставляемые записью в таблице, т.е. то, какие операции разрешено выполнять. Сервер формирует полное описание привилегий пользователя, комбинируя информацию, хранящуюся в разных таблицах привилегий. Это осуществляется по правилам, которые описаны в разделе .
Поля контекста - это строковые значения, объявленные, как показано ниже; устанавливаемым по умолчанию значением для каждого из них является пустая строка:
Имя поля | Тип | Примечания | 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 запись для каждого из этих хостов. Более подробно данный механизм описан в разделе .
Таблицы tables_priv и columns_priv подобны таблице db , но областью их действия является уже уровень таблиц и столбцов, а не баз данных.
Заметим, что привилегии администрирования (RELOAD , SHUTDOWN и т.д..) задаются только в таблице user . Это связано с тем, что операции администрирования являются операциями над самим сервером, а не над базами данных, поэтому не смысла перечислять такие привилегии в других таблицах привилегий. Фактически для того, чтобы выяснить, имеете ли вы привилегии выполнять операции администрирования, достаточно обратиться только к таблице user .
Привилегия FILE также задается только в таблице user . Она не является привилегией администрирования как таковой, но возможность производить чтение или запись файлов на серверном хосте не связана с базой данных, к которой вы получаете доступ.
Сервер mysqld считывает содержимое таблиц привилегий единожды, при его запуске. О том, каким образом изменения, вносимые в таблицы привилегий, вступают в силу, рассказывается в разделе Когда изменения в привилегиях вступают в силу.
При внесении изменений в таблицы привилегий стоит убедиться в том, что ваши изменения задают привилегии именно так, как задумано вами. Помощь по диагностике проблем вы найдете в разделе Причины появления ошибок Access denied ("в доступе отказано"). По вопросам, связанным с безопасностью, следует обращаться к разделу Как обезопасить MySQL от хакеров.
Полезным диагностическим инструментом является скрипт mysqlaccess , которым Ив Карлье (Yves Carlier) укомплектовал дистрибутив MySQL. Запустите mysqlaccess с опцией --help чтобы посмотреть, как он работает. Заметим, что mysqlaccess контролирует доступ, используя только таблицы user , db и host . Он не проверяет привилегии на уровне таблиц или столбцов.
1 2 3 4 5 6 7 8
8 8 8
| |