GRANT

Оператор GRANT

Розглянуті вище оператори дозволяють створювати, видаляти і редагувати облікові записи, проте вони не дозволяють змінювати привілеї користувача, тобто повідомляти СУБД MySQL, який користувач має право тільки на перегляд інформації, який на перегляд та редагування, а кому надані права змінювати структуру бази даних і створювати облікові записи для інших користувачів.

Для вирішення цих задач призначені оператори GRANT і REVOKE, оператор grant призначає привілеї користувачу, a REVOKE - видаляє. Якщо облікового запису, який з'являється в операторі GRANT, не існує, то він автоматично створюється. Проте видалення всіх привілеїв за допомогою оператора REVOKE не призводить до автоматичного знищення облікового запису - для повного видалення користувача необхідно або скористатися оператором DROP USER, або видалити відповідний запис з таблиці mysql.user.

У найпростішому випадку оператор GRANT виглядає так, як це представлено в прикладі нижче.

Приклад:

GRANT ALL ON TO 'wet'@'localhost' IDENTIFIED BY 'pass';

Запит у прикладі створює користувача з ім'ям wet і паролем pass, який може звертатися до сервера MySQL з локального хоста (localhost), і має всі права (ALL) для всіх баз даних (*.*). Якщо такий користувач вже існує, то його привілеї будуть змінені на ALL.

Зауваження:

На даний момент оператор GRANT підтримує імена хостів, баз даних, таблиць і стовпців розміром до 60 символів. Ім'я користувача не може бути довшим 16 символів.

Відібрати права у користувача 'wet' @ 'localhost' можна за допомогою оператора REVOKE, представленого в прикладі.

Приклад:

REVOKE ALL ON *.* FROM 'wet'@'localhost';

Замість ключового слова ALL, яке позначає всі системні привілеї (крім GRANT OPTION-передача привілеїв іншим користувачам), можна використовувати любe з ключових слів, поданих у таблиці.

Зауваження:

  • Привілеї CREATE TFMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES і SUPER були додані У версії 4 0.2 (привілей EXECUTE не виконував ніяких дій до версії 5.0 3).

Привілеї CREATE VIEW і SHOW VIEW були додані у версії 5.0.1, a CREATE USER, CREATE ROUTINE і ALTER ROUTINE у версії 5.0.3.

Таблиця 1. Системні привілеї, які використовуються в операторах GRANT і REVOKE

 

Привілей

Операція, дозволена привілеєм

ALL [PRIVILEGES]

Комбінація всіх привілеїв, за винятком привілеї GRANT OPTION, яка завжди задається окремо або з виразом WITH GRANT OPTION

ALTER

Дозволяє редагувати таблиці за допомогою оператора ALTER TABLE

ALTER ROUTINE

Дозволяє редагувати або видаляти збережену процедуру

CREATE

Дозволяє створювати таблицю за допомогою оператора CREATE TABLE

CREATE ROUTINE

Дозволяє створювати збережену процедуру

CREATE TEMPORARY TABLES

Дозволяє створювати тимчасові таблиці

CREATE USER

Дозволяє працювати з обліковими записами за допомогою операторів CREATE USER, DROP USER, RENAME USER та REVOKE ALL PRIVILEGES

CREATE VIEW

Дозволяє створювати перегляд за допомогою оператора CREATE VIEW

DELETE

Дозволяє видаляти записи за допомогою оператора DELETE

DROP

Дозволяє видаляти таблиці за допомогою оператора DROP TABLE

EXECUTE

Дозволяє виконувати збережені процедури

FILE

Дозволяє працювати з файлами за допомогою операторів SELECT ... INTO OUTFILE І LOAD DATA INFILE

INDEX

Дозволяє працювати з індексами, зокрема, використовувати оператори CREATE INDEX і DROP INDEX

INSERT

Дозволяє додавати в таблицю нові записи за допомогою оператора INSERT

LOCK TABLES

Дозволяє здійснювати блокування таблиць за допомогою операторів LOCK TABLES і UNLOCK TABLES. Для дії цього привілею повинна бути встановлено ??привілей SELECT

PROCESS

Дозволяє використовувати оператор SHOW FULL PROCESSLIST

REFERENCES

Зарезервовано, але не реалізовано

RELOAD

Дозволяє використовувати оператор fLush для оновлення таблиць привілеїв, кеша і журналів

REPLICATION CLIENT

Дозволяє дізнатися, чи є сервер головним чи підлеглим у реплікації

