Как настроить централизованное хранение журналов с помощью Rsyslog в AlmaLinux

Rsyslog — это демон (сервис), предназначенный для регистрации и ведения журналов системных событий. Он позволяет собирать сообщения от операционной системы и различных сервисов, фильтровать их по нужным параметрам и записывать в соответствующие файлы журналов.

Одним из ключевых преимуществ Rsyslog является гибкость настройки. С помощью правил и фильтров можно определить, какие сообщения нужно сохранять, куда их записывать и какие журналы пересылать на другие серверы. Rsyslog поддерживает работу как с UDP, так и с TCP, что позволяет выбирать подходящий способ передачи журналов в зависимости от требований к надёжности и производительности.

Помимо локальной обработки журналов, с помощью Rsyslog можно настроить централизованный сервер ведения журналов, на который другие Linux-серверы будут отправлять свои системные логи. Это особенно полезно в инфраструктурах с большим количеством серверов, а также может быть полезно для выполнения требований по защите и контролю доступа к информации. Храня журналы на отдельном сервере, можно централизованно управлять доступом к ним, контролировать срок их хранения и настраивать ротацию. Это может быть частью комплекса технических мер для выполнения требований GDPR и других политик информационной безопасности.

Для развертывания такого сервера можно использовать надежный SSD VPS или выделенный сервер с SSD — в зависимости от количества клиентов, объема логов и требований к дисковому пространству.

В этом руководстве мы настроим AlmaLinux в качестве центрального Rsyslog-сервера, а также покажем, как настроить клиентский сервер для отправки журналов на него.

В качестве примера воспользуемся следующей схемой:

192.168.10.10 — центральный Rsyslog-сервер
└── 192.168.10.41 — (Клиент 1)

На центральном сервере журналы удалённых машин будут храниться в каталоге:

/var/log/servers/<IP-адрес-клиента>/

Например:

/var/log/servers/192.168.10.41/

По умолчанию Rsyslog использует порт 514 для Syslog. В этом руководстве для простоты мы будем использовать UDP, а в конце также покажем, как перейти на TCP.

Что нам понадобится

Перед началом работы убедитесь, что у вас есть:

  • два сервера или виртуальные машины под управлением AlmaLinux;
  • root-доступ или пользователь с правами sudo к серверам/виртуальным машинам.

В примерах этой статьи будем использовать:

Rsyslog-сервер: 192.168.10.10
(Сервер, получающий журналы событий от других серверов)
Клиент: 192.168.10.41
(Отправляет свои журналы событий на центральный Rsyslog-сервер)

Замените эти адреса на те, которые используются в вашей сети.

Настраиваем центральный Rsyslog-сервер

Установка Rsyslog на центральном сервере

Сначала установим Rsyslog на центральный сервер с AlmaLinux.

Обновите информацию о пакетах:

sudo dnf update -y

Затем установите Rsyslog:

sudo dnf install -y rsyslog

После завершения установки запустите службу и добавьте её в автозапуск:

sudo systemctl enable --now rsyslog

Проверьте её состояние:

sudo systemctl is-active rsyslog

Если всё настроено правильно, вы увидите:

active

Настройка Rsyslog на главном сервере

Теперь настроим наш rsyslog-сервер на AlmaLinux для приёма журналов удалённых серверов.

Вместо редактирования основного файла /etc/rsyslog.conf рекомендуется создать отдельный конфигурационный файл в /etc/rsyslog.d/. Rsyslog автоматически обрабатывает .conf-файлы из этого каталога.

Создайте новый файл /etc/rsyslog.d/10-remote.conf

Добавьте в него:

# Enable UDP syslog reception
module(load="imudp")

# Listen for incoming syslog messages on UDP port 514
input(
    type="imudp"
    port="514"
)

# Store remote logs in a separate directory for each client
template(
    name="RemoteLogs"
    type="string"
    string="/var/log/servers/%FROMHOST-IP%/%PROGRAMNAME%.log"
)

