Керування обліковими записами користувачів

 

Керування обліковими записами користувачів

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

Облікові записи СУБД MySQL

Слід відмінити, що обліковий запис приймає форму 'username' @ 'host', де username-ім'я, a host-адресса хоста, з якого користувачеві username дозволено звертатися до сервера MySQL. Так, облікові записи 'root' @ 'l27.0.0.1' і 'wet' @ '62 .78.56.34 'означають, що користувач з ім'ям root може звертатися з хоста, на якому розташований сервер, a wet - тільки з хоста з IP -адресою 62.78.56.34, ні з якого іншого хоста звернутися до сервера MySQL з цим ім'ям не можна, в тому числі і з-під IP-адреси 127.0.0.1, що відноситься до локального хосту.

Зауваження

  • Якщо ім'я користувача та хост не містять спеціальних символів "-" і "%", їх необов'язково брати в лапки - root@127.0.0.1.
  • IP-адреса 127.0.0.1 завжди відноситься до локального хосту-якщо сервер і клієнт встановлені на одному хості і мережа не використовується, то сервер слухає з'єднання за цією адресою, а клієнт відправляє на нього SQL-запити. У всіх операційних системах IP-адреса 127.0. 0.1 має псевдонім localhost, тому замість IP-адреси можна вказувати цей псевдонім, а облікові записи виду 'root' @ '127 .0.0.1 'записувати у вигляді' root '@' localhost '.

Якщо до IP-адреси хоста прив'язане якесь доменне ім'я, наприклад softtime.ru то замість даного хоста можна використовувати доменне ім'я' root '@' softtime.ru '-такий обліковий запис означає, що з-під користувача root можна звертатися до сервера з хоста, доменним ім'ям якого є softtime.ru.

Якщо на додаток до двух хостів 127.0.0.1 і 62.78.56.34 потрібно дозволити користувачеві wet звертатися до сервера MySQL з третього хоста 158.0.55.62, то  потрібно створювати три облікових записи: 'wet' @ '127 .0.0.1 ',' wet '@ '62 .78.56.31 'і' wet '@ '158 .0.55.62'. Але число адрес, з яких необхідно забезпечити доступ користувачеві, може бути значним і включати цілі діапазони. Для завдання діапазону в імені хоста використовується спеціальний символ "%", що виконує ту ж функцію, що і в операторі like. Так, обліковий запис 'wet'@'%' дозволяє користувачеві wet звертатися до сервера MySQL з будь-яких комп'ютерів мережі. Символ "%" дозволяє задавати діапазони, тому обліковий запис 'wet'@'%. softtime.ru' дозволяє звертатися до сервера MySQL з піддоменів домену softtime.ru. Обліковий запис 'wet' @ '62 .78.56.% 'Дозволяє користувачеві wet отримати доступ з хостів, що володіють IP-адресами в діапазоні від 62.78.56.0 до 62.78.56.255.

Відсутність частини host в акаунті аналогічно використанню "%" таким чином, облікові записи 'wet' @ '%' і 'wet' еквівалентні.

Усі облікові записи зберігаються в таблиці user системної бази даних з ім'ям mysql. Після першої інсталяції вміст таблиці user виглядає так, як це представлено у прикладі.

Приклад

SELECT Host, User, Password FROM mysql.user;

Host                   User           Password

localhost   root

%              root

Якщо при інсталяції СУБД MySQL був відзначений пункт Створення анонімного користувача, то до цих двох записів додадуться записи для анонімного користувача - як його ім'я виступає порожній рядок (приклад).

Приклад

SELECT Host, User, Password FROM mysql.user;

Host                   User           Password

localhost   root

%              root

localhost

%

Користувач root є унікальним користувачем, що володіє всіма привілеями, анонімний користувач за умовчанням володіє мінімальними привілеями, простіше кажучи, він може тільки авторизуватися і виконувати найпростіші запити на зразок SELECT VERSION (). Зміна рівня привілеїв буде розглянуто далі.

Як видно з прикладів, за замовчуванням облікові записи не захищені паролем, що дозволяє не вказувати його при авторизації. Однак, якщо до хосту, на якому встановлено сервер MySQL, мають доступ кілька людей, розумніше захистити облікові записи паролем. Це можна зробити за допомогою оператора SET password, який має наступний синтаксис:

 SET PASSWORD = PASSWORD ('pass')

 PASSWORD FOR user = PASSWORD ('pass')

У першій формі оператор SET PASSWORD встановлює пароль для поточного користувача. Будь-який клієнт, підключений до сервера з використанням не анонімного облікового запису, може змінювати свій пароль.

Таким чином, користувач wet, здійснивши авторизацію, може поміняти свій пароль за допомогою запиту, поданого нижче.

Зауваження:

  • Пароль буде змінено для облікового запису з використанням того хоста, з якого авторизувався користувач. Тобто якщо користувач змінює пароль на локальному хості, це не призводить до зміни пароля для мережевого облікового запису.

