Rsyslog: syslog сервер в Linux
Если вы хотите обеспечить безопасность своей системы, вы должны знать, что в ней происходит; это можно сделать с помощью журналов (логов). С помощью журналов можно диагностировать проблемы и определять состояние системы и приложений.
Служба журналирования
Большинство дистрибутивов Linux поставляется с предустановленным RSyslog (преемником syslog), а также с компонентом протоколирования systemd - systemd-journald (journald). Если он не предустановлен, для установки можно использовать следующие команды:
Для RHEL/CentOS:
$ yum install rsyslog
Для Ubuntu/Debian:
$ apt install rsyslog
RSyslog daemon
С помощью утилиты RSyslog можно создавать и хранить читаемые сообщения о событиях, чтобы системные администраторы могли управлять своими системами.
Вы можете проверить, запущена ли служба или нет:
systemctl status rsyslog
RSyslog может отправлять свои выходные данные в различные места назначения, например:
Текстовые файлы в виде файлов /var/log/*
БД SQL
Различные хосты
Поддерживаются следующие базы данных: MySQL, PostgreSQL, Oracle, SQLite, Microsoft SQL, Sybase, Firebird и mSQL.
Каждая запись журнала содержит дату, время, имя хоста, имя процесса, PID и сообщение журнала.
Настройка Rsyslog
Конфигурационный файл демона RSyslog - /etc/rsyslog.conf
.
В некоторых дистрибутивах Linux, таких как Ubuntu или Linux Mint, вы найдете эти строки в файле:
/etc/rsyslog.d/default.conf
Каждая строка содержит селектор и действие.
kern.* /var/log/messages
Kernel является объектом, а приоритет - это звездочка (*), поэтому ядро будет отправлять все сообщения в /var/log/messages.
Мы должны знать, какие объекты есть в нашей системе и какие приоритеты существуют.
Порт Rsyslog
Для служб журналирования используются порты 514 UDP/TCP.
По умолчанию RSyslog использует порт 514 TCP. Использование TCP происходит после указания символов @@.
Убедиться в наличии порта RSyslog можно с помощью команды netstat
:
$ netstat -tnlp | grep rsyslog
Возможности RSyslog
Источник сообщения RSyslog мы называем объектом. В Linux существуют некоторые функции, демоны и другие приложения, к которым прикреплены объекты.
Ниже приведен список объектов RSyslog в Linux:
auth-priv
Сообщения о приватной аутентификации.
cron
Сообщения, генерируемые подсистемой cron.
daemon
Сообщения служб.
kern
Сообщения ядра.
Сообщения mail.
syslog
Сообщения syslog.
У вас есть еще два специальных объекта: звездочка (*), которая означает все объекты, и (none), которая означает отсутствие объекта.
Для понимания этих специальных объектов рассмотрим следующие примеры.
*.emerg /var/log/emerg
Эта строка предписывает отправлять все сообщения аварийного приоритета в файл /var/log/emerg.
mail.none /var/log/maillog
Строка выше запрещает RSyslog регистрировать почтовые сообщения в файле /var/log/maillog.
Приоритеты Rsyslog
Приоритет сообщения позволяет определить важность того или иного события для системы.
Приоритеты бывают следующие:
0 (Emergency) система не работоспособна. Emerg.
1 (Alert) система требует немедленного вмешательства. Alert.
2 (Critical) состояние системы критическое. Crit.
3 (Error) сообщения об ошибках. Err.
4 (Warning) предупреждения о возможных проблемах. Warning.
5 (Notice) сообщения о нормальных, но важных событиях. Notice.
6 (Informational) информационные сообщения. Info.
7 (Debug) отладочные сообщения. Debug.
Также, можно использовать звёздочку "*" для выбора всех приоритетов или "none" для того, чтобы не выбрать ничего.
Также можно использовать знак равенства (=) или восклицательный знак(!).
Рассмотрим пример,
kern.=crit
Здесь мы выбираем сообщения, полученные от ядра, у которых стоит приоритет "crit"
kern.!crit
А здесь мы выбираем все сообщения ядра, кроме тех, которые имеют приоритет "crit".
Действия RSyslog
Каждое уведомление о событии, полученное сервером syslog в Linux, отправляется на указанное действие, в предыдущих примерах мы видели, что журналы отправляются в файлы, но можно сделать и больше действий.
RSyslog может выполнять следующие действия:
Писать журнал в файл.
Писать журнал в файл-устройство.
Выводить журнал на экран пользователя.
Отправлять журнал в созданный pipe.
Отправлять журнал на удаленный узел.
Чтобы лучше понять вышеописанные действия, рассмотрим следующие примеры:
daemon.*
/dev/lpr2
auth-priv
root,likegeeks
kern.crit
|/var/log/mypipe
@@likegeeks.local
auth.*
>dbhost,dbname,dbuser,dbpassword;dbtemplate
В 1-й строке все сообщения auth с приоритетом err записываются в файл /var/log/messages.
Во 2-й строке все сообщения полученные от демона, вне зависимости от приоритета отправляются на локальный принтер lpr2.
3-я строка посылает приватные сообщения аутентификации пользователям root и likegeeks, если они вошли в систему.
4-я строка отправляет все сообщения ядра (kernel) с приоритетом crit в созданный pipe /var/log/mypipe. Создать pipe можно с помощью команды mkfifo
.
5-я строка отправляет все почтовые сообщения на хост likegeeks.local на TCP-порт 514. Для этого необходимо, чтобы демон RSyslog был запущен с опцией -r, иначе порт не откроется.
Следует использовать двойной знак @, например @@likegeeks.local, для принудительного использования протокола TCP службой RSyslog для передачи журналов.
Шестая строка отправляет все сообщения auth в таблицу базы данных с указанными параметрами, причем поле dbtemplate является необязательным.
Следует помнить, что открывать порт 514 в своей системе опасно, злоумышленник может завалить систему сообщениями.
Если требуется удаленное журналирование, то следует использовать syslog-NG, о котором мы поговорим далее.
Вы можете заметить строку, подобную следующей
/etc/rsyslog.conf
mail.* -/var/log/maillog
Она позволяет RSyslog отменить синхронизацию файлов после записи журналов, но при этом возможна потеря данных, если процесс записи не завершится успешно.
Совмещение селекторов RSyslog
Объект и приоритет вместе составляют селектор.
Вы можете комбинировать селекторы в файле rsyslog.conf
следующим образом:
mail,kern.emerg /var/log/log
Думаю, понять эту строку несложно.
Мы будем отправлять всю почту и все сообщения от ядра (kern) с приоритетом emerg или выше в файл /var/log/log
.
Фильтры RSyslog
Для фильтрации можно использовать селекторы, но что делать, если нужно отфильтровать сообщения?
Можно отфильтровать сообщения с помощью фильтров на основе свойств, например, так:
:property, compare-operation, "value"
В следующих примерах показана фильтрация сообщений, содержащих ошибку:
:msg, contains, "error"
Операциями сравнения являются: contains, isequal, startswith, regex, ereregex.
:msg, regex, "login .* failed"
Этот фильтр перехватывает все сообщения, содержащие слова "login" и "failed" и любой текст между ними.
Служба systemd-journald
Systemd-Journald - это компонент systemd, который работает как служба для сбора данных, подобно RSyslog.
Он хранит данные в индексированных журналах, что делает его более быстрым по сравнению с другими инструментами.
Многие дистрибутивы Linux поставляются с systemd-journald, интегрированным вместе с RSyslog.
Вы можете запускать их одновременно на одной системе и даже передавать данные из одного в другой.
Основным инструментом для работы с файлами журналов является journalctl
.
С помощью journalctl
можно запросить и просмотреть содержимое журналов, которое собирает служба systemd-journald.
$ journalctl

Для навигации по сообщениям можно использовать клавиатуру, а после завершения работы нажать q для выхода.
Вы можете заметить, что некоторые строки имеют цвет, а другие выделены жирным шрифтом. Красным цветом выделены приоритеты crit [2], alert [1] и emerg [0].
Красным цветом и жирным шрифтом выделены строки с приоритетами warn [4], crit [2], alert [1] и emerg [0].
Строки с приоритетом debug (7) и выше info [6] отображаются нормально.
Самое замечательное в команде journalctl
то, что сообщения можно фильтровать с помощью некоторых гибких опций.
Вы можете вывести на экран определенное количество строк следующим образом:
$ journalctl -n 3

В режиме реального времени можно показывать сообщения, сформированные следующим образом:
$ journalctl -f
Кроме того, можно показывать сообщения за определенное количество дней:
$ journalctl --since="3 days ago"
Или можно показывать сообщения между днями следующим образом:
$ journalctl --since="5 days ago" --until="2 days ago"
Также можно указать нужную дату:
$ journalctl --since="2017-03-14"
Возможно, вам нужно определенное время:
$ journalctl --since="2017-03-14 15:00" --until="2017-03-14 15:30"
При этом можно указать нужный приоритет:
$ journalctl --since="2017-03-14 15:00" --until="2017-03-14 15:30" -p warning
Вы можете отобразить сообщения, связанные с конкретным пользователем, следующим образом:
$ journalctl _UID=1001
Вы можете просмотреть сообщения, выдаваемые программой типа /sbin/init:
$ journalctl /sbin/init
Кроме того, можно проверить сообщения на диске:
$ journalctl /dev/sda1
Syslog-ng
Еще одним преемником syslog является syslog-ng. Этот инструмент лучше и безопаснее.
Кроме того, syslog-ng позволяет осуществлять более сложную фильтрацию, манипулирование и взаимодействие с сообщениями.
Некоторые предпочитают syslog-ng, поскольку он имеет более чистый синтаксис, чем RSyslog.
Конфигурационный файл имеет следующий вид:
/etc/syslog-ng/syslog-ng.conf
Этот файл содержит следующие блоки:
source{}
Определяет источник сообщений.
destination{}
Определяет место назначения сообщений.
filter{}
Определяет фильтр для фильтрации сообщений.
log{}
Записывает логи из источника в место назначения, указанное из приведенных выше утверждений.
Идея syslog-ng состоит в том, чтобы указать source{}, destination{} и filter{}, а затем использовать их в операторе log{}. Мы рассмотрим, как написать каждый из них и как написать окончательный оператор log.
Указание источника отчётов Syslog-ng
source my_udp { udp(ip(1.2.3.4) ;};
В этой строке указывается источник сообщений - IP-адрес 1.2.3.4.
Можно также указать файл в качестве источника журналирования:
source my_file { file("/proc/kmsg"); };
Кроме того, в качестве источника можно указать созданный pipe:
source my_pipe { pipe("/var/mypipe"); };
Указание места назначения отчётов Syslog-ng
Вы можете указать место назначения отчётов следующим образом:
destination my_dest { file("/var/log/mylogs" owner(likegeeks) group(likegeeks) perm(0644)); };
Вы указываете имя файла и его принадлежность. Также, можно использовать созданный pipe как источник:
destination my_dest { pipe("/var/mypipe"); };
Готовые макросы расширения файла можно использовать следующим образом:
destination my_dest { file("/var/log/hosts/$HOST/$FACILITY$YEAR$MONTH$DAY"); };
В качестве места назначения (адресата) может выступать вошедший в систему пользователь, как показано ниже:
destination my_dest { usertty("root"); };
Фильтрация журналов Syslog-ng
Вы можете задать фильтр, указав объекты и приоритеты, которые вы хотите отобрать, следующим образом:
filter my_filter { facility(kern); priority(notice .. crit) };
Приведенный выше оператор фильтрации выбирает все сообщения от ядра (kern) с приоритетами от notice до crit.
Диапазон приоритетов разделяется двумя точками (..).
Можно выполнять фильтрацию по хостам:
filter my_filter { host(likegeeks); };
Или по конкретному приложению:
filter my_filter { program("telnet.*") };
Или можно использовать регулярные выражения для фильтрации сообщений:
filter my_filter { match("YOUR REGEX"); };
Также, можно фильтровать сообщения по отсутствию в них регулярных выражений:
filter my_filter { not match("YOUR REGEX"); };
Журналирование Syslog-ng
Мы разобрались с операторами источника, назначения и фильтрации. Осталось написать операторы журналирования, которые будут выполнять собственно журналирование.
В отличие от других операторов, операторы журналирования можно не называть, поскольку они не будут использоваться в других местах.
log { source(my_src); destination(my_dest); };
Эта строка отправляет сообщения из my_src в my_dest.
В приведенном выше выражении используется один источник, а как насчет объединения нескольких источников?
log { source(my_src); source(my_kern); filter(my_filter); destination(my_dest); };
Всё удалось!
Журналирование сообщений syslog-ng в БД SQL
Syslog-ng поддерживает множество баз данных в качестве backend. В следующем примере мы будем использовать MySQL.
destination my_dest {
sql(type(mysql)
host("localhost") username("likegeeks") password("likegeeks")
database("dblogs")
table("logs")
columns("datetime", "host", "program", "pid", "logmessage")
values("$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC", "${HOST}", "${PROGRAM}", "${PID}", " $MSG")
indexes("datetime", "host", "program", "pid", "logmessage"));
};
В данном примере журналы отправляются в базу данных MySQL, работающую на localhost'е.
Syslog-ng автоматически создает необходимые таблицы и колонки.
Затем вы можете использовать это место назначения в любом операторе журналирования.
Расположение журналов
Расположение журналов по умолчанию, которые могут пригодиться при troubleshooting'е:
/var/log/kern.log
Логи ядра (Kernel)
/var/log/cron
Логи демона Cron
/var/log/btmp
Содержит неудачные попытки входа в систему
/var/log/mail.log
Содержит логи от почтового сервера
/var/log/wtmp
Содержит все попытки входа и выхода из системы.
/var/log/dmesg
Содержит логи ядра
/var/log/secure
Содержит логи, связанные с безопасностью.
/var/log/mariadb
Логи БД MariaDB
/var/log/mysql
Логи БД MySQL.
/var/log/httpd/
Логи веб-сервера Apache
Для CPanel журналы apache находятся в этом месте:
/usr/local/apache/domlogs/
Логи, специфичные для домена.
/var/log/exim/
Логи почтового сервера Exim.
/var/log/yum.log
Логи менеджера пакетов Yum.
/var/log/boot.log
Содержит информацию о времени загрузки системы.
cPanel — платная панель управления веб-хостингом. Функционирует посредством отдельной копии веб-сервера, работающей, как правило, на порту 2082. В состав cPanel входит большое количество свободного ПО, основным из которого является Apache, MySQL, PHP, exim.
Автоматическая ротация журналов с помощью Logrotate
С помощью анализа журналов можно понять, что работает не так, почему произошла ошибка и как решить возникшую проблему. Однако существует некоторая проблема - размер журналов постоянно растет, они занимают все больше и больше места на диске, поэтому необходимо вовремя удалять устаревшие записи, чтобы они не мешали нормальной работе компьютера. Делать это можно вручную или воспользоваться утилитой logrotate.
Утилита logrotate предназначена для автоматизации обработки журналов. Она может выполнять необходимые действия в зависимости от определенных условий и правил соответствия. Например, можно сжимать журналы в архив или отправлять на другой сервер, когда они достигают определенного размера, возраста или других параметров.
Проверку условий можно настроить ежедневно, еженедельно или ежемесячно - это позволяет создать схему ротации логов, удобную именно для вас и вашего сервера.
Logrotate — популярная утилита, поэтому в большинстве дистрибутивов она поставляется по умолчанию.
Конфигурация logrotate находится в файле /etc/logrotate.conf.
Для дополнительных настроек в основном файле указана папка /etc/logrotate.d. Собственные настройки лучше сохранять именно в данном каталоге, так ими будет проще управлять.
weekly
rotate 4
create
В этой конфигурации журналы ротируются еженедельно, после четырехкратной ротации файл журналов удаляется, затем создаются новые файлы.
Вы можете изменить процесс ротации журналов по своему усмотрению. Кроме того, можно включить свои журналы.
В файле logrotate.conf можно использовать любую из следующих опций:
weekly
еженедельная ротация
monthly
ежемесячная ротация
yearly
ежегодная ротация
compress
сжатие старых файлов, прошедших ротацию
include
Включение большего количества файлов .conf
По умолчанию настроена еженедельная (weekly) проверка.
Рассмотрим основные параметры управления и обработки журналов:
rotate — указывает, сколько старых логов нужно хранить (в параметрах передается количество);
create — создание пустого файла лога после перемещения старого;
dateext — перед заголовком старого лога добавляется дата ротации;
compress — сжатие логов;
delaycompress — не сжимать последний и предпоследний журнал;
extension — сохранять оригинальный лог-файл после ротации, если у него указано расширение;
mail — отправлять e-mail после завершения ротации;
maxage — выполнять ротацию журналов, если они старше, чем указано;
missingok — не выдавать ошибки, если лог-файла не существует;
olddir — перемещать старые логи в отдельную папку;
postrotate/endscript — выполнить произвольные команды после ротации;
start — номер, с которого будет начинаться нумерация старых логов;
size — размер лога, когда он будет перемещен.
По умолчанию настроено хранение четырех старых файлов журналов, создание нового пустого файла журнала после перемещения старых и использование даты ротации при создании файлов журнала.
Вы можете проверить сценарий оболочки, выполняемый ежедневно для ротации журнала, в файле /etc/cron.daily/logrotate.
Last updated