3.9.7.3 Rsyslog – сервис управления системными журналами
Скачать документ Содержимое конфигурационного файла rsyslog.conf
Создание правил в системе
Другие варианты написания правил
Отправка лог-сообщений на удаленный сервер
Rsyslog — это очень быстрый, расширяемый сервис для управления логами с огромным количеством возможностей. Среди его возможностей можно отметить поддержку фильтрации контента, а также передачу логов по сетям. Основные возможности:
- Многопоточность;
- TCP, SSL, TLS, RELP;
- Поддержка MySQL, PostgreSQL, Oracle;
- Фильтрация журналов;
- Полностью настраиваемый формат вывода.
Вы можете подробнее ознакомиться с работой сервиса управления логами Rsyslog, просмотрев наши обучающие видео:
на RuTube — Rsyslog - сервис управления логами;
в Яндекс.Дзен — Rsyslog - сервис управления логами;
в VK Видео — Rsyslog - сервис управления логами.
На наших каналах вы также сможете найти много другой полезной информации.
Каталогом по умолчанию для хранения логов является каталог /var/log, в файлы которого записывается вся информация о состоянии системы и используемых программ, а также информация об ошибках. Лог-файлы можно просмотреть, выполнив команду:
ls -l /var/log/
Содержимое конфигурационного файла rsyslog.conf
Главным конфигурационным файлом сервиса rsyslog является rsyslog.conf. Для просмотра содержимого конфигурационного файла можно воспользоваться командой:
nano /etc/rsyslog.conf
Файл разделен на 3 основных секции:
Modules
— содержит параметры, предназначенные для настройки методов работы сервиса с лог-сообщениями;Global derectives
— содержит глобальные параметры работы службы rsyslog;Rules
— содержит правила сортировки логов.
Секция Modules
В секции Modules
загружаются все необходимые модули программы. Секция имеет следующим вид:
#### MODULES ####
module(load="imuxsock" # provides support for local system logging (e.g. via logger command)
SysSock.Use="off") # Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
module(load="imjournal" # provides access to the systemd journal
StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load"immark") # provides --MARK-- message capability
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")
Существует четыре типа модулей:
Модули ввода — можно рассматривать, как способ сбора информации из различных источников, начинаются с im;
Модули вывода — позволяют отправлять сообщения в файлы, по сети или в базу данных, начинаются с om;
Модули фильтрации — позволяют отфильтровывать сообщения по разным параметрам, начинаются с fm;
Модули парсинга — предоставляют расширенные возможности для синтаксического анализа сообщения, начинаются с pm.
Модуль imuxsock позволяет сервису получать сообщения от приложений, работающих в локальной системе. По умолчанию отключено прослушивание сокета /dev/log из-за параметра SysSock.Use="off"
.
Модуль imjournal предоставляет возможность импорта сообщений структурированного журнала из журнала systemd в системный журнал. Обратите внимание, что этот модуль читает базу данных журнала, что считается относительно интенсивной операцией. Таким образом, производительность конфигурации с использованием этого модуля может быть заметно ниже, чем при использовании imuxsock. По умолчанию ограничение скорости активировано и позволяет обрабатывать 20 000 сообщений в течение 10 минут, чего должно быть достаточно для большинства случаев использования. Если импорт структурированных данных необходим, используйте imjournal, в противном случае следует задействовать модуль imuxsock.
Модуль imklog предназначен для получения сообщений ядра.
Модуль immark позволяет маркировать соединения или выводить сообщения о том, что syslog все еще работает.
Секция Global directives
Глобальные директивы используются для настройки службы rsyslog. Как правило, они указывают значение для конкретной предопределенной переменной, которая влияет на функциональность правил или самой службы rsyslog.
Секция Global directives имеет следующий вид:
#### GLOBAL DIRECTIVES ####
# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")
# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")
Описание переменных:
global(workDirectory="/var/lib/rsyslog")
— задает директорию, которая будет использоваться для рабочих файлов службы rsyslog;module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
— задает стандартный формат хранения времени, в секундах с 1970 года;include(file="/etc/rsyslog.d/*.conf" mode="optional")
— задает директорию, которая будет использоваться для дополнительных файлов конфигурации.
Секция Rules
Данный раздел содержит правила сортировки логов. Каждое правило имеет свой синтаксис: сначала идет источник и приоритет, затем действие. Если источник и приоритет совпадают, сообщение отправляется в указанный файл. Источников и приоритетов может быть несколько, их можно разделять точкой с запятой.
Содержимое секции имеет следующий вид:
#### RULES ####
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
Источниками являются места, откуда поступают сообщения.
Источники могут принимать следующие значения:
auth — все, что связано с авторизацией пользователей, например, login и su (безопасность/права доступа);
authpriv — то же самое, что и auth, однако сообщения этой категории записываются в файл, который могут читать лишь некоторые пользователи (категория выделена, потому что принадлежащие ей сообщения могут содержать открытые пароли пользователей, которые не должны попадать на глаза посторонним людям, и, следовательно, файлы протоколов должны иметь соответствующие права доступа);
cron — сообщения от системного планировщика;
daemon — сообщения от системных служб, которые в отличие от FTP или LPR не имеют специально-выделенных категорий;
kern — сообщения ядра;
lpr — сообщения от системы печати;
mail — сообщения от почтовой системы;
mark — присваивается отдельным сообщениям, формируемым службой syslog;
security — эквивалентно auth;
syslog — система протоколирования может протоколировать сообщения от самой себя;
uucp — копирование файлов между компьютерами (Unix-to-Unix CoPy);
user — сообщения пользовательских программ;
local0 … local7 — зарезервированные категории для использования администратором системы. Категория local7 обычно используется для сообщений, генерируемых на этапе загрузки системы;
* — Выбор всех источников.
Приоритетом является степень важности сообщения.
Приоритеты могут принимать следующие значения:
emerg (раньше panic) — чрезвычайная ситуация, система неработоспособна;
alert — тревога, требуется немедленное вмешательство;
crit — критическая ошибка (критическое состояние);
error (раньше err) — сообщение об ошибке;
warn (раньше warning) — предупреждение;
notice — информация о каком-либо нормальном, но важном событии;
info — информационное сообщение;
debug — сообщения, формируемые в процессе отладки;
* — выбор всех приоритетов;
none — сообщения от источника с любым приоритетом будут исключены для действия.
Действием является отправка сообщений, которые подходят под заданные ранее параметры в заданное место.
Действия могут принимать следующие значения:
/путь/к/файлу — отправка сообщений в обычный файл;
/dev/console — отправка сообщений в терминал или консоль;
@xx.xx.xx.xx:514 — отправка сообщений на удаленную машину с помощью UDP;
@@xx.xx.xx.xx:514 — отправка сообщений на удаленную машину с помощью TCP;
user,user2,root — отправка сообщений пользователям на терминал (разделенный запятыми список пользователей, получающих сообщения).
Создание правил в системе
В общем случае синтаксис правил выглядит следующим образом:
<источник>.<приоритет> <действие>
В качестве примера разберем правило:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
Первым источником событий являются все сообщения с приоритетом info. Также к источникам добавляются и другие сообщения, разделенные между собой точкой с запятой. Из правил следует, что источники mail, authpriv, cron будут исключены, так как имеют приоритет none. Действием для данного правила является отправка сообщений в файл /var/log/messages.
Другие варианты написания правил
Фильтрация на основе свойств сообщения
Фильтрация данного вида имеет следующий синтаксис:
:<переменная>, <операция_сравнения>, "<искомое_значение>" <действие>
Переменные могут принимать значение:
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 — имя хоста обработки.
Операция сравнения может принимать значение:
contains — проверяет соответствие
<искомое_значение>
с любой частью строки в переменная;isequal — проверяет, совпадает (целиком) ли
<искомое_значение>
с переменной;isempty — проверяет, является ли переменная пустой;
startswith — проверяет, начинается ли переменная с
<искомое_значение>
;regex — сравнивает поле с регулярным выражением.
Искомое значение может принимать значение имени программы, службы или источника (источники были рассмотрены ранее в данной статье).
Действие принимает значения, рассмотренные ранее в статье.
Теперь можно составить правило для логирования приложения. Пример составления правила:
:syslogtag, isequal, "wireguard:" /var/log/wireguard.log
&stop
& stop необходим для того, чтобы остановить регистрацию сообщения после его совпадения.
Фильтрация RainerScript
Фильтрация данного вида имеет следующий синтаксис:
if $<переменная> <операция_сравнения> "<искомое_значение>" then <действие>
Операция сравнения может принимать значения:
== — равно;
!= — не равно.
Пример правила для логирования приложения будет выглядеть следующим образом:
if $syslogtag == "wireguard" then /var/log/wireguard.log
Отправка лог-сообщений на удаленный сервер
Настройка сервера, который будет принимать лог-сообщения
Если на сервере используется брандмауэр, необходимо открыть порты TCP/UDP 514. На примере iptables открытие портов производится командами:
iptables -A INPUT -p tcp --dport 514 -j ACCEPT iptables -A INPUT -p udp --dport 514 -j ACCEPT
Затем настройте SELinux, если он используется:
semanage port -m -t syslogd_port_t -p tcp 514 semanage port -m -t syslogd_port_t -p udp 514
Для разрешения серверу принимать соединение по TCP и UDP в конфигурационном файле /etc/rsyslog.conf раскомментируйте строки в секции Modules:
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
Не обязательно открывать соединение по обоим протоколам, можно выбрать только тот, который необходим именно вам.
В эту же секцию после модулей для TCP- и UDP-соединения необходимо добавить следующее:
$template RemoteLogs,"/var/log/rsyslog/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
Таким образом создается шаблон, по которому лог-сообщения от любого источника с любым уровнем будут сохраняться в каталог сервера /var/log/rsyslog/<имя_компьютера-отправителя_лога>/<приложение-отправитель_лога>.log.
После проделанных настроек необходимо перезагрузить службу rsyslog командой:
systemctl restart rsyslog.service
Настройка сервера на этом закончена. Для проверки открытия порта выполните команду:
netstat -pnltu
Настройка клиента, который будет отправлять лог-сообщения
Для создания правила на клиенте воспользуйтесь директорией rsyslog.d, которая является дополнительной для конфигурационных файлов.
Создайте конфигурационный файл, который будет отправлять на сервер сообщения от источника auth с любым приоритетом. Для этого выполните команду:
nano /etc/rsyslog.d/auth.conf
И добавьте правило:
auth.* @@xx.xx.xx.xx:514
где @@xx.xx.xx.xx:514 — адрес сервера и его порт для протокола TCP. Для протокола UDP нужно указывать действие в виде @xx.xx.xx.xx:514.
Сохраните изменения и перезагрузите службу rsyslog командой:
systemctl restart rsyslog.service
При корректной настройке на сервере в каталоге /var/log/rsyslog должна появиться директория с именем (hostname) ПК, который отправляет лог-файлы, и, непосредственно, лог-файлы.
ll /var/log/rsyslog/итого 4
drwx------. 2 root root 4096 окт 14 15:37 localhost
ll /var/log/rsyslog/localhost/-rw-------. 1 root root 100 окт 14 15:36 at-spi-bus-launcher.log -rw-------. 1 root root 6904 окт 14 15:38 audit.log -rw-------. 1 root root 98 окт 14 15:36 dbus-broker-launch.log -rw-------. 1 root root 239 окт 14 15:36 plasmashell.log -rw-------. 1 root root 2008 окт 14 15:37 rsyslogd.log -rw-------. 1 root root 174 окт 14 15:37 su.log -rw-------. 1 root root 1671 окт 14 15:37 systemd.log
Дата последнего изменения: 14.10.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.