Аудит безопасности

Аудит базы данных позволяет обеспечить детальный контроль соответствия требованиям путем аудита операций с базой данных, оповещения о рискованном поведении и блокировки попыток атак. Он регистрирует, анализирует и отчитывается о доступе пользователей к базе данных, помогая пользователям генерировать отчеты о соответствии, отслеживать инциденты, усиливать логирование поведения во внутренней и внешней сети, а также повышать безопасность данных.

YMatrix поддерживает два метода аудита: параметры log_XXX и pgAudit.

log_XXX

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

Параметры конфигурации

logging_collector         -- Enables log collection. Default is off; recommended: on.
log_destination           -- Log output format. Default is stderr (errors only). Recommended: csvlog. Options: stderr, csvlog, syslog, eventlog.
log_directory             -- Log file directory. Default: $PGDATA/pg_log.
log_filename              -- Log file name. Default: postgresql-%Y-%m-%d_%H%M%S.log.
log_file_mode             -- Log file permissions. Default: 0600.
log_truncate_on_rotation  -- Truncate log file when rotating. Default: off (append). Set to on to overwrite.
log_rotation_age          -- Maximum age per log file. Default: 1d. Also supports 1h, 1min, 1s.
log_rotation_size         -- Maximum size per log file. Default: 10MB.
log_error_verbosity       -- Error message detail level. Default: default. Use verbose for more details.
log_connections           -- Log user session login events. Default: off. Recommended: on.
log_disconnections        -- Log user session logout events. Default: off. Recommended: on.
log_statement             -- Log SQL statements after login:
    none     -- No statements logged.
    ddl      -- Log CREATE, DROP, ALTER.
    mod      -- Log DDL + INSERT, DELETE, UPDATE, TRUNCATE.
    all      -- Log all statements including SELECT.
log_min_duration_statement = 2s  -- Log queries running longer than 2 seconds.
log_checkpoints = on
log_lock_waits = on
deadlock_timeout = 1s

Пример конфигурации

Ниже приведен пример конфигурации. Добавьте эти настройки в файл postgresql.conf:

Примечание!
После изменения файла postgresql.conf перезапустите сервис YMatrix для применения изменений.

logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 10MB
log_truncate_on_rotation = off

log_statement = 'all'
log_min_duration_statement = 100

log_connections = on
log_disconnections = on
log_lock_waits = on

pgAudit

Используйте расширение pgAudit для более детального аудита. pgAudit предоставляет два режима аудита: сеансовый и аудит объектов. Доступны следующие параметры.

Параметры конфигурации

pgaudit.log                     -- Specifies statement classes to include in session audit logs. Default: none. Options:
    READ     -- SELECT, COPY FROM
    WRITE    -- INSERT, UPDATE, DELETE, TRUNCATE, COPY TO
    FUNCTION -- Function calls and DO blocks
    ROLE     -- GRANT, REVOKE, CREATE/ALTER/DROP ROLE
    DDL      -- All DDL except ROLE-related commands
    MISC     -- DISCARD, FETCH, CHECKPOINT, VACUUM
    MISC_SET -- Miscellaneous SET commands (e.g., SET ROLE)
    ALL      -- Include all above categories
pgaudit.log_catalog             -- Audit changes to tables in pg_catalog schema. Default: on.
pgaudit.log_client              -- Log client application type. Default: off.
pgaudit.log_level               -- Log severity level for audit entries. Default: log.
pgaudit.log_parameter           -- Log session-level parameter settings. Default: off.
pgaudit.log_parameter_max_size  -- Maximum size (in bytes) of logged parameters. Default: 0.
pgaudit.log_relation            -- For session auditing, log one entry per table accessed. Default: off.
pgaudit.log_rows                -- Log number of rows affected by a statement. Default: off.
pgaudit.log_statement           -- Log statement text. Default: on.
pgaudit.log_statement_once      -- For repeated statements, log full details only once. Default: off.
pgaudit.role                    -- Role used for object-level auditing. No default value.

Примеры конфигурации

Аудит сеансов

Аудит сеансов записывает подробные записи всех операций, выполненных пользователем в бэкенде. Включите его с помощью параметра pgaudit.log.

-- 1. Configure session audit
SET pgaudit.log = 'read, ddl'; -- Log read and DDL operations

-- 2. Perform operations
-- 2.1 Create table
CREATE TABLE account
(
    id int,
    name text,
    password text,
    description text
);

-- 2.2 Insert data
INSERT INTO account (id, name, password, description)
VALUES (1, 'user1', 'HASH1', 'blah, blah');

-- 2.3 Query data
SELECT *
FROM account;

