Облачный PostgreSQL: Техническая информация

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

Ограничения

Облачный PostgreSQL – это DBaaS-решение, которое предполагает, что обслуживание PostgreSQL и виртуальной машины, на которой работает PostgreSQL, производится нашими силами. В связи с этим существует ряд ограничений, запрещающий выполнение некоторых действий со стороны пользователя посредством SQL-запросов:

  • Нельзя менять настройки облачной базы данных PostgreSQL.
  • Нельзя управлять пользователями, а также создавать и назначать роли. Однако можно назначать пользователям привилегии на уровне отдельных объектов баз данных.
  • Нельзя создавать базы данных. Однако владельцу БД можно выполнять команду ALTER DATABASE для ранее созданной БД.
  • Нельзя управлять расширениями PostgreSQL.
  • Недоступны никакие действия, требующие прав суперпользователя.

Управление пользователями, ролями и привилегиями

Атомарные полномочия в PostgreSQL называются привилегиями, группы полномочий – ролями. Подробнее об организации прав доступа вы можете прочитать в документации PostgreSQL.

Пользователь, создаваемый вместе с облачной базой данных PostgreSQL, является владельцем первой базы данных. Вы можете создавать других пользователей и настраивать их права по своему усмотрению.

Обратите внимание!
В случае если ваш проект требует кастомной системы ролей и пользователей, которые невозможно настроить в рамках ограничений облачного PostgreSQL, напишите в нашу техническую поддержку.

Изменение списка ролей пользователя

Для назначения роли пользователю необходимо использовать интерфейс панели управления. Назначение роли с помощью команды GRANT невозможно.

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

Специальные роли:

  • cdb_monitor – для пользователей, которые должны читать различные параметры конфигурации, статистику и другую системную информацию.

    Включает в себя привилегии предопределенных ролей pg_monitor и pg_read_all_stats.
  • cdb_read_all_data – для readonly-пользователей, которым необходима возможность выполнять SELECT-запросы к таблицам, представлениям (view) и последовательностям (sequence).

    Включает в себя привилегии предопределенной роли pg_read_all_data.
Обратите внимание!
В рамках облачной базы данных PostgreSQL не предусмотрено создание пользовательских ролей. Права пользователя определяются назначенными ему привилегиями.

Назначить роль пользователю вы можете в панели управления в разделе “Базы данных”, во вкладке “Пользователи и роли”:

  • При создании пользователя нажмите на кнопку “Дополнительные параметры” и выберите любое количество ролей в поле “Родительские роли”.
  • Для созданного пользователя нажмите на кнопку в списке пользователей и выберите любое количество ролей в поле “Пользователи, от которых будут унаследованы роли”.

Пользователи и доступ к базе данных

Для подключения к базе данных PostgreSQL пользователю необходима привилегия connect. 

При создании облачной базы данных первый пользователь (по умолчанию cloud_user) становится владельцем первой базы данных (по умолчанию default_db). При создании базы данных в разделе “Базы данных” вы выбираете пользователя-владельца из уже созданных пользователей.

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

При создании нового пользователя с ролями cdb_read_all_data, cdb_monitor или без роли вообще привилегия connect отсутствует. Как следствие, отсутствует возможность подключиться к базе данных под новым пользователем.

Есть несколько способов выдать привилегию connect новому пользователю:

  • Унаследовать пользователя от пользователя-владельца базы данных либо другого пользователя, которому выдана привилегия connect.
  • Выдать привилегию connect вручную, подключившись к базе данных под пользователем-владельцем.

Управление привилегиями пользователей

Управлять привилегиями пользователей может пользователь-владелец базы данных.

Для выдачи привилегий пользователю необходимо использовать команду GRANT. Подробное описание синтаксиса команды смотрите в документации PostgreSQL.

Для отзыва привилегий пользователю необходимо использовать команду REVOKE. Подробное описание синтаксиса команды смотрите в документации PostgreSQL.

Примеры

Во всех примерах используется новая база данных с названием default_db и пользователем-владельцем cloud_user. Также в базе данных создана таблица example.

Создание пользователя с возможностью выполнения INSERT-запросов в таблицу example

  1. Создайте пользователя user1 в панели управления.
  2. Подключитесь к базе данных default_db с помощью данных пользователя-владельца, например, через psql:
psql --host example.beget.app --username cloud_user --password --dbname default_db
  1. Выдайте привилегию на подключение к базе данных default_db пользователю user1, выполнив следующий запрос:
GRANT CONNECT ON DATABASE default_db TO user1;
  1. Выдайте привилегию на выполнение INSERT-запросов к таблице example, выполнив следующий запрос:
GRANT INSERT ON example TO user1;

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

REVOKE CONNECT ON DATABASE default_db FROM user1;
REVOKE INSERT ON example FROM user1;

Создание readonly-пользователя с доступом к базе данных default_db

  1. Создайте пользователя user1 в панели управления. При создании укажите ему роль cdb_read_all_data.
  2. Подключитесь к базе данных default_db с помощью данных пользователя-владельца, например, через psql:
psql --host example.beget.app --username cloud_user --password --dbname default_db
  1. Выдайте привилегию на подключение к базе данных default_db пользователю user1, выполнив следующий запрос:
GRANT CONNECT ON DATABASE default_db TO user1;

Отозвать выданную привилегию можно с помощью следующего запроса:

REVOKE CONNECT ON DATABASE default_db FROM user1;

Установка расширений PostgreSQL

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

Настройка внешнего доступа

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

Доступ из внешней сети

По умолчанию доступ к базе данных в облаке разрешен только из приватной сети. Чтобы настроить доступ к базе данных из внешней сети, укажите IP адреса или подсети в формате ip/subnet в поле “Доступ по внешнему IP-адресу”.

Если необходимо разрешить доступ с любого IP, укажите в поле подсеть 0.0.0.0/0.

Обратите внимание!
Невозможно указать пересекающиеся подсети либо IP-адрес, который входит в уже добавленную подсеть.

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

99
1105