Grant Tables

Теперь рассмотрим как именно MySQL сервер хранит информацию о привилегиях пользователей. В словаре данных, который находится в служебной базе mysql, есть следующие таблицы: user, db, tables_priv, columns_priv, procs_priv. Именно в них и хранятся записи о привилегиях пользователей. Каждая из этих таблиц соответствует своему уровню привилегий:

  • user – содержит записи о всех аккаунтах, известных серверу, их глобальных привилегиях, а также некоторую другую дополнительную информацию (ограничение ресурсов, возможность устанавливать только защищенное соединение с сервером с использованием SSL и т.п.). Любой аккаунт на сервере должен иметь запись в этой таблице, т.к. с ее помощью сервер определяет разрешить или запретить ему коннект к базе данных. Если же у аккаунта есть привилегии отличные от глобальных, он должен иметь также соответствующие записи в других таблицах.
  • db – содержит записи о привилегиях, относящихся к базам данных.
  • tables_priv – привилегии, связанные с таблицами.
  • columns_priv – привилегии, связанные с колонками (столбцами) таблиц.
  • procs_priv – в этой таблице сохраняются записи о правах на процедуры и функции.

При старте MySQL сервер загружает вышеуказанные таблицы (grant tables) в память и использует их копию в памяти в процессе своей работы для контроля прав доступа пользователей.

Сервер обновляет копию этих таблиц в памяти в следующих случаях:

  • аккаунт пользователя был создан или изменен в этих таблицах (grant tables) на диске с помощью команд по управлению аккаунтами: CREATE USER, GRANT, REVOKE или SET PASSWORD.
  • сервер получил явное указание перегрузить эти таблицы в память командой FLUSH PRIVILEGES, либо выполнением команд flush-privileges или reload в утилите mysqladmin.

 Изменения в таблицах привилегий (Grant Tables).

Изменение привилегий у пользователей и, соответственно, изменения в grant tables возможны следующими способами:

  • прямые изменения с использованием команд SQL INSERT, DELETE, UPDATE. После выполнения изменений таким способом необходимо, как было описано выше, выполнить команду FLUSH PRIVILEGES для того, чтобы эти изменения применились.
  • непрямые изменения осуществляются с помощью команд CREATE USER, GRANT, REVOKE или SET PASSWORD. После этих изменений сервер автоматически производит загрузку grant tables в память, т.е. они применяются немедленно.

Стоит добавить, что при прямом изменении grant tables существует риск при какой-либо ошибке залочить всех пользователей, или, наоборот, создать “дыру” в безопасности сервера, открыв лишний доступ.

Если пользователи уже подключены и работают с базой данных, изменения в их привилегиях отрабатывают следующим образом:

  • изменения привилегий на таблицы и колонки начинают действовать со следующего запроса пользователя.
  • изменения привилегий на базы данных будут действовать после выполнения команды USE <имя базы>. Это связано с тем, что приложения часто кэшируют имя базы данных.
  • изменения глобальных привилегий и смена пароля не оказывают на пользователей уже подключенных к базе никакого влияния. Только при следующем подключении пользователя эти изменения вступят в силу.

Оглавление.

Leave a Reply

Your email address will not be published. Required fields are marked *