Ограничение ресурсов пользователя
Начиная с 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 , поэтому приведенная ниже информация предназначена для опытных пользователей. См. раздел Синтаксис команд GRANT и REVOKE .
В примерах, приведенных в предыдущих разделах, демонстрируется важный принцип, который заключается в следующем: при сохранении непустых паролей с использованием операторов 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. Cм. раздел Имена пользователей MySQL и пароли .
1 2 3 4 5 6 7
8 8 8
|