Розподіл прав доступу

Аутентифікація користувача проводиться по імені (до 16 символів), паролю (м.б. порожнім) і хосту або його IP. Більшість клієнтських програм за замовчуванням використовують mysql-ім'я, що збігається з unix-ім'ям, але це можна змінити за допомогою ключа --user =. Пароль можна задати:
  • прямо в командному рядку після ключа -p (без пробілу, дуже небезпечно)
  • вказавши ключ -p без пароля (програма запросить пароль з клавіатури, найбезпечніше)
  • в файлі .my.cnf (права до цього файлу повинні бути тільки у власника), секція [client], поля host, user і password
  • за допомогою змінної оточення MYSQL_PWD (дуже небезпечно) і MYSQL_HOST

Вся інформація про права зберігається в БД з ім'ям mysql. Ніхто не повинен мати до неї доступу на читання (див. Про паролі).

Перевірка прав при виконанні кожного запиту: таблиця db сортується по полях Host, Db і User, таблиця host по полях Host і Db, таблиці tables_priv і columns_priv по полях Host, Db і User від найбільш специфічного до найменш. Для адміністративних запитів і доступу до файлів перевіряється тільки таблиця user. Для інших запитів на початку перевіряється таблиця user - а чи немає у даного користувача прав доступу на "глобальному" рівні. Якщо є - операція дозволяється. Якщо немає, то перевіряються права доступу до конкретної БД з конкретного хоста (по перетинанню таблиць Db і Host з урахуванням шаблонів і порожніх полів). Якщо їх достатньо, то доступ дається. Якщо недостатньо, то до об'єднання "глобальних" прав і прав БД / хост додаються права, витягнуті з таблиць tables_priv і columns_priv. Якщо і цього не вистачає, то на жаль.

Права доступу читаються mysqld (і не читаються при "ручному" зміні БД mysql):
  • при запуску
  • при виконанні команд GRANT, REVOKE і SET PASSWORD
  • при виконанні команди FLUSH PRIVILEGES
  • при виконанні mysqladmin flush-privileges / reload

"Глобальні" привілеї і зміни пароля набувають чинності тільки при наступному з'єднанні. Зміни в доступі до БД - при наступній команді use. Зміни в доступі до таблиць і колонок - при наступному запиті.

Зміна пароля: set password for ім'я = password ( 'новий пароль').

GRANT тип-привілеї [(список-стовпців)] [, тип-привілеї [(список-стовпців)]. ] ON <имя-таблицы | * | *.* | имя-БД.*> TO ім'я-користувача [IDENTIFIED BY 'пароль'] [, ім'я-користувача [IDENTIFIED BY 'пароль]. ] WITH GRANT OPTION

REVOKE тип-привілеї [(список-стовпців)] [, тип-привілеї [(список-стовпців)]. ] ON <имя-таблицы | * | *.* | имя-БД.*> FROM ім'я-користувача [, ім'я-користувача. ]

Типи привілеїв:
  • ALL PRIVILEGES (aka ALL)
  • ALTER
  • CREATE
  • DELETE
  • DROP
  • FILE
  • GRANT OPTION (тільки для REVOKE)
  • INDEX
  • INSERT
  • PROCESS
  • REFERENCES (не реалізоване)
  • RELOAD
  • SELECT
  • SHUTDOWN
  • UPDATE
  • USAGE (ніяких - просто місце застовпити)

Для стовпців можна задавати тільки INSERT, SELECT і UPDATE. Для таблиць - INSERT, SELECT, UPDATE, CREATE, DROP, DELETE, GRANT, INDEX, ALTER. Використання "*. *" Означає завдання глобальних привілеїв. Використання "*" означає завдання привілеїв для поточної БД (якщо поточної БД немає, то глобальні).

SHOW GRANTS FOR ім'я @ хост;

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

Схожі статті