REPLICATION SLAVE

Даний привілей необхідна для підлеглих серверів реплікації

SELECT

Дозволяє здійснювати вибірки таблиць за допомогою оператора select

SHOW DATABASES

Дозволяє переглядати список усіх таблиць на сервері MySQL за допомогою оператора SHOW DATABASES

SHOW VIEW

Дозволяє використовувати оператор SHOW CREATE VIEW

SHUTDOWN

Дозволяє завершувати роботу сервера за допомогою mysqladmin shutdown

SUPER

Дозволяє виконувати адміністративні функції за допомогою операторів CHANGE MASTER, KILL, PURGE MASTER LOGS і SET GLOBAL

UPDATE

Дозволяє оновлювати вміст таблиць за допомогою оператора UPDATE

USAGE

Синонім для статусу "відсутні привілеї"

GRANT OPTION

Дозволяє керувати привілеями інших користувачів, без даної привілеї неможливо виконати оператори GRANT і REVOKE

Розглянемо кілька прикладів. Для того щоб дозволити користувачеві editor повний доступ на перегляд, заповнення, редагування та видалення таблиць, необхідно скористатися запитом, представленим у прикладі.

Приклад:

GRANT SELECT, INSERT, DELETE, UPDATE ON *.* TO editor;

Якщо в якості користувача виступає програма, яка додає нові записи або оновлює поточні, то її права можна обмежити лише привілеями INSERT і UPDATE (приклад), це дозволить уникнути виконання операцій DELETE і SELECT, якими може скористатися зловмисник.

Приклад:

GRANT INSERT, UPDATE ON TO program;

Для того щоб призначити всі привілеї відразу, слід скористатися запитами, представленими у прикладі нижче.

Приклад:

GRANT ALL ON *.* TO superuser;

GRANT GRANT OPTION ON *.* TO superuser;

Виконати операції щодо наділення користувача усіма правами в одному запиті не вийде, тому що ключове слово ALL завжди вживається окремо і не повинно використовуватися спільно з іншими ключовими словами з таблиці 1.

Проте використання ключового слова USAGE, яке означає повну відсутність привілеїв, спільно з іншими ключовими словами з таблиці, цілком припустимо (приклад).

Приклад:

GRANT USAGE, SELECT ON *.* TO superuser;

Слід відзначити, що один оператор GRANT може бути використаний для надання привілеїв відразу декільком користувачам (приклад).

Приклад:

GRANT ALL OPTION ON *.* TO superuser, wet, toor;

Ключове слово ON в операторі GRANT задає рівень привілеїв, які можуть бути задані на одному з чотирьох рівнів, представлених у таблиці 2.

Таблиця 2. Рівні привілеїв

 

Ключове слово ON

Рівень

ON *.*

Глобальний рівень - стосується всіх баз даних і таблиць, що входять до їх складу, таким чином, користувач з повноваженнями на глобальному рівні може звертатися до всіх баз даних

ON *

Якщо поточна база даних не була обрана за допомогою оператора USE даний параметр еквівалентний ON *.*, якщо зроблено вибір поточної бази даних, то встановлювані за допомогою оператора GRANT привілеї відносяться до всіх таблиць поточної бази даних

ON db. *

Рівень бази даних - даний параметр означає, що привілеї поширюються на таблиці бази даних db

ON db.tbl

Рівень таблиці - даний параметр означає, що привілеї поширюються на таблицю tbl бази даних db

ON db.tbl

Рівень стовпця - привілеї рівня стовпця стосуються окремих стовпців у таблиці tbl бази даних db. Список стовпців вказується в дужках через кому після ключових слів SELECT, INSERT, UPDATE

Привілеї EXECUTION, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN і SUPER можуть бути встановлені лише на глобальному рівні. Для таблиць можна встановити тільки такі типи привілеїв: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEX і ALTER. Це слід враховувати при використанні конструкції GRANT ALL, яка призначає привілеї на поточному рівні. Так, запит рівня бази даних GRANT ALL on db .* не представляє ніяких глобальних привілеїв, таких як FILE або RELOAD.

Зауваження:

  • Не обов'язково запам'ятовувати контекст застосування привілеїв. Доступні в поточній версії привілеї, а також контекст їх застосування, можна уточнити за допомогою оператора show privileges. Даний оператор введений в MySQL, починаючи з версії 4.1.0.

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

Приклад:

GRANT ALL ON shop.* TO shop_editor;