# Write all remote messages to the dynamic log file
*.* action(
    type="omfile"
    dynaFile="RemoteLogs"
    createDirs="on"
    dirCreateMode="0750"
    fileCreateMode="0640"
)

Сохраните файл.

Объясним, как работают эти настройки

Строка:

module(load="imudp")

загружает модуль imudp, который позволяет Rsyslog принимать Syslog-сообщения через UDP.

Далее:

input(
    type="imudp"
    port="514"
)

заставляет Rsyslog прослушивать UDP-порт 514.

Шаблон:

string="/var/log/servers/%FROMHOST-IP%/%PROGRAMNAME%.log"

определяет, где будут храниться журналы.

Например, если у клиента IP-адрес:

192.168.10.41

а сообщение отправляет sshd, Rsyslog сохранит его здесь:

/var/log/servers/192.168.10.41/sshd.log

Это позволяет легко разделять журналы разных серверов и сервисов.

Настройка доступа к журналам

Создадим основной каталог для удаленных журналов и установим права доступа:

sudo mkdir -p /var/log/servers
sudo chmod 0750 /var/log/servers

Проверьте, используется ли на вашем сервере SELinux:

getenforce

Если в ответе вы получили enforcing или permissive, выполните шаги, приведенные ниже; в противном случае перейдите к следующему разделу «Проверка конфигурации Rsyslog».

sudo restorecon -Rv /var/log/servers

Проверить контекст можно с помощью:

ls -Zd /var/log/servers

Проверка конфигурации Rsyslog

Перед перезапуском Rsyslog на центральном сервере следует проверить конфигурацию на наличие синтаксических ошибок.

Выполните:

sudo rsyslogd -N1

Если конфигурация верна, в конце вы увидите сообщение примерно такого содержания:

End of config validation run. Bye.

Если возникла ошибка, не перезапускайте службу, а проверьте настройки, исправьте ошибки и только после этого перезапустите rsyslog.

Перезапускаем Rsyslog

Перезапустите службу rsyslog:

sudo systemctl restart rsyslog

Проверьте её состояние:

sudo systemctl is-active rsyslog

Также проверим, прослушивает ли Rsyslog UDP-порт 514:

sudo ss -lunp | grep ":514"

Ожидаемый результат будет примерно таким:

UNCONN 0 0 0.0.0.0:514 0.0.0.0:* users:((«rsyslogd»,…))
Теперь сервер готов принимать удалённые журналы.

Ограничение клиентов, которым разрешено отправлять журналы

На многих серверах с AlmaLinux типичным сетевым инструментом защиты является firewalld. AlmaLinux также рекомендует использовать firewall-cmd для управления правилами брандмауэра.

Здесь и далее, если вы используете другой инструмент сетевой защиты, внесите соответствующие изменения в настройки вашего сетевого фильтра и игнорируйте команды, связанные с firewalld.
sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.41" port port="514" protocol="udp" accept"

Где 192.168.10.41 — IP-адрес сервера, с которого наш центральный rsyslog-сервер будет получать журналы.

Примените изменения:

sudo firewall-cmd --reload

Проверьте:

sudo firewall-cmd --zone=public --list-rich-rules

Это лучше, чем оставлять Syslog-порт открытым для всего Интернета.

Настройка клиентского сервера

Теперь настроим другой сервер AlmaLinux, который будет отправлять журналы на центральный rsyslog-сервер.

В нашем примере:

Клиент: 192.168.10.41
Rsyslog-сервер: 192.168.10.10
Порт: 514/UDP

На клиенте установим и запустим Rsyslog:

sudo dnf install -y rsyslog
sudo systemctl enable --now rsyslog

Проверим его статус:

sudo systemctl is-active rsyslog

Настройка пересылки журналов

Создадим отдельный конфигурационный файл /etc/rsyslog.d/90-remote.conf

Добавьте в него:

# Forward all logs to the central Rsyslog server

*.* action(
    type="omfwd"
    target="192.168.10.10"
    port="514"
    protocol="udp"
)

Замените 192.168.10.10 на IP-адрес вашего центрального сервера Rsyslog.