Приклад:

SET PASSWORD = PASSWORD ('Ht76W9y0Wa');

Друга форма оператора SET PASSWORD дозволяє змінювати пароль користувача для будь-якого облікового запису (приклад). Тільки клієнти, що мають доступ до бази даних mysql, мають право використовувати цей оператор. В якості такого клієнта, як правило, виступає root. Значення user задається у формі 'username' @ 'host'

Приклад:

SET PASSWORD FOR 'wet'@'%' = PASSWORD('Ht76W9y0Wa');

Слід зазначити, що для всіх облікових записів пароль обробляється за допомогою фікції password (), це пов'язано з тим, що MySQL не дозволяє зберігати паролі в незашифрованому вигляді. Пропуск функції password () може призвести До того, що обліковий запис буде недоступний для використання. Особливо це стосується прямого редагування таблиці user за допомогою оператора update, при якому опустити виклик функції PASSWORD () дуже легко (приклад).

Приклад:

UPDATE mysql.user SET Password = PASSWORD('Ht76W9yOWa')

WHERE User = 'wet' AND Host = '%';

FLUSH PRIVILEGES;

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

З прикладів видно, що за замовчуванням для облікових записів суперкористувача (root) і анонімного користувача створюється також мережевий варіант облікового запису ("%"), дозволяє отримати доступ до сервера бази даних з будь-якого хоста локальної мережі. З метою безпеки рекомендується видалити ці облікові записи за допомогою операторів REVOKE і DROP USER, які розглядаються далі.

Оператор CREATE USER

Оператор create user дозволяє створити новий обліковий запис і має наступний синтаксис:

CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']

Оператор створює обліковий запис user з необов'язковим паролем password. У прикладі представлений запит, створює користувача softtime.

Зауваження:

  • Оператор CREATE USER з'явився в СУБД MySQL, починаючи з версії 5.0.2.

Приклад:

CREATE USER softtime;

Якщо пароль не вказується, за замовчуванням в його якості виступає порожній рядок. Після того як новий обліковий запис створено, в будь-якому клієнті можна авторизуватися з під користувача softtime.

Для того щоб задати пароль, слід використовувати ключове слово IDENTIFIED BY, зa яким в одиночних лапках слідує пароль.

Приклад:

CREATE USER softtime IDENTIFIED BY '1234567';

Зауваження:

  • На даний момент оператор CREATE USER підтримує імена хостів до 60 символів. Ім'я користувача не може бути довшим 16 символів.

Пароль, заданий у прикладі для облікового запису softtime, буде зберігатися у вигляді звичайного тексту. Розумніше зберігати пароль у вигляді хеш-коду, отриманого в результаті незворотного шифрування. При авторизації пароль, що вводиться користувачем, також піддається незворотному шифруванню, після чого порівнянні піддаються хеш-коди. При такій системі авторизації зловмисник, який отримав в руки хеш-коди, змушений буде витратити час на розшифровку паролів користувача шляхом перебору. Якщо паролі обрані правильно, тобто не є осмисленою фразою, а представляють набір букв і цифр, час, який може знадобитися на їх розшифровку, зробить їх неактуальними. Для того щоб скористатися таким механізмом авторизації, необхідно помістити між ключовим словом IDENTIFIED BY і паролем ключове слово PASSWORD, яке повідомляє, що пароль перед збереженням слідує пропустити через функцію PASSWORD ().

Зауваження:

  • При незворотному шифруванні можна використовувати тільки функцію PASSWORD (), використання інших функцій не передбачено.

Приклад:

CREATE USER wet IDENTIFIED BY PASSWORD '123456';

При спробі створення облікового запису з вже існуючим ім'ям СУБД MySQL повертає помилку.

Проте створені за допомогою оператора CREATE USER облікові записи не мають жодних привілеїв - з використанням такого облікового запису неможливо переглядати таблиці та здійснювати запити. Для наділення облікового запису привілеями необхідно скористатися оператором GRANT.

Один оператор CREATE USER дозволяє створити відразу кілька записів. Для цього необхідно перерахувати визначення облікових записів через кому, як це продемонстровано в прикладі, де створюються відразу три облікових записи.

Приклад:

CREATE USER

wet IDENTIFIED BY PASSWORD ’123456’

ret IDENTIFIED BY PASSWORD ’1654321’,

tor IDENTIFIED BY PASSWORD ’678451’;

За замовчанням, якщо не вказується хост, створюється мережевий обліковий запис, тобто доступ дозволяється з будь-якого хоста мережі. Для того щоб створити обліковий запис, що дозволяє звертатися до сервера MySQL лише з певного хоста, наприклад тільки з локального хоста (localhost), слід явно вказати це в операторі create USER (приклад).

Приклад:

CREATE USER

'wet'@'localhost' IDENTIFIED BY PASSWORD '123456',

'ret'@'localhost' IDENTIFIED BY PASSWORD '654321',

