IBCOURSES / СПРАВОЧНИК ИБ

PostgreSQL jsonlog: как связать ошибку, сеанс и запрос

К ответу ↓

В jsonlog SQLSTATE записывается в state_code. Связь session_id/line_num помогает восстановить контекст ошибки; формат журнала не означает аудит всех запросов.

Например
Материалов с пояснениями: 94 · Записей реестров: 11 678

Уточнить поиск

События и журналы

Найдено: 84
Инструкция по проверке

PostgreSQL jsonlog: как связать ошибку, сеанс и запрос

В jsonlog SQLSTATE записывается в state_code. Связь session_id/line_num помогает восстановить контекст ошибки; формат журнала не означает аудит всех запросов.

Условия и место записи

Зафиксируйте PostgreSQL 18, экземпляр, узел и период. Для jsonlog нужны соответствующий log_destination и работающий logging_collector; формат, пороги сообщений и регистрация SQL — отдельные настройки. До поиска получите паспорт конфигурации у владельца БД, затем разрешённую копию нужных файлов с учётом ротации. Не считайте файл с расширением .json доказательством правильного источника: проверьте форму нескольких объектов. Эта инструкция читает копию; включение журналирования, перезапуск сервера и изменение расширений не выполняются.

Как отобрать ошибку и сеанс

Начните с узкого интервала и state_code, не с переведённого текста ошибки. Первая команда jq выбирает 23505 и оставляет поля для сопоставления; вторая раскрывает доступные сообщения того же session_id. Работайте с JSONL, где каждая строка — самостоятельный объект, а не с JSON-массивом или CSV. Зафиксируйте имя файла и границы копии, чтобы повторная выгрузка не создала ложные дубликаты. Для связи используйте экземпляр, session_id и line_num; PID и время сохраняйте как дополнительный контекст.

Разбор результата

В примере роль demo_app в базе demo получила ERROR с SQLSTATE 23505. Официальное имя кода — unique_violation: нарушено ограничение уникальности. Это может быть повторная отправка, гонка приложения или другой сбой обработки данных; запись сама не устанавливает злой умысел. Поле line_num задаёт место сообщения внутри сеанса. Имена, адрес 192.0.2.40 и запрос на соединение вымышлены. Поля statement и detail здесь намеренно не добавлены: отсутствующее значение нельзя восстанавливать догадкой или подставлять из другой записи.

Интерпретация и предел вывода

Разделяйте ошибку сервера, итог запроса и бизнес-результат операции. Одно сообщение не показывает, выполнилась ли позднее успешная повторная попытка. Не смешивайте JSON-ключ state_code с sql_state_code из предложенной в документации CSV-таблицы. Строковые null-поля в jsonlog опускаются; неизвестные дополнительные поля следует сохранять, не ломая разбор. Адрес клиента может принадлежать пулеру, а приложение использовать общую роль. Поэтому атрибуция человеку требует отдельной цепочки, связывающей запрос приложения, соединение и доступную пользовательскую сессию.

Следующая проверка

Сопоставьте соседние строки сеанса с журналом приложения и ожидаемой операцией над данными. Определите, какая запись появилась первой и что произошло после ошибки, сохраняя границы наблюдения. Для вопроса «кто прочитал таблицу или выдал право» проверьте существующий аудит отдельно: jsonlog — формат доставки серверных сообщений, а pgAudit добавляет аудит сеанса/объекта через журналирование. Не утверждайте полный охват SELECT/GRANT без настройки и подтверждающей записи. При нехватке данных запишите точный пробел и необходимый источник.

Если записи нет

Проверьте экземпляр, формат назначения, collector, период, часовой пояс, пороги и ротацию, затем путь доставки в SIEM. Для отсутствующего SQL-текста отдельно проверьте применимые настройки регистрации сообщений и запросов. Сравните исходную копию с результатом фильтра: ошибка разбора JSONL отличается от нулевого числа совпадений. Убедитесь, что не читаете файл другого узла или предыдущего периода. Пустой вывод означает лишь отсутствие выбранной записи в доступной копии и не доказывает, что запрос никогда не выполнялся.

Поля и область применения

