Если вы используете в своих проектах базы данных и если это еще и проекты, которые должны проходить всякие проверки и соответствовать требованиям ИБ, то вы скорее всего рано или поздно зададитесь вопросом аудита/логирования действий пользователя с базами данных.
В этой статье мы рассмотрим, как включить аудит/логирование действий пользователя в PostgreSQL. Для осуществления аудита/логирования я буду использовать встроенную функцию логирования в PostgreSQL (log_statement). Также можно воспользоваться расширением pgAudit, который я рассматривал в этой статье.
Что именно логировать?
Для начала нужно определится что именно записывать в лог файлы, т.е. какие выполняемые команды необходимо включить в аудит.
Для того, чтобы задать что именно мы будет логировать используется переменная log_statement, которая может иметь следующие значения:
- none - ничего не логировать (выключено)
- ddl - операции
CREATE
,ALTER
иDROP
- mod - всё что в ddl плюс операторы изменения данных, такие как
INSERT
,UPDATE
,DELETE
,TRUNCATE
,COPY FROM
,PREPARE
,EXECUTE
,EXPLAIN ANALYZE
- all - все команды
Важно отметить что все записи аудита будут повторять саму команду точь-в-точь, т.е. если log_statement = all
и вы выполняете команду установки пароля для пользователя как простой текст, то в логах вы увидите этот пароль. Подробнее я рассматривать такую ситуацию тут.
Подготовка
Перед тем ка приступить к включению аудита подготовим немного наш сервер к этому.
- Создадим тестовую бд
sudo -u postgres psql postgres
CREATE DATABASE exampledb; \c exampledb CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100), age INTEGER, email VARCHAR(150) );
- Создадим тестового пользователя
CREATE USER test with password '11111111';
- Выдадим права пользователю
\c exampledb GRANT CONNECT ON DATABASE exampledb TO test ; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO test; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO test; grant all ON database exampledb to test; GRANT USAGE ON SCHEMA public TO test ;
Включаем аудит действий
Аудит можно включить, используя несколько методов:
- Глобально для всех пользователей в файле postgresql.conf
- Для конкретного пользователя используя команду
ALTER ROLE user_name SET log_statement TO 'all';
- Для конкретной бд, например
ALTER DATABASE my_database SET log_statement = 'all';
- Для конкретной сессии, например
SET log_statement = 'all';
Для того, чтобы настроить глобально выполняем следующее:
sudo vim /etc/postgresql/16/main/postgresql.conf
log_directory = 'pg_log' -- Где хранить логи
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' -- Имя файла с логами
log_statement = mod
sudo systemctl restart postgresql
Для того, чтобы настроить аудит для конкретного пользователя выполняем следующее:
sudo -u postgres psql postgres
alter role test set log_statement to 'all'
Проверяем работу аудита действий
- Подключаемся к базе под пользователем
test
psql -U test -d exampledb
- Выполняем команду INSERT
INSERT INTO users (name, age, email) VALUES ('John Doe', 30, 'john.doe@example.com'); INSERT INTO users (name, age, email) VALUES ('John Doe', 30, 'john.doe@example.com');
- В логах проверяем записи о добавлении этих двух строк
sudo vim /var/log/postgresql/postgresql-16-main.log
2024-05-20 15:31:55.826 +05 [52823] test@exampledb LOG: statement: INSERT INTO users (name, age, email) VALUES ('John Doe', 30, 'john.doe@example.com'); 2024-05-20 15:31:57.369 +05 [52823] test@exampledb LOG: statement: INSERT INTO users (name, age, email) VALUES ('John Doe', 30, 'john.doe@example.com');
Комментарии