2010-08-05 3 views
4

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

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

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

В вашем ответе, пожалуйста, будьте как можно более конкретными.

ответ

2

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

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

ALTER ROLE <rolename> SET statement_timeout = '60000' 

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

+1

Он все равно может убить ваш ввод-вывод, и это всего лишь один запрос.Пожар 1 запрос в минуту, и в вашей базе данных все еще много проблем. –

+0

Правда, но это, по крайней мере, останавливает одноразовые случайные (или просто мозговые) массовые плохие запросы, которые будут большинством проблем. У нас возникли дополнительные проблемы на любом сервере, у которого был добавлен этот параметр для пользователей, умеющих писать специальные запросы. –

2

Ну, вам действительно нужно, чтобы CREATE a ROLE, а затем GRANT read only access прямо на вещи, которые вы хотите разрешить. Все, что вы не предоставляете, они не могут делать (если они не являются суперпользователем).

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

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

0

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

+0

Черт. Я как бы надеялся, что может существовать какая-то подобная система для лимитов PAM's .conf для Linux, но для запросов к базе данных ... – fmark

1

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

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

Если автоматизировать какую-то часть этого, скажем, дать людям команду «Настройка Postgres» для запуска, вуаля.

1

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