Привилегии для владельца базы данных; пользователь приложения

15

Быстрая версия:

Какую команду следует выполнить, чтобы позволить владельцу базы данных разрешить ему доступ к таблицам в этой базе данных, и это можно сделать из учетной записи этого владельца?


Более длинная версия:

Я создаю базу данных на RDS. У меня есть пользователь root, который я настроил с помощью Amazon.

Amazon автоматически создает групповую роль «rds_superuser», которая очень привилегирована, но на самом деле не является суперпользователем.

Я создаю базу данных и пользователя для приложения следующим образом:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

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

Когда приложение подключается (с учетными данными master_application), оно создает (и, следовательно, владеет) таблицы.

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

Я мог решить эту проблему раньше, запустив следующее из учетной записи приложения:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

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

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


обновить после повторной попытки изменить привилегии по умолчанию ...

Это все еще не предоставляет доступ к таблицам; Я вижу, что это предлагается в другом месте, и это имеет полный смысл, но это не работает для меня. Из оболочки psql:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

мой пользователь с правами суперпользователя - мой_интерфейс, а пользователи - это таблица в моей базе данных.


Обновить

Я получил довольно бесполезный ответ от кого-то из Amazon.

Они попросили меня позвонить в ALTER DEFAULT PRIVILEGES из логина master_application. Хотя это, вероятно, сработает, оно не ответит на мой вопрос (как я могу сделать это исключительно из учетной записи rds_superuser).

Я попросил их уточнить это, и они ушли.

Энди Дэвис
источник

Ответы:

9

Вы хотите ALTER DEFAULT PRIVILEGES.

Дайте rds_superuserправа доступа по умолчанию ко всем новым таблицам.

Это влияет только на таблицы, созданные после ALTER. Для существующих таблиц вы должны иметь GRANTправа.

Крейг Рингер
источник
Я пытался сделать это. Я плохо сформулировал это в исходном вопросе, я отредактировал его, чтобы показать именно ту команду, которую я выполнял. Я что-то не так понял?
Энди Дэвис
Это влияет только на таблицы , созданные послеALTER . Когда ты это сделал? Для существующих таблиц вы должны иметь GRANTправа.
Крейг Рингер
Я изменил значения по умолчанию, а затем создал таблицы. Я собираюсь попробовать это снова, возможно, я допустил ошибку.
Энди Дэвис
Все еще не повезло с этим, хотя это абсолютно похоже на команду, которая должна решить проблему. Я обновил команду, чтобы включить вывод из \ ddp и \ dp из одной из таблиц.
Энди Дэвис
Ужасно странно. Можете ли вы воспроизвести проблему в обычном (не RDS) PostgreSQL?
Крейг Рингер,
0

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

Итак, если вы не используете:

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

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

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

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

Не наоборот, как вы пытаетесь это сделать.

Александрос
источник
А? GRANTНикогда не должны быть в состоянии уменьшить права доступа. Я не убежден. Обратите внимание, что права на схему также не наследуются новыми таблицами в этой схеме, поэтому наличие доступа к publicсхеме не означает, что вы можете использовать таблицы внутри нее.
Крэйг Рингер,
Я наконец смог опробовать это, и это не помогло ситуации.
Энди Дэвис
Я отредактировал вопрос, чтобы исключить Грант, на который ссылался @Aleandros. Казалось, это не проблема, но я думаю, что это отвлекало.
Энди Дэвис,