F.39. pg_proaudit — регистрация различных событий, связанных с безопасностью #

Расширение pg_proaudit позволяет регистрировать различные события, связанные с безопасностью.

pg_proaudit работает параллельно со стандартными средствами протоколирования PostgreSQL (сборщиком сообщений) и не зависит от них. Журнал событий безопасности расширения pg_proaudit сохраняется отдельно от журнала работы сервера. При запуске Postgres Pro Standard расширение pg_proaudit запускает специальный фоновый процесс, который записывает в журнал информацию о событиях безопасности.

Правила регистрации событий сохраняются в файле конфигурации pg_proaudit.conf, располагающемся в каталоге данных кластера (PGDATA). Он представляет собой текстовый файл, который можно редактировать непосредственно, используя инструменты операционной системы. Для изменения его содержимого средствами SQL предусмотрены несколько функций pg_proaudit. В представлении pg_proaudit_settings можно посмотреть текущие правила pg_proaudit, даже если они ещё не были сохранены в файл pg_proaudit.conf.

Все фиксируемые события разделяются на следующие классы:

  • команды DDL для создания, изменения и удаления объектов СУБД (баз данных, табличных пространств, схем, таблиц, представлений, последовательностей, языков, функций)

  • команды управления доступом к объектам баз данных (GRANT, REVOKE)

  • команды DML для обращения к объектам баз данных (INSERT, UPDATE, DELETE, SELECT, TRUNCATE для таблиц/представлений, EXECUTE для функций)

  • события аутентификации/отключения от баз данных

  • все команды, выполняемые определённым пользователем

События безопасности могут как передаваться централизованному средству журналирования операционной системы (syslog), так и записываться в обычные файлы операционной системы. Оба варианта могут задействоваться одновременно. Журналы событий в файлах имеют формат CSV. Все записи pg_proaudit в syslog имеют метку AUDIT, что позволяет однозначно их определять. Файлы журнала событий записываются в формате CSV. Каждое событие записывается в отдельную строку, в которой выделяются следующие поля:

  • дата и время события

  • имя пользователя

  • имя базы данных

  • идентификатор серверного процесса (PID)

  • уровень важности: INFO или ERROR

  • последовательный номер команды в сеансе

  • номер подкоманды в сложных командах (CREATE TABLE ... AS SELECT ...)

  • имя оператора

  • тип объекта

  • имя объекта

  • результат выполнения оператора: SUCCESS (успех) или FAILURE (отказ)

  • сообщение об ошибке в случае результата FAILURE

  • текст SQL-команды

  • параметры команды (например, для PREPARE)

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

Пользователь Postgres Pro с атрибутом SUPERUSER должен давать доступ к расширению pg_proaudit и журналам событий безопасности только пользователям, исполняющим роль администратора информационной безопасности.

F.39.1. Установка и настройка #

Расширение pg_proaudit включено в состав Postgres Pro Standard как стандартное расширение. Чтобы задействовать pg_proaudit, выполните следующие действия:

  1. Добавьте pg_proaudit в переменную shared_preload_libraries в файле postgresql.conf:

    shared_preload_libraries = 'pg_proaudit'
  2. Перезагрузите сервер баз данных, чтобы изменения вступили в силу.

    Примечание

    Чтобы убедиться, что библиотека pg_proaudit установлена правильно, вы можете выполнить следующую команду:

    SHOW shared_preload_libraries;
  3. Создайте расширение pg_proaudit, выполнив следующий запрос:

    CREATE EXTENSION pg_proaudit;

    Расширение pg_proaudit добавляет несколько функций для управления файлом pg_proaudit.conf, представление pg_proaudit_settings, показывающее текущие правила pg_proaudit, и событийные триггеры. Для удобства расширение pg_proaudit следует создать в каждой базе данных, в которой вы планируете регистрировать события, связанные с безопасностью.

F.39.2. Настройка записи событий в журнал #

Для настройки регистрации событий в pg_proaudit предусмотрен SQL-интерфейс, состоящий из различных функций, а также представление pg_proaudit_settings.

pg_proaudit_set_object(event_type text, object_type text, db_name text)
pg_proaudit_set_object(event_type text, object_oid oid, db_name text)

Включает регистрацию событий с заданными параметрами. Регистрация начинается сразу после завершения функции pg_proaudit_set_object(), но файл pg_proaudit.conf не изменяется. Для сохранения изменений в файле pg_proaudit.conf вызовите функцию pg_proaudit_save().

Аргументы:

  • event_type — тип событий, которые должны регистрироваться, включая имена операторов SQL, а также названия событий AUTHENTICATE и DISCONNECT. Если равняется ALL, включается регистрация всех возможных событий для объектов заданного типа. Например, для объектов типа TABLE ключевое слово ALL включает регистрацию команд SELECT, INSERT, UPDATE, DELETE, TRUNCATE, а также CREATE, ALTER, DROP. Полный список допустимых значений параметра event_type приведён в Подразделе F.39.3.1.

  • object_type — тип объектов, для которых должны регистрироваться события. Например, для регистрации всех попыток доступа к сторонним таблицам, укажите тип объекта FOREIGN TABLE для события SELECT. Если в event_type передаётся AUTHENTICATE, DISCONNECT, SET или RESET, в данном параметре должен передаваться NULL. Для всех событий, относящихся к действиям с пользователями, например CREATE USER или DROP USER, в качестве типа нужно передавать ROLE.

  • object_oid — идентификатор объекта (OID), для которого должны регистрироваться события безопасности.

  • db_name — имя базы данных, для которой необходимо регистрировать события безопасности. Значением по умолчанию является пустая строка, что означает, что регистрируются события для текущей базы данных. В этом случае запись в файле pg_proaudit.conf содержит имя текущей базы данных. Если установлено значение NULL, действия регистрируются для всех баз данных, в которых создано расширение pg_proaudit. В этом случае запись pg_proaudit.conf содержит пустое значение. Например, чтобы зарегистрировать все события для всех объектов во всех базах данных, выполните SELECT pg_proaudit_set_object('ALL', NULL, NULL), что соответствует записи ,all,,0, в файле pg_proaudit.conf.

pg_proaudit_set_role(event_type text, role_oid oid, db_name text)

Включает регистрацию событий, вызванных определённым пользователем СУБД. Регистрация соответствующих событий начинается сразу после завершения pg_proaudit_set_role, но файл pg_proaudit.conf не изменяется. Для сохранения изменений в файле pg_proaudit.conf вызовите функцию pg_proaudit_save().

Аргументы:

  • event_type — тип событий, которые должны регистрироваться. Со значением ALL регистрируются все команды, выполняемые пользователем, указанным в параметре role_oid. Список возможных значений приведён в Подразделе F.39.3.1.

  • role_oid — идентификатор пользователя (OID), действия которого необходимо регистрировать. Если установлено значение NULL, действия регистрируются для всех пользователей. В этом случае запись в файле pg_proaudit.conf содержит пустое значение.

  • db_name — имя базы данных, для которой необходимо регистрировать события безопасности. Значением по умолчанию является пустая строка, что означает, что регистрируются события для текущей базы данных. В этом случае запись в файле pg_proaudit.conf содержит имя текущей базы данных. Если установлено значение NULL, действия регистрируются для всех баз данных, в которых создано расширение pg_proaudit. В этом случае запись pg_proaudit.conf содержит пустое значение. Например, чтобы зарегистрировать все события для всех пользователей во всех базах данных, выполните SELECT pg_proaudit_set_role('ALL', NULL, NULL), что соответствует записи ,all,,0, в файле pg_proaudit.conf.

pg_proaudit_reset_object(event_type text, object_type text, db_name text)
pg_proaudit_reset_object(event_type text, object_oid oid, db_name text)

Отключает регистрацию событий с заданными параметрами. Для сохранения изменений в файле конфигурации pg_proaudit.conf вызовите функцию pg_proaudit_save().