Зауваження:

  • Слід зазначити, що відсутність конструкції IDENTIFIED BY призводить до того, що в якості пароля користувача призначається порожній рядок.

Якщо у користувача немає привілеїв на доступ до бази даних, ім'я бази даних не відображається у відповіді на запит SHOW DATABASES, якщо тільки у користувача немає спеціальної привілеї SHOW DATABASES.

Наступний рівень, який ми розглянемо,-це привілеї на рівні таблиці. Нехай обсяг робіт зріс настільки, що потрібна новий обліковий запис для менеджера по роботі з клієнтами, якому потрібна тільки одна таблиця - users. У цьому випадку запит на створення такого облікового запису може виглядати так, як це представлено у прикладі.

Приклад:

GRANT ALL ON shop.user TO client_manager;

Якщо у користувача немає привілеїв на доступ до таблиці, то ця таблиця не відображається у відповіді на запит списку таблиць бази даних - show tables.

В іменах баз даних і таблиць допускається використання символів "%" та "_" обидва символи мають таке ж значення, що і в операторі like, тобто заміняють довільне число і один символ відповідно. Це означає, що якщо потрібно використовувати символ "_" як частину імені бази даних, його необхідно екранувати зворотним слешем, інакше можна ненавмисно надати доступ до баз даних, відповідним заданому шаблону. Наприклад, для бази даних lis_tuser оператор GRANT може виглядати так, як це представлено у прикладі.

Приклад:

GRANT ALL ON 'list\_user'.* TO 'wet'@'localhost';