'tor'@'localhost' IDENTIFIED BY PASSWORD '678451';

Оператор DROP USER

Оператор DROP USER дозволяє видалити обліковий запис user і має наступний синтаксис:

DROP USER user

Як обліковий запис user використовується Стандартний для MySQL запис виду 'username' @ 'host'.

Зауваження:

  • Оператор DROP USER з'явився в СУБД MySQL, починаючи з версії 4.1.1.

Приклад:

DROP USER 'wet'@'%';

Оператор drop user (приклад) не закриває автоматично з'єднання у видаленого користувача, котрий зможе працювати з базою даних до тих пір, поки не буде закрито його з'єднання або зв'язок з сервером не обірветься.

Точно так само, як і оператор create user, оператор drop user дозволяє видалити cpaзу кілька облікових записів (приклад).

Приклад:

DROP USER 'wet'@'%', 'ret'%@'%', 'tor'@'%';

Спочатку оператор DROP USER видаляв тільки тих користувачів, які не володіють жодними правами, проте, починаючи з версії 5.0.2, порядок роботи оператора DROP USER був змінений, і він набув можливості видаляти будь-якого користувача з будь-яким рівнем привілеїв. До версії 5.0.2 перед використанням оператора DROP USER слід було переконатися, що користувач не володіє ніякими привілеями, Для цього необхідно було виконати оператор SHOW GRANTS (приклад). Якщо в результуючій таблиці облікового запису немає, користувач не володіє ніякими правами і його обліковий запис може бути видалено.

Приклад:

SHOW GRANTS;

Grants for root@localhost
GRANT ALL PRIVILEGES ON *. * TO 'root'@'localhost' WITH GRANT –OPTION

Як видно з прикладу, тільки користувач 'root' @ 'localhost' володіє привілеями, всі інші користувачі можуть бути видалені за допомогою оператора DROP USER (наступний приклад).

Приклад:

SELECT Host, User, Password FROM mysql.user;

Host           User           Password

localhost     root

%                wet             *6BB4837EB74329105EE4S68DDA7DC67ED2CA2AD9

localhost     softtime      *6A7A4 90FB9DC8C33C2B025A91737077A7E9CC5E5

До версії 4.1.1 видалення користувача проводилося прямим редагуванням таблиці mysql.user (приклад). Для цього також потрібно видалити всі привілеї користувача що видаляється.

Приклад:

DELETE FROM mysql.user WHERE User = 'wet' AND Host = '%';

FLUSH PRIVILEGES;

Оператор RENAME USER

Оператор RENAME USER дозволяє змінювати ім'я користувача у обліковому записі і має наступний синтаксис

RENAME USER old_user ТО new_user

Тут old_user-старе ім'я користувача, a new_user-нове ім'я користувача. Приклад використання оператора RENAME USER наведено в наступному прикладі.

Зауваження:

  • Оператор RENAME USER введений в СУБД MySQL, починаючи з версії 5.0.2.

Приклад:

RENAME USER wet TO wet1;

SELECT Host, User, Password FROM mysql.user;

Host           User           Password

localhost     root

%                wetl            *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

localhost     softtime      *6A7A490FB9DC8C33C2B025A91737077A7E9CC5E5

Зауваження:

  • На даний момент оператор rename user підтримує імена хостів до 60 символів. Ім'я користувача не може бути довшим 16 символів.

До версії 5.0.2 зміна імені користувача у обліковому записі проводилося прямим редагуванням таблиці mysql.user (приклад).

Приклад:

UPDATE mysql.user SET User = 'wet1'

WHERE User = 'wet' AND Host = '%';

FLUSH PRIVILEGES;

Оператор 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.

Оператор REVOKE

Для скасування привілеїв облікового запису використовується оператор REVOKE. (приклад). Його синтаксис схожий на синтаксис оператора GRANT з тією лише різницею що ключове слово TO замінено на FROM, а опції IDENTIFIED BY, REQUIRE і WITH GRANT OPTION відсутні.

Приклад:

REVOKE DELETE, UPDATE ON shop.* FROM 'wet'@'localhost';

Слід пам'ятати, що оператор REVOKE скасовує привілеї, але не видаляє облікові записи, для їх видалення необхідно скористатися або оператором drop або видалити користувача з таблиці mysql.user за допомогою оператора DELETE.

До версії 4.1.2 не можна було видалити відразу всі привілеї, необхідно було виконати два оператори (приклад).

Приклад:

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

REVOKE GRANT OPTION ON shop.* FROM 'wet'@'localhost';

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

Приклад:

REVOKE ALL, GRANT OPTION ON shop.* FROM 'wet'@'localhost';

Синтаксис оператора REVOKE дозволяє видаляти привілеї відразу для декількох користувачів (приклад).

Приклад:

REVOKE ALL, GRANT OPTION ON shop.* FROM ' wet'@'localhost', 'toor'@'localhost', 'ret'@'localhost';