Аргументы:

  • event_type — тип событий, которые должны регистрироваться, включая имена операторов SQL, а также названия событий AUTHENTICATE и DISCONNECT. Если равняется ALL, включается регистрация всех возможных событий для объектов заданного типа. Например, для объектов типа TABLE ключевое слово ALL включает регистрацию команд SELECT, INSERT, UPDATE, DELETE, TRUNCATE, а также CREATE, ALTER, DROP. Полный список допустимых значений параметра event_type приведён в Подразделе F.39.3.1.

  • object_type — тип объектов, для которых должны регистрироваться события. Например, для регистрации всех попыток доступа к сторонним таблицам, укажите тип объекта FOREIGN TABLE для события SELECT. Если в event_type передаётся AUTHENTICATE, DISCONNECT, SET или RESET, в данном параметре должен передаваться NULL. Для всех событий, относящихся к действиям с пользователями, например CREATE USER или DROP USER, в качестве типа нужно передавать ROLE.

  • object_oid — идентификатор объекта (OID), для которого должны регистрироваться события безопасности.

  • db_name — имя базы данных, для которой необходимо регистрировать события безопасности. Значением по умолчанию является пустая строка, что означает, что регистрируются события для текущей базы данных. В этом случае запись в файле pg_proaudit.conf содержит имя текущей базы данных. Если установлено значение NULL, действия регистрируются для всех баз данных, в которых создано расширение pg_proaudit. В этом случае запись pg_proaudit.conf содержит пустое значение. Например, чтобы удалить правило регистрации всех событий для всех объектов во всех базах данных, выполните SELECT pg_proaudit_reset_object('ALL', NULL, NULL), что соответствует записи ,all,,0, в файле pg_proaudit.conf.

pg_proaudit_reset_role(event_type text, role_oid oid, db_name text)

Отключает регистрацию событий, связанных с заданным пользователем СУБД. Для сохранения изменённой конфигурации в файле pg_proaudit.conf вызовите функцию pg_proaudit_save().

Аргументы:

  • event_type — тип событий, которые должны регистрироваться. Со значением ALL регистрируются все команды, выполняемые пользователем, указанным в параметре role_oid. Список возможных значений приведён в Подразделе F.39.3.1.

  • role_oid — идентификатор пользователя (OID), действия которого необходимо регистрировать. Если установлено значение NULL, действия регистрируются для всех пользователей. В этом случае запись в файле pg_proaudit.conf содержит пустое значение.

  • db_name — имя базы данных, для которой необходимо регистрировать события безопасности. Значением по умолчанию является пустая строка, что означает, что регистрируются события для текущей базы данных. В этом случае запись в файле pg_proaudit.conf содержит имя текущей базы данных. Если установлено значение NULL, действия регистрируются для всех баз данных, в которых создано расширение pg_proaudit. В этом случае запись pg_proaudit.conf содержит пустое значение. Например, чтобы удалить правило регистрации всех событий для всех пользователей во всех базах данных, выполните SELECT pg_proaudit_reset_role('ALL', NULL, NULL), что соответствует записи ,all,,0, в файле pg_proaudit.conf.

pg_proaudit_show()

Возвращает список регистрируемых событий в виде таблицы. Эта функция применяется в представлении pg_proaudit_settings.

pg_proaudit_reload()

Считывает конфигурацию регистрации из файла pg_proaudit.conf. Вы должны вызывать эту функцию, если файл pg_proaudit.conf изменялся непосредственно средствами операционной системы.

pg_proaudit_reset()

Отключает регистрацию всех событий. Для сохранения изменённой конфигурации в файле pg_proaudit.conf вызовите функцию pg_proaudit_save().

pg_proaudit_save()

Сохраняет правила регистрации из памяти в файле pg_proaudit.conf. Файл pg_proaudit.conf размещается в каталоге данных кластера (PGDATA). Изменить расположение файла pg_proaudit.conf нельзя.

F.39.3. Представление pg_proaudit_settings #

В этом представлении показываются текущие правила pg_proaudit, даже если они ещё не были сохранены в файл pg_proaudit.conf. Представление pg_proaudit_settings образуют следующие столбцы:

  • db_name (text) — имя базы данных, в которой регистрируются события.

  • event_type (text) — тип регистрируемых событий.

  • object_type (text) — тип объекта, для которого должны регистрироваться события.

  • object_name (text) — имя объекта, для которого должны регистрироваться события.

  • role_name (text) — роль, от имени которой должны выполняться регистрируемые действия.

F.39.3.1. События безопасности #

Расширение pg_proaudit может регистрировать следующие события:

  • AUTHENTICATE

  • DISCONNECT

  • ALTER AGGREGATE

  • ALTER COLLATION

  • ALTER CONVERSION

  • ALTER DATABASE

  • ALTER DEFAULT PRIVILEGES

  • ALTER DOMAIN

  • ALTER EVENT TRIGGER

  • ALTER EXTENSION

  • ALTER FOREIGN DATA WRAPPER

  • ALTER FOREIGN TABLE

  • ALTER FUNCTION

  • ALTER INDEX

  • ALTER LANGUAGE

  • ALTER LARGE OBJECT

  • ALTER MATERIALIZED VIEW

  • ALTER OPERATOR

  • ALTER OPERATOR CLASS

  • ALTER OPERATOR FAMILY

  • ALTER POLICY

  • ALTER ROLE, ALTER USER, ALTER GROUP

  • ALTER RULE

  • ALTER SCHEMA

  • ALTER SEQUENCE

  • ALTER SERVER

  • ALTER SYSTEM

  • ALTER TABLE

  • ALTER TABLESPACE

  • ALTER TEXT SEARCH CONFIGURATION

  • ALTER TEXT SEARCH DICTIONARY

  • ALTER TEXT SEARCH PARSER

  • ALTER TEXT SEARCH TEMPLATE

  • ALTER TRIGGER

  • ALTER TYPE

  • ALTER USER MAPPING

  • ALTER VIEW

  • CLUSTER

  • COMMENT

  • COPY

  • CREATE ACCESS METHOD

  • CREATE AGGREGATE

  • CREATE CAST

  • CREATE COLLATION

  • CREATE CONVERSION

  • CREATE DATABASE

  • CREATE DOMAIN

  • CREATE EVENT TRIGGER

  • CREATE EXTENSION

  • CREATE FOREIGN DATA WRAPPER

  • CREATE FOREIGN TABLE

  • CREATE FUNCTION

  • CREATE INDEX

  • CREATE LANGUAGE

  • CREATE MATERIALIZED VIEW

  • CREATE OPERATOR

  • CREATE OPERATOR CLASS

  • CREATE OPERATOR FAMILY

  • CREATE POLICY

  • CREATE ROLE, CREATE USER, CREATE GROUP

  • CREATE RULE

  • CREATE SCHEMA

  • CREATE SEQUENCE

  • CREATE SERVER

  • CREATE TABLE, CREATE TABLE AS, SELECT INTO

  • CREATE TABLESPACE

  • CREATE TEXT SEARCH CONFIGURATION

  • CREATE TEXT SEARCH DICTIONARY

  • CREATE TEXT SEARCH PARSER

  • CREATE TEXT SEARCH TEMPLATE

  • CREATE TRANSFORM

  • CREATE TRIGGER

  • CREATE TYPE

  • CREATE USER MAPPING

  • CREATE VIEW

  • DELETE

  • DO

  • DROP ACCESS METHOD

  • DROP AGGREGATE

  • DROP CAST

  • DROP COLLATION

  • DROP CONVERSION

  • DROP DATABASE

  • DROP DOMAIN

  • DROP EVENT TRIGGER

  • DROP EXTENSION

  • DROP FOREIGN DATA WRAPPER

  • DROP FOREIGN TABLE

  • DROP FUNCTION

  • DROP INDEX

  • DROP LANGUAGE

  • DROP MATERIALIZED VIEW

  • DROP OPERATOR

  • DROP OPERATOR CLASS

  • DROP OPERATOR FAMILY

  • DROP OWNED

  • DROP POLICY

  • DROP ROLE, DROP USER, DROP GROUP

  • DROP RULE

  • DROP SCHEMA

  • DROP SEQUENCE

  • DROP SERVER

  • DROP TABLE

  • DROP TABLESPACE

  • DROP TEXT SEARCH CONFIGURATION

  • DROP TEXT SEARCH DICTIONARY

  • DROP TEXT SEARCH PARSER

  • DROP TEXT SEARCH TEMPLATE

  • DROP TRANSFORM

  • DROP TRIGGER

  • DROP TYPE

  • DROP USER MAPPING

  • DROP VIEW

  • GRANT

  • INSERT

  • REASSIGN OWNED

  • REFRESH MATERIALIZED VIEW

  • REINDEX

  • RESET

  • REVOKE

  • SECURITY LABEL

  • SELECT

  • SET

  • UPDATE

  • TRUNCATE TABLE

