Rsyslog на Debian, настройка сервера сбора логов
Приветствую, читатель моего блога. Давненько я не писал статей. Много жизненных перемен. Сегодняшняя статья будет посвящена syslog, а точнее rsyslog, который активным образом внедряется вместо старенького syslogd (он же sysklogd) в последних версиях дистрибутивов (например, Suse, Debian, RedHat и др.). Базовое описание работоспособности syslog и logrotate я приводил в соответствующей статье. Поэтому перед прочтением нижеописанного я очень советую прочитать статью о syslog и logrotate. На текущий момент для меня стоит задача собирать системные журналы syslog с сетевого оборудования в количестве
100 хостов с последующим увеличением их количества. Реализацией данного функционала я и постараюсь заняться в данной статье, предварительно описав структуру конфига и принцип работы rsyslog. Все это дело будет описано на базе Debian 6, в других дистрибутивах, при наличии опыта, с минимумом движений напильником, думаю что тоже не составит большого труда настроить. Итак, начнем.
Введение rsyslog
Как я уже сказал, rsyslog стал дефолтным пакетом в большинстве дистрибутивов Linux (возможно, во всех). Rsyslog полностью соответствует протоколу syslog, описанному в RFC syslog, а так же содержит некоторые дополнительные фичи. Такие как TCP транспорт, фильтрацию и сортировку сообщений, хранение сообщения в СУБД, шифрование и мн.др. В статье я постараюсь рассмотреть описание конфигурационного файла, описание управления демоном rsyslogd и типовые примеры конфигураций.
Установка rsyslogd
Установка rsyslog (если по какой-то причине он не установлен по умолчанию) сводится к одной команде:
Если, конечно, нет желания устанавливать из исходников. Тогда необходимо прочитать install manual . После установки в Debian, мы будем иметь следующее размещение файлов (показаны наиболее важные):
Как видно, все элементарно. rsyslog состоит из бинарника и файла конфигурации. Кроме указанных файлов, rsyslog так же использует:
rsyslog настройка
Перед настройкой какой-либо конфигурации, отличной от той, что используется по умолчанию, необходимо понять логику конфигурационного файла (rsyslog.conf). Структура rsyslog.conf классическая: пустые строки и строки, начинающиеся с # являются комментариями и игнорируются, остальное - параметры в виде $параметр значение. При этом, символ \ в конце строки говорит нам, что это не конец строки и строка продолжается на следующей. Строки, которые содержат ошибки в конфигурации - пропускаются и демон пытается обработать остальные строки (это поведение можно изменить). Итак, конфигурационный файл rsyslog.conf в Debian структурирован по следующему принципу:
- Модули (Modules)
- Конфигурационные директивы (не знаю, как перевести более доступно) (Configuration Directives)
- Шаблоны (template)
- Правила сортировки (Rule line)
Давайте разберем каждый раздел.
Модули (Modules) rsyslogRsyslog имеет модульную архитектуру. Это позволяет удобно расширять функциональность. Модули подразделяются на группы, например некоторые из них:
- модули ввода - применяются для использования различных источников сообщений, имена начинаются на im (imfile, etc)
- модули вывода - используются для записи мессаг в различные места (файл, сокет, СУБД. ), имена начинаются на om (omsnmp, ommysql, etc)
- модули парсинга (анализа содержимого) - используются для анализа содержимого (не понял назначение данных модулей. ), имена начинаются на pm (pmrfc5424, etc)
- фильтрационные (фильтрующие) модули - позволяют фильтровать сообщения в соответствии со специальными правилами, имена начинаются на fm
- .
Модули постоянно добавляются разработчиками и могут быть написаны любым желающим, со списком основных модулей можно ознакомиться на официальном сайте.
Конфигурационные директивы (Configuration Directives)Конфигурационные директивы иногда называют глобальными директивами, они задают общие параметры работы демона rsyslogd. Директива имеет формат $Директива параметр
С наиболее полным списком глобальных директив можно ознакомиться тут .
Шаблоны (Templates) rsyslogОчень важной и ключевой особенностью rsyslogd является возможность использования шаблонов. Template позволяет: 1. задавать формат выводимой информации, 2. использовать динамические имена файлов логов на основании какого-либо правила. На самом деле, все выходные сообщения в rsyslogd формируются на основе шаблонов. Тут может возникнуть соответствующий вопрос - как же вывод формируется, если не указать никаких шаблонов в rsyslog.conf (ведь по умолчанию не указано никаких шаблонов)? Все просто. Имеются некоторые шаблоны (взятые из совместимые со старой версии syslog и статично прописанные в исходники rsyslog). Подтверждение этого дела можно найти в файле исходного кода syslogd.c , поиском по строке "template_" (наткнетесь на /* hardcoded standard templates (used for defaults) */). Шаблоны должны быть заданы до использования в правилах.
Cинтаксис templateВ целом, структуру шаблона можно представить в следующем виде синтаксисе:
Давайте разберем каждый пункт. $template - указывает, что далее пойдет описание шаблона. имя_шаблона - произвольное значение понятно описывающее, что за шаблон и для чего (имя будет использоваться в правилах для обращения к шаблону). опции - может принимать значение sql и sqlstd, это заставляет отформатировать конечный результат выполнения шаблона в вид, пригодный для MySQL или стандартный SQL соответственно (фактически - заменяет некоторые спецсимволы в syslog сообщении в формат, поддерживаемый SQL-сервером). Опции применяются только для шаблонов для вывода в sql.
описание_шаблона заключается в кавычки. В шаблонах в кавычках любой текст воспринимается буквально (как есть), кроме того текста, который заключен в знаки процентов (%текст%). Такой текст является переменной и позволяет "получить доступ" к внутреннему содержимому пришедшего сообщения и тем самым добиться всяких веселых фич по модификации ). Так же, в кавычках может использоваться т.н. escape-последовательности в виде обратной косой черты и некоего символа за чертой (например, \n - новая строка, \7 - . ).
Применение переменных в шаблонах rsyslogДавайте разгребем структуру значений, указываемых в %процентах%.
имя_proper (оно же имя_свойства, оно же имя_переменной) - задает имя свойства (свойство в данном контексте можно рассматривать как некоторое свойство\поле syslog сообщения, проходящего сквозь демона), вот некоторые наиболее используемые свойства rsyslog:
- msg - тело сообщения
- hostname - имя хоста\ip из сообщения
- fromhost - имя хоста, от которого пришло сообщение
- fromhost-ip - адрес хоста, от которого пришло сообщения (127.0.0.1 для локальных сообщений)
- syslogtag - имя и номер процесса (" rsyslogd[12125]:"), который выдал сообщение (извлекается из сообщения)
- programname - имя процесса, который выдал сообщение (извлекается из сообщения)
- pri - источник и приоритет, в виде числа
- pri-text - декодированные источник и приоритет (facility.priority, например syslog.emer)
- syslogfacility - только источник в виде числа
- syslogfacility-text - только декодированный источник ("local0")
- syslogseverity - только приоритет в виде числа
- syslogseverity-text - только декодированный уровень ("debug")
- timegenerated - время получения (с высоким разрешением)
- timereported - время, извлечённое из сообщения
- inputname - имя входного модуля
- $hour, $minute - текущее время
- $myhostname - имя хоста обработки
- и еще хуча
Как видно, некоторые свойства начинаются с знака доллара - они считаются локальными\системными.
Значения начало_строки : конец_строки - мозговыносящие. Победить их можно где-то тут . Кратко - они используются для регулярных выражений.
Далее - опции. Опции позволяют модифицировать переменную в границе от знака процента до знака процента. Можно применять одновременно несколько опций, через запятую. Если указать несколько противоречащих (например uppercase, lowercase), то будет применена последняя указанная (lowercase). Вот некоторые опции:
- uppercase - преобразование к верхнему регистру
- lowercase - преобразование к нижнему регистру
- date-mysql - преобразовать в формат даты MySQL
- space-cc - заменить управляющие символы пробелами
- drop-cc - удалить управляющие символы
- и еще куча
fieldname - данное поле доступно с версии 6.3.9+ и имеет очень специфичный характер. Можно ее забыть.
Как видно из приведенного выше шаблона переменной, значения из фигурных скобок указываются по желанию, то есть можно указать просто, например %hostname%. Но если будут применяться опции , то необходимо указать и предыдущие пустые поля, например %hostname. lowercase%. Между двоеточиями пропущены поля начало_строки и конец_строки . При этом, fieldname почему-то в качестве пустого - не указывается.
Шаблоны, которые хардово запрограммированы в rsyslog (но которые можно изменить директивой $ActionFileDefaultTemplate):
RSYSLOG_SyslogProtocol23Format - формат, определённый в проекте стандарта IETF ietf-syslog-protocol-23, соответствует шаблону:
RSYSLOG_FileFormat - традиционный формат журнала, с добавлением долей секунды и зоны, соответствует шаблону:
RSYSLOG_TraditionalFileFormat - традиционный формат журнала для записи в файл, соответствует следующему шаблону:
RSYSLOG_ForwardFormat - традиционный формат журнала для передачи с добавлением долей секунды и зоны, соответствует шаблону:
RSYSLOG_TraditionalForwardFormat - традиционный формат журнала для передачи на удалённый сервер
Правила сортировки rsyslog (Rule line)Каждая строка правил сортировки имеет классический формат, как и в обычном сислоге. Для понимания, что и как, необходимо почитать статью syslog. Кратко: правило состоит из селекотора и действия, разделенных пробелом или табулятором. Селектор в свою очередь состоит из источника и приоритета. Каждое сообщение сверяется с селектором из каждого правила последовательно, если селектор сообщения и правила совпадает, то выполняется указанное действие. При этом, после первого совпадения - обработка не останавливается. Перед действием, мессадж преобразуется в соответствии с шаблоном (шаблон по умолчанию, заданный в соответствующей директиве (заменяющий шаблон по умолчанию), заданный в данном действии шаблон - один из трех).
К стандартным возможностям селекторов syslog добавились некоторые дополнительные возможности (напомню, что классически селектор - это источник.приоритет, он же facility.priority). В rsyslog в качестве селектора можно использовать значения переменных. В rsyslog применение переменных в селекторе называется Filters (фильтры). Выше в статье, а так же в первой статье о syslog описан классический подход к фильтрации на основе источник.приоритет (т.н."traditional" severity and facility based selectors). Кроме традиционной фильтрации существует следующие виды фильтрации: RainerScript-based filters (фильтрация на основе языка RainerScript - фактически обычный if - then - else), property-based filters (фильтрация на основе свойств сообщения (как в template)). Давайте рассмотрим оба:
Фильтрация RainerScript (RainerScript-based filters)Как я уже сказал, RainerScript - это классический язык на основе if then else. В rsyslog RainerScript поддерживает вложенность условий, арифметические, логические и строковые операции. В целом, синтаксис следующий:
Соответственно, if, then - это обязательные операторы, определяющие конструкцию условия, else - по необходимости. блок_действий - может содержать одно действие (action), либо вложенный блок условий. Если блок условий содержит несколько действий, то он заключается в скобки. условие - содержит условие отбора сообщений для блока_действий . В условии можно использовать:
- логические выражения (and, or, not), а так же группировку данных выражений в виде: not условие0 and (условие1 and условие2).
- переменные (properties) - переменные указываются в виде $имя_переменной (например $hostname или $msg)
- операции сравнения (== - равно, != - не равно, > - больше, < - меньше, <= - меньше или равно, >= - больше или равно, (!)contains - (не)содержит, (!)startswith - (не)начинается с)
- комментарии /* комментарии */ (сомнительный пункт . нужно ли его экранировать как в bash . )
Описание языка есть на сайте . Маленький пример фильтра на основе RainerScript:
if $syslogfacility-text == 'local7' and $msg startswith 'CISCO' and ($msg contains 'warn' or $msg contains 'emer') then /var/log/cisco-alarm
фильтрация на основе свойств сообщения (property-based filters)Давайте рассмотрим данный вид фильтрации.
: переменная , [!] операция_сравнения , " искомое_значение " действие
Что у нас тут есть: переменная - в соответствии с переменными,(в данном случае - без % или $), действие выполняемое над сообщением. операция_сравнения - может быть:
- contains - проверяет соответствие искомое_значение с любой частью строки в переменная
- isequal - проверяет, совпадает (целиком) ли искомое_значение с переменной
- isempty - проверяет, является ли переменная пустой (доступна с 6.6.2)
- startswith - проверяет, начинается ли переменная с искомое_значение
- regex или ereregex - сравнивает содержимое переменной, заданному в искомое_значение регулярному выражению в соответствии с regular и Extended Regular Expression соответственно
Например: :msg, contains, "syslog" будет искать слово syslog в теле.
Существует так же, специальный символ &, который повторяет выполнение прошлого фильтра и запускает действие, указанное после данного символа. Это очень удобно для фильтрации или экономии системных ресурсов, например:
то есть в первом варианте, rsyslogd нет необходимости несколько раз сравнивать селектор. Сообщение просто выполняет 3 действия.
Действия (actions)Действия rsyslog полностью совместимы с действиями syslog. Так же, стоит учитывать, что в действии rsyslog, кроме стандартный значений syslog, добавились дополнительные (выделены цветом ):
- /путь/к/файлу - отправить сообщения в простой файл (по умолчанию, rsyslogd умеет сам создавать новые файлы)
- ?имя_шаблона - вместо классического действия (/путь/к/файлу) в rsyslog можно указывать шаблон, в соответствии с которым будет динамически формироваться новый файл по заданному в шаблоне правилу.
- ?имя_шаблона;шаблон_фильтра - дополнительно, к шаблону имени файла (?имя_шаблона) возможно преобразовать сообщения поступающие в эти файлы в соответствии с заданным шаблоном фильтра (шаблон_фильтра).
- zцифра- задает gzip сжатие отправляемых пакетов с уровнем сжатия заданным цифрой от 0-9 (9-максимальное)
rsyslog в картинках
После всего прочтенного хотелось бы все это лицезреть в понятном виде. Попробую ка я все это обрисовать.
В данной схеме я постарался отобразить схему движения сообщения "сквозь" логику работы демона rsyslogd. Давайте попробуем разобраться в последовательности. Итак, сообщение пришло в систему с помощью одного из модулей ввода (сеть, файл, /dev/log . ) - оранжевая сноска. Далее, сообщения выстраиваются в главную очередь (если не хватает системных ресурсов ). Очереди rsyslogd это отдельная тема), но для типового понимания этой информации достаточно. Далее, сообщения поступают в обработчик, который использует модули парсинга - фиолетовая сноска. После данного этапа, мессаджи сверяются с фильтрами (читай - с селекторами источник.приоритет), заданными в правилах. Если сообщение подпадает под селектор, то перед применением действия к сообщению применяется соответствующий шаблон (если шаблон для действия не указан, то применяется шаблон по умолчанию, либо тот, который задан в глобальных параметрах). Ну и применяется соответствующее действие. На основании действия, сообщение может быть направлено в соответствующее место, если это место требует применения модуля (например, ommysql, ompgsql), то используются соответствующий модуль вывода.
Вот, собственно и вся схема.
Централизованный сервер rsyslog в Debian
Давайте рассмотрим простой конфиг централизованного сервера rsyslog, который будет сортировать файлы логов по ip адресу источника сообщения. Редактировать файлы можно с помощью vim или другого текстового редактора. ip адрес сервера rsyslog примем за 10.0.0.1, на него необходимо натравить всех клиентов syslog. Для корректной работы rsyslogd необходимо разрешить получение syslog сообщений из сети, подключив соответствующий модуль и задав правило, т.к. по умолчанию, UDP и TCP транспорт на сервере отключен (приведу только измененные\добавленные строки):
После задания указанных параметров, необходимо перезапустить\перечитать конфигурационный файл (service rsyslog restart). При этом, netstat нам должен показать, что сислог стал слушать соответствующий порт:
Конечно, мы можем не указывать параметры хранения, а лишь раскомментировать параметры $ModLoad imudp и $UDPServerRun 514, тогда rsyslogd будет размещать сообщения в стандартных выходных файлах (messages, syslog, etc), согласно правил по умолчанию. Необходимо учитывать, что указание только загрузки модуля (например $ModLoad imudp) недостаточно для приема сообщений по сети. Обязательно нужно указывать так же и соответствующий порт для прослушки (например, $UDPServerRun 514).
Настройка клиентов syslog
Linux (rsyslog)Для отправки syslog сообщений с linux-клиента, необходимо добавить в конфигурационный файл следующие строки:
Ну и после этого - рестарт rsyslog. Если нужно настроить разграничение отправки сообщений по приоритетам, то нужно заменить *.* на свое значение в соответствии со статьей syslog, описывающей принципы сортировки.
Cisco VMware ESXiДля старенького гипервизора:
В /etc/syslog.conf необходимо добавить следующее:
В последних версиях гипервизора все делается через гуишного клиента. В настройках гипервизора Advansed -> Syslog -> remote указать адрес rsyslog сервера.
Хранение журнала rsyslog в СУБД MySQL
В Debian настройка хранения в базе данных мега простая (почти как в вендовозе ) ). В целом, достаточно установить пакет rsyslog-mysql. При этом, установщик кладет модуль ommysql.so в каталог /usr/lib/rsysloul/spang/ и запускает мастер настройки, который запрашивает пароль администратора MySQL, создает отдельного пользователя и просит указать для него пароль. Создает соответствующую базу из скрипта /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql. Получившиеся настройки кладет в /etc/rsyslog.d/mysql.conf. Конфиг получается из 2х строчек::
Веб интерфейс для rsyslog
В качестве веб-интерфейса будем настраивать Loganalizer от adiscon. Установка веб интерфейса довольно проста. Заключается в скачивании архива, распаковке в каталог веб сервера и запуск графического мастера настройки. Итак, отсюда (http://loganalyzer.adiscon.com/downloads) качаем архив с файлами (Например: http://download.adiscon.com/loganalyzer/loganalyzer-3.5.6.tar.gz). Перед настройкой, конечно же должен быть установлен Web сервер и модуль php5 (aptitude install apache2 libapache2-mod-php5). А да, еще php5-gd для отображения отчетов.
В текущем каталоге появится каталог loganalyzer-3.5.6, который содержит некоторую информацию, достойную прочтения:
Далее, пытаемся зайти на http://10.0.0.1/loganalyzer и видим чудо:
Видим, для чего мы давали права 666, нажимаем Next
Здесь выбираем желаемые настройки. Отдельного внимания требует параметр Enable User Database. Если выбрать его, то будет создана отдельная база для хранения настроек Веб-интерфейса. Так же, будет доступна возможность создавать пользователей и группы. Жмем next.
Странно, но куда то пропало 6 шагов. (это потому что на прошлом шаге мы не выбрали хранение настроек в базе). На данном шаге выбираем источник сообщений (файл, sql) и указываем соответствующие параметры.
Это все. Ниже пару скриншотов того, что получилось:
Есть маленькое дополнение - веб сервер не имеет доступа к обычным файлам в каталоге /var/log/. Поэтому, журнал может не отображаться. Чтобы решить данную проблему, необходимо добавить пользователя www-data в группу adm:
Кроме Loganalyzer существует так же - Logzilla, обладающая тем же функционалом. Ее тоже стоит попробовать установить, если есть желание.
Некоторые типсы и триксы для rsyslog
Иногда, когда rsyslog является сетевым сервисом для сбора удаленных логов, хранение сообщений по имени хоста неудобно или непроизводительно или может еще что-то. Чтобы отключить резолвинг ip адресов в хостнеймы, необходимо добавить параметр -x:
Для того чтобы разрешить в нетфильтре прохождение udp пакетов, необходимо использовать команду:
Некоторые примеры правил с комментариями:
Для централизованного сервера сбора логов с сетевых устройств, можно на сетевых устройствах установить источник (facility) в какое-либо значение из local0-local7. Это позволит удобно сортировать сообщения, пример:
Таким образом, можно удобно фильтровать локальные сообщения от удаленных.
Вот некоторый конфиг, который позволяет отправлять почтовые уведомления о событиях (. почтовый сервер должен принимать сообщения без аутентификации):
Траблешуттинг
Для диагностики работы syslog отлично помогает tcpdump, пример команды для мониторинга:
Ну и, конечно же сам /var/log/syslog.
Что еще почитать
https://www.suse.com/releasenotes/x86_64/SUSE-SLES/11-SP2/ - rsyslog внедряется в SuSe http://www.debian.org/releases/lenny/i386/release-notes/ch-whats-new.en.html#system-changes - rsyslog внедряется в Debian https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/5/html-single/5.2_Release_Notes/index.html#sect-Red_Hat_Enterprise_Linux-Release_Notes-Feature_Updates - rsyslog внедряется в RedHat http://www.bog.pp.ru/work/syslog.html#linux - очень много русифицированных параметров и директив http://www.rsyslog.com/doc - документация от разработчика http://www.rsyslog.com/doc/rsyslog_conf_modules.html - модули rsyslog http://tools.ietf.org/html/rfc3164 - RFC syslog http://wiki.rsyslog.com/index.php/Configuration_Samples - примеры конфигураций http://www.rsyslog.com/tag/more-complex-scenarios/ - многие примеры брал отсюда http://www.rsyslog.com/doc/property_replacer.html - переменные в конфиге, такие как hostname $year .
Резюме
Статья получилась мега большая. В перспективе, наверно разделю ее на 2 более подробные. В целом, думаю, что прочитав материал - удастся получить достаточный объем базового понимания принципов работы rsyslog, чтобы реализовать своё более сложное и интересное решение. До новых статей!