Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

За логирование WCS Core отвечает файл настроек log4j.properties и ряд настроек файла flashphoner.properties:

Настройки логирования flashphoner.properties

...

Для отключения клиентских логов необходимо установить в файле flashphoner.properties

Code Block
languagebash
themeRDark
enable_extended_logging=false

...

Code Block
languagebash
themeRDark
client_log_level=INFO

Управление настройками автоматической очистки для этих логов осуществляется с помощью настроек keep_extended_logs_max_days, extended_logs_dir_depth, check_extended_logs_interval. По умолчанию проверка на устаревшие логи проходит каждые 24 часа и удаляются логи хранящиеся более 30 дней. Для изменения правил удаления и хранения клиентских логов отредактируйте эти настройки и перезапустите WCS сервер.

Управление уровнем логирования "на лету"

Уровень логирования для определенной сессии можно менять на ходу, без перезапуска сервера. Для этого используются REST-запросы

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://test.flashphoner.com:8081/rest-api/logger/enable_client_log
  • HTTPS: https://test.flashphoner.com:8444/rest-api/logger/enable_client_log

Здесь:

  • test.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /logger/enable_client_log - используемый REST-метод

...

Для периодической очистки клиентских логов рекомендуется использовать cron в сочетании с find. Например, задание для проверки на устаревшие логи каждые 24 часа и удаление логов старше 30 дней будет выглядеть следующим образом

Code Block
languagebash
themeRDark
0 0 * * * find /usr/local/FlashphonerWebCallServer/logs/client_logs/ -type d -mtime +30 | xargs rm -rf

Управление уровнем логирования "на лету"

Уровень логирования для определенной сессии можно менять на ходу, без перезапуска сервера. Для этого используются REST-запросы

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

Здесь:

  • test.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /logger/enable_client_log - используемый REST-метод

REST-методы и статусы ответа

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/logger/enable_client_log

Code Block
languagejs
themeRDark
{
 "sessionId": "/127.0.0.1:57539/192.168.1.101:8443",
 "logLevel": "DEBUG"
}

200 - Уровень изменен

404 - Сессия не найдена


Установить указанный уровень логирования в заданной сессии

/logger/disable_client_log

Code Block
languagejs
themeRDark
{
 "sessionId": "/127.0.0.1:57539/192.168.1.101:8443"
}

200 - Логирование отключено

404 - Сессия не найдена

Полностью отключить логирование в заданной сессии

Параметры

Имя параметра

Описание

Пример

sessionId

Идентификатор сессии

/127.0.0.1:57539/192.168.1.101:8443

logLevel

Устанавливаемый уровень логирования

DEBUG

...

Изменение уровня логирования при помощи REST-запросов влияет только на заданную сессию, но не на другие сессии на сервере, в том числе на сессии, создаваемые позднее.

Использование самописца (flight recorder)

Самописец (flight recorder) позволяет циклически записывать для публикуемого потока последние несколько событий. Эта информация поможет диагностировать проблемы с публикацией потока, не включая полные отладочные логи клиента. Самописец включается настройкой в файле flashphoner.properties

...

Включение отладочных логов для всех клиентских сессий

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

Code Block
themeRDark
enableclient_log_flightforce_recorderdebug=true

Необходимо также указать категорию событий, которые будут записываться (определяется разработчиком)

...

Для всех вновь подключившихся клиентов будут записаны отладочные логи в течение времени в секундах, заданного настройкой

Code Block
themeRDark
flight_recorder_categories=WCS1438

События записываются для публикующего клиента в файл flight_recorder.log в случае, если диагностируется остановка публикации потока, или поток портится каким-либо образом.

Для того, чтобы протестировать работу самописца, необходимо установить параметр

Code Block
languagebash
themeRDark
enable_flight_recorder_test=true

без перезапуска сервера. Это запишет события для всех подключенных публикующих клиентов.

Warning
Параметр enable_flight_recorder_test не предназначен для промышленной эксплуатации