F.39.4. Параметры конфигурации журнала событий безопасности #

Расширение pg_proaudit предоставляет несколько параметров конфигурации для управления файлами журналов событий безопасности. Эти параметры можно задать непосредственно в файле конфигурации postgresql.conf или посредством команды ALTER SYSTEM. Чтобы изменения вступили в силу, вызовите функцию pg_reload_conf() или перезагрузите сервер баз данных. Для дополнительной настройки можно использовать параметры конфигурации syslog_ident и syslog_facility.

pg_proaudit.log_destination (string)

Определяет метод фиксирования событий безопасности. Возможные значения:

  • csvlog — записывать события безопасности в файл CSV.

  • syslog — передавать события безопасности в syslog.

Данный параметр может содержать одно или несколько этих значений, разделённых запятыми.

По умолчанию: csvlog

pg_proaudit.log_catalog_access (boolean)

Определяет, будут ли регистрироваться обращения к объектам системного каталога в схеме pg_catalog.

По умолчанию отключено.

pg_proaudit.log_command_text (boolean)

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

По умолчанию включено.

pg_proaudit.log_directory (string)

Задаёт путь к каталогу для сохранения файлов журналов CSV. Это может быть абсолютный путь либо путь, заданный относительно каталога данных (PGDATA). Этот параметр используется, если параметр pg_proaudit.log_destination содержит значение csvlog.

По умолчанию: pg_proaudit

pg_proaudit.log_filename (string)

Определяет шаблон имён файлов для журналов событий. Этот шаблон может содержать спецпоследовательности с %, перечисленные в описании strftime стандарта Open Group (http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html). Данный параметр используется, если параметр pg_proaudit.log_destination содержит csvlog.

По умолчанию: postgresql-%Y-%m-%d_%H%M%S.log

pg_proaudit.log_rotation_size (integer)

Задаёт максимальный размер файла журнала CSV, в килобайтах. По достижении этого размера pg_proaudit создаёт для записи событий безопасности новый файл. Данный параметр используется, если параметр pg_proaudit.log_destination содержит csvlog. Если он равен 0, новый файл в зависимости от размера текущего создаваться не будет.

По умолчанию: 10 МБ

pg_proaudit.log_rotation_age (integer)

Задаёт максимальное время жизни файла журнала, в минутах. По истечении этого времени pg_proaudit создаёт новый файл для записи событий безопасности. Данный параметр используется, если параметр pg_proaudit.log_destination содержит csvlog. Если он равен 0, создание новых файлов журналов по времени отключается.

По умолчанию: 1 день

pg_proaudit.log_truncate_on_rotation (boolean)

Определяет, должны ли усекаться файлы журналов при переключении записи на уже существующий файл журнала. Со значением off pg_proaudit продолжает запись в конец файла. Данный параметр используется, если параметр pg_proaudit.log_destination содержит значение csvlog.

По умолчанию отключено.

F.39.5. Просмотр журнала событий безопасности #

Файлы журналов событий безопасности представляют собой текстовые файлы, которые можно просмотреть средствами операционной системы. Чтобы прочитать файлы журналов на уровне SQL, вы можете применить расширение file_fdw — обёртку сторонних данных для обращения к файлам на сервере. Для этого выполните следующие действия:

  1. Установите file_fdw и создайте определение стороннего сервера:

    CREATE EXTENSION file_fdw;
    CREATE SERVER pg_proauditlog FOREIGN DATA WRAPPER file_fdw;
  2. Создайте стороннюю таблицу, определив её столбцы и указав абсолютный путь к файлу журнала. Фактический путь определяется параметрами pg_proaudit.log_directory и pg_proaudit.log_filename.

    CREATE FOREIGN TABLE pg_proaudit_log
          ( log_time timestamp(3) with time zone,
            role_name text,
            database_name text,
            session_pid text,
            error_severity text,
            session_line_num bigint,
            session_line_subcommand_num bigint,
            event_type text,
            object_type text,
            object_name text,
            status text,
            error_message text,
            query_text text,
            query_args text )
    SERVER pg_proauditlog
    OPTIONS (filename 'absolute_file_path_to_log_file.csv', FORMAT 'csv' );

