колонтитул в word 2007, 0000002111
Добавление новых пользователей в MySQL
Пользователей можно добавлять двумя различными способами - при помощи команды
GRANT
или напрямую в таблицы назначения привилегий MySQL.
Предпочтительнее использовать команду GRANT
- этот способ проще и
дает меньше ошибок.
Существует также большое количество программ (таких как phpmyadmin
),
которые служат для создания и администрирования пользователей.
В приведенных ниже примерах демонстрируется, как использовать клиент
mysql
для задания новых пользователей. В примерах предполагается, что
привилегии установлены в соответствии с принятыми по умолчанию значениями,
описанными в предыдущем разделе. Это означает, что для внесения изменений на том
же компьютере, где запущен mysqld
, необходимо подсоединиться к
серверу как пользователь MySQL root
, и у пользователя root
должна быть привилегия INSERT
для базы данных mysql
, а
также административная привилегия RELOAD
. Кроме того, если был
изменен пароль пользователя root
, его необходимо указать здесь для
команды mysql
.
Новых пользователей можно добавлять, используя команду 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'
(в версиях до Version 3.22.11
было меньше столбцов привилегий). Для пользователя admin
используется более удобочитаемый расширенный синтаксис команды INSERT
,
который доступен начиная с версии 3.22.11.
Обратите внимание: чтобы создать суперпользователя, необходимо создать запись
таблицы user
с полями привилегий, установленными в значение
'Y'
. Нет необходимости задавать значения в записях таблиц db
или host
.
Столбцы привилегий в таблице user в последнем операторе INSERT
(для пользователя dummy
) не были заданы явно, поэтому данным
столбцам был присвоено принятое по умолчанию значение 'N'
. Точно
так же действует команда GRANT USAGE
.
В приведенном ниже примере добавляется пользователь 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';
Привилегии для пользователя custom мы назначаем потому, что этот пользователь
хочет получать доступ к MySQL как с локального компьютера через сокеты Unix, так
и с удаленного компьютера whitehouse.gov
через протокол TCP/IP.
Чтобы задать привилегии пользователя путем непосредственного внесения
изменений в таблицы назначения привилегий, выполните следующие команды (обратите
внимание на команду 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, но только если доступ осуществляется с определенных компьютеров. Как
обычно, после внесения изменений непосредственно в таблицы назначения привилегий
серверу необходимо дать команду на перезагрузку этих таблиц (при помощи
FLUSH PRIVILEGES
), чтобы внесенные изменения вступили в силу.
Если необходимо предоставить определенному пользователю доступ с любого
компьютера к определенному домену, можно воспользоваться оператором GRANT
следующим образом:
mysql> GRANT ...
-> ON *.*
-> TO myusername"%.mydomainname.com"
-> IDENTIFIED BY 'mypassword';
Чтобы сделать то же самое путем непосредственного внесения изменений в
таблицы назначения привилегий, выполните следующие действия:
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
-> PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;
Ограничение ресурсов пользователя
Начиная с MySQL версии 4.0.2 можно ограничивать определенные ресурсы,
выделяемые пользователям.
До этой версии единственным возможным методом ограничения использования
ресурсов сервера MySQL была установка переменной запуска
max_user_connections
в значение, отличное от нуля. Но этот метод
действует только на глобальном уровне и не позволяет управлять отдельными
пользователями. Он может представлять определенный интерес только для
провайдеров услуг Internet.
На уровне отдельного пользователя теперь введено управление следующими тремя
ресурсами:
-
Количество всех запросов в час: все команды, которые может запускать
пользователь.
-
Количество всех обновлений в час: любая команда, которая изменяет
таблицу или базу данных.
-
Количество соединений, сделанных за час: новые соединения, открытые
за час.
Пользователь в упомянутом выше контексте представляет собой отдельную запись
в таблице user, которая уникальным образом идентифицируется своими столбцами
user
и host
.
По умолчанию все пользователи не ограничены в использовании указанных выше
ресурсов только в случае, только если эти ограничения не наложены на них. Данные
ограничения могут быть наложены только
при помощи глобальной команды GRANT (*.*)
с использованием
следующего синтаксиса:
GRANT ... WITH MAX_QUERIES_PER_HOUR N1
MAX_UPDATES_PER_HOUR N2
MAX_CONNECTIONS_PER_HOUR N3;
Можно указать любое сочетание приведенных выше ресурсов. N1, N2 и N3 являются
целыми числами, представляющими собой значения количеств
запросов/обновлений/соединений в час.
Если пользователь в течение часа достигает предела любого из вышеуказанных
значений, его соединение будет прервано с выдачей соответствующего сообщения об
ошибке.
Текущие значения для определенного пользователя могут быть сброшены
(установлены в нуль), если воспользоваться оператором GRANT
с любым
из приведенных выше пунктов, включая оператор GRANT
с текущими
значениями.
Кроме того, текущие значения для всех пользователей сбрасываются, если
производится перезагрузка привилегий (на сервере или при использовании команды
mysqladmin reload
) или если выполняется команда FLUSH
USER_RESOURCES
.
Эта функция включается сразу после того, как на пользователя будут наложены
ограничения при помощи команды GRANT
.
Необходимым условием для включения данной функции является наличие в таблице
user
базы данных mysql
дополнительного столбца, как
это определено в скриптах создания таблиц mysql_install_db
и
mysql_install_db.sh
в подкаталоге scripts
.
Задание паролей
В большинстве случаев для задания пользователей и их паролей следует
пользоваться командой GRANT
, поэтому приведенная ниже информация
предназначена для опытных пользователей.
В примерах, приведенных в предыдущих разделах, демонстрируется важный
принцип, который заключается в следующем: при сохранении непустых паролей с
использованием операторов INSERT
или UPDATE
для их
шифрования должна применяться функция PASSWORD()
. Это делается
потому, что в таблице user
пароли хранятся в зашифрованном виде, а
не как простой текст. Предположим, что мы упустили это из виду и задали пароли
следующим образом:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;
В результате выполнения этих команд в таблице user будет сохранено значение
пароля biscuit
в виде простого текста. Когда пользователь
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'));
При использовании оператора SET PASSWORD
также необходимо
применять функцию 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
образом. Не следует полагать, что если ваши пароли для Unix и для MySQL
совпадают, то функция PASSWORD()
выдаст точно такой же результат
шифрования, как и файл паролей Unix.
колонтитулы в word 2007, 000000211111