Системный журнал#
Для ППО SOWA существует три источника журнальной информации:
Для СПО SOWA логи установки будут расположены в директории /sowa/distrib/logs.
Очистка файлов логирования рассмотрена в разделе Очистка файлов логирования.
Настройка рoтации файлов логирования приведена в разделе Рoтация файлов логирования.
События системного журнала перечислены в разделе Основные события.
Настройка системного журнала#
Журналирование событий конфигуратора#
Журнал событий конфигуратора находится в файле:
/sowalogs/sowa-config.log
По умолчанию события конфигуратора пишутся в syslog и перенаправляются в вышеуказанный файл посредством правила в rsyslog.conf:
if ($programname startswith "sowa-config") then {
action(type="omfile" file="/sowalogs/sowa-config.log" flushOnTXEnd="on")
stop
}
Для явного указания типа логирования используется ключ
--log-type:
--log-type file|syslog
Если используется тип логирования syslog, дополнительно можно указать хост и порт с помощью директив --host (по умолчанию localhost) и --port (по умолчанию 514).
Журналирование событий профиля#
Настройка уровня и типа логирования#
Уровень и тип логирования профиля указывается разделе system\optional конфигурационного файла профиля параметрами log_level и log_type. Например:
version: 2.0.3
profile: erib_mapi
system:
optional:
log_level: error
log_type: file
Доступны следующие уровни логирования:
debug - информации для отладки;
Внимание!
Включение данного уровня логирования не рекомендуется в промышленных инсталляциях.
info - подробная информация о процессе обработки запроса/ответа;
notice - уведомление о событиях;
warn - предупреждение;
error - ошибка при обработке запроса/ответа, не приводящая к неработоспособности;
crit - критические ошибки, не приводящие к неработоспособности;
emerg-alert - аварийный сбой, уведомление о неработоспособности;
off - отключение логирования.
Можно отправлять сообщения в удаленный приемник сообщений syslog, задав параметры подключения к удаленному сервер log_host и log_port.
Следует учесть, что при выборе уровня debug, логи профиля становятся значительно информативнее, но максимальный эффект достигается при использовании отлаженных пакетов SOWA.
Для это необходимо произвести установку СПО SOWA c флагом -g:
./install.sh -g
Для того чтобы убедиться в том, что в системе установлен отлаженный пакет, рекомендуется проанализировать вывод команды sudo yum list installed sowa-nginx-debug\*:
sowa-nginx-debug.x86_64 2.1-84904.el7 @/sowa-nginx-debug-2.1-84904.el7.x86_64
Далее необходимо запустить профиль с флагом –debug:
sowa-config --run <имя профиля> --debug
Более подробно процесс установки описан в разделе «Установка SOWA в режиме отладки» в Руководстве по установке.
Существует следующие типы логирования профиля: file, syslog и kafka. По умолчанию используется file.
При использовании типа kafka события профиля отправляются в kafka. Существует возможность комбинировать источники для отправки логов, например, файл+kafka, kafka+файл+syslog и т.д. в зависимости от потребностей клиента.
При использовании типа syslog cобытия профиля уходят в syslog через сокет unix:/dev/log. Имеется возможность указать хост и порт посредством параметров log_host и log_port.
В случае syslog журналирования события перенаправляются в файл /sowalogs/sowa-nginx.log посредством правила в rsyslog.conf:
if ($programname startswith "sowa_nginx") then {
action(type="omfile" file="/sowalogs/sowa-nginx.log" flushOnTXEnd="on")
stop
}
Расположение журнальных файлов#
При типе логирования file, журнал событий профиля находится в каталоге:
/sowalogs/<имя профиля>
Системный лог /sowalogs/<имя профиля>/system/main_error.log содержит как общую для профиля информацию (например, старт/стоп рабочих процессов), так и информацию модулей SOWA, которая в силу специфики не может быть привязана к конкретному логу сервиса (например, active health check).
Логи сервисов содержатся в следующих файлах:
/sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_access.logсодержит журнал обращений к этому сервису./sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_error.logсодержит расширенную информацию по обработке событий внутри сервиса.
ID сервиса указывается в конфигурационном файле для каждого сервиса и имеет уникальное значение.
Кроме того, существует служебный каталог с логами событий сервиса статистики профиля:
/sowalogs/<имя профиля>/services/service_profile_status/*.log.
Данный сервис используется для мониторинга профилей посредством Zabbix (интеграция с Zabbix описана в разделе Интеграция с Zabbix данного руководства.
Транзакционные логи профиля#
В профиле существует возможность включить логирование транзакций. В этом случае будут доступны подробные данные жизненного цикла запроса на каждом из этапов: запрос клиента, запрос на upstream, ответ от upstream и ответ клиенту.
За активацию этого режима логирования отвечает параметр event_hook (далее EVH).
Данный параметр можно объявить как в service_main_proxy (в этом случае настройки EVH наследуются всеми остальными сервисами), так и в любом из других доступных типов сервисов. Например:
service_http_proxy:
- id: service1
name: service1
optional:
event_hook:
stage:
- name: client_request
- name: client_response
- name: upstream_request
- name: upstream_response
log_in_file: on
Если включено логирование в файл log_in_file: on, журнальную информацию можно найти в каталоге /sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>/.
Далее логи транзакций располагаются в каталогах с именем, соответствующим каждому stage:
/sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>/client_request/;/sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>/client_response/;/sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>/upstream_request/;/sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>/upstream_response/.
Журналирование событий фильтра безопасности#
В профиле также может быть объявлен фильтр безопасности ModSecurity. Например:
filters:
filter_mds:
custom_rules:
- owasp-crs/crs-setup.conf
- owasp-crs/rules/*.conf
По умолчанию генерируемые фильтром события попадают в syslog.
Для явного указания типа логирования используется директива SecAuditLogType:
filters:
filter_mds:
config:
SecAuditLogType: Syslog|Concurrent|Serial
Для типа syslog дополнительно можно указать:
хост с помощью директивы
SecAuditSyslogHost(по умолчанию localhost);порт с помощью директивы
SecAuditSyslogPort(по умолчанию 514);протокол с помощью директивы
SecAuditSyslogProtocol(по умолчанию UDP).
В случае syslog журналирования события перенаправляются в файл /sowalogs/sowa-mds.log посредством правила в rsyslog.conf:
if ($programname startswith "sowa-modsecurity") then {
action(type="omfile" file="/sowalogs/sowa-mds.log" flushOnTXEnd="on")
stop
}
Для типа журналирования Concurrent события хранятся в отдельных файлах в директории /sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_mds/, журнал событий отражается в файле /sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_mds.log.
Пример:
/sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_mds.log
localhost:8091 x.x.x.x - [24/Dec/2019:14:47:22 +0300] "GET /payments/v4/banking/products/p2bpayments/mobile-main/main?connectdselectfrom HTTP/1.1" 500 298 - "curl/7.29.0" 157718804246.059708 - /sowalogs/uko_web/services/service_main_proxy/1_mds/20191224/20191224-1447/20191224-144722-157718804246.059708 0 2564.000000 md5:998bf6e95ee710bf07a7243b992c480a
/sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_mds/<транзакция>
{"transaction":{"client_ip":"x.x.x.x","time_stamp":"Tue Dec 24 14:47:22 2019","server_id":"4dd156df48891b6fb2981a221801cdec879fb08c","client_port":0,"host_ip":"x.x.x.x","host_port":12147,"unique_id":"157718804246.059708","request":{"method":"GET","http_version":1.1,"uri":"/payments/v4/banking/products/p2bpayments/mobile-main/main?connectdselectfrom","headers":{"Host":"localhost:8091","X-Real-IP":"x.x.x.x","Connection":"close","Content-Length":"5","User-Agent":"curl/7.29.0","Accept":"*/*","Content-Type":"application/json","Origin":"front.ift-node2.testonline.mycompany.ru","X-Forwarded-For":"127.0.0.1"}},"response":{"body":"{\n\t\"status\": {\n\t\t\"code\": 3,\n\t\t\"errors\": [\n\t\t\t{\n\t\t\t\t\"id\": \"CODE-100\",\n\t\t\t\t\"element\": \"\",\n\t\t\t\t\"title\": \"datapower\",\n\t\t\t\t\"description\": \"Неизвестная run-time ошибка\"\n\t\t\t}\n\t\t],\n\t\t\"warnings\": [\n\t\t\t{\n\t\t\t\t\"id\": \"\",\n\t\t\t\t\"element\": \"\",\n\t\t\t\t\"title\": \"\",\n\t\t\t\t\"description\": \"\"\n\t\t\t}\n\t\t]\n\t}\n}\n","http_code":500,"headers":{"Access-Control-Allow-Methods":"","Date":"Tue, 24 Dec 2019 11:47:21 GMT","Access-Control-Allow-Headers":"","Access-Control-Allow-Credentials":"true","Server":"SOWA","Server":"SOWA","Connection":"close","Access-Control-Allow-Origin":"front.ift-node2.testonline.mycompany.ru","Content-Type":"application/json;charset=UTF-8","Content-Length":"298","Access-Control-Max-Age":""}},"producer":{"modsecurity":"ModSecurity v3.0.3 (Linux)","connector":"ModSecurity-nginx v1.0.0","secrules_engine":"Enabled","components":[]},"messages":[{"message":"GET or HEAD Request with Body Content.","details":{"match":"Matched \"Operator `Rx' with parameter `^0?$' against variable `REQUEST_HEADERS:Content-Length' (Value: `5' )","reference":"o0,3v0,3v167,1","ruleId":"7036","file":"/sowa/profile_storage/custom/uko_web/ufs_rules/REQ.conf","lineNumber":"84","data":"GET","severity":"2","ver":"OWASP_CRS/3.0.0","rev":"1","tags":[],"maturity":"9","accuracy":"9"}},{"message":"GET or HEAD Request with Body Content.","details":{"match":"Matched \"Operator `Rx' with parameter `^0?$' against variable `REQUEST_HEADERS:Content-Length' (Value: `5' )","reference":"o0,3v0,3v167,1","ruleId":"7036","file":"/sowa/profile_storage/custom/uko_web/ufs_rules/REQ.conf","lineNumber":"84","data":"GET","severity":"2","ver":"OWASP_CRS/3.0.0","rev":"1","tags":["application-multi","language-multi","platform-multi","attack-protocol","OWASP_CRS/PROTOCOL_VIOLATION/INVALID_HREQ","CAPEC-272"],"maturity":"9","accuracy":"9"}}]}}
Для типа журналирования Serial события хранятся в одном файле /sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_mds.log.
С точки зрения производительности такой вариант менее предпочтителен, т.к. в один момент времени только одна запись может быть добавлена в файл.
Существует возможность включить отладочный вывод механизма обработки событий фильтра безопасности, объявив флаг debug:
filters:
filter_mds:
debug: true
Отладочный журнал будет доступен в файле /sowalogs/<имя профиля>/services/<тип сервиса>/<id сервиса>_mds.debug.
Очистка файлов логирования#
Перед удалением файлов с логами рекомендуется сделать бэкап.
Для того чтобы очистить логи SOWA, необходимо выполнить следующие действия:
Войдите под учетной записью sowacfg.
Перейдите в каталог /sowalogs/profile/service/service_/ и удалить все файл-логи (.log).
Повторите действия из п.2 для всех каталогов.
Выполните команду:
sowa-config --reload *profile* --log-type arg
В случае, если запросы балансируются на несколько экземпляров, данные действия необходимо выполнить поочередно на каждом из них.
Рoтация файлов логирования#
Структура логов и расположение скриптов#
В Platform V SOWA реализован механизм ротации log-файлов по заранее заданным критериям.
Файлы, подлежащие ротации:
/sowalogs/sowa-config.log- лог конфигуратора SOWA./sowalogs/sowa-mds.log- лог фильтра безопасности SOWA./sowalogs/sowa-nginx.log- общий лог ошибок работы для всех профилей SOWA./sowalogs/*/system/*.log- общий лог ошибок/доступа для конкретного профиля SOWA./sowalogs/*/services/*/*.log- лог ошибок/доступа для конкретного сервиса профиля SOWA.EVH-логи:
/sowalogs/*/services/*/*/client_request.sowalogs/*/services/*/*/client_response.sowalogs/*/services/*/*/upstream_request.sowalogs/*/services/*/*/upstream_response.
При установке дистрибутива, в каталоги /etc/cron.d/ и /etc/logrotate.hourly.d помещаются скрипты ротации перечисленных выше логов. При этом, интервалы ротации являются настраиваемыми.
Скрипт /etc/logrotate.d/sowa-logrotate осуществляет ротацию access и error логов. Скрипт /usr/local/sowa/bin/sowa-logrotate-evh.sh осуществляет ротацию EVH-логов. Параметр EVH подробно рассмотрен в разделе «Параметр event_hook» в Руководстве разработчика.
Отправка логов профиля в kafka включается опцией system.log_type (описание приведено в разделе Пaраметр logging Руководства разработчика).
Настройка частоты ротации#
Для настройки частоты сбора логов необходимо задать значение переменных окружения SOWALOGMINUTES и SOWALOGMINUTESLR пользователя sowacfg. Значения этих переменных указаны в календаре CRON для запуска соответствующих скриптов ротации. Где SOWALOGMINUTES отвечает за ротацию EVH-логов, а SOWALOGMINUTESLR отвечает за ротацию access и error логов.
Например, значение одного из этих параметров "17,20" будет соответствовать записи CRON: "17,20 * * * *". Этот календарь означает, что ротация будет запускаться в 17 и 20 минут каждого часа.
По умолчанию переменные выставляются в значения «11,23,37,51» и «10,40» соответственно.
Критерии ротации#
Несмотря на указанную частоту запуска скриптов ротации логи будут ротироваться не всегда. На необходимость ротации указывают значения переменных окружения пользователя sowacfg из таблицы ниже.
Параметр |
Назначение |
Дефолтное значение |
80% наполнение |
70% наполнение |
50% наполнение |
|---|---|---|---|---|---|
SOWAMAXSIZE |
Максимальное количество килобайт для директории с EVH-логами, при достижении которого требуется осуществлять ротацию |
120000 |
SOWAMAXSIZE/4 |
SOWAMAXSIZE/3 |
SOWAMAXSIZE/2 |
SOWAOLDFILES |
Максимальное количество старых файлов архивов EVH-логов для хранения |
30 |
1 |
SOWAOLDFILES/2 |
SOWAOLDFILES - 3 |
SOWAMAXEVH |
Максимальное количество EVH-лог файлов, после которых требуется ротация |
2000 |
100 |
400 |
1000 |
Это не единственные критерии ротации. В скрипт зашито максимальное удаление текущих и архивированных логов при достижении 90% заполнения раздела /sowalogs или при 90% процентах заполнения пространства inodes раздела /sowalogs. Подобное поведение необходимо для избежания срабатываний типовых триггеров заполнения файловых систем в таких системах мониторинга как, например, Zabbix.
Ротация access и error логов производится с помощью стандартного logrotate.d и имеет ограничения в 40 мегабайт на файл и 8 архивов.
Доступ к системному журналу#
Доступ к системному журналу осуществляется под УЗ sowacfg.
Основные события#
В Platform V SOWA доступно большое количество разнообразных событий системного журнала. Далее приведено описание нескольких из основных событий профиля (событий, возникающих при обработке сообщений):
Описание |
Комментарий |
Уровень записи |
|---|---|---|
Ошибка валидации запроса |
Клиент отправил сообщение, которое не соответствует валидационной схеме. |
Error |
Ошибка валидации ответа |
Backend вернул сообщение, которое не соответствует валидационной схеме. |
Error |
Системная ошибка при работе с менеджером очередей |
Менеджер MQ вернул |
Error |
Ошибка наличия SQL-Injection |
Код ошибки, возвращаемой |
Error |
Неизвестная run-time ошибка |
Типовой код ошибки, если не задано переопределение для данного типа ошибок. |
Error |
Не найден маршрут |
Сервис с подобным URL не был явно создан в профилей. |
Error |
Обрыв HTTP сессии внешним сервисом до таймаута шлюза |
Получили от backend статус 502 или backend разорвал соединение. |
Error |
Не получили ответа от внешнего сервиса за указанный таймаут |
Не получили Response от backend за допустимый интервал времени, указанный в настройках сервиса. |
Error |
Некорректный ответ от внешнего сервиса |
Backend вернул не JSON/не XML сообщение, backend вернул необрабатываемую ошибку. |
Error |
Ответ не является JSON |
Backend вернул не JSON/не XML сообщение, когда ожидалось обратное. |
Error |
Запрос не является JSON |
Тело Request не содержит JSON. |
Error |
Примеры событий при выполнении административных операций конфигуратора:
Описание |
Комментарий |
Уровень записи |
|---|---|---|
|
Запуск профиля успешен. |
Info |
|
Создание профиля завершено успешно. |
Info |
|
Информация о версии ОС, на которой происходит выполнение операций |
Info |
`ERROR: Failed to configure profile: File „/sowa/profile_storage/custom/profile/postprocessor_rules.yml“ does not exist! |
Ошибка конфигурирования профиля из-за отсутствия требуемых пользовательских ресурсов.` |
Error |
|
Ошибка при создании профиля - профиль уже создан. |
Error |
Примеры событий фильтра безопасности:
Описание |
Комментарий |
Уровень записи |
|---|---|---|
|
Backend вернул ошибку 5хх, которая маскируется шлюзом. |
Error |
|
Заблокирован запрос, в котором обнаружена SQL-инъекция |
Error |