- Предоставление доступа пользователю MySQL
- Наследование привилегий
- Доступ к таблице
- Доступ к столбцу
- Управление учетными записями пользователей MySQL
- 4.3.1. Синтаксис команд GRANT и REVOKE
- 4.3.2. Имена пользователей MySQL и пароли
- 4.3.3. Когда изменения в привилегиях вступают в силу
- 4.3.4. Задание изначальных привилегий MySQL
- 4.3.5. Добавление новых пользователей в MySQL
- 4.3.6. Ограничение ресурсов пользователя
- 4.3.7. Задание паролей
- 4.3.8. Обеспечение безопасности своего пароля
- 4.3.9. Использование безопасных соединений
- 4.3.9.1. Основные сведения
- 4.3.9.2. Требования
- 4.3.9.3. Создание SSL-сертификатов
- 4.3.9.4. Параметры команды GRANT
- Просмотр привилегий пользователей MySQL
- Проверка текущих полномочий пользователя
- Проверка полномочий к данным
- Просмотр привилегий через системную БД mysql
- Просмотр глобальных привилегий
Предоставление доступа пользователю MySQL
Доступ предоставляется командой:
GRANT SELECT ON `some_db`.* TO 'some_user'@'somehost.somedomain';
FLUSH PRIVILEGES;Создадим пользователя и БД (часто БД называют схемой, в терминах MySQL):
CREATE SCHEMA test_DB;
CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'secret';Команда для предоставления доступа будет выглядеть так:
GRANT SELECT ON `test_db`.* TO 'test_user'@'localhost';
FLUSH PRIVILEGES;Наследование привилегий
В предыдущем примере наш пользователь сможет только читать данные из базы test_db, но передать свои права другому пользователю не сможет. Используя GRANT OPTION, мы можем позволить ему сделать это. Тогда пользователь получит возможность передавать другим то, что разрешено ему самому.
GRANT SELECT, INSERT, UPDATE, DELETE ON `some_db`.* TO 'some_user'@'somehost' WITH GRANT OPTION;Из соображений безопасности использовать GRANT OPTION небезопасно! В случае компрометации учетной записи злоумышленник сможет не только получить доступ к данным, но и сделать закладку в виде копии учетной записи.
Доступ к таблице
Примеры выше дают доступ ко всей БД. Часто доступ должен быть ограничен строго определенным набором таблиц:
GRANT SELECT ON `test_db`.`table_users` TO 'test_user'@'localhost';Выполнение команды приведет к ошибке, т.к. этой таблицы еще нет.
CREATE TABLE `test_db`.`table_users` (id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(16) NOT NULL, password VARCHAR(32));и повторим предоставление доступа:
GRANT SELECT ON `test_db`.`table_users` TO 'test_user'@'localhost';Доступ к столбцу
Предоставляется перечислением столбцов:
GRANT SELECT (id, user_name), UPDATE (user_name) ON `test_db`.`table_users` TO 'test_user'@'localhost';В этом примере пользователю дано право читать идентификатор, читать и менять имя пользователя, а парольный хэш доступен не будет.
Управление учетными записями
пользователей MySQL
- 4.3.1. Синтаксис команд
GRANTи
REVOKE - 4.3.2. Имена пользователей MySQL и пароли
- 4.3.3. Когда изменения в привилегиях вступают
в силу - 4.3.4. Задание изначальных привилегий MySQL
- 4.3.5. Добавление новых пользователей в MySQL
- 4.3.6. Ограничение ресурсов пользователя
- 4.3.7. Задание паролей
- 4.3.8. Обеспечение безопасности своего
пароля - 4.3.9. Использование безопасных соединений
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] 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...] GRANT включен в MySQL начиная
с версии 3.22.11 и выше. В более ранних
версиях MySQL оператор GRANT
ничего не выполняет.
Команды GRANT и
REVOKE позволяют системным
администраторам создавать
пользователей MySQL, а также
предоставлять права пользователям
или лишать их прав на четырех
уровнях привилегий:
Глобальный
уровеньУровень базы
данныхПривилегии базы данных
применяются ко всем таблицам
указанной базы данных. Эти
привилегии хранятся в таблицах
mysql.dbи
mysql.host.Уровень
таблицыПривилегии таблицы применяются
ко всем столбцам указанной
таблицы. Эти привилегии хранятся
в таблицеmysql.tables_priv.Уровень
столбцаПривилегии столбца применяются
к отдельным столбцам указанной
таблицы. Эти привилегии хранятся
в таблицеmysql.columns_priv.
Если привилегии предоставляются
пользователю, которого не
существует, то этот пользователь
создается. Чтобы просмотреть
примеры работы команды
GRANT, см. раздел
Раздел 4.3.5, «Добавление новых пользователей в MySQL».
В таблице приведен список
возможных значений параметра
priv_type для операторов
GRANT и REVOKE:
Значение USAGE можно
задавать, если необходимо создать
пользователя без привилегий.
В боле старых версиях MySQL
привилегия PROCESS
предоставляет такие же права, как и
новая привилегия SUPER.
Чтобы лишить пользователя
привилегий, предоставленных
командой GRANT,
воспользуйтесь значением
priv_type в GRANT OPTION:
mysql> REVOKE GRANT OPTION ON ... FROM ...; Для таблицы можно указать только
следующие значения
priv_type: SELECT,
INSERT, UPDATE,
DELETE, CREATE,
DROP, GRANT OPTION,
INDEX и ALTER.
Для столбца можно указать только
следующие значения priv_type
(при использовании оператора
column_list): SELECT,
INSERT и UPDATE.
Глобальные привилегии можно
задать, воспользовавшись
синтаксисом ON *.*, а
привилегии базы данных — при помощи
синтаксиса ON db_name.*. Если
указать ON * при открытой
текущей базе данных, то привилегии
будут заданы для этой базы данных.
(:
если указать ON * при
открытой текущей базы данных, это
повлияет на глобальные
привилегии!)
Чтобы проверить, происходит ли
подобное на вашем компьютере,
выполните следующий запрос:
mysql> SELECT Host,User FROM mysql.user WHERE User=''; На данный момент команда
GRANT поддерживает имена
удаленных компьютеров, таблиц, баз
данных и столбцов длиной не более 60
символов. Имя пользователя должно
содержать не более 16 символов.
Привилегии для столбца могут быть
вычислены следующим образом:
глобальные привилегии OR (привилегии базы данных AND привилегии удаленного компьютера) OR привилегии таблицы OR привилегии столбца
В большинстве случаев права
пользователя определяются только
на одном уровне привилегий,
поэтому обычно эта процедура не
настолько сложна, как описано выше.
Подробная информация о
последовательности действий
проверки привилегий представлена
в разделе Раздел 4.2, «Общие проблемы безопасности и система
привилегий доступа MySQL».
Если в MySQL версий 3.22.12 и выше создан
новый пользователь или
предоставлены глобальные
привилегии, пароль пользователя
будет назначаться оператором
IDENTIFIED BY, если он указан.
Если у пользователя уже есть
пароль, то этот пароль будет
заменен новым.
Если вы не хотите отправлять
пароль открытым текстом, можно
воспользоваться параметром
PASSWORD с зашифрованным
паролем, полученным при помощи
функции SQL PASSWORD() или
функции C API make_scrambled_password(char *to,.
const char *password)
:
если при создании нового
пользователя не указать оператор
IDENTIFIED BY, будет создан
пользователь без пароля. Это
ненадежно с точки зрения
безопасности.
Пароли также можно задавать при
помощи команды SET PASSWORD. See
Раздел 6.2.3.4, «Тип множества SET».
Если у вас привилегии для базы
данных, то при необходимости в
таблице mysql.db создается
запись. Данная запись удаляется
после удаления всех привилегий для
этой базы данных командой
REVOKE.
Если у пользователя нет никаких
привилегий для таблицы, то таблица
не отображается, когда
пользователь запрашивает список
таблиц (например, при помощи
оператора SHOW TABLES).
Оператор WITH GRANT OPTION
предоставляет пользователю
возможность наделять других
пользователей любыми
привилегиями, которые он сам имеет
на указанном уровне привилегий.
При предоставлении привилегии
GRANT необходимо проявлять
осмотрительность, так как два
пользователя с разными
привилегиями могут объединить
свои привилегии!
Параметры MAX_QUERIES_PER_HOUR #,
MAX_UPDATES_PER_HOUR # и
MAX_CONNECTIONS_PER_HOUR # являются
новыми в MySQL версии 4.0.2. Эти
параметры ограничивают количество
запросов, обновлений и входов,
которые пользователь может
осуществить в течение одного часа.
Если установлено значение 0
(принято по умолчанию), то это
означает, что для данного
пользователя нет ограничений. See
Раздел 4.3.6, «Ограничение ресурсов пользователя».
Нельзя предоставить другому
пользователю привилегию, которой
нет у вас самого. Привилегия
GRANT позволяет
предоставлять только те
привилегии, которыми вы обладаете.
Учтите, что если пользователю
назначена привилегия GRANT
на определенном уровне привилегий,
то все привилегии, которыми этот
пользователь уже обладает (или
которые будут ему назначены в
будущем!) на этом уровне, также
могут назначаться этим
пользователем. Предположим,
пользователю назначена привилегия
INSERT в базе данных. Если
потом в базе данных назначить
привилегию SELECT и указать
WITH GRANT OPTION, пользователь
сможет назначать не только
привилегию SELECT, но также
и INSERT. Если затем в базе
данных предоставить пользователю
привилегию UPDATE,
пользователь сможет после этого
назначать INSERT,
SELECT и UPDATE.
Не следует назначать привилегии
ALTER обычным
пользователям. Это дает
пользователю возможность
разрушить систему привилегий
путем переименования таблиц!
Обратите внимание на то, что если
используются привилегии для
таблицы или столбца даже для
одного пользователя, сервер
проверяет привилегии таблиц и
столбцов для всех пользователей, и
это несколько замедляет работу MySQL.
Наиболее значительные отличия
команды GRANT версий ANSI SQL и
MySQL следующие:
В MySQL привилегии назначаются для
сочетания имя пользователя +
удаленный компьютер, а не только
для имени пользователя.В ANSI SQL отсутствуют глобальные
привилегии и привилегии уровня
базы данных, и ANSI SQL поддерживает
не все типы привилегий MySQL. В свою
очередь, в MySQL отсутствует
поддержка привилегий ANSI SQL
TRIGGER,UNDER.Структура привилегий ANSI SQL
является иерархической. Если
удалить пользователя, то все
назначенные этому
пользователелю привилегии будут
отменены. В MySQL назначенные
привилегии не отменяются
автоматически, их при
необходимости требуется удалять
самостоятельно.В MySQL пользователь может
применять к таблице оператор
INSERTпри наличии у него
привилегииINSERTтолько
для нескольких столбцов в этой
таблице. Столбцы, для которых
отсутствует привилегия
INSERT, будут установлены
в свои значения, принятые по
умолчанию. В ANSI SQL требуется
наличие привилегии
INSERTдля всех столбцов.При удалении таблицы в ANSI SQL все
привилегии для этой таблицы
будут отменены. Если отменить
привилегию в ANSI SQL, то все
привилегии, которые были
назначены на основе этой
привилегии, также будут
отменены. В MySQL привилегии могут
удаляться только при помощи
командыREVOKEили путем
изменения таблиц назначения
привилегий MySQL.
Чтобы ознакомиться с описанием
использования REQUIRE, см.
раздел See Раздел 4.3.9, «Использование безопасных соединений».
4.3.2. Имена пользователей MySQL и пароли
Между MySQL и Unix или Windows существует
несколько различий в
использовании имен пользователей
и паролей:
Имена пользователей MySQL могут
содержать до 16 символов. Имена
пользователей Unix обычно
ограничены 8 символами.Пароли MySQL не имеют никакого
отношения к паролям Unix. Не
существует связи между паролем,
который используется для входа в
Unix, и паролем, необходимым для
доступа к базе данных.MySQL шифрует пароли при помощи
своего алгоритма, который
отличается от алгоритма Unix,
используемого во время входа в
систему. Описание функций
PASSWORD()и
ENCRYPT()можно найти в
разделе See
Раздел 6.3.6.2, «Разные функции». Обратите
внимание: даже если ваш пароль
хранится в ‘зашифрованном виде’,
то знания этого ‘зашифрованного’
пароля будет достаточно, чтобы
подсоединиться к серверу MySQL!
Пользователи MySQL и их привилегии
обычно создаются при помощи
команды GRANT. See
Раздел 4.3.1, «Синтаксис команд GRANT и
REVOKE».
Если подсоединение к серверу MySQL
осуществляется с клиента
командной строки, необходимо
указать пароль при помощи
параметра --password=your-password.
See Раздел 4.2.8, «Соединение с сервером 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
немедленно.
Когда сервер замечает, что были
внесены изменения в таблицы
назначения привилегий, он
обрабатывает установленные
соединения клиентов следующим
образом:
Изменения привилегий таблиц и
столбцов вступают в силу при
следующем запросе клиентаИзменения привилегий баз данных
вступают в силу при следующем
использовании командыUSE
db_nameИзменения глобальных привилегий
и изменения пароля вступают в
силу при следующем
подсоединении пользователя.
4.3.4. Задание изначальных привилегий MySQL
После установки MySQL изначальные
привилегии доступа задаются при
помощи scripts/mysql_install_db. See
Раздел 2.3.1, «Обзор быстрой установки». Скрипт
mysql_install_db запускает
сервер mysqld, а затем
инициализирует таблицы
предоставления привилегий со
следующим набором привилегий:
В качестве суперпользователя
создается MySQLroot
который может делать все, что
угодно. Соединения должны
устанавливаться с локального
компьютера.:
Изначально парольroot
пуст, поэтому кто угодно может
подсоединиться в качестве
rootбез
пароля и получить все
привилегии.Создается анонимный
пользователь, который может
выполнять любые операции над
базами данных с именами
testили начинающимися с
test_. Соединения должны
устанавливаться с локального
компьютера. Это означает, что
любой локальный пользователь
может подключиться без пароля и
будет воспринят сервером как
анонимный пользователь.
: В
Windows принятые по умолчанию
привилегии отличаются от
указанных. See Раздел 2.6.2.3, «Работа MySQL в среде Windows».
Поскольку сразу после установки
программа совершенно не защищена,
первым делом необходимо задать
пароль для пользователя MySQL
root. Это можно сделать
следующим образом (обратите
внимание, что пароль указывается
при помощи функции
PASSWORD()):
shell>mysql -u root mysqlmysql>SET PASSWORD FOR root@localhost=PASSWORD('new_password');
Опытные пользователи могут
работать непосредственно с
таблицами назначения привилегий:
shell>mysql -u root mysqlmysql>UPDATE user SET Password=PASSWORD('new_password')->WHERE user='root';mysql>FLUSH PRIVILEGES;
shell> mysqladmin -u root password new_password Изменять пароли других
пользователей могут только
пользователи с правом
записи/обновления базы данных
mysql. Все обычные
пользователи (не анонимные) могут
модифицировать только свой
собственный пароль при помощи
указанных выше команд или команды
SET PASSWORD=PASSWORD('new_password').
После того, как был задан пароль
root, этот пароль
необходимо будет вводить,
подсоединяясь к серверу как
root.
Можно оставить пароль root
пустым, тогда не придется его
указывать во время проведения
дополнительных установок и
тестирования. Тем не менее,
обязательно укажите его, прежде
чем использовать сервер для любой
реальной работы.
Ознакомьтесь со скриптом
scripts/mysql_install_db, чтобы
увидеть, как задавать привилегии
по умолчанию. Данный скрипт можно
использовать как основу для
добавления других пользователей.
Если необходимо, чтобы изначальные
привилегии отличались от
указанных выше, можно изменить
базу mysql_install_db еще до ее
запуска.
Чтобы полностью заново создать
таблицы предоставления
привилегий, удалите все файлы с
расширениями .frm,
.MYI и .MYD в
каталоге, где находится база
данных mysql (это каталог с
именем mysql в каталоге
базы данных, который выводится на
экран при запуске команды mysqld). Затем запустите скрипт
--help
mysql_install_db (возможно,
после добавления в него
необходимых привилегий).
: в
более старых, чем 3.22.10, версиях MySQL
файлы с расширением .frm
удалять не следует. Если же
случайно они были удалены, их
следует восстановить, скопировав
из дистрибутива MySQL до запуска
mysql_install_db.
4.3.5. Добавление новых пользователей в MySQL
Пользователей можно добавлять
двумя различными способами — при
помощи команды GRANT или
напрямую в таблицы назначения
привилегий MySQL. Предпочтительнее
использовать команду GRANT
— этот способ проще и дает меньше
ошибок. See Раздел 4.3.1, «Синтаксис команд GRANT и
REVOKE».
В приведенных ниже примерах
демонстрируется, как использовать
клиент mysql для задания
новых пользователей. В примерах
предполагается, что привилегии
установлены в соответствии с
принятыми по умолчанию значениями,
описанными в предыдущем разделе.
Это означает, что для внесения
изменений на том же компьютере, где
запущен mysqld, необходимо
подсоединиться к серверу как
пользователь MySQL root, и у
пользователя root должна
быть привилегия INSERT для
базы данных mysql, а также
административная привилегия
RELOAD. Кроме того, если был
изменен пароль пользователя
root, его необходимо
указать здесь для команды
mysql.
Новых пользователей можно
добавлять, используя команду
GRANT:
shell>mysql --user=root mysqlmysql>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 создают
трех новых пользователей:
Пользователь, который может
подсоединяться к серверу без
пароля, но только с локального
компьютера. Все глобальные
привилегии установлены в
значение'N'-тип
привилегииUSAGE,
который позволяет создавать
пользователей без привилегий.
Предполагается, что относящиеся
к базам данных привилегии будут
назначены позже.
Можно напрямую добавить точно
такую же информацию о пользователе
при помощи оператора
INSERT, а затем дать серверу
команду перезагрузить таблицы
назначения привилегий:
shell>mysql --user=root mysqlmysql>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;
В приведенном ниже примере
добавляется пользователь
custom, который может
подсоединяться с компьютеров
localhost, server.domain
и whitehouse.gov. Он хочет
получать доступ к базе данных
bankaccount только с
компьютера localhost, к базе
данных expenses — только с
whitehouse.gov, и к базе данных
customer — со всех трех
компьютеров, а также использовать
пароль stupid при
подсоединении со всех трех
компьютеров.
Чтобы задать эти привилегии
пользователя при помощи оператора
GRANT, выполните следующие
команды:
shell>mysql --user=root mysqlmysql>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 mysqlmysql>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;
Если необходимо предоставить
определенному пользователю доступ
с любого компьютера к
определенному домену, можно
воспользоваться оператором
GRANT следующим образом:
mysql>GRANT ...->ON *.*->TO myusername"%.mydomainname.com"->IDENTIFIED BY 'mypassword';
Чтобы сделать то же самое путем
непосредственного внесения
изменений в таблицы назначения
привилегий, выполните следующие
действия:
mysql>INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',->PASSWORD('mypassword'),...);mysql>FLUSH PRIVILEGES;
4.3.6. Ограничение ресурсов пользователя
Начиная с MySQL версии 4.0.2 можно
ограничивать определенные
ресурсы, выделяемые пользователям.
На уровне отдельного пользователя
теперь введено управление
следующими тремя ресурсами:
Количество всех запросов в час:
все команды, которые может
запускать пользователь.Количество всех обновлений в
час: любая команда, которая
изменяет таблицу или базу
данных.Количество соединений,
сделанных за час: новые
соединения, открытые за час.
По умолчанию все пользователи не
ограничены в использовании
указанных выше ресурсов только в
случае, только если эти
ограничения не наложены на них.
Данные ограничения могут быть
наложены
при помощи глобальной команды
GRANT (*.*) с использованием
следующего синтаксиса:
GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3;
Можно указать любое сочетание
приведенных выше ресурсов. N1, N2 и N3
являются целыми числами,
представляющими собой значения
количеств
запросов/обновлений/соединений в
час.
Если пользователь в течение часа
достигает предела любого из
вышеуказанных значений, его
соединение будет прервано с
выдачей соответствующего
сообщения об ошибке.
Текущие значения для
определенного пользователя могут
быть сброшены (установлены в нуль),
если воспользоваться оператором
GRANT с любым из
приведенных выше пунктов, включая
оператор GRANT с текущими
значениями.
Эта функция включается сразу после
того, как на пользователя будут
наложены ограничения при помощи
команды GRANT.
4.3.7. Задание паролей
В большинстве случаев для задания
пользователей и их паролей следует
пользоваться командой
GRANT, поэтому приведенная
ниже информация предназначена для
опытных пользователей. See
Раздел 4.3.1, «Синтаксис команд GRANT и
REVOKE».
shell>mysql -u root mysqlmysql>INSERT INTO user (Host,User,Password)->VALUES('%','jeffrey','biscuit');mysql>FLUSH PRIVILEGES;
shell> mysql -u jeffrey -pbiscuit testAccess deniedmysql>INSERT INTO user (Host,User,Password)->VALUES('%','jeffrey',PASSWORD('biscuit'));
При использовании оператора
SET PASSWORD также необходимо
применять функцию PASSWORD():
mysql> SET PASSWORD FOR jeffrey"%" = PASSWORD('biscuit');mysql> GRANT USAGE ON *.* TO jeffrey"%" IDENTIFIED BY 'biscuit';shell> mysqladmin -u jeffrey password biscuit Примечание: Функция
PASSWORD() шифрует пароли
отличным от Unix образом. Не следует
полагать, что если ваши пароли для
Unix и для MySQL совпадают, то функция
PASSWORD() выдаст точно такой
же результат шифрования, как и файл
паролей Unix. See Раздел 4.3.2, «Имена пользователей MySQL и пароли».
4.3.8. Обеспечение безопасности своего
пароля
Не рекомендуется указывать пароль
таким образом, чтобы его могли
подобрать другие пользователи.
Ниже приведены методы, которыми
можно пользоваться при задании
своего пароля при запуске
указанных клиентских программ, а
также степенью риска для каждого
из методов:
Использование параметров
-pyour_passили
--password=your_passв командной
строке удобно, но не очень
безопасно, так как ваш пароль
становится видимым для
системных статусных утилит
(таких какps), и другие
пользователи могут просмотреть
командные строки (во время
запуска клиенты MySQL обычно
перезаписывают аргументы
командной строки нулями, но
существует небольшой промежуток
времени, на протяжении которого
значение остается видимым).Используйте параметр
-pили--password
(без указания значения
your_pass). В этом случае
программа клиента запрашивает
пароль с терминала:shell>
mysql -u user_name -pEnter password: ********Ваш пароль будет представлен
символами ‘*’.Вводить пароль таким образом
намного безопаснее, чем из
командной строки, поскольку он
невидим для остальных
пользователей. Тем не менее, этот
метод подходит только для тех
программ, которые вы запускаете
самостоятельно. Если клиент
требуется запустить из скрипта,
то возможности ввести пароль с
терминала не будет. В некоторых
системах первая строка скрипта
считывается и неправильно
распознается как ваш пароль![client] password=your_pass
Если пароль хранится в
.my.cnf, файл не должен
быть доступен для чтения или
записи для всех или для
отдельных групп пользователей.
Убедитесь, что права доступа к
файлу установлены в 400 или 600.Можно хранить свой пароль в
переменной окружения
MYSQL_PWD, но этот метод
считается очень небезопасным и
не должен использоваться. В
некоторые версии ps включена
возможность отображать
переменные окружения
работающего процесса. Поэтому
если задать свой пароль при
помощиMYSQL_PWD, он будет
виден для всех,. Даже в системах
без такой версииps,
неразумно предполагать, что не
существует другого метода
получить информацию по
переменным окружения. See
Приложение F, Переменные окружения.
Исходя из всего сказанного выше,
самыми безопасными методами
указания пароля являются запрос
программы клиента на ввод пароля с
терминала или указание пароля в
защищенном надлежащим образом
файле .my.cnf.
4.3.9. Использование безопасных соединений
- 4.3.9.1. Основные сведения
- 4.3.9.3. Создание SSL-сертификатов
- 4.3.9.4. Параметры команды
GRANT
4.3.9.1. Основные сведения
MySQL поддерживает шифрованные
SSL-соединения. Для лучшего
понимания того, как в MySQL
используется SSL, мы приводим здесь
основные сведения по SSL и X509.
Пользователи, которые уже знакомы
с данным протоколом и стандартом,
эту часть могут пропустить.
По умолчанию в MySQL используются
незашифрованные соединения между
клиентом и сервером. Это означает,
что просматривать все данные,
передаваемые между клиентом и
сервером, может кто угодно. На
практике можно даже изменять
данные во время передачи их от
клиента к серверу и наоборот.
Помимо того, иногда возникает
необходимость передать
действительно секретные данные
через общедоступную сеть — в таких
случаях использование
незашифрованных соединений
просто неприемлемо.
В протоколе SSL используются
различные алгоритмы шифрования,
обеспечивающие безопасность для
данных, передаваемых через
общедоступные сети. Этот протокол
содержит средства, позволяющие
обнаруживать любые изменения,
потери и повторы данных. В
протоколе SSL также применяются
алгоритмы для проведения
идентификации при помощи
стандарта X509.
Шифровка — это метод, позволяющий
сделать прочтение любых данных
невозможным. Фактически при
современном положении дел для
алгоритмов шифрования требуется
использование дополнительных
элементов безопасности. Они
должны обеспечивать
противодействие многим видам
известных на настоящий момент
атак, таких как изменение порядка
зашифрованных сообщений или
повторение данных.
Стандарт X509 позволяет
производить идентификацию в Internet.
Чаще всего он используется в
приложениях электронной
коммерции. Упрощенно схема его
применения выглядит следующим
образом: существует некая
организация под названием «Certificate
Authority» (можно перевести как
«Сертификационное Бюро». — Прим.
пер.), которая назначает
электронные сертификаты всем,
кому они нужны. Сертификаты
основываются на асимметричных
алгоритмах шифрования,
содержащих два ключа — публичный и
секретный. Владелец сертификата
может подтвердить свою личность,
предъявив свой сертификат другой
стороне. Сертификат состоит из
публичного ключа владельца. Любые
данные, зашифрованные при помощи
этого публичного ключа могут быть
расшифрованы только при помощи
соответствующего секретного
ключа, который находится у
владельца сертификата.
В MySQL по умолчанию не используется
шифрование при соединениях, так
как это значительно замедляет
обмен данными между клиентом и
сервером. Любые дополнительные
функции приводят к
дополнительной нагрузке для
компьютера, а шифрование данных
требует интенсивной работы
процессора, что может вызвать
задержку выполнения основных
задач MySQL. По умолчанию MySQL
настроен на максимально быструю
работу.
Если вы хотите получить
дополнительную информацию о
SSL/X509/шифровании, необходимо
воспользоваться своим любимым
поисковым сервером Internet и
произвести поиск по словам,
которые вас интересуют.
4.3.9.2. Требования
Для того чтобы SSL-соединения могли
работать с MySQL, необходимо
выполнить следующие действия:
Установите библиотеку OpenSSL.
Тестирование MySQL производилось
с библиотекой OpenSSL 0.9.6.
http://www.openssl.org/.Выполните настройку компиляции
MySQL (configure) при помощи
параметров--with-vio.
--with-opensslПроверить, скомпилирована ли в
запущенном сервере
mysqldбиблиотека OpenSSL
можно, убедившись, чтоSHOW
VARIABLES LIKE 'have_openssl'
показываетYES.
4.3.9.3. Создание SSL-сертификатов
Вот пример, как создаются
SSL-сертификаты для MySQL:
DIR=`pwd`/openssl PRIV=$DIR/private mkdir $DIR $PRIV $DIR/newcerts cp /usr/share/ssl/openssl.cnf $DIR replace ./demoCA $DIR -- $DIR/openssl.cnf # создаем необходимые файлы: $database, $serial и каталог $new_certs_dir # (опционально) touch $DIR/index.txt echo "01" > $DIR/serial # # Создаем Certificate Authority(CA) # openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \ -config $DIR/openssl.cnf # Пример вывода: # Using configuration from /home/monty/openssl/openssl.cnf # Generating a 1024 bit RSA private key # ................++++++ # .........++++++ # writing new private key to '/home/monty/openssl/private/cakey.pem' # Enter PEM pass phrase: # Verifying password - Enter PEM pass phrase: # ----- # You are about to be asked to enter information that will be incorporated # into your certificate request. # What you are about to enter is what is called a Distinguished Name or a DN. # There are quite a few fields but you can leave some blank # For some fields there will be a default value, # If you enter '.', the field will be left blank. # ----- # Country Name (2 letter code) [AU]:FI # State or Province Name (full name) [Some-State]:. # Locality Name (eg, city) []: # Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB # Organizational Unit Name (eg, section) []: # Common Name (eg, YOUR name) []:MySQL admin # Email Address []: # # Создаем server-request и ключ # openssl req -new -keyout $DIR/server-key.pem -out \ $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf # Пример вывода: # Using configuration from /home/monty/openssl/openssl.cnf # Generating a 1024 bit RSA private key # ..++++++ # ..........++++++ # writing new private key to '/home/monty/openssl/server-key.pem' # Enter PEM pass phrase: # Verifying password - Enter PEM pass phrase: # ----- # You are about to be asked to enter information that will be incorporated # into your certificate request. # What you are about to enter is what is called a Distinguished Name or a DN. # There are quite a few fields but you can leave some blank # For some fields there will be a default value, # If you enter '.', the field will be left blank. # ----- # Country Name (2 letter code) [AU]:FI # State or Province Name (full name) [Some-State]:. # Locality Name (eg, city) []: # Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB # Organizational Unit Name (eg, section) []: # Common Name (eg, YOUR name) []:MySQL server # Email Address []: # # Please enter the following 'extra' attributes # to be sent with your certificate request # A challenge password []: # An optional company name []: # # Удаляем парольную фразу из ключа (опционально) # openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem # # Подписываем сертификат сервера # openssl ca -policy policy_anything -out $DIR/server-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/server-req.pem # Пример вывода: # Using configuration from /home/monty/openssl/openssl.cnf # Enter PEM pass phrase: # Check that the request matches the signature # Signature ok # The Subjects Distinguished Name is as follows # countryName :PRINTABLE:'FI' # organizationName :PRINTABLE:'MySQL AB' # commonName :PRINTABLE:'MySQL admin' # Certificate is to be certified until Sep 13 14:22:46 2003 GMT (365 days) # Sign the certificate? [y/n]:y # # # 1 out of 1 certificate requests certified, commit? [y/n]y # Write out database with 1 new entries # Data Base Updated # # Создаем client request и ключ # openssl req -new -keyout $DIR/client-key.pem -out \ $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf # Пример вывода: # Using configuration from /home/monty/openssl/openssl.cnf # Generating a 1024 bit RSA private key # .....................................++++++ # .............................................++++++ # writing new private key to '/home/monty/openssl/client-key.pem' # Enter PEM pass phrase: # Verifying password - Enter PEM pass phrase: # ----- # You are about to be asked to enter information that will be incorporated # into your certificate request. # What you are about to enter is what is called a Distinguished Name or a DN. # There are quite a few fields but you can leave some blank # For some fields there will be a default value, # If you enter '.', the field will be left blank. # ----- # Country Name (2 letter code) [AU]:FI # State or Province Name (full name) [Some-State]:. # Locality Name (eg, city) []: # Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB # Organizational Unit Name (eg, section) []: # Common Name (eg, YOUR name) []:MySQL user # Email Address []: # # Please enter the following 'extra' attributes # to be sent with your certificate request # A challenge password []: # An optional company name []: # # Удаляем парольную фразу из ключа (опционально) # openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem # # Подписываем клиентский сертификат # openssl ca -policy policy_anything -out $DIR/client-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/client-req.pem # Пример вывода: # Using configuration from /home/monty/openssl/openssl.cnf # Enter PEM pass phrase: # Check that the request matches the signature # Signature ok # The Subjects Distinguished Name is as follows # countryName :PRINTABLE:'FI' # organizationName :PRINTABLE:'MySQL AB' # commonName :PRINTABLE:'MySQL user' # Certificate is to be certified until Sep 13 16:45:17 2003 GMT (365 days) # Sign the certificate? [y/n]:y # # # 1 out of 1 certificate requests certified, commit? [y/n]y # Write out database with 1 new entries # Data Base Updated # # Создаем такой my.cnf, который позволит нам протестировать сертификаты # cnf="" cnf="$cnf [client]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/client-cert.pem" cnf="$cnf ssl-key=$DIR/client-key.pem" cnf="$cnf [mysqld]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/server-cert.pem" cnf="$cnf ssl-key=$DIR/server-key.pem" echo $cnf | replace " " ' ' > $DIR/my.cnf # # Тестируем MySQL mysqld --defaults-file=$DIR/my.cnf & mysql --defaults-file=$DIR/my.cnf
Вы также можете тестировать
сертификаты путем модификации
my.cnf таким образом,
чтобы использовать
демонстрационные сертификаты в
каталоге mysql-source-dist/SSL.
4.3.9.4. Параметры команды GRANT
Существует несколько
возможностей ограничить
соединения:
Если не указано никаких
параметров SSL/X509, а имя
пользователя и пароль указаны
правильно, то разрешены все
виды шифрованных и
нешифрованных соединений.Параметр
REQUIRE SSL
позволяет серверу
устанавливать только
зашифрованные при помощи
протокола SSL соединения.
Обратите внимание, что этот
параметр может быть
неприемлемым, если существуют
записи ACL, разрешающие не-SSL
соединения.mysql>
GRANT ALL PRIVILEGES ON test.* TO root@localhost->IDENTIFIED BY "goodsecret" REQUIRE SSL;REQUIRE X509означает, что
у клиента должен быть
действительный сертификат, но
мы не требуем наличия
определенного сертификата,
сертификата определенной фирмы
или темы. Единственное
ограничение — подпись должна
поддаваться проверке при
помощи одного из сертификатов
бюро сертификации.mysql>
GRANT ALL PRIVILEGES ON test.* TO root@localhost->IDENTIFIED BY "goodsecret" REQUIRE X509;REQUIRE ISSUER "issuer"делает
требования по соединению более
определенными: теперь клиент
должен предоставить
действительный сертификат X509,
выданный бюро сертификации (CA)
"issuer". Использование
сертификатов X509 всегда
означает применение
шифрования, поэтому параметр
SSLбольше не нужен.mysql>
GRANT ALL PRIVILEGES ON test.* TO root@localhost->IDENTIFIED BY "goodsecret"->REQUIRE ISSUER "C=FI, ST=Some-State, L=Helsinki,">O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com";REQUIRE SUBJECT "subject"
требует наличия у клиента
действительного сертификата X509
с содержащейся в нем темой
«subject». Если у клиента есть
действительный сертификат, но
другой «subject», то соединение не
будет установлено.mysql>
GRANT ALL PRIVILEGES ON test.* TO root@localhost->IDENTIFIED BY "goodsecret"->REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn,">O=MySQL demo client certificate,">CN=Tonu Samuel/Email=tonu@mysql.com";REQUIRE CIPHER "cipher"
требуется для обеспечения
достаточно сложных шифра и
длины ключа. Протокол SSL сам по
себе может быть ненадежным
из-за использования старых
алгоритмов с короткими ключами
шифрования. Воспользовавшись
этим параметром, мы можем
указать определенный метод
шифрования, разрешающий
соединение.mysql>
GRANT ALL PRIVILEGES ON test.* TO root@localhost->IDENTIFIED BY "goodsecret"->REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA";Разрешается также сочетать
SUBJECT,ISSUER,
CIPHERвREQUIRE,
например, так:mysql>
GRANT ALL PRIVILEGES ON test.* TO root@localhost->IDENTIFIED BY "goodsecret"->REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn,">O=MySQL demo client certificate,">CN=Tonu Samuel/Email=tonu@mysql.com"->AND ISSUER "C=FI, ST=Some-State, L=Helsinki,">O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com"->AND CIPHER "EDH-RSA-DES-CBC3-SHA";Начиная с MySQL 4.0.4, слово
ANDнеобязательно в
опцияхREQUIRE.Порядок опций не имеет
значения, но ни одна опция не
может быть указана дважды.
Просмотр привилегий пользователей MySQL
Часто возникает задача выяснить полномочия учетной записи или определить, кому дан доступ к базе или таблице. Остановимся на этом подробнее.
Проверка текущих полномочий пользователя
Нам пригодится команда:
SHOW GRANTS FOR 'someuser'@'somehost.somedomain';SHOW GRANTS FOR 'appuser'@'srv14.example.com';
+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for appuser@srv14.example.com |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'appuser'@'srv14.example.com' IDENTIFIED BY PASSWORD '*F4E0A7F0B10264F70558CF07A4ABD4E041182D6E' |
| GRANT SELECT ON `net_database`.* TO 'appuser'@'srv14.example.com' |
+--------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)Проверка полномочий к данным
Через read-only БД information_schema доступно множество метаданных — системной информации. Информация о доступе на БД (схемы), таблицы и столбцы доступны в таблицах schema_privileges, table_privileges и column_privileges. Работа с ними — обычные SQL-запросы:
SELECT * FROM information_schema.schema_privileges;
SELECT * FROM information_schema.table_privileges;
SELECT * FROM information_schema.column_privileges;
SELECT * FROM information_schema.column_privileges WHERE GRANTEE="'test_user'@'localhost'";MariaDB [information_schema]> select * from information_schema.column_privileges WHERE GRANTEE="'test_user'@'localhost'";
+-------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| 'test_user'@'localhost' | def | test_db | table_usr | id | INSERT | NO |
| 'test_user'@'localhost' | def | test_db | table_usr | user_name | UPDATE | NO |
+-------------------------+---------------+--------------+------------+-------------+----------------+--------------+
2 rows in set (0.001 sec)Просмотр привилегий через системную БД mysql
Аналогичных результатов можно добиться, обратившись к системным таблицам напрямую.
Информация о пользователях:
SELECT * FROM mysql.user;Привилегии на базы данных:
SELECT * FROM mysql.db;Права, назначенные на таблицы:
SELECT * FROM mysql.tables_priv;И на столбцы:
SELECT * FROM mysql.columns_priv;Просмотр глобальных привилегий
Глобальные полномочия смотрим здесь:
SELECT * FROM information_schema.user_privileges;





