вторник, 11 ноября 2008 г.

Работа с привилегиями пользователей в MySQL


Памятка по операциям выдачи-отъема привилегий пользователей в MySQL (тестировалось на версии 5.1.24). Предполагается, что все последующие действия совершаются от имени учетной записи root сервера MySQL.
Пусть имеется база данных myDb0 с таблицами myTbl1 и myTbl2. Создадим пользователя newusr с правами на чтение из первой таблицы и чтение-вставку во вторую.
mysql> grant select on mydb0.mytbl1 to 'newusr'@'localhost' identified by 'qwerty123';
mysql> grant select, insert on mydb0.mytbl2 to 'newusr'@'localhost';
Заметим в скобках: (
  1. предложение identified by 'qwerty123' нужно только при первом grant для данного пользователя;
  2. для выполнения второго grant (т.е. выдача привилегий уже существующему пользователю) права root необязательны - достаточно иметь привилегию grant на те объекты, к которым мы выделяем права).
Просмотреть существующие привилегии можно командой:
mysql> show grants for 'newusr'@'localhost';
Удалить права можно командой вида:
mysql> revoke insert on mydb0.mytbl2 from 'newusr'@'localhost';
Но если прав выдавалось много, то проще воспользоваться таблицами в системной базе данных mysql. Та есть, например, таблица - tables_priv (сруктура такая: Host char(60), Db char(64), User char(16), Table_name char(64), Grantor char(77), Timestamp timestamp, Table_priv set('Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter', 'Create View', 'Show view', 'Trigger'), Column_priv set('Select', 'Insert', 'Update', 'References'), PRIMARY KEY (Host, Db, User, Table_name)), а, значит можно применить, такую, например, массовую операцию:
mysql> delete from mysql.tables_priv where user='newusr' and db='mydb0';
Если пользователю выдавалась привилегия на все таблицы базы (т.е. mydb0.*), то удалять ее надо из таблицы db(структура такая: Host char(60), Db char(64), User char(16), Select_priv enum('N','Y'), Insert_priv enum('N','Y'), Update_priv enum('N','Y'), Delete_priv enum('N','Y'), Create_priv enum('N','Y'), Drop_priv enum('N','Y'), Grant_priv enum('N','Y'), References_priv enum('N','Y'), Index_priv enum('N','Y'), Alter_priv enum('N','Y'), Create_tmp_table_priv` enum('N','Y'), Lock_tables_priv` enum('N','Y'), Create_view_priv enum('N','Y'), Show_view_priv enum('N','Y'), Create_routine_priv enum('N','Y'), Alter_routine_priv enum('N','Y'), Execute_priv enum('N','Y'), Event_priv enum('N','Y'), Trigger_priv enum('N','Y'), PRIMARY KEY (Host, Db, User)):
mysql> delete from mysql.db where user='newusr' and db='mydb0';
Все операции над этими таблицами не приводит к непосредсвенному изменению привилегий (т.е. вывод show privs не изменится), чтобы записать изменения не забудем выполнить:
mysql> flush privileges;
И еще два замечания в скобках: (
  1. при удалении таблиц и баз данных строчки в таблицах db и tables_priv никуда не исчезают - т.е. при создании нового объекта со старым именем к нему применятся прежде существовавшие права. Хорошо это или плохо, сразу не скажешь, но забывать об этом не рекомендуется;
  2. привилегия grant usage on *.*, отображаемая командой show grants, является привилегией по умолчанию при создании пользователя и может быть удалена только удалением самого пользователя командой drop user 'newusr'@'localhost' или delete from mysql.user where user='sel').

Комментариев нет: