MySql: Надати параметри лише для читання?


97

У мене є користувач, якому я хочу надати всі дозволи на читання на схемі db.

Один із способів такий:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

Чи є спосіб групувати всі операції з читання в гранті?


Привілей є SHOW VIEW, ні SHOW_VIEW, але вам не потрібно надавати це користувачеві, якщо ви не хочете, щоб вони мали змогу SHOW CREATE VIEWпереглядати перегляди ... вони можуть вибирати з представлень єдиний SELECTпривілей. Що ви маєте на увазі під "згрупувати всі операції читання в грант"?
Майкл - sqlbot

Якщо є якась одна привілей, яка розшифровується для ВСІХ ЧИТАННЯ операцій на базі даних. Я розумію, що вони забезпечують дрібнозернистий доступ, але зручна абстракція високого рівня допомогла б нам.
Ajeet Ganga

Відповіді:


161

Якщо є якась одна привілей, яка розшифровується для ВСІХ ЧИТАННЯ операцій на базі даних.

Це залежить від того, як ви визначаєте "все прочитане".

"Читання" з таблиць і поглядів - SELECTпривілей. Якщо це ви маєте на увазі під "всі прочитані", то так:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

Однак це звучить так, як ви маєте на увазі здатність "бачити" все, "дивитися, але не торкатися". Отже, ось інші види читання, які приходять на думку:

"Читання" визначення поглядів - це SHOW VIEWпривілей.

"Читання" списку запитів, що виконуються в даний час іншими користувачами, є PROCESSпривілеєм.

"Читання" поточного стану реплікації - це REPLICATION CLIENTпривілей.

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

Якщо це читання, яке ви хочете зробити, ви можете об'єднати будь-яку з цих (або будь-яку іншу з наявних привілеїв ) в одному GRANTзаяві.

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

Однак немає жодної привілеї, яка надає деякий підмножина інших привілеїв, саме так, як ви запитуєте.

Якщо ви все робите вручну і шукаєте простіший спосіб вирішити цю проблему, не потрібно пам'ятати точний грант, який ви зазвичай робите для певного класу користувачів, ви можете шукати заяву, щоб відновити порівнянні гранти користувача та змінити його. щоб створити нового користувача з подібними привілеями:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Зміна "not_leet" та "localhost" відповідно до нового користувача, якого ви хочете додати, разом із паролем, призведе до повторного використання GRANTдля створення нового користувача.

Якщо ви хочете, щоб однією операцією встановити та надавати користувачам обмежений набір привілеїв, а можливо, видалити будь-які невідомі привілеї, це можна зробити, створивши збережену процедуру, яка інкапсулює все, що ви хочете зробити. В рамках процедури ви повинні побудувати GRANTоператор з динамічним SQL та / або безпосередньо маніпулювати самими таблицями грантів.

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


1
Дякую. Окрім чудової відповіді, мені також сподобався ваш пароль. :)
Ajeet Ganga

2
Варто зауважити: КЛІЕНТ ПРОЦЕССІЇ та ЗАМОВЛЕННЯ є "глобальними" типами привілеїв, тому синтаксис буде невдалим, якщо визначено виключення "на базу даних". PROCESS GRANT ON mydb. * Буде недійсним, але GRANT PROCESS ON *. * Буде нормальним.
Бі Бі Кей

НАДАННЯ ВИБІРУ на db_name. * ДО 'demo' @ '%' З ГРАНТОВИМ ВАРІАНТОМ;
Муса,

16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Це створить користувача з SELECTпривілеєм для всієї бази даних, включаючи подання.


9

Різні дозволи, які ви можете надати користувачеві, є

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

Щоб надати дозволу конкретному користувачеві, ви можете використовувати цей фреймворк:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

Я вважав цю статтю дуже корисною


3

Покроковий посібник я знайшов тут .

Щоб створити обліковий запис користувача лише для читання для MySQL

У підказці UNIX запустіть програму командного рядка MySQL і увійдіть як адміністратор, набравши таку команду:

mysql -u root -p

Введіть пароль для кореневого облікового запису. У запиті mysql виконайте один із наступних кроків:

Щоб надати користувачеві доступ до бази даних з будь-якого хоста, введіть таку команду:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

Якщо колектор буде встановлено на тому ж хості, що і база даних, введіть таку команду:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

Ця команда надає користувачеві доступ лише до читання до бази даних лише з локального хосту. Якщо ви знаєте ім’я хоста або IP-адресу хосту, на якому буде встановлений колектор, введіть таку команду:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

Ім'я хоста повинно бути дозволеним DNS або локальним файлом хостів. У запиті mysql введіть таку команду:

flush privileges;

Тип quit.

Далі наведено список прикладів команд та повідомлень про підтвердження:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

3

Навіть користувач отримав відповідь і @Michael - sqlbot дуже добре набрав очки в своєму пості, але одна точка відсутня, тому просто намагаюся прикрити її.

Якщо ви хочете надати дозвіл на читання простому користувачеві (не адміністратору) -

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

Примітка: ВИКОНАННЯ тут потрібно, щоб користувач міг читати дані, якщо є збережена процедура, яка створює звіт (має декілька вибраних операторів).

Замініть localhost конкретним IP-адресою, з якої користувач підключиться до БД.

Додаткові дозволи на читання -

  • ПОКАЗУЙТЕ ВИГІД: Якщо ви хочете показати схему перегляду.
  • КЛІЄНТ ЗАМОВЛЕННЯ: Якщо користувачеві потрібно перевірити стан реплікації / підлеглого. Але потрібно дати дозвіл на всі БД.
  • ПРОЦЕС: Якщо користувачеві потрібно перевірити запущений процес. Працюватиме лише з усіма БД.

0

Якщо ви хочете, щоб подання читалося лише після надання дозволу на читання, ви можете використовувати ALGORITHM = TEMPTABLE у визначенні DDL визначення.


0

Примітка для MySQL 8 це інше

Це потрібно зробити в два етапи:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.