Структура и содержимое клиентских логов

Структура клиентских логов:

client_log_force_debug_timeout=60

По умолчанию, логи будут записываться в течение 60 секунд с начала сессии.

Эти настройки могут быть изменены через интерфейс командной строки и применены без перезапуска сервера.

Использование самописца (flight recorder)

Самописец (flight recorder) позволяет циклически записывать для публикуемого потока последние несколько событий. Эта информация поможет диагностировать проблемы с публикацией потока, не включая полные отладочные логи клиента. Самописец включается настройкой в файле flashphoner.properties

Code Block
languagebash
themeRDark
enable_flight_recorder=true

Необходимо также указать категорию событий, которые будут записываться (определяется разработчиком)

client_logs ---- 2018-05-16 -------- 84gij60a6u3ni7docsr1di1l5b-15-06-59 ------------ flashphoner.log ----
Code Block
languagebash
themeRDark
flight_recorder_categories=WCS1438

События записываются для публикующего клиента в файл flight_recorder.log в случае, если диагностируется остановка публикации потока, или поток портится каким-либо образом.

Для того, чтобы протестировать работу самописца, необходимо установить параметр

Code Block
languagebash
themeRDark
enable_flight_recorder_test=true

без перезапуска сервера. Это запишет события для всех подключенных публикующих клиентов.

Warning
Параметр enable_flight_recorder_test не предназначен для промышленной эксплуатации

Структура и содержимое клиентских логов

Структура клиентских логов:

Code Block
languagebash
themeRDark
client_logs
---- 2018-05-16
-------- client-84gij60a6u3ni7docsr1di1l5b-201884gij60a6u3ni7docsr1di1l5b-15-06-59
------------ flashphoner.log
------------ client-84gij60a6u3ni7docsr1di1l5b-2018.05.16.15.07.26-1526458046646.report
------------ MediaDump-85d65b00-639e-4a7e.31002-31004-31006-31008.pcap

...

Дампы медиатрафика

Если в файле настроек flashphoner.properties указано ненулевое значение client_dump_level, для клиента дополнительно пишется дамп сессии:

...

Code Block
languagebash
themeRDark
endstart;mediaProvider;name;mediaSessionId;duration;disposition;info;type;subscribers;

...

Code Block
languagebash
themeRDark
2015-11-11 08:36:13;Flash;stream-Bob;5c2d75c0-7d87-421d-aa93-2732c48d8eaa;00:00:48;UNPUBLISHED;;PUBLISH;3;

Поле

Описание

endstart

Дата и время завершения установки сессии

mediaProvider

Используемое медиа на WCS JavaScript API: WebRTC, Flash

name

Имя публикуемого / воспроизводимого потока

mediaSessionId

Идентификатор медиа-сессии

duration

Продолжительность сессии

disposition

Как сессия была завершена: UNPUBLISHED, STOPPED, FAILED

UNPUBLISHED - публикация потока была остановлена

STOPPED - воспроизведение потока было остановлено

FAILED - некорректное завершение сессии

info

Если disposition==FAILED, содержит описание причины

type

PUBLISH в случае публикации потока

SUBSCRIBE в случае воспроизведения потока

subscribers

Количество подписчиков в случае публикации потока; 0 в случае воспроизведения потока

CONNDR-логи

Connection Detail Record - это журнал WebSocket-сессий.

CONNDR записи пишутся в лог-файл sdr.log, находящийся в директории logs/cdr. Новый лог-файл создается на основе часового интервала. Записи сохраняются в CSV-формате, что упрощает их обработку. Названия полей в файл не пишутся.

Формат записи:

Code Block
languagebash
themeRDark
end;mediaSessionId;disposition;info;duration;

Пример записи:

Code Block
languagebash
themeRDark
2018-04-25 19:29:08;/5.44.168.45:52199/95.191.131.64:8443;DISCONNECTED;Normal disconnect;17;