Исходное полеСмысл и ограничения
timestampВремя сообщения со строковым часовым контекстом; сверять часы источников.
user / dbnameПользователь и база, когда известны. Имя роли не устанавливает человека.
pidЧисловой ID backend; переиспользуется, поэтому одного PID недостаточно.
session_id / line_numИдентификатор сеанса и числовой номер строки внутри него; сохранять вместе с экземпляром.
remote_host / remote_portКлиентская конечная точка, когда доступна; это может быть пулер.
error_severityУровень серверного сообщения; не оценка серьёзности инцидента ИБ.
state_codeSQLSTATE как строка. В JSON это не sql_state_code из примера CSV-таблицы.
message / detail / hintСообщение и дополнительные сведения при наличии; могут содержать чувствительные значения.
statement / application_nameТекст запроса и имя приложения при наличии; зависимы от регистрации и клиента.

Примеры записей

Данные в примерах условные. Состав полей зависит от версии и настроек источника.

Строка примера jsonlog PostgreSQL 18

Фрагмент журнала. Показано подмножество документированных полей PostgreSQL 18. Все значения вымышлены; значения условные. Для JSONL сохраните объект одной строкой; дополнительные строковые поля могут отсутствовать.

{
  "timestamp": "2026-11-04 06:20:00.000 UTC",
  "user": "demo_app",
  "dbname": "demo",
  "pid": 4210,
  "session_id": "6aeace72.1072",
  "line_num": 5,
  "remote_host": "192.0.2.40",
  "remote_port": 51432,
  "error_severity": "ERROR",
  "state_code": "23505",
  "message": "duplicate key value violates unique constraint \"demo_pkey\"",
  "application_name": "demo-service"
}

Команды и способы проверки

Укажите свой узел, путь к журналу и временной интервал. Требуемая среда указана рядом с командой.

jq 1.8 · локальная разрешённая копия JSONL, один JSON-объект на строку; подключения к БД нет

jq -c 'select(.state_code == "23505") | {timestamp,user,dbname,pid,session_id,line_num,state_code,message}' postgresql.jsonl

jq 1.8 · та же копия JSONL; session_id взят из примера

jq -c 'select(.session_id == "6aeace72.1072") | {timestamp,pid,session_id,line_num,error_severity,state_code,message}' postgresql.jsonl

Первоисточники

23505 означает нарушение уникальности, а не автоматически инцидент ИБ. Серверный журнал и аудит операций имеют разный охват.

Связанные материалы

Как пользоваться техническим справочником

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

Материалы по разделам

События и журналы

Два ответа рядом

Сравнение источников

Сравнение показывает различия. События и поля разных систем не считаются эквивалентными.

Выберите службу

В списке — службы, доступные с текущими условиями. Число рядом — количество записей портов, а не программ на вашем узле.

Как искать в справочнике

Введите число, код, фрагмент сообщения или вопрос. Известный идентификатор поможет найти карточку; это не анализ самого инцидента.

  1. Введите номер, код, имя или фрагмент записи. Для портов можно использовать список: 80, 443, 8000–8010.
  2. Уточните поиск фильтрами. Все условия действуют одновременно. Числа в списках показывают, сколько материалов останется при выборе варианта.
  3. Службу выбирайте из каталога: поиск внутри списка помогает найти название, а кнопка «Выбрать» применяет его.
  4. Убирайте отдельные условия кнопкой × рядом с фильтром. «Сбросить фильтры» сохраняет текст поиска и текущий раздел.
  5. В карточке сверьте источник, версию и условия регистрации, затем откройте поля, примеры и первоисточник.

/ — перейти к поиску. Прямые ссылки открывают выбранную карточку в этом же справочнике.

Назначения портов и коды приведены по официальным реестрам. Версии, условия регистрации и ссылки на документацию указаны в карточках.

Избранное и недавние материалы хранятся в этом браузере. Запрос и фильтры сохраняются при возврате к выдаче и обновлении вкладки. Поиск работает локально.

Что есть в справочнике

От вопроса к свидетельствам: кто вошёл, что запустил, к каким данным обратился, что изменил и где искать следы.

Выберите область, чтобы посмотреть доступные источники и перейти к материалам.

Уточнить или исправить ответ

Скопируйте сообщение и отправьте его на mail@ibcourses.ru.