Убедитесь в том, что параметр pg_proaudit.log_destination содержит значение csvlog, включающее запись событий безопасности в файлы CSV.

F.39.6. Примеры #

В качестве примера давайте настроим регистрацию следующих событий:

  • аутентификация/отключение от базы данных postgres

  • все действия пользователя postgres

  • создание, изменение и удаление любых таблиц

  • все операции с таблицей app_table, принадлежащей схеме public

Все события должны записываться в файлы в формате CSV и храниться неделю. Для обращения к журналу событий необходимо организовать доступ на уровне SQL. Для решения этой задачи выполните следующее:

Воспользовавшись psql, убедитесь, что предварительная подготовка расширения pg_proaudit в базе данных postgres выполнена:

SHOW shared_preload_libraries;
 shared_preload_libraries 
--------------------------
 pg_proaudit

\dx pg_proaudit 
                 List of installed extensions
  Name   | Version | Schema |           Description           
---------+---------+--------+---------------------------------
 pg_proaudit | 1.0     | public | provides auditing functionality

Добавьте следующие строки в файл конфигурации postgresql.conf:

pg_proaudit.log_destination = 'csvlog'
pg_proaudit.log_directory = 'audit'
pg_proaudit.log_filename = 'audit-%u.csv'
pg_proaudit.log_rotation_age = 1440
pg_proaudit.log_rotation_size = 0
pg_proaudit.log_truncate_on_rotation = on
pg_proaudit.log_command_text = on

Чтобы изменения вступили в силу, выполните:

SELECT pg_reload_conf();

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

SHOW pg_proaudit.log_destination;
SHOW pg_proaudit.log_directory;
SHOW pg_proaudit.log_filename;
SHOW pg_proaudit.log_rotation_age;
SHOW pg_proaudit.log_rotation_size;
SHOW pg_proaudit.log_truncate_on_rotation;
SHOW pg_proaudit.log_command_text;

Предположим, что ваша переменная окружения PGDATA указывает на каталог данных кластера. Так как в pg_proaudit.log_directory задан относительный путь, файлы журналов будут находиться в каталоге $PGDATA/audit. Создадим пустые файлы для семи дней недели и сделаем их доступными только для владельца:

touch $PGDATA/audit/audit-1.csv
touch $PGDATA/audit/audit-2.csv
touch $PGDATA/audit/audit-3.csv
touch $PGDATA/audit/audit-4.csv
touch $PGDATA/audit/audit-5.csv
touch $PGDATA/audit/audit-6.csv
touch $PGDATA/audit/audit-7.csv
chmod 600 $PGDATA/audit/audit-*.csv

Создайте таблицу для чтения записей журнала:

CREATE TABLE pg_proaudit_log (
  log_time timestamp(3) with time zone,
  role_name text,
  database_name text,
  session_pid text,
  error_severity text,
  session_line_num bigint,
  session_line_subcommand_num bigint,
  event_type text,
  object_type text,
  object_name text,
  status text,
  error_message text,
  query_text text,
  query_args text
);

Установите расширение file_fdw и создайте сторонний сервер:

CREATE EXTENSION file_fdw;
CREATE SERVER pg_proauditlog FOREIGN DATA WRAPPER file_fdw;

Теперь создадим для таблицы pg_proaudit_log семь дочерних сторонних таблиц, для каждого дня недели:

CREATE FOREIGN TABLE pg_proaudit_log_1 () INHERITS (pg_proaudit_log) SERVER pg_proauditlog 
   OPTIONS (filename '/path_to_PGDATA/audit/audit-1.csv',  FORMAT 'csv');
CREATE FOREIGN TABLE pg_proaudit_log_2 () INHERITS (pg_proaudit_log) SERVER pg_proauditlog 
   OPTIONS (filename '/path_to_PGDATA/audit/audit-2.csv',  FORMAT 'csv');
CREATE FOREIGN TABLE pg_proaudit_log_3 () INHERITS (pg_proaudit_log) SERVER pg_proauditlog 
   OPTIONS (filename '/path_to_PGDATA/audit/audit-3.csv',  FORMAT 'csv');
CREATE FOREIGN TABLE pg_proaudit_log_4 () INHERITS (pg_proaudit_log) SERVER pg_proauditlog 
   OPTIONS (filename '/path_to_PGDATA/audit/audit-4.csv',  FORMAT 'csv');
CREATE FOREIGN TABLE pg_proaudit_log_5 () INHERITS (pg_proaudit_log) SERVER pg_proauditlog 
   OPTIONS (filename '/path_to_PGDATA/audit/audit-5.csv',  FORMAT 'csv');
CREATE FOREIGN TABLE pg_proaudit_log_6 () INHERITS (pg_proaudit_log) SERVER pg_proauditlog 
   OPTIONS (filename '/path_to_PGDATA/audit/audit-6.csv',  FORMAT 'csv');
CREATE FOREIGN TABLE pg_proaudit_log_7 () INHERITS (pg_proaudit_log) SERVER pg_proauditlog 
   OPTIONS (filename '/path_to_PGDATA/audit/audit-7.csv',  FORMAT 'csv');

Чтобы настроить регистрацию интересующих событий безопасности, подключитесь к базе данных postgres и выполните следующие команды:

SELECT pg_proaudit_set_object ('AUTHENTICATE', null);
SELECT pg_proaudit_set_object ('DISCONNECT', null);
SELECT pg_proaudit_set_object ('ALL', 'table');
SELECT pg_proaudit_set_role ('ALL', 'postgres'::regrole);

Создайте таблицу app_table и включите регистрацию всех операций с этой таблицей:

CREATE TABLE app_table (id int, name text);
SELECT pg_proaudit_set_object ('ALL', 'public.app_table'::regclass);

Проверьте, работает ли регистрация событий должным образом:

SELECT * FROM pg_proaudit_settings;
 db_name  |  event_type  | object_type |   object_name    | role_name
----------+--------------+-------------+------------------+-----------
 postgres | authenticate |             | 0                |
 postgres | disconnect   |             | 0                |
 postgres | all          | table       | 0                |
 postgres | all          |             | 0                | postgres
 postgres | all          |             | public.app_table |
(5 rows)

Сохраните эти параметры конфигурации в файле pg_proaudit.conf, чтобы они не были потеряны при перезапуске сервера:

SELECT pg_proaudit_save();

Выполним несколько запросов, обращающихся к таблице app_table:

INSERT INTO app_table VALUES (1, 'first');
SELECT * FROM app_table;

Проверьте записи в журнале, относящиеся к таблице app_table:

SELECT to_char(log_time, 'DD.MM.YY HH24:MI:SS') AS when, role_name,
       session_pid, event_type, query_text
FROM   pg_proaudit_log
where  object_name = 'public.app_table';
       when        | role_name | session_pid |  event_type  |                 query_text
-------------------+-----------+-------------+--------------+---------------------------------------------
 27.09.23 12:44:27 | postgres  | 2010        | CREATE TABLE | CREATE TABLE app_table (id int, name text);
 27.09.23 12:45:55 | postgres  | 2010        | INSERT       | INSERT INTO app_table VALUES (1, 'first');
 27.09.23 12:46:00 | postgres  | 2010        | SELECT       | SELECT * FROM app_table;
(3 rows)

Мы настроили еженедельную ротацию файлов журналов с переключением файлов журналов каждый день. Это означает, что запросы к таблице pg_proaudit_log будут возвращать только события, произошедшие за последнюю неделю. Более старые события будут автоматически удаляться при ротации файлов. Для дополнительного ограничения доступа к определённым записям журнала вы можете создать отдельные представления на базе таблицы pg_proaudit_log и разрешить чтение этих представлений, используя встроенные механизмы управления доступом Postgres Pro.