Настройка прав доступа к базам данных MySQL

MySQL имеет развитую систему доступа к базам данных. пользователю базы данных может быть предоставлен доступ ко всей базе данных, отдельным таблицам и отдельным столбцам таблиц. Имеется разграничение на действия, которые может производить пользователь с записями. Для органи-зации такой структуры доступа используется несколько таблиц в специальной базе данных. На основании значений этих таблиц выстраивается политика предоставления доступа.

Добавление новых пользователей осуществляется по обычной схеме добавления записей в таблицу базы данных MySQL. Пример создания пользователей дан на рис.

Пример добавления новых пользователей



Было создано три пользователя:

  • monty - cуперпользователь (администратор), должен использо-вать пароль, для работы с MySQL:

  • dummy должен быть допущен к индивидуальной базе данных по таблице 'db ';

  • admin не нуждается в пароле, но разрешено выполнение только команд 'mysqladmin reload' и 'mysqladmin processlist'. Может быть допущен к индивидуальной базе данных через таблицу 'db'.

  • База данных, которую сервер MySQL использует для хранения внутренней информации о пользователях, по умолчанию имеет имя mysql. В этой базе данных определены таблицы для хранения информации пользовательских учетных записей.

    Список таблиц прав доступа



    Проверка прав доступа производится в порядке, указанном в предыдущей таблице. Прежде всего проверяется, существует ли пользователь и какие возможности он имеет при управлении базой данных (табл. user).

    Поля таблицы user



    Поля с типом enum('N','Y') считаются разрешенными, если для них установлено значение Y, и неразрешенными, если установлено значение N.

    Для администратора сервера MySQL необходимы все привилегии; для обычных пользователей в данной таблице обычно не разрешена ни одна из привилегий этой таблицы, то есть обычные пользователи не могут изменять конфигурацию сервера MySQL. Исключением можно считать привилегии File_priv, если пользователь активно работает с файловой системой.

    Поле host может быть описано как IP-адрес или имя, а также быть пустым. В имени компьютера и в имени пользователя разрешается применение регулярных выражений.

    Пароли хранятся в зашифрованном виде и не имеют функции обратной дешифровки. Для того, чтобы задать пароль, необходимо использовать функцию password( ).

    Если привилегии на просмотр процессов сервера не разрешены, тогда пользователь может видеть только собственные процессы.

    На этапе проверки значений таблицы user пропускаются для дальнейшей обработки только те соединения, у которых поля Host, User и значение функции password ( ) от значения пароля, полученного от клиента, совпадают.

    Дальнейшая обработка проводится в таблице db, на этом этапе определяются привилегии, которыми обладает пользователь для работы с конкрет-ной базой данных (см. табл.).

    Привилегии для работы с базой данных



    Как и в предыдущем случае, поле host, имя пользователя и название базы данных могут содержать специальные символы регулярных выражений.

    Привилегии, указанные в таблице db, перекрывают значения, полученные в таблице user, именно поэтому пользователи могут не иметь ни одной привилегии в таблице user.

    Один пользователь может иметь несколько различных адресов, с которых может производиться подключение, поэтому на данном этапе проверяется значение Host. Если значение поля Host пусто, тогда производится допол-нительная проверка в таблице host (см. табл.)

    Привилегии для работы с базой данных с разных адресов



    Столбцы таблицы host аналогичны столбцам таблицы db, разница состоит только в том, что данные из таблицы host при совпадении полей Host и Db имеют более высокий приоритет и перекрывают ранее установленные значения.

    MySQL позволяет устанавливать ограничения на доступ к отдельным таблицам и столбцам таблицы (см. следующие две таблицы), но увеличение количества проверок приводит к уменьшению производительности.

    Поля таблицы tables_priv



    Наличие хотя бы одной записи в таблице tables_priv или columns_priv приведет к тому, что все входящие запросы будут проверяться на соответствие выполняемым операциям. Поскольку количество проверок на соответствие разрешенным привилегиям возрастет в несколько раз, перед применением таких ограничений следует протестировать производительность сервера баз данных с типовой нагрузкой. Если возникнут проблемы с производительностью, нужно будет изменить конфигурацию сервера либо отказаться от та-кого типа проверок.

    Поля таблицы columns_priv



    Следует помнить следующие правила при настройке прав доступа:

  • Имя сервера и поля в таблице db могут содержать регулярные выражения языка SQL: символы "%" и "_". В других полях использовать их нельзя;

  • Имя сервера может быть доменным именем, именем localhost, IP адресом или SQL выражением. Пустое поле "имя сервера" означает любой сервер;

  • Поле db является именем базы данных или SQL выражением;

  • Пустое имя пользователя эквивалентно любому пользователю;

  • Пустой пароль эквивалентен любому паролю. Вы можете создать суперпользователя (super-user), установив все права для него в 'Y' в таблице пользователей при его создании. Этот пользователь сможет делать что угод-но, не считаясь со значениями, установленными в таблице db;

  • Таблица серверов проверяется только когда в таблице db поле "имя сервера" пустое;

  • Все таблицы, по возможности, сортируются в порядке host-user-db.



  • Начиная с версии 3.22.11, MySQL поддерживает команды GRANT и REVOKE, с помощью которых можно проводить установку привилегий.

    Синтаксис данных команд:

    GRANT priv_type [(список_столбцов)] [, priv_type [(список столбцов)] .] ON {имя таблицы} | * | *.* | имя_базы_данных.*} TO имя_пользователя [IDENTIFIED BY 'пароль'] [, имя_пользователя [IDENTIFIED BY 'пароль'] .] [WITH GRAND OPTION]

    REVOKE priv_type [(список_столбцов)] [, priv_type [(список_столбцов)] .] ON {имя таблицы} | * | *.* | имя_базы_данных.*} FROM имя_пользователя [, имя_пользователя .]

    Для выполнения этих команд пользователь должен обладать соответствующими привилегиями.

    Администраторы системы могут создавать и удалять привилегии для четырех доступных уровней привилегий.

    1. Глобальный уровень, привилегии распространяются на все базы данных (таблица mysql.user).
    2. Уровень базы данных, привилегии распространяются только на таблицы и записи указанной базы данных (таблицы mysql.db и mysql.host).
    3. Уровень таблиц, привилегии распространяются только на записи одной таблицы (таблица mysql.tables_priv).
    4. Уровень столбцов, привилегии распространяются только на указанный столбец определенной таблицы (таблица mysql.columns_priv).