Роль - іменований набір привілеїв. Замість видавати однакові права кожному користувачу окремо, права видають ролі, а роль - користувачам. Зміна прав ролі одразу діє для всіх, кому вона призначена.
CREATE ROLE 'app_read', 'app_write', 'app_ddl';
GRANT SELECT ON app.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON app.* TO 'app_write';
GRANT CREATE, ALTER, DROP, INDEX, REFERENCES ON app.* TO 'app_ddl';
CREATE USER 'analyst'@'%' IDENTIFIED BY '...';
GRANT 'app_read' TO 'analyst'@'%';
CREATE USER 'app'@'10.0.0.%' IDENTIFIED BY '...';
GRANT 'app_read', 'app_write' TO 'app'@'10.0.0.%';
Головна пастка - ролі неактивні за замовчуванням. Після GRANT 'app_read' TO 'analyst' і підключення:
SELECT * FROM app.orders;
-- ERROR 1142: SELECT command denied to user 'analyst'@...
SELECT CURRENT_ROLE(); -- NONE
Роль призначена, але не активована в сесії. Варіанти:
-- активувати в поточній сесії
SET ROLE 'app_read';
SET ROLE ALL;
-- зробити ролі активними за замовчуванням при вході
SET DEFAULT ROLE ALL TO 'analyst'@'%';
-- або глобально: активувати всі призначені ролі при вході кожного користувача
SET PERSIST activate_all_roles_on_login = ON;
Для облікового запису застосунку зручно SET DEFAULT ROLE ALL, інакше Laravel отримає помилки прав одразу після деплою.
Перевірити ефективні права:
SHOW GRANTS FOR 'analyst'@'%'; -- видно лише призначені ролі
SHOW GRANTS FOR 'analyst'@'%' USING 'app_read'; -- права з урахуванням ролі
Корисні можливості:
- обов'язкові ролі (
mandatory_roles) - автоматично призначаються всім користувачам; - роль - фактично заблокований обліковий запис, тож ролі можна вкладати одну в одну (
GRANT 'app_read' TO 'app_write'); REVOKE 'app_write' FROM 'app'@'10.0.0.%'- забрати роль, не перебираючи окремі права.
Як це використовувати в проєкті: ролі під призначення (читання, запис, міграції, бекап, моніторинг) і облікові записи під конкретні сервіси чи людей. Коли співробітник іде - видаляється лише його обліковий запис, а не переписуються права. Аудит прав зводиться до перегляду кількох ролей.
У керованих хмарних MySQL набір доступних привілеїв обмежений провайдером, але ролі працюють так само.