The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Базы данных, SQL" / Оглавление документа

4.3 Управление пользователями в MySQL

4.3.1 Синтаксис GRANT и REVOKE

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
      ON {tbl_name|*|*.*|db_name.*} TO user_name [IDENTIFIED BY 'password']
      [, user_name [IDENTIFIED BY 'password'] ...] [REQUIRE {SSL|X509}
      [ISSUER issuer] [SUBJECT subject]] [WITH GRANT OPTION]

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
       ON {tbl_name|*|*.*|db_name.*}
       FROM user_name [, user_name ...]

GRANT реализован в MySQL Version 3.22.11 или позже. Для более ранних версий MySQL инструкция GRANT не делает ничего.

Команды GRANT и REVOKE позволяют администраторам системы создавать пользователей, предоставлять и отменять права на MySQL-пользователей в четырех уровнях привилегий:

Глобальный уровень (Global level)
Глобальные привилегии обращаются ко всем базам данных на данном сервере. Эти привилегии сохранены в таблице mysql.user.
Уровень баз данных (Database level)
Привилегии баз данных обращаются ко всем таблицам в данной базе данных. Эти привилегии сохранены в таблицах mysql.db и mysql.host.
Уровень таблиц (Table level)
Привилегии таблиц обращаются ко всем столбцам в данной таблице. Эти привилегии сохранены в таблице mysql.tables_priv.
Уровень столбцов (Column level)
Привилегии столбцов обращаются к одиночным столбцам в данной таблице. Эти привилегии сохранены в таблице mysql.columns_priv.

Если Вы даете привилегии пользователю, который не существует, он будет автоматически создан. За примерами по работе GRANT обратитесь к разделу "4.3.5 Добавление новых пользователей к MySQL".

Для инструкций GRANT и REVOKE аргумент priv_type может быть определен как любой из следующего списка:

ALL PRIVILEGES   FILE         RELOAD     ALTER   INDEX     SELECT
CREATE           INSERT       SHUTDOWN   DELETE  PROCESS   UPDATE
DROP             REFERENCES   USAGE

ALL представляет собой синоним для ALL PRIVILEGES. REFERENCES пока не реализовано. USAGE в настоящее время представляет собой синоним для ``no privileges''. Это может быть применено, когда Вы хотите создать пользователя, который не имеет никаких привилегий.

Чтобы отменять привилегию предоставленную командой grant, используйте значение priv_type параметра GRANT OPTION:

REVOKE GRANT OPTION ON ... FROM ...;

Значения priv_type, которые Вы можете определять для таблицы: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX и ALTER.

Значения priv_type, которые Вы можете определять для столбца (то есть, когда Вы используете аргумент column_list): SELECT, INSERT и UPDATE.

Вы можете устанавливать глобальные привилегии, используя синтаксис ON *.*. Вы можете устанавливать привилегии базы данных, используя синтаксис ON db_name.*. Если Вы определяете ON *, и Вы имеете текущую базу данных, Вы установите привилегии именно для этой базы данных. ПРЕДУПРЕЖДЕНИЕ: Если Вы определяете ON *, и Вы не имеете текущей базы данных, Вы будете воздействовать на глобальные привилегии!

