Разрешения, необходимые для безопасного выполнения произвольного sql - PullRequest
5 голосов
/ 05 августа 2010

Я хочу создать изолированную программную среду SQL, которая позволит пользователям выполнять произвольные SELECT запросы в базе данных PostGIS.По сути, я хочу разрешить пользователям доступ к psql для игры.

Очевидно, что это беда безопасности, если разрешен доступ для записи.Как я могу создать такую ​​систему, чтобы запросы к данным были разрешены, но у пользователя нет разумной возможности:

  1. Компрометация данных в базе данных
  2. Получение более широкого доступа к серверу
  3. Уничтожение системы с помощью запроса типа SELECT * from long_table, long_table, long_table, long_table, long_table, long_table, long_table, выполнение которого займет много времени

Пожалуйста, будьте максимально точны в своем ответе.

Ответы [ 5 ]

2 голосов
/ 05 августа 2010

Проблемы # 1 и # 2 обрабатываются с помощью явных GRANTs и REVOKEs разрешений, как отмечали другие.

Что касается # 3,

ALTER ROLE <rolename> SET statement_timeout = '60000'

всегда работало хорошо для меня.Это завершает любой запрос, который выполняется дольше 1 минуты (60000 мс).Мы обнаружили это после того, как несколько пользовательских запросов в phpPgAdmin вызвали проблемы ...

2 голосов
/ 05 августа 2010

Что ж, вам просто нужно СОЗДАТЬ РОЛЬ , а затем ГРАНАТЬ доступ только для чтения явно к вещам, которые вы хотите разрешить. Все, что вы не предоставляете, они не могут сделать (если они не являются суперпользователем).

Если вы предоставили доступ только для чтения и они не являются суперпользователем, они не смогут получить доступ к базовой системе. Это не означает, что вы не должны устанавливать postgres как непривилегированный пользователь, вы должны - просто не нужно выполнять то, что вы перечислили.

Хорошо, вы отредактировали свое сообщение, добавив в него сумасшедшие запросы. Я не верю, что у postgres в настоящее время есть способ ограничить ресурсы запросов для каждого пользователя.

1 голос
/ 05 августа 2010

Для # 3 не могли бы вы написать какой-нибудь код, который отслеживает активность запросов и убить те запросы, которые вы считаете CRAZY, на основе некоторых критериев, используя системные представления в postgre?

1 голос
/ 05 августа 2010

Вы можете установить postgres как непривилегированный пользователь и запускать его таким образом. Таким образом, вы используете преимущества существующих системных разрешений, чтобы ограничить то, что люди могут делать с базой данных, включая изоляцию их доступа только к своей собственной базе данных. Смотрите инструкции внизу этой страницы:

http://www.postgresql.org/docs/current/interactive/tutorial-start.html

Если вы автоматизируете какую-то часть этого, скажем, дайте людям команду 'setup postgres', вуаля.

0 голосов
/ 05 августа 2010

# 3 нельзя предотвратить, когда пользователь может выполнить свой собственный фрагмент SQL.Вам нужно (маленькое) приложение, которое выполняет предопределенный SQL.Здесь не помогут даже VIEW, каждый может присоединиться к паре взглядов, чтобы нанести вред вашей системе.

...