Назад | Перейти на главную страницу

Как максимально просто создать пользователя веб-приложения PostgreSQL с ограниченными правами?

Есть ли у кого-нибудь сейчас простой и относительно быстрый способ достичь следующего:

У меня есть СУБД PostgreSQL 8.2.9 с несколькими (10 или около того) разными базами данных, которые все служат для соответствующих веб-приложений. Эти базы данных разделены на разные схемы, которые, конечно же, разделены на разные таблицы.

Я использовал суперпользователя postgres для подключения к базам данных в своих веб-приложениях. Теперь я хочу переосмыслить свою концепцию безопасности и, следовательно, создать менее привилегированного пользователя, который может выполнять только следующие действия: INSERT, DELETE, UPDATE и SELECT для всех таблиц всех баз данных. Не имеет значения, может ли этот пользователь получить доступ ко всем базам данных, я не хочу создавать отдельных пользователей для всех веб-приложений.

В любом случае должен быть способ предоставить эти привилегии пользователю после его создания, что-то вроде

GRANT SELECT, INSERT, UPDATE, DELETE ON . TO new_user;

Я знаю только, как предоставить эти привилегии отдельным таблицам, но это была бы одиссея с более чем 10000 таблицами, распределенными по 10 базам данных. Я кое-что читал о чтении метатаблицы pg_tables, чтобы получить список всех таблиц, но это почему-то не сработало в моей версии. Может быть, вы также могли бы ответить, существует ли на самом деле база данных PostgreSQL, которая стоит выше всех баз данных и включает в себя метаинформацию обо всех базах данных ?! Я только заметил, что в каждой базе данных есть схема под названием information_schema, в которой хранится информация о текущей базе данных ?!

Большое спасибо.

Массовый GRANT / REVOKE доступен только в PostgreSQL 9.0+.

Вместо этого вы можете создать функции pg_grant () и pg_revoke (), найденные в http://blog.bhushangahire.net/2009/06/17/grant-privileges-to-all-tables-in-a-database-for-postgresql/

Параметры обеих функций:

  1. Роль пользователя
  2. Разрешения
  3. Имя объекта, может быть шаблоном. «%» влияет на все объекты
  4. Имя схемы

Вам нужно будет запустить команду для каждой базы данных и каждой схемы. Синтаксис выглядит так:

SELECT pg_grant('web_user','SELECT,INSERT,UPDATE,DELETE','%','public');

Если хотите, вы можете изменить эту строку в определении функции:

nspname = $4 AND

к этому:

nspname like $4 AND

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