MySql: предоставить параметры только для чтения?


102

У меня есть пользователь, которому я хочу предоставить все права READ для схемы db.

Один из способов это:

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

Есть ли способ сгруппировать все операции чтения в гранте?


Привилегия - SHOW VIEWнет SHOW_VIEW, но вам не нужно предоставлять ее пользователю, если вы не хотите, чтобы он мог работать с SHOW CREATE VIEWпредставлениями ... они могут выбирать из представлений с единственной SELECTпривилегией. Что вы имеете в виду под «сгруппировать все операции чтения в грант»?
Майкл - sqlbot

Если есть какая-либо одна привилегия, которая обозначает ВСЕ операции чтения в базе данных. Я понимаю, что они предоставляют мелкозернистый доступ, но удобная абстракция высокого уровня нам бы помогла.
Ajeet Ganga

Ответы:


167

Если есть какая-либо одна привилегия, которая обозначает ВСЕ операции чтения в базе данных.

Это зависит от того, как вы определяете «все читают».

«Чтение» из таблиц и представлений - это 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привилегии в процедуре, временно принимать расширенные привилегии, чтобы позволить им делать определенные вещи процедура завершается.


2
Спасибо. Помимо отличного ответа мне также понравился ваш пароль. :)
Аджит Ганга

2
Стоит отметить: PROCESS и REPLICATION CLIENT являются «глобальными» типами привилегий, поэтому синтаксис завершится ошибкой при определении с исключением «для каждой базы данных». GRANT PROCESS ON mydb. * Будет недопустимым, но GRANT PROCESS ON *. * Будет в порядке.
Bee Kay

GRANT SELECT ON db_name. * TO 'demo' @ '%' WITH GRANT OPTION;
Муса

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

Это создаст пользователя с SELECTпривилегиями для всей базы данных, включая представления.


12

Различные разрешения, которые вы можете предоставить пользователю:

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

Введите пароль для учетной записи root. В командной строке 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';

Примечание. Здесь требуется EXECUTE, чтобы пользователь мог читать данные, если есть хранимая процедура, которая создает отчет (имеет несколько операторов выбора).

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

Дополнительные разрешения на чтение:

  • ПОКАЗАТЬ ВИД: если вы хотите показать схему просмотра.
  • КЛИЕНТ РЕПЛИКАЦИИ: Если пользователю необходимо проверить статус репликации / ведомого устройства. Но нужно дать разрешение на всю БД.
  • ПРОЦЕСС: Если пользователю необходимо проверить запущенный процесс. Будет работать только со всей БД.

2

Примечание для MySQL 8 это другое

Сделать это нужно в два этапа:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;

1
Это единственное решение, которое у меня сработало. Похоже, что другие решения, как вы сказали, устарели. Спасибо за предоставление этого обновленного решения.
Кайл Брайденстайн,

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.