Чтобы приспосабливать предоставление прав на пользователей с произвольных компьютеров, MySQL поддерживает определение значения user_name в форме user@host. Если Вы хотите определять строку user или строку host, содержащую специальные или групповые символы (например, `-'), Вы можете цитировать имя пользователя или хоста (например, 'test-user'@'test-hostname').

Вы можете определять групповые символы в hostname. Например, user@"%.loc.gov" применяется к user для любого компьютера в домене loc.gov, а user@"144.155.166.%" будет применено к user с любой машины в сети 144.155.166 класса C.

Простая форма user представляет собой синоним для user@"%". ОБРАТИТЕ ВНИМАНИЕ: Если Вы позволяете анонимным пользователям соединяться с сервером MySQL (что является значением по умолчанию), Вы должны также добавить всех локальных пользователей как user@localhost потому, что иначе анонимная запись в таблице mysql.user будет применяться, когда пользователь попробует зарегистрироваться на сервере MySQL с локальной машины! Анонимные пользователи определены вставкой записей с User='' в таблицу mysql.user. Вы можете проверять, применяется ли это у Вас, выполняя такой запрос:

mysql> SELECT Host,User FROM mysql.user WHERE User='';

В настоящий момент GRANT поддерживает имена хоста, базы данных, таблицы и столбца длиной только до 60 символов. Имя пользователя может быть длиной до 16 символов.

Привилегии для таблицы или столбца сформированы из логического ИЛИ (OR) привилегий в каждом из четырех уровней привилегии. Например, если таблица mysql.user определяет, что пользователь имеет глобальную привилегию select, это не может быть отменено записью на других уровнях доступа!

Привилегии для столбца могут быть вычислены следующим образом:

global privileges OR
(database privileges AND host privileges) OR
table privileges OR column privileges

В большинстве случаев Вы предоставляете права пользователю только в одном из уровней привилегии, так что обычно это просто. Детали проверяющей привилегии процедуры подробно рассмотрены в разделе "4.2 Общие проблемы защиты и система привилегий доступа MySQL".

Если Вы предоставляете привилегии для комбинации user/hostname, которая не существует в таблице mysql.user, запись будет добавлена и останется там пока ее не удалят командой DELETE. Другими словами, GRANT может создавать записи в таблице user, но REVOKE не будет удалять их. Вы должны делать это явно, используя вызов DELETE.

В MySQL Version 3.22.12 или позже, если новый пользователь создан, или если Вы имеете глобальные привилегии, пароль пользователя будет установлен в пароль, определенный предложением IDENTIFIED BY, если оно задано. Если пользователь уже имел пароль, он будет заменен новым.

ПРЕДУПРЕЖДЕНИЕ: Если Вы создаете нового пользователя, но не определяете предложение IDENTIFIED BY, пользователь не имеет никакого пароля. Это опасно.

Пароли также могут быть установлены командой SET PASSWORD. Подробности в разделе "5.5.6 Синтаксис SET".

Если Вы предоставляете привилегии для базы данных, запись в таблице mysql.db будет создана, если необходимо. Когда все привилегии для базы данных будут удалены с помощью REVOKE, эта запись тоже будет удалена автоматически.

Если пользователь не имеет привилегий на таблице, данная таблица не отображается вообще, когда пользователь запрашивает список таблиц (например, инструкцией SHOW TABLES).

Предложение WITH GRANT OPTION дает пользователю способность передать другим пользователям любые привилегии, которые этот пользователь имеет в определенном уровне доступа. Вы должны быть внимательным к тому, кому Вы даете привилегию grant, поскольку два пользователя с различными привилегиями могут быть способны соединить свои привилегии!

Вы не можете предоставлять другому пользователю привилегию, которую Вы не имеете сами. Привилегия grant позволяет Вам передавать только те привилегии, которыми Вы реально обладаете.

Знайте, что, когда Вы предоставляете пользователю привилегию grant в специфическом уровне привилегии, любые привилегии, которые пользователь уже имеет (или получит в будущем!) в этом уровне также могут передаваться этим пользователем кому угодно. Предположите, что Вы предоставляете пользователю привилегию insert на базе данных. Если Вы затем предоставляете привилегию select на базе данных и определяете WITH GRANT OPTION, пользователь сможет передавать не только привилегию select, но и insert! Если Вы затем предоставляете ему еще и привилегию update на базе данных, этот пользователь сможет передавать insert, select и update.

Вы не должны предоставлять привилегию alter нормальному пользователю. Если Вы это сделаете, пользователь может попробовать разрушить систему привилегии, переименовывая таблицы!

Обратите внимание, что, если Вы используете привилегии столбца или таблицы даже для одного пользователя, сервер исследует привилегии столбца и таблицы для всех пользователей, и это замедлит немного MySQL.

Когда mysqld запускается, все привилегии читаются в память. Привилегии, связанные с базами данных, таблицами и столбцами начинают действовать сразу же, а связанные с пользователями сработают, когда пользователь соединится с сервером в следующий раз. Модификации к таблицам предоставления, которые Вы выполняете, используя GRANT или REVOKE воспринимаются сервером немедленно. Если Вы изменяете таблицы предоставления вручную (используя INSERT, UPDATE и т.д.), Вы должны выполнить инструкцию FLUSH PRIVILEGES или запустить команду mysqladmin flush-privileges, чтобы сервер перезагрузил все таблицы предоставления привилегий.

Самые большие различия между ANSI SQL и MySQL версиями оператора GRANT:

4.3.2 Имена и пароли пользователей MySQL

Имеются несколько различий между использованием имен и паролей MySQL и Unix или Windows:

Пользователи MySQL и их привилегии обычно создаются командой GRANT. Подробности в разделе "4.3.1 Синтаксис GRANT и REVOKE".

Когда Вы входите в систему на сервере MySQL с помощью клиента командной строки, Вы должны определить пароль с помощью опции --password=your-password. Подробности изложены в разделе "4.2.7 Связь с сервером MySQL":

mysql --user=monty --password=guess database_name

Если Вы хотите, чтобы Вас запросили относительно пароля, Вы должны использовать аргумент --password:

mysql --user=monty --password database_name

Или в кратком виде:

mysql -u monty -p database_name

Обратите внимание, что в последнем примере пароль НЕ database_name.

Если Вы хотите использовать опцию -p, чтобы задать пароль, сделайте это так:

mysql -u monty -pguess database_name

На некоторых системах библиотечный вызов, который MySQL использует для запроса пароля, автоматически урежет пароль до длины в 8 символов. Внутренне MySQL не имеет ограничений на длину пароля.

4.3.3 Когда привилегии вступают в силу

При запуске mysqld все содержание таблиц предоставления привилегий читается в память и становится действующим.

Модификации к таблицам предоставления, которые Вы выполняете используя GRANT, REVOKE или SET PASSWORD вступают в силу немедленно.

Если Вы изменяете таблицы предоставления вручную (используя операторы INSERT, UPDATE), Вы должны выполнить инструкцию FLUSH PRIVILEGES или запустить mysqladmin flush-privileges, или mysqladmin reload, чтобы сообщить, что сервер должен перезагрузил таблицы предоставления. Иначе Ваши изменения не будут иметь никакого эффекта, пока Вы не перезапустите сервер. Если Вы изменяете таблицы предоставления вручную, но забываете перезагружать привилегии, Вы будете часто задаваться вопросом, почему Ваши изменения не делают вообще ничего!

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

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

4.3.4 Установка начальных привилегий MySQL

После установки MySQL Вы устанавливаете начальные привилегии доступа вызовом скрипта scripts/mysql_install_db. Подробности в разделе "2.3.1 Обзор быстрой установки". Скрипт mysql_install_db запускает сервер mysqld и устанавливает следующие привилегии:

ОБРАТИТЕ ВНИМАНИЕ: заданные по умолчанию привилегии иные для Windows. Подробности в разделе " 2.6.2.3 Запуск MySQL под Windows".

Первое, что следует сделать, это определить пароль для MySQL-пользователя root. Вы можете сделать это следующим образом (обратите внимание, что Вы определяете пароль, используя функцию PASSWORD()):

shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
                  WHERE user='root';
mysql> FLUSH PRIVILEGES;

Вы можете, в MySQL версии 3.22 и выше, использовать инструкцию SET PASSWORD:

shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('new_password');

Другой способ устанавливать пароль: применить команду mysqladmin:

shell> mysqladmin -u root password new_password

Только пользователи с доступом на чтение/запись к базе данных mysql могут изменять пароль для других пользователи. Все нормальные пользователи (не анонимные) могут менять только их собственный пароль с помощью вышеупомянутых команд или вызовом SET PASSWORD=PASSWORD('new password').

Обратите внимание, что, если Вы модифицируете пароль непосредственно в таблице user, используя первый метод, Вы должны сообщить, чтобы сервер заново прочитал таблицы предоставления привилегий (команда FLUSH PRIVILEGES), иначе изменение будет не замечено.

Как только пароль root был установлен, Вы должны использовать его при соединении с сервером.

Изучение скрипта scripts/mysql_install_db весьма пригодится при сборе информации по созданию и настройке других пользователей.

Если Вы хотите, чтобы начальные привилегии были иными, чем те, которые только что я описал, Вы можете изменять скрипт mysql_install_db прежде, чем Вы его выполните.

Чтобы освежить таблицы предоставления привилегий полностью (пересоздать их заново), удалите все файлы `.frm', `.MYI' и `.MYD' в каталоге, содержащем базу данных mysql. Это каталог с именем `mysql' в каталоге баз данных, который будет перечислен, когда Вы выполняете mysqld --help. Затем выполните скрипт mysql_install_db, возможно, после его редактирования, чтобы иметь те привилегии, которые Вы хотите установить.

ОБРАТИТЕ ВНИМАНИЕ: Для MySQL версий старше, чем 3.22.10, Вы не должны удалить файлы `.frm'. Если Вы случайно сделаете это, Вы должны скопировать их обратно из Вашего дистрибутива MySQL перед выполнением mysql_install_db.

4.3.5 Добавление новых пользователей в MySQL

Вы можете добавлять пользователей двумя различными путями: используя инструкции GRANT или непосредственно управляя таблицами MySQL.

Имеются также много программ, например, phpmyadmin, которые могут использоваться, чтобы создать и администрировать пользователей.

Примеры ниже показывают, как использовать клиент mysql, чтобы установить новых пользователей. Эти примеры принимают, что привилегии установлены согласно значениям по умолчанию, описанным в предыдущем разделе. Это означает, что, чтобы делать изменения, Вы должны быть зарегестрированы на той же самой машине, где работает сервер mysqld, Вы должны соединиться как MySQL-пользователь root, и он должен иметь привилегию insert для базы данных mysql, а также административную привилегию reload. Также, если Вы изменили пароль для root, Вы должны определить его в командах.

Вы можете добавлять новых пользователей, выдавая инструкции GRANT:

shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
           IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
           IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;

Эти инструкции GRANT устанавливают трех новых пользователей:

monty
Полный суперпользователь, может соединяться с сервером отовсюду, но должен использовать пароль 'some_pass'. Обратите внимание, что Вы должны выдать инструкции GRANT для monty@localhost и monty@"%". Если мы не добавляем запись с localhost, анонимный пользователь для localhost, который создан mysql_install_db, будет иметь приоритет, когда мы соединяемся с локального компьютера потому, что это имеет более специфическое поле Host, и таким образом окажется первым в отсортированной таблице user.
admin
Пользователь может соединяться с localhost без пароля, и ему предоставляют административные привилегии reload и process. Это позволяет пользователю выполнять команды mysqladmin reload, mysqladmin refresh и mysqladmin flush-*, также как mysqladmin processlist. Никакие связанные с базой данных привилегии ему не предоставляются. Их можно предоставить позже, выдавая дополнительные инструкции GRANT.
dummy
Пользователь может соединяться без пароля, но только с локального компьютера. Глобальные привилегии все установлены в 'N'. Привилегия USAGE позволяет Вам создавать пользователя без привилегий. Принимается, что Вы предоставите ему специфические для базы данных привилегии позже.

Вы можете также добавлять то же самое, обращаясь к информации непосредственно, выдавая инструкции INSERT и затем сообщая серверу перезагрузить таблицы:

shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'),
                  'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'),
                  'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
                  Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
                  VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;

В зависимости от Вашей версии MySQL, Вам, вероятно, придется использовать выше различное число значений 'Y' (версии до версии 3.22.11 имели меньшее количество столбцов привилегий). Для пользователя admin применен более удобный синтаксис INSERT, который является доступным, начиная с версии 3.22.11 и выше.

Обратите внимание, что, чтобы установить суперпользователя, Вы должны только создать запись таблицы user с набором полей привилегий, выставленных в 'Y'. Никаких записей в таблицах db или host не требуется.

Столбцы привилегии в таблице user не были установлены явно в последней инструкции INSERT (для пользователя dummy), так что им будет установлено значение по умолчанию 'N'.

Следующий пример добавляет пользователя custom, который может соединяться с компьютеров localhost, server.domain и whitehouse.gov. Он хочет обращаться к базе данных bankaccount только с машины localhost, базе данных expenses только с машины whitehouse.gov, а к базе данных customer со всех трех компьютеров. Он хочет использовать пароль stupid для всех систем.

Чтобы установить привилегии этого пользователя, используя инструкцию GRANT, выполните эти команды:

shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.*
           TO custom@localhost IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.*
           TO custom@whitehouse.gov IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.*
           TO custom@'%' IDENTIFIED BY 'stupid';

Чтобы установить привилегии пользователя, изменяя таблицы предоставления привилегий непосредственно, выполните эти команды (обратите внимание на вызов FLUSH PRIVILEGES в конце):

shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
                  VALUES('localhost','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
                  VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
                  VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
           (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
            Create_priv,Drop_priv) VALUES
            ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
           (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
            Create_priv,Drop_priv) VALUES
           ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
           (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
            Create_priv,Drop_priv)
           VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;

Первые три инструкции INSERT добавляют записи таблицы user, которые позволяют пользователю custom соединяться с трех различных компьютеров с данным паролем, но не дают ему никаких прав доступа (все привилегии установлены в значение по умолчанию 'N'). Следующие три инструкции INSERT добавляют записи таблицы db, которые предоставляют custom привилегии для баз данных bankaccount, expenses и customer, но только когда он обращается с соответствующих компьютеров. Как обычно, когда таблицы предоставления привилегий изменяются непосредственно, сервер должен перезагрузить их.

Если Вы хотите давать специфический доступ пользователю с любой машины в данном домене, Вы можете выдать инструкцию GRANT таким образом:

mysql> GRANT ...
           ON *.* TO myusername@"%.mydomainname.com"
           IDENTIFIED BY 'mypassword';

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

mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
           PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;

Вы можете также использовать xmysqladmin, mysql_webadmin и xmysql, чтобы вставлять, изменять и модифицировать значения в таблицах предоставления. Вы можете найти эти утилиты в каталоге http://www.mysql.com/Downloads/Contrib Web-сайта MySQL.

4.3.6 Установка паролей

В большинстве случаев Вы должны использовать GRANT, чтобы установить Ваших пользователей и их пароли, так что следующее касается только пользоваателей профессионального уровня.

Примеры в предшествующих разделах иллюстрируют важный принцип: когда Вы сохраняете непустой пароль, используя инструкции INSERT или UPDATE, Вы должны использовать функцию PASSWORD() для его шифрования. Это потому, что таблица user хранит пароли в зашифрованной форме, а не как открытый текст. Если Вы забываете этот факт, Вы, вероятно, будет пытаться устанавливать пароли подобно этому примеру:

shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
                  VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;

Результат: открытый текст 'biscuit' будет сохранен как пароль в таблице user. Когда пользователь jeffrey попытается подключиться к серверу, клиент mysql шифрует его пароль с помощью вызова функции PASSWORD(), генерирует вектор аутентификации, основанный на зашифрованном пароле и произвольном числе, полученном с сервера, и посылает результат сервера. Он использует значение password в таблице user (а там не зашифрованное значение biscuit!), чтобы выполнить те же самые вычисления, и сравнивает результаты. Разумеется, они отличаются, и сервер отклоняет подключение (а Вы долго пытаетесь понять, почему ничего не работает):

shell> mysql -u jeffrey -pbiscuit test
Access denied

Пароли должны быть зашифрованы, когда они вставлены в таблицу user, так что инструкция INSERT должна быть определена подобно этому:

mysql> INSERT INTO user (Host,User,Password)
                  VALUES('%','jeffrey',PASSWORD('biscuit'));

Вы должны также использовать функцию PASSWORD(), когда Вы применяете инструкции SET PASSWORD:

mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');

Если Вы устанавливаете пароли, используя инструкции GRANT ... IDENTIFIED BY или вызов команды mysqladmin password, функция PASSWORD() уже не нужна: там она вызывается автоматически, так что Вы должны определить пароль biscuit примерно так (вот что мешало не путать людей, а сделать единую процедуру настройки?!):

mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';

или примерно так:

shell> mysqladmin -u jeffrey password biscuit

ОБРАТИТЕ ВНИМАНИЕ: PASSWORD() не выполняет шифрование пароля так, как это делается в Unix.

4.3.7 Хранение паролей в безопасности

Нецелесообразно определять Ваш пароль так, что его могут увидеть другие пользователи. Методы, которые Вы можете использовать, чтобы определить Ваш пароль, когда Вы выполняете программы-клиенты, перечислены ниже, наряду с оценкой рисков каждого метода:

В целом, самые безопасные методы состоят в том, чтобы иметь запрос программы-клиента для пароля или определять пароль в правильно защищенном файле личных настроек .my.cnf.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру