Плагин PostgreSQL ищет базы данных, схемы, таблицы и столбцы и управляет политиками доступа в терминах самого PostgreSQL: чтение, вставка и изменение столбцов, удаление строк, очистка таблиц и создание триггеров на них, создание объектов в схеме, а также создание схем и временных таблиц в базе данных, с фильтрами строк для таблиц. Идентификатор плагина и тип сервиса — оба postgresql. Плагин сервиса работает на сервере GrantForge; агент PostgreSQL, сервис рядом с серверами, применяет политики с помощью собственных привилегий и политик защиты строк PostgreSQL.
Интеграционные тесты Testcontainers в репозитории охватывают PostgreSQL 15, 16, 17 и 18 — версии, которые поддерживает PostgreSQL; это не сертифицирует все остальные версии.
Установка
Дистрибутив содержит плагин в plugins/postgresql. Убедитесь в разделе Управление платформой → Плагины, что postgresql включён; после обновления каталога плагинов просканируйте его заново. Плагин общается с серверами через JDBC-драйвер PostgreSQL, в собственном загрузчике классов.
Добавление сервиса данных
- Откройте Права на данные → Сервисы данных, добавьте сервис и выберите PostgreSQL (
postgresql). - Укажите сервер как
host:portили несколько серверов. - Выберите, как входит пользователь для поиска, укажите его имя и учётные данные, проверьте подключение и сохраните сервис. Проверка выполняет вход и описывает сервер: версию PostgreSQL, пользователя, под которым выполнен вход, и число баз данных на сервере.
Пользователь для поиска позволяет GrantForge находить ресурсы; он отделён от пользователей, которые читают и записывают. Успешная проверка подключения не означает, что доступ уже подчиняется политикам.
| Параметр | Назначение |
|---|---|
postgresql.hosts |
Обязательный: сервер как host:port, например postgres1.example.com:5432; несколько через запятую, по очереди, когда один недоступен. Порт по умолчанию — 5432 |
postgresql.database |
База данных, в которую пользователь для поиска входит первой, чтобы перечислить базы данных; по умолчанию postgres |
authentication |
password (по умолчанию) или certificate: клиентский сертификат TLS, который аутентификация cert в PostgreSQL сопоставляет пользователю |
username |
Обязательный: пользователь для поиска |
password |
password: пароль пользователя для поиска; хранится в зашифрованном виде |
ssl.mode |
TLS так, как его называет sslmode из libpq: disable, allow, prefer (по умолчанию), require, verify-ca или verify-full, который проверяет ещё и имя сервера |
ssl.root.certificate |
verify-ca и verify-full: сертификат УЦ в формате PEM, по которому проверяются серверы, на сервере GrantForge; пусто — используется сертификат JVM |
ssl.client.certificate, ssl.client.key |
certificate: клиентский сертификат PEM и его закрытый ключ PKCS #8, PEM или DER, на сервере GrantForge; вход по сертификату требует require или режима проверки, а режим проверки при этом требует ssl.root.certificate |
timeout |
Сколько могут длиться подключение и запрос, по умолчанию 30000, диапазон 1..600000 миллисекунд |
Параметры одного способа входа отклоняются при другом, так что сервис точно указывает, как он входит. Драйвер PostgreSQL отклоняет файл закрытого ключа, который могут читать не только его владелец. Отклонённый вход, отсутствующая база данных, недоступный сервер или сервер, чей сертификат нельзя проверить, сообщаются как таковые.
Что видит пользователь для поиска
Каталоги PostgreSQL показывают каждому пользователю имена баз данных, а в каждой базе, к которой он может подключиться, — имена схем, таблиц и столбцов, не читая данных. Пользователю для поиска нужен только CONNECT к базам данных, для которых пишутся политики; PUBLIC имеет его, если его не отозвали. Поиск схем, таблиц или столбцов входит в каждую базу данных, которую называет политика, не более 20, и пропускает базы, к которым пользователь для поиска не может подключиться. Собственные схемы PostgreSQL — начинающиеся с pg_ и information_schema — исключены: политики их не решают.
Ресурсы и типы доступа
| Уровень | Сопоставление | Типы доступа |
|---|---|---|
database |
Подстановочные знаки, с учётом регистра; имя базы данных | create_schema, temporary |
schema |
Подстановочные знаки, с учётом регистра; внутри базы данных | create |
table |
Подстановочные знаки, с учётом регистра; таблицы, секционированные таблицы, представления, материализованные представления и сторонние таблицы внутри схемы | delete, truncate, trigger |
column |
Подстановочные знаки, с учётом регистра; внутри таблицы | select, insert, update |
| Тип доступа | Привилегии PostgreSQL |
|---|---|
select, insert, update |
SELECT, INSERT, UPDATE на столбцы или на всю таблицу |
delete, truncate, trigger |
DELETE, TRUNCATE, TRIGGER на таблицу |
create |
CREATE на схему: таблицы, представления, последовательности, функции и другие объекты в ней |
create_schema |
CREATE на базу данных: схемы в ней |
temporary |
TEMPORARY на базу данных |
Чтение, вставка и изменение решаются по столбцам, как их выдаёт PostgreSQL: политика для select, insert или update называет столбцы, * — все. Так политика может разрешить таблицу и запретить один её столбец, и пользователь может читать все остальные. В значениях политик * соответствует любой последовательности символов, а ? — одному символу. Редактор политик подсказывает базы данных, схемы баз, которые называет политика, их таблицы и столбцы.
Чтобы добраться до того, что разрешает политика, PostgreSQL нужно больше: CONNECT к базе данных, USAGE на схему и, для вставки в столбец serial, USAGE на его последовательность. Это не отдельные типы доступа: агент выдаёт их вместе с тем, чему они нужны. В PostgreSQL нет маскирования столбцов, поэтому этот тип сервиса его не предлагает.
Фильтры строк
Политика фильтрации строк на таблице показывает её пользователям строки, для которых выполняется условие. Условие — выражение PostgreSQL в том виде, в каком его принимает USING политики защиты строк, например region = 'EU' или owner = current_user. Пользователь видит фильтр первой политики, которая к нему применяется, как и в других сервисах. PostgreSQL фильтрует только строки таблиц и секционированных таблиц: представление или похожий объект, строки которого политика фильтрует для пользователя, этому пользователю вообще недоступно для чтения.
Пример политик
Пусть на сервере есть базы данных sales и hr, а в sales — схема crm. Создайте эти включённые политики в одном сервисе данных:
| Ресурсы | Правило |
|---|---|
database=sales, schema=crm, table=*, column=* |
Разрешить select группе analysts |
database=sales, schema=crm, table=orders, column=card |
Запретить select группе analysts |
database=sales, schema=crm, table=orders, column=* |
Разрешить insert пользователю ingest |
database=sales, schema=team_* |
Разрешить create группе data-team |
database=sales, schema=team_*, table=* |
Разрешить delete и truncate группе data-team |
database=sales, schema=team_*, table=*, column=* |
Разрешить select, insert и update группе data-team |
database=sales |
Разрешить create_schema группе data-team |
database=sales, schema=crm, table=orders (фильтр строк) |
Показывать пользователю emea строки region = 'EMEA' |
После того как агент применит новый снимок, члены analysts читают каждую таблицу crm, кроме номеров карт в orders; ingest вставляет в orders, включая её идентификаторы serial, и ничего не читает; члены data-team создают схемы и в тех, чьё имя начинается с team_, создают, читают, изменяют и очищают таблицы; а emea, если политика позволяет ему читать orders, видит только строки своего региона.
Применение политик
Плагин сервиса управляет политиками и ищет ресурсы. Чтобы их применять, нужен агент PostgreSQL — по одному на сервер или на основной сервер. Развёртывание и проверки описаны в разделе Агент PostgreSQL.