Ще більш гнучкі засоби для призначення привілеїв надаються на рівні стовпця. Для того щоб надати доступ до стовпця, потрібно перерахувати імена стовпців через кому після ключових слів select, insert і update - використовувати інші ключові слова для надання привілеїв на рівні стовпців не можна. Нехай користувачу wet надається привілей перегляду (SELECT стовпця name таблиці catalogs бази даних shop. У цьому випадку запит, що створює такого користувача, може виглядати так, як це представлено у прикладі.

Приклад:

GRANT SELECT(name) ON shop.catalogs TO 'wet'@'localhost';

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

Окремо в привілеях слід зазначити привілей grant option-здатність наділяти інших користувачів правами на передачу прав користувача. Зазвичай цей привілей призначають за допомогою окремого запиту, але мова запитів SQL пропонує спеціальний вираз with grant option, який дозволяє наділяти обліковий запис цим привілеєм. Вираз with grant option поміщається в кінці запиту (приклад нижче).

Приклад:

GRANT ALL ON shop.* TO 'wet'@'localhost' WITH GRANT OPTION;

В результаті виконання запиту з прикладу користувач wet наділяється правами використання оператора GRANT ALL для надання привілеїв іншим користувачам на базу даних shop і її таблиць. Ні на які інші бази даних користувач wet не має права видавати привілеї, іншими словами, користувач, що володіє правами GRANT OPTION, може передавати іншим користувачам тільки ті права, які належать йому самому.

Слід вкрай обережно поводитися з привілеєм GRANT OPTION, тому що він поширюється не лише на ті привілеї, якими користувач володіє на даний момент, але й на всі привілеї, які він може одержати в майбутньому.

Ключове слово WITH, крім привілеї GRANT OPTION, дозволяє накласти обмеження на кількість підключень, запитів, відновлень і паралельних запитів на годину, це здійснюється за допомогою опцій MAX_CONNECTIONS_PER_HOUR, MAX_QUERIES_PER_HOUR, MAX_UPDATES_PER_HOUR і MAX_USER_CONNECTIONS відповідно. Запит у прикладі встановлює для користувача wet повний доступ до бази даних але з обмеженням-не більше 10 підключень до сервера MySQL на годину і не більше 1000 запитів, з яких тільки 200 можуть бути операціями оновлення update, а 3 запити протікати одночасно.

Зауваження:

  • Опції MAX_QUERIES_PER_HOUR, MAX_UPDATES_PER_HOUR, MAX_CONNECTIONS_PER_HOUR з'явилися в СУБД MySQL, починаючи з версії 4.0.2. Опція MAX_USER_CONNECTIONS з'явилася в СУБД MySQL, починаючи з версії 5.0.3.

Приклад:

GRANT ALL ON shop.* TO 'wet'@'localhost' IDENTIFIED BY 'pass'

WITH MAX_CONNECTIONS_PER_HOUR 10

MAX_QUERIES_PER_HOUR 1000

MAX_UPDATES_PER_HOUR 10

MAX_USER_CONNECTIONS 3;

Якщо значення кожної з опції дорівнює 0 (за замовчанням), це означає, що у користувача немає обмежень по цьому параметру.

MySQL дозволяє шифрувати весь мережевий трафік між сервером і клієнтом за допомогою протоколу SSL.

Зауваження:

  • Протоколи Internet, в тому числі і транспортний протокол TCP, який використовується в СУБД MySQL, розроблялися досить давно і не були спочатку призначені для комерції та передачі конфіденційних відомостей. Для підвищення безпеки в мережі компанія Netscape свого часу розробила протокол обміну даними, який гарантує захист транзакцій. Цей протокол вона назвала протоколом захищених сокетів (SSL, Secure Sockets Layer). Це проміжний протокол, розташований між транспортним і прикладним рівнем, перед відправкою по мережі він шифрує дані, що відправляються прикладними протоколами (HTTP, FTP, SMTP, SQL). Тому якщо зловмисник з мережевим аналізатором перехопить трафік-він отримає не чистий текст, а зашифрований. На іншому кінці відбувається розшифровка.

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

  • REQUIRE SSL— сообщает серверу, что использование данной учетной записи разрешается только для шифрованных SSL-подключений, попытки установить, соединение по обычному нешифрованному каналу будут отвергаться.
  • REQUIRE Х509-дана опція повідомляє серверу, що клієнт повинен мати дійсний сертифікат, але який саме, ким і кому виданий - не має знання.
  • REQUIRE ISSUER 'provider' - повідомляє серверу, що клієнт повинен мати сертифікат, виданий сертифікаційним центром provider. Навіть якщо сертифікат дійсний, але виданий кимось іншим, то сервер відмовить в наданні доступу.
  • REQUIRE SUBJECT 'subject' - повідомляє серверу, що сертифікат повинен бути виданий на ім'я subject.
  • REQUIRE CIPHER 'cod' - дана опція необхідна для того, щоб гарантувати, що буде використовуватися досить строгий шифр і довжина ключа. SSL сам по собі може бути ослаблений, якщо застосовуються старі алгоритми з короткими ключами шифрування. Використовуючи цю опцію, можна задати конкретний метод шифрування, щоб дозволити з'єднання.

Для того щоб вимагати від користувача root звертатися до сервера тільки по зашифрованому SSL-каналу, слід скористатися запитом, представленим у прикладі.

Прикдад:

GRANT ALL ON *.* TO 'root'@'*' IDENTIFIED BY 'secret' REQUIRE SSL;

Вимога використання сертифіката представлено нижче.

Приклад:

GRANT ALL ON *.* TO 'root'@'*' IDENTIFIED BY 'secret' REQUIRE X509;

Якщо сертифікат повинен бути виданий конкретним сертифікаційним центром, оператор grant може виглядати так, як це представлено у прикладі. Важливою вимогою в цьому випадку є те, що рядок provider мусить бути представлена ??як єдине ціле і не може розриватися символом переведення рядка.

Приклад:

GRANT ALL ON *.* TO 'root'@'*' IDENTIFIED BY 'secret'

REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/ О=MySQL Finland ICN=Tonu Samuel/Email=tonu@example.com';

Якщо сертифікат повинен бути виданий на конкретну особу, то оператор GRANT може виглядати так, як це представлено у прикладі. Тут, так само як і в попередньому прикладі, не допускається розрив символом переведення рядка.

Приклад:

GRANT all ON *.* TO 'root'@'*'

IDENTIFIED BY 'secret' require SUBJECT '/C=EE/ST=Some-State/L=Tallinn/О=MySQL demo client certificate/CN=Tonu Samuel/Email tonu@example.com';

Зміна опції REQUIRE CIPHER 'cod' демонструється в наступному прикладі.

Приклад:

GRANT ALL ON *.* TO 'root'@'*' IDENTIFIED BY 'secret' REQUIRE CIPHER 'EDH-RSA-DE.S-CBC3-SHA';

Опції SUBJECT, ISSURE і CIPHER можуть комбінуватися в конструкції require так як це представлено у прикладі.

Приклад:

GRANT ALL ON *.* TO 'root'@'*' IDENTIFIED BY 'secret'

REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/0=MySQL demo client certificate/CN=Tonu Samuel/Email=tonu@example.com';

AND REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/ 0=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';

AND REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA";

Зауваження:

  • Починаючи з версії MySQL 4.0.4, допускається необов'язкове слово AND між опціями REQUIRE.