Модуль omfwd используется Rsyslog для пересылки сообщений по UDP или TCP. Он встроен, поэтому загружать его отдельно не требуется.

Настраиваем очередь в rsyslog на случай недоступности сервера

В производственной среде мы рекомендуем не ограничиваться простым:

*.* action(
    type="omfwd"
    target="192.168.10.10"
    port="514"
    protocol="udp"
)

Если центральный сервер временно недоступен, часть сообщений может быть утеряна.

Для этого можно настроить очередь Rsyslog:

*.* action(
    type="omfwd"
    target="192.168.10.10"
    port="514"
    protocol="udp"

    queue.type="linkedlist"
    queue.filename="remote_fwd"
    queue.saveOnShutdown="on"
    action.resumeRetryCount="-1"
)

Эта конфигурация позволяет Rsyslog временно хранить сообщения в очереди и повторять попытки отправки, если сервер назначения недоступен. Red Hat также рекомендует использовать action queue для защиты от потери сообщений в случае недоступности удалённого сервера.

Важно: для максимально надёжной регистрации событий лучше использовать TCP вместо UDP. UDP не гарантирует доставку пакетов.

Проверка конфигурации клиента

Проверим конфигурацию:

sudo rsyslogd -N1

Если ошибок нет, перезапустите Rsyslog:

sudo systemctl restart rsyslog

Проверьте, запустилась ли служба Rsyslog:

sudo systemctl is-active rsyslog

Ответ должен быть:

active

Тестирование удалённого ведения журналов

Теперь проверим, может ли клиент отправлять сообщения на удаленный (центральный) сервер.

На сервере-клиенте выполните:

logger "Test message from AlmaLinux client"

Эта команда создаст тестовое сообщение Syslog.

Вернитесь на центральный сервер Rsyslog.

Проверьте каталог:

sudo ls -la /var/log/servers

Вы должны увидеть каталог с IP-адресом клиента:

192.168.10.41

Проверьте его:

sudo ls -la /var/log/servers/192.168.10.41/

Среди файлов должен появиться файл, связанный с программой, которая создала сообщение.

Найти тестовое сообщение можно с помощью:

sudo grep -R "Test message from AlmaLinux client" /var/log/servers/

Или воспользоваться командой tail:

sudo tail -f /var/log/servers/192.168.10.41/*.log

Если всё работает правильно, вы увидите своё тестовое сообщение.

Использование TCP вместо UDP в Rsyslog

UDP прост и быстр, но он не гарантирует доставку сообщений.

Для продакшен-систем, где потеря журналов недопустима, лучше использовать TCP. В документации RHEL по Rsyslog описаны imtcp на сервере и omfwd с protocol=»tcp» на клиенте.

Настройка главного rsyslog-сервера

Откройте файл для редактирования /etc/rsyslog.d/10-remote.conf и замените в нём все записи «imudp» на «imtcp» или добавьте в него:

# Enable TCP syslog reception
module(load="imtcp")

input(
    type="imtcp"
    port="514"
)

template(
    name="RemoteLogsTCP"
    type="string"
    string="/var/log/servers/%FROMHOST-IP%/%PROGRAMNAME%.log"
)

*.* action(
    type="omfile"
    dynaFile="RemoteLogsTCP"
    createDirs="on"
    dirCreateMode="0750"
    fileCreateMode="0640"
)

Откройте TCP-порт в firewalld:

sudo firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.10.41" port port="514" protocol="tcp" accept"
sudo firewall-cmd --reload

Где 192.168.10.41 — IP-адрес сервера, с которого наш центральный rsyslog-сервер будет получать журналы.

Проверьте конфигурацию:

sudo rsyslogd -N1

После этого перезапустите службу rsyslog:

sudo systemctl restart rsyslog

Проверьте порт:

sudo ss -ltnp | grep ":514"

Настройка Rsyslog на клиенте для TCP

На клиенте откройте файл /etc/rsyslog.d/90-remote.conf для редактирования и измените в нём protocol=»udp» на protocol=»tcp» или вставьте в него следующие настройки, заменив предыдущие:

*.* action(
    type="omfwd"
    target="192.168.10.10"
    port="514"
    protocol="tcp"

    queue.type="linkedlist"
    queue.filename="remote_fwd"
    queue.saveOnShutdown="on"
    action.resumeRetryCount="-1"
)

Проверьте файл конфигурации rsyslog:

sudo rsyslogd -N1

Перезапустите:

sudo systemctl restart rsyslog

Теперь создайте тестовое сообщение:

logger "Test TCP message from AlmaLinux client"

На сервере проверьте:

sudo grep -R "Test TCP message from AlmaLinux client" /var/log/servers/

Проверка работы Rsyslog

Если журналы не поступают на сервер, проверьте систему в следующем порядке.

1. Проверьте Rsyslog

На центральном Rsyslog-сервере:

sudo systemctl is-active rsyslog

На клиенте:

sudo systemctl is-active rsyslog

2. Проверьте конфигурацию

На обоих серверах:

sudo rsyslogd -N1

3. Проверьте порт

На сервере:

sudo ss -lunp | grep ":514"

Для TCP:

sudo ss -ltnp | grep ':514'

4. Проверьте firewalld

sudo firewall-cmd --list-all

5. Проверьте SELinux

getenforce

Если используется Enforcing, проверьте контекст каталога:

ls -Zd /var/log/servers

6. Проверьте журналы Rsyslog

sudo journalctl -u rsyslog -n 100 --no-pager

Для просмотра журнала в режиме реального времени:

sudo journalctl -u rsyslog -f

7. Проверьте сетевое соединение

С клиента можно проверить доступность порта TCP:

nc -vz 192.168.10.10 514

Для UDP такая проверка менее надёжна, поэтому для диагностики можно воспользоваться tcpdump.

На Rsyslog-сервере:

sudo tcpdump -ni any udp port 514

После этого на клиенте:

logger "tcpdump test message"

Если пакеты видны в tcpdump, сетевое соединение работает, и проблему нужно искать в конфигурации Rsyslog или SELinux.

Ротация удалённых журналов на главном rsyslog-сервере

Если Rsyslog-сервер собирает логи с большого количества машин, каталог /var/log/servers может быстро разрастаться.

Поэтому в производственной среде стоит настроить logrotate.

Создайте файл /etc/logrotate.d/remote-rsyslog

Добавьте в него:

/var/log/servers/*/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
}

Эта конфигурация:

  • будет ежедневно ротировать журналы;
  • будет хранить 14 старых копий;
  • будет сжимать старые журналы;
  • не будет выдавать ошибку, если файл отсутствует;
  • не будет создавать пустые журналы.

Перед использованием в продакшен-среде проверьте вашу конкретную схему каталогов и требования к хранению логов.

Централизованное ведение журналов с помощью Rsyslogd настроено: Итог

В данной инструкции мы настроили централизованное ведение журналов в AlmaLinux с помощью Rsyslog: подготовили сервер для приёма логов, настроили клиентский сервер для их пересылки, проверили работу UDP/TCP-соединения, добавили очередь для более надёжной доставки и настроили ротацию журналов.

Такая схема позволяет хранить логи нескольких серверов в одном месте, упрощает их поиск и анализ, а также помогает быстрее находить проблемы в инфраструктуре.

Хотя в инструкции в качестве примера приведена конфигурация из двух серверов — центрального Rsyslog-сервера и одного клиента, — этот подход можно использовать для любого количества клиентских серверов. Достаточно настроить каждый из них на пересылку журналов на центральный Rsyslog-сервер.

Для стабильной работы централизованного ведения журналов важно иметь надёжную серверную инфраструктуру. Если вам нужен сервер для централизованного ведения журналов, мониторинга, резервного копирования или других задач, вы можете рассмотреть быстрые SSD VPS или выделенный сервер с SSD соответствующей конфигурации на нашем сайте.

Прокрутить вверх