...

Поле

...

Описание

...

end

...

Дата и время завершения сессии

...

mediaSessionId

...

Идентификатор медиа-сессии

...

disposition

...

Как сессия была завершена: DISCONNECTED, FAILED

DISCONNECTED - завершение сессии по инициативе клиента

FAILED - некорректное завершение сессии

...

info

...

Содержит описание завершения сессии

...

duration

...

Продолжительность сессии

GC-логи

По умолчанию логи сборщика мусора находятся в директории /usr/local/FlashphonerWebCallServer/logs.

Code Block
themeRDark
logs
---- gc-core-2018-12-18_20-02.log
---- gc-core-2018-12-18_19-56.log

Расположение и префикс имени лога можно изменить в файле настроек wcs-core.properties.

Для осуществления ротации логов средствами JVM в wcs-core.properties могут быть добавлены следующие настройки:

Code Block
themeRDark
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=2M

Тогда имена файлов будут такими

Code Block
themeRDark
logs
---- gc-core.log2018-12-14_18-57.log.0
---- gc-core.log2018-12-14_18-57.log.1
---- gc-core.log2018-12-14_18-57.log.2.current

Суффикс 'current' обозначает файл, в который ведется запись.

Чтобы убрать время создания из имени файла, нужно убрать проставление даты из переменной GC_SUFFIX в bin/setenv.sh:

Code Block
themeRDark
GC_SUFFIX=".log"

Тогда имена файлов будут такими

...

themeRDark

...

PUBLISH в случае публикации потока

SUBSCRIBE в случае воспроизведения потока

subscribers

Количество подписчиков в случае публикации потока; 0 в случае воспроизведения потока

CONNDR-логи

Connection Detail Record - это журнал WebSocket-сессий.

CONNDR записи пишутся в лог-файл sdr.log, находящийся в директории logs/cdr. Новый лог-файл создается на основе часового интервала. Записи сохраняются в CSV-формате, что упрощает их обработку. Названия полей в файл не пишутся.

Формат записи:

Code Block
languagebash
themeRDark
start;mediaSessionId;disposition;info;duration;

Пример записи:

Code Block
languagebash
themeRDark
2018-04-25 19:29:08;/5.44.168.45:52199/95.191.131.64:8443;DISCONNECTED;Normal disconnect;17;

Поле

Описание

start

Дата и время установки сессии

mediaSessionId

Идентификатор медиа-сессии

disposition

Как сессия была завершена: DISCONNECTED, FAILED

DISCONNECTED - завершение сессии по инициативе клиента

FAILED - некорректное завершение сессии

info

Содержит описание завершения сессии

duration

Продолжительность сессии

GC-логи

По умолчанию логи сборщика мусора находятся в директории /usr/local/FlashphonerWebCallServer/logs.

Code Block
themeRDark
logs
---- gc-core-2018-12-18_20-02.log
---- gc-core-2018-12-18_19-56.log

Расположение и префикс имени лога можно изменить в файле настроек wcs-core.properties.

Для осуществления ротации логов средствами JVM в wcs-core.properties могут быть добавлены следующие настройки:

Code Block
themeRDark
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=2M

Тогда имена файлов будут такими

Code Block
themeRDark
logs
---- gc-core.log2018-12-14_18-57.log.0
---- gc-core.log2018-12-14_18-57.log.1
---- gc-core.log2018-12-14_18-57.log.2.current

Суффикс 'current' обозначает файл, в который ведется запись.

Чтобы убрать время создания из имени файла, нужно убрать проставление даты из переменной GC_SUFFIX в bin/setenv.sh:

Code Block
themeRDark
GC_SUFFIX=".log"

Тогда имена файлов будут такими

Code Block
themeRDark
logs
---- gc-core.log.0
---- gc-core.log.1
---- gc-core.log.2.current

Лог статистики медиасессий

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