-- 3. View logs
-- Since WRITE class is not enabled, INSERT is not logged
AUDIT: SESSION,1,1,DDL,CREATE TABLE,TABLE,public.account,create table account
(
    id int,
    name text,
    password text,
    description text
);,<not logged>
AUDIT: SESSION,2,1,READ,SELECT,,,select *
    from account,,<not logged>

Аудит объектов

Аудит объектов поддерживает только операции SELECT, INSERT, UPDATE и DELETE. Он реализуется через систему ролей. Параметр pgaudit.role определяет роль, используемую для аудита на уровне объектов. Когда у аудиторной роли есть разрешение (или наследует разрешение) на команду, соответствующий объект (TABLE, VIEW и т. д.) подлежит аудиту.

В этом примере показано, как pgAudit регистрирует операции определенной роли (auditor) на конкретных таблицах и столбцах. Обратите внимание, что логирование для таблицы account управляется на уровне столбцов, а для account_role_map — на уровне таблицы.

-- 1. Configure object audit
-- Set audit role
SET pgaudit.role = 'auditor';

-- 2. Perform operations
-- 2.1 Create table
CREATE TABLE account
(
    id int,
    name text,
    password text,
    description text
);

-- 2.2 Grant column-level SELECT privilege to auditor
GRANT SELECT (password)
ON public.account
TO auditor;

-- 2.3 Query data
SELECT id, name
FROM account;

SELECT password
FROM account;

-- 2.4 Grant UPDATE privileges on name and password
GRANT UPDATE (name, password)
ON public.account
TO auditor;

-- 2.5 Update data
UPDATE account
SET description = 'yada, yada';

UPDATE account
SET password = 'HASH2';

-- 2.6 Create related table
CREATE TABLE account_role_map
(
    account_id int,
    role_id int
);

-- 2.7 Grant table-level SELECT privilege
GRANT SELECT
ON public.account_role_map
TO auditor;

-- 2.8 Join query
SELECT account.password,
       account_role_map.role_id
FROM account
INNER JOIN account_role_map
ON account.id = account_role_map.account_id;

-- 3. Log output
AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.account,select password
  from account,<not logged>
AUDIT: OBJECT,2,1,WRITE,UPDATE,TABLE,public.account,update account
   set password = 'HASH2',<not logged>
AUDIT: OBJECT,3,1,READ,SELECT,TABLE,public.account,select account.password,
       account_role_map.role_id
  from account
       inner join account_role_map
            on account.id = account_role_map.account_id,<not logged>
AUDIT: OBJECT,3,1,READ,SELECT,TABLE,public.account_role_map,select account.password,
       account_role_map.role_id
  from account
       inner join account_role_map
            on account.id = account_role_map.account_id,<not logged>

Комбинирование аудита объектов и сеансов

Аудит объектов обеспечивает более высокую детализацию по сравнению с аудитом сеансов. Использование обоих методов одновременно не всегда необходимо, но одним из корректных сценариев является использование аудита сеансов для фиксации всех операций и дополнение его аудитом объектов для получения детальной информации о конкретных отношениях.

-- 1. Configure session audit
SET pgaudit.log = 'write, ddl';          -- Log write and DDL operations
SET pgaudit.log_relation = ON;           -- Enable per-relation session logging

-- 2. Configure object audit
GRANT SELECT, DELETE ON public.account TO auditor; -- Grant permissions to auditor
SET pgaudit.role = 'auditor';                    -- Assign audit role

-- 3. Perform operations
-- 3.1 Create table
CREATE TABLE account (
    id INT PRIMARY KEY,
    name TEXT,
    password TEXT,
    description TEXT
);

-- 3.2 Insert data
INSERT INTO account (id, name, password, description)
VALUES (1, 'user1', 'HASH1', 'blah, blah');

-- 3.3 Query data
SELECT * FROM account;

-- 3.4 Delete data
DELETE FROM account
WHERE id = 1;

-- 4. View logs
AUDIT: SESSION,1,1,DDL,CREATE TABLE,TABLE,public.account,CREATE TABLE account (
    id INT PRIMARY KEY,
    name TEXT,
    password TEXT,
    description TEXT
);,<not logged>
AUDIT: SESSION,2,1,WRITE,INSERT,TABLE,public.account,INSERT INTO account (id, name, password, description)
    VALUES (1, 'user1', 'HASH1', 'blah, blah');,<not logged>
AUDIT: OBJECT,3,1,READ,SELECT,TABLE,public.account,SELECT * 
    FROM account;,<not logged>
AUDIT: SESSION,4,1,WRITE,DELETE,TABLE,public.account,DELETE 
    FROM account WHERE id = 1;<not logged>
AUDIT: OBJECT,4,1,WRITE,DELETE,TABLE,public.account,DELETE 
    FROM account WHERE id = 1;<not logged>