GrantForge

    Базы данных / Реляционные

    PostgreSQL

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

    Плагин PostgreSQL ищет базы данных, схемы, таблицы и столбцы и управляет политиками доступа в терминах самого PostgreSQL: чтение, вставка и изменение столбцов, удаление строк, очистка таблиц и создание триггеров на них, создание объектов в схеме, а также создание схем и временных таблиц в базе данных, с фильтрами строк для таблиц. Идентификатор плагина и тип сервиса — оба postgresql. Плагин сервиса работает на сервере GrantForge; агент PostgreSQL, сервис рядом с серверами, применяет политики с помощью собственных привилегий и политик защиты строк PostgreSQL.

    Интеграционные тесты Testcontainers в репозитории охватывают PostgreSQL 15, 16, 17 и 18 — версии, которые поддерживает PostgreSQL; это не сертифицирует все остальные версии.

    Установка

    Дистрибутив содержит плагин в plugins/postgresql. Убедитесь в разделе Управление платформой → Плагины, что postgresql включён; после обновления каталога плагинов просканируйте его заново. Плагин общается с серверами через JDBC-драйвер PostgreSQL, в собственном загрузчике классов.

    Добавление сервиса данных

    1. Откройте Права на данные → Сервисы данных, добавьте сервис и выберите PostgreSQL (postgresql).
    2. Укажите сервер как host:port или несколько серверов.
    3. Выберите, как входит пользователь для поиска, укажите его имя и учётные данные, проверьте подключение и сохраните сервис. Проверка выполняет вход и описывает сервер: версию 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.

    Связанные руководства

    Редактировать эту страницу на GitHub