В этой статье мы расскажем о нюансах использования PostgreSQL в облаке – существующих ограничениях, управлении пользователями, ролями и привилегиями, а также настройках внешнего доступа.
Ограничения
Облачный PostgreSQL – это DBaaS-решение, которое предполагает, что обслуживание PostgreSQL и виртуальной машины, на которой работает PostgreSQL, производится нашими силами. В связи с этим существует ряд ограничений, запрещающий выполнение некоторых действий со стороны пользователя посредством SQL-запросов:
- Нельзя менять настройки облачной базы данных PostgreSQL.
- Нельзя управлять пользователями, а также создавать и назначать роли. Однако можно назначать пользователям привилегии на уровне отдельных объектов баз данных.
- Нельзя создавать базы данных. Однако владельцу БД можно выполнять команду
ALTER DATABASE
для ранее созданной БД. - Нельзя управлять расширениями 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 пользователю необходима привилегия 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
- Создайте пользователя
user1
в панели управления. - Подключитесь к базе данных
default_db
с помощью данных пользователя-владельца, например, черезpsql
:
psql --host example.beget.app --username cloud_user --password --dbname default_db
- Выдайте привилегию на подключение к базе данных
default_db
пользователюuser1
, выполнив следующий запрос:
GRANT CONNECT ON DATABASE default_db TO user1;
- Выдайте привилегию на выполнение 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
- Создайте пользователя
user1
в панели управления. При создании укажите ему рольcdb_read_all_data
. - Подключитесь к базе данных
default_db
с помощью данных пользователя-владельца, например, черезpsql
:
psql --host example.beget.app --username cloud_user --password --dbname default_db
- Выдайте привилегию на подключение к базе данных
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
.
Если у вас возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или наши продукты с коллегами по цеху и сотрудниками Бегета – ждем вас в нашем сообществе в Telegram.