Логи — критически важный компонент любой программы или операционной системы. Обычно в них хранятся записи о действиях пользователей, системных событиях, сетевой активности и многом другом, в зависимости от предназначения. Rsyslog — одна из наиболее широко распространенных систем ведения логов для Linux.
Rsyslog – это мощная, безопасная и высокопроизводительная система обработки логов, принимающая данные из различных источников (систем и приложений) и выдающая их в разнообразных форматах. Она представляет собой развитие обычного демона syslog до полнофункциональной системы ведения логов корпоративного уровня. Rsyslog работает по модели «клиент-серевер», поэтому ее можно настроить как клиент и/или сервер для централизованного ведения логов других серверов, сетевых устройств и удаленных приложений.
В данном руководстве мы рассмотрим основы работы с rsyslog. В примерах мы будем использовать следующие узлы:
Сервер: 192.168.241.140
Клиент: 172.31.21.58
Установка и настройка сервера Rsyslog
В большинстве дистрибутивов Linux пакет rsyslog предустановлен. Если у вас его нет, установите его при помощи менеджера пакетов:
Для RHEL/CentOS:
$ yum install rsyslog
Для Ubuntu/Debian:
$ apt install rsyslog
После установки rsyslog нужно запустить службу, активировать автоматический запуск при загрузке и проверить состояние при помощи команды systemctl.
$ sudo systemctl start rsyslog $ sudo systemctl enable rsyslog $ sudo systemctl status rsyslog
Главный файл конфигурации rsyslog — /etc/rsyslog.con
f. Он загружает модули, определяет глобальные директивы, содержит правила по обработке сообщений логов, а также включает пути ко всем файлам конфигурации в директории /etc/rsyslog.d/
для различных приложений и служб.
$ sudo vim /etc/rsyslog.conf
По умолчанию rsyslog использует модули imjournal и imusock для импорта структурированных записей логов из журнала systemd и для приема через сокеты Unix сообщений системных логов от приложений, запущенных в локальной системе, соответственно.
Чтобы настроить rsyslog как сетевой централизованный сервер ведения логов, нужно установить протоколы (UDP, TCP или оба), которые будут использоваться для приема удаленных сообщений системных логов, а также прослушиваемые порты.
Если вы хотите использовать UDP-соединение, более быстрое, но ненадежное, найдите в файле конфигурации следующие строки, раскомментируйте их и замените 514 на порт, который вы хотите прослушивать. Этот порт должен соответствовать порту, на который клиенты будут отправлять сообщения, мы рассмотрим это ниже при настройке клиента rsyslog:
$ModLoad imudp $UDPServerRun 514
Для использования TCP-соединения (медленнее, но надежнее) найдите и раскомментируйте следующие строки:
$ModLoad imtcp $InputTCPServerRun 514
В нашем случае мы будем использовать оба протокола.
Далее вам потребуется определить набор правил для обработки удаленных логов в следующем формате:
источник.уровень_важности место_записи_лога
источник: тип процесса или приложения, от которого исходит сообщение, значение может быть auth, cron, daemon, kernel, local0..local7. Использование звездочки (*) означает все источники.
уровень_важности: тип сообщения логов: emerg-0, alert-1, crit-2, err-3, warn-4, notice-5, info-6, debug-7. Использование звездочки означает все уровни важности, если ничего не указывать, предполагается отсутствие уровня важности.
- 0, emerg – система не работоспособна
- 1, alert – система требует немедленного вмешательства
- 2, crit – состояние системы критическое
- 3, err – сообщение об ошибке
- 4, warning – предупреждение о возможной проблеме
- 5, notice – нормальное, но важное событие
- 6, info – информационное сообщение
- 7 , debug – отладочное сообщение
- место_записи_лога: локальный файл или удаленный сервер rsyslog (определенный в формате IP-адрес:порт).
Для сбора логов удаленных узлов мы будем использовать следующий набор правил с шаблоном RemoteLogs. Обратите внимание, что эти правила должны предшествовать правилам обработки локальных сообщений.
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *.* ?RemoteLogs & ~
Рассмотрим набор правил более подробно. Первое правило в нем следующее: «$template RemoteLogs,”/var/log/%HOSTNAME%/%PROGRAMNAME%.log”».
Директива $template дает демону rsyslog команду собирать полученные сообщения из источников и записывать их в отдельные логи в директории /var/logs
в соответствии с именем узла (машины клиента) и источником (программой/приложением), от которых были получены сообщения, что определено соответствующим шаблоном.
Вторая строка «*.* ?RemoteLogs» означает запись сообщений всех уровней важности от всех источников в соответствии с шаблоном RemoteLogs.
Последняя строка «& ~» задает rsyslog прекратить обработку сообщений после их записи в файл. Если не указать «& ~», сообщения будут записаны в локальные файлы.
Настройка сервера для нашего примера завершена. Теперь нужно сохранить и закрыть файл конфигурации, а также перезапустить демон rsyslog, чтобы изменения вступили в силу:
$ sudo systemctl restart rsyslog
Далее требуется проверить сетевые сокеты rsyslog. Воспользуйтесь netstat
$ netstat -nap | grep "rsyslog"
Если у вас включена служба SELinux, нужно выполнить следующие команды, чтобы разрешить трафик rsyslog:
$ sudo semanage -a -t syslogd_port_t -p udp 514 $ sudo semanage -a -t syslogd_port_t -p tcp 514
При включенном брандмауэре нужно открыть TCP и UDP порты 514, чтобы разрешить подключение к серверу rsyslog по обоим протоколам:
Для CentOS (брандмауэр firewalld):
$ sudo firewall-cmd --permanent --add-port=514/udp $ sudo firewall-cmd --permanent --add-port=514/tcp $ sudo firewall-cmd --reload
Для Ubuntu (брандмауэр ufw):
$ sudo ufw allow 514/udp $ sudo ufw allow 514/tcp $ sudo ufw reload
Настройка клиента Rsyslog для отправки логов на сервер
Проверьте, запущена ли служба rsyslog на клиентской машине, при помощи следующей команды:
$ sudo systemctl status rsyslog
Если она не установлена, установите и запустите службу точно так же, как для сервера:
После запуска службы откройте файл конфигурации:
$ sudo vim /etc/rsyslog.conf
Чтобы демон rsyslog работал как клиент и отправлял все локальные логи на удаленный сервер rsyslog, добавьте следующее правило перенаправления в конце файла, как показано на скриншоте ниже. Номер порта должен соответствовать номеру порта, прописанному в конфигурации сервера:
*. * @@192.168.100.10:514
Приведенное правило будет отправлять сообщения всех уровней важности от всех источников. Для отправки сообщений от конкретного источника, например, auth, воспользуйтесь следующим правилом:
auth. * @@192.168.100.10:514
Сохраните и закройте файл, а также перезагрузите службу rsyslog чтобы изменения вступили в силу.
$ sudo systemctl restart rsyslog
Мониторинг логов на сервере
Последний этап – проверить, действительно ли rsyslog получает сообщения от клиента и сохраняет их в директории /var/log
и формате имя_узла/имя_программы.log.
Выполните команду ls, чтобы получить список файлов директории логов и проверьте, есть ли там директории под названием ip-172.31.21.58 (или с соответствующим именем узла вашего клиента).
$ ls -l /var/log/
Если директория существует, проверьте файлы логов в ней следующей командой:
$ sudo ls -l /var/log/ip-172-31-21-58/
Заключение
Rsyslog – высокопроизводительная система обработки логов с архитектурой «клиент-сервер». В данном руководстве рассмотрена базовая установка и настройка. Более подробную информацию о программе и ее конфигурации можно получить в официальной сетевой документации или man-страницах.