Статистика записывается в файл /usr/local/FlashphonerWebCallServer/logs/stats/media-session-connection-stats.log в формате CSV

Code Block
themeRDark
#{mediaSessionId}; {channels_not_writable}; {decodable_drops_old}; {incomplete_drops_old}; {decodable_drops_reset}; {incomplete_drops_reset}; {decodable_drops_pli}; {incomplete_drops_pli}; {data_packets_with_empty_payload}; {missed_h264_units}; {dropped_audio_data_packets}

Здесь

  • mediaSessionId - идентификатор медиа сессии
  • channels_not_writable - количество событий, в результате которых не удалось записать данные на отправку в TCP сокет
  • decodable_drops_old - количество сброшенных H264 фреймов, собранных из пакетов трафика
  • incomplete_drops_old - количество сброшенных H264 фреймов, не полностью собранных из пакетов трафика
  • decodable_drops_reset - количество сброшенных H264 фреймов до новой точки декодирования, собранных из пакетов трафика
  • incomplete_drops_reset - количество сброшенных H264 фреймов до новой точки декодирования, не полностью собранных из пакетов трафика
  • decodable_drops_pli - количество сбросов всех H264 фреймов, собранных из пакетов трафика, при приходе ключевого фрейма
  • incomplete_drops_pli - количество сбросов всех H264 фреймов, не полностьюсобранных из пакетов трафика, при приходе ключевого фрейма
  • data_packets_with_empty_payload - количество пакетов с пустым содержимым, высылаются браузером для оценки канала публикации при включенном TWCC
  • missed_h264_units - количество потерянных H264 элементов
  • dropped_audio_data_packets - количество аудио пакетов, отброшенных на этапе передачи в движок сервера

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

Code Block
themeRDark
f49f8cb0-dc52-11ee-81df-51ad589334c0; 0; 0; 7; 0; 0; 0; 10; 0; 443; 0

Запись статистики в файл настраивается в log4j.properties следующим образом

Code Block
themeRDark
log4j.logger.MediaSessionConnectionStats=error, mediaSessionConnectionStatsAppender
log4j.additivity.MediaSessionConnectionStats=false
log4j.appender.mediaSessionConnectionStatsAppender=com.flashphoner.common.logging.NewLogForEachRunFileAppender
log4j.appender.mediaSessionConnectionStatsAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.mediaSessionConnectionStatsAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.mediaSessionConnectionStatsAppender.layout.ConversionPattern=%m%n
log4j.appender.mediaSessionConnectionStatsAppender.File=${com.flashphoner.fms.AppHome}/logs/stats/media-session-connection-stats.log

Уязвимость CVE-2021-44228

Уязвимость CVE-2021-44228 в библиотеке Apache log4j не может эксплуатироваться на WCS сервере. Конфигурирование логгера осуществляется только через файл log4j.properties, поэтому злоумышленник должен получить доступ к файловой системе сервера. Через поля ввода уязвимость не может быть проэксплуатирована:

1. Для проверки используем адрес https://log4shell.huntress.com/. По этому адресу генерируется уникальная ссылка, которую необходимо вставить в поля ввода.

2, Открываем пример Two Way Streaming на демо сервере https://demo.flashphoner.com:8888/client2/examples/demo/streaming/two_way_streaming/two_way_streaming.html, нажимаем Connect и вставляем ссылку в поля для имени потока. Публикуем и играем поток:

Image Added

3. Открываем ссылку для просмотра результатов. В колонках IP address и Date/Time должны выводиться обращения от нашего сервера, если уязвимость сработала

Image Added

Как видно, уязвимость через поля ввода не может быть проэксплуатирована в сборке WCS 5.2.1109

Пояснения: почему WCS не подвержен уязвимости

В составе WCS  используется версия библиотеки Apache log4j 1.2.17. В данной версии нет поддержки JDNI, которая была добавлена начиная с log4j 2.0-beta9. Поэтому CVE-2021-44228 не может эксплуатироваться в WCS.