пятница, 20 января 2012 г.

MySQL. Два способа создания аккаунтов/пользователей


Вы можете создать MySQL пользователей двумя способами: С помощью операторов предназначенных для создания аккаунтов, таких как  CREATE USER или GRANT. Эти операторы позволяют вносить в таблицу привилегий соответствующие изменения. И прямыми манипуляциями в MySQL таблицах привилегий с помощью операторов  INSERT, UPDATE, или DELETE.

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


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

Приведенные ниже примеры покажут как использовать программу MySQL клиента, для  создания новых учетных записей. В этих примерах предполагается что привилегии пользователей были созданы в соответствии с настройками по умолчанию. Это означает, что для внесения изменений необходимо подключится к серверу MySQL от имени root пользователя, при этом root должен иметь привилегии INSERT для базы данных mysql и административные привилегии RELOAD.

Для начала запустите MySQL терминал и войдите в оболочку от имени главного пользовтеля 'root':
shell> mysql --user=root mysql
Если пользователь root защищен паролем, вам понадобиться передать также и пароль, с помощью параметра --password или -p.

После подключения к MySQL серверу вы можете создавать новых пользователей. Следующие операторы используют команду GRANT для создания и настройки 4 пользователей:
  1. mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
  2. mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
  3.     ->     WITH GRANT OPTION;
  4. mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
  5. mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
  6.     ->     WITH GRANT OPTION;
  7. mysql> CREATE USER 'admin'@'localhost';
  8. mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
  9. mysql> CREATE USER 'dummy'@'localhost';
Аккаунты созданные этими операторами имеют следующие характеристики:

Два из созданных аккаунтов имеют имя monty и пароль some_pass. Оба эти аккаунты являются супер-пользователями, имеют все привилегии и могут делать что угодно. Аккаунт 'monty'@'localhost' может использоваться только при подключении с localhost. Аккаунт 'monty'@'%' использует специальный параметр '%' вместо адреса хоста, благодаря этому он может подключатся к серверу с любого адреса.

Аккаунту 'admin'@'localhost' не задан пароль. Этот аккаунт может использоваться только администратором и только с локального хоста. Ему разрешены административные операторы RELOAD и PROCESS. Эти привилегии позволяют администратору выполнять команды: mysqladmin reload, mysqladmin refresh, и mysqladmin flush-xxx, а также mysqladmin processlist . Но этот пользователь не имеет никаких привилегий для управления любой из баз данных. Мы добавим эти привилегии позже используя немного другие GRANT операторы.

Аккаунту 'dummy'@'localhost' не задан пароль. Это значит что он может быть использован, при подключении, только с localhost. Ему не даны никакие привилегии. Мы присвоим ему эти привилегии чуть позже.

Для того чтобы проверить права или привилегии аккаунта, используйте следующую команду SHOW GRANTS:
mysql> SHOW GRANTS FOR 'admin'@'localhost';
  1. +-----------------------------------------------------+
  2. | Grants for admin@localhost                          |
  3. +-----------------------------------------------------+
  4. | GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
  5. +-----------------------------------------------------+
Как альтернативу к  CREATE USER и GRANT, вы можете создать те же аккаунты вручную, используя оператор INSERT при этом в конце обязательно нужно вызвать команду перегрузки привилегий используя FLUSH PRIVILEGES:
  1. shell> mysql --user=root mysql
  2. mysql> INSERT INTO user
  3.     ->     VALUES('localhost','monty',PASSWORD('some_pass'),
  4.     ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
  5. mysql> INSERT INTO user
  6.     ->     VALUES('%','monty',PASSWORD('some_pass'),
  7.     ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
  8.     ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
  9.     ->     '','','','',0,0,0,0);
  10. mysql> INSERT INTO user SET Host='localhost',User='admin',
  11.     ->     Reload_priv='Y', Process_priv='Y';
  12. mysql> INSERT INTO user (Host,User,Password)
  13.     ->     VALUES('localhost','dummy','');
  14. mysql> FLUSH PRIVILEGES;
Функция PASSWORD() была использована в операторе INSERT для шифрования пароля. Оператор CREATE USER автоматически шифрует для вас пароли, так что функция PASSWORD() для него не нужна.

Значение 'Y' включает привилегии для аккаунта. в зависимости от вашей версии MySQL, вы можете иметь разное количество значений 'Y' в первых двух операторах INSERT. Оператор INSERT для администратора работает с более читабельным расширением  INSERT синтаксиса -используя оператор SET.

Оператор INSERT для пользователя dummy, имеет значения только для полей  Host, User, и Password. Для него не заданны поля с привилегиями, так что MySQL добавит их автоматически с значением по умолчанию 'N'.

Для создания супер-пользователя, необходимо выполнить INSERT с значениями 'Y' во всех полях что отвечают за привилегии пользователя.

В следующих примерах мы создадим троих пользователей и дадим им доступ только к определенным базам данных.
Для создания пользователей с помощью CREATE USER и GRANT, используйте следующие команды:
  1. shell> mysql --user=root mysql
  2. mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'obscure';
  3.     ->     ON bankaccount.*
  4.     ->     TO 'custom'@'localhost';
  5. mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'obscure';
  6.     ->     ON expenses.*
  7.     ->     TO 'custom'@'host47.example.com';
  8. mysql> CREATE USER 'custom'@'server.domain' IDENTIFIED BY 'obscure';
  9.     ->     ON customer.*
  10.     ->     TO 'custom'@'server.domain';
Первый аккаунт имеет доступ к базе данных bankaccount, но только с localhost.
Второй аккаунт имеет доступ к базе данных expenses, но только с хоста host47.example.com.
Третий аккаунт имеет доступ к базе данных customer, но только с хоста server.domain.

Для создания этих же аккаунтов без операторов GRANT, используйте INSERT в следующем виде:
  1. shell> mysql --user=root mysql
  2. mysql> INSERT INTO user (Host,User,Password)
  3.     ->     VALUES('localhost','custom',PASSWORD('obscure'));
  4. mysql> INSERT INTO user (Host,User,Password)
  5.     ->     VALUES('host47.example.com','custom',PASSWORD('obscure'));
  6. mysql> INSERT INTO user (Host,User,Password)
  7.     ->     VALUES('server.domain','custom',PASSWORD('obscure'));
  8. mysql> INSERT INTO db
  9.     ->     (Host,Db,User,Select_priv,Insert_priv,
  10.     ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
  11.     ->     VALUES('localhost','bankaccount','custom',
  12.     ->     'Y','Y','Y','Y','Y','Y');
  13. mysql> INSERT INTO db
  14.     ->     (Host,Db,User,Select_priv,Insert_priv,
  15.     ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
  16.     ->     VALUES('host47.example.com','expenses','custom',
  17.     ->     'Y','Y','Y','Y','Y','Y');
  18. mysql> INSERT INTO db
  19.     ->     (Host,Db,User,Select_priv,Insert_priv,
  20.     ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
  21.     ->     VALUES('server.domain','customer','custom',
  22.     ->     'Y','Y','Y','Y','Y','Y');
  23. mysql> FLUSH PRIVILEGES;
Три первых INSERT оператора добавляют записи в таблицу пользователей, которые позволят пользователю custom подключатся с разных хостов с заданным паролем. Но он не имеет никаких глобальных привилегий (все привилегии были выставлены по умолчанию в значение 'N'). следующие три INSERT оператора добавляют записи в таблицу db, которые изменят привилегии для пользователя custom в базах данных bankaccount, expenses, и customer, но только при подключении с определенных хостов. Всегда когда вы меняете привилегии пользователей вручную,вы должны выполнить в конце команду обновления прав пользователей FLUSH PRIVILEGES, только после этого ваши изменения вступят в силу.

Для создания пользователя который может подключатся со всех машин определенного домена (например: mydomain.com), вы можете использовать параметр “%” для части имени в которой указывается хост:
mysql> CREATE USER 'myname'@'%.mydomain.com' IDENTIFIED BY 'mypass';
Если вы делаете все в ручном режиме. то для того же результата вам нужно испольнить:
  1. mysql> INSERT INTO user (Host,User,Password,...)
  2.     ->     VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...);
  3. mysql> FLUSH PRIVILEGES;