Отправка логов на удаленный сервер с помощью journald в системах Linux

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: CentOS, Ubuntu, Linux.

Централизованный сервер логов может помочь с анализом событий на компьютерах в нашей инфраструктуре. Настроить их сбор с журналов можно разными способами — мы разберем использование journald. В качестве сервера и клиентов могут выступать различные системы на базе Linux. Для примера, будем собирать логи NGINX.

Установка компонентов

Для работы нам понадобятся следующие компоненты — systemd-journal-gateway, systemd-journal-remote, systemd-journal-upload.

Их установку нужно выполнить из репозитория на всех компьютерах (как на сервере, так и клиентах).

а) если используем систему Red Hat / CentOS:

yum install systemd-journal-gateway

а) если используем систему Debian / Ubuntu:

apt-get install systemd-journal-remote

Настройка сервера

На сервере необходимо настроить систему безопасности и запуск journal-remote.

Брандмауэр

При использовании брандмауэра, необходимо открыть TCP-порты 19531 и 19532.

1. Если используем firewalld:

firewall-cmd --permanent --add-port={19531,19532}/tcp

firewall-cmd --reload

2. Если используем iptables:

iptables -A INPUT -p tcp --dport 19531:19532 -j ACCEPT

SELinux

Если в нашей системе используется SELinux либо его корректно настраиваем, либо отключаем командами:

setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Запуск journal-remote

Для запуска серверной части необходимо стартовать компонент сбора логов — systemd-journal-remote. Но при попытке это сделать, мы получим ошибку, так как необходимо подготовить сервер к запуску.

Создаем каталог для хранения логов:

mkdir -p /var/log/journal/remote

Задаем владельца для созданного каталога:

chown systemd-journal-remote:systemd-journal-remote /var/log/journal/remote

Создаем каталоги для хранения сертификатов безопасности (если их нет):

mkdir /etc/ssl/{private,certs,ca}

Генерируем ключ центра сертификации (CA):

openssl genrsa -out /etc/ssl/ca/trusted.key 4096

Создаем сертификат центра сертификации:

openssl req -x509 -new -nodes -key /etc/ssl/ca/trusted.key -sha256 -days 1825 -out /etc/ssl/ca/trusted.pem -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=journal-server.local"

* где journal-server.local — имя (hostname) нашего journal сервера.

Генерируем приватный ключ для нашего сервера journal:

openssl genrsa -out /etc/ssl/private/journal-remote.pem 2048

Создаем файл запроса сертификата:

openssl req -new -key /etc/ssl/private/journal-remote.pem -out /etc/ssl/certs/journal-remote.csr -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=journal-server.local"

* где journal-server.local — имя (hostname) нашего journal сервера.

Наконец, создаем сертификат для journald на основе запроса и CA:

openssl x509 -req -in /etc/ssl/certs/journal-remote.csr -CA /etc/ssl/ca/trusted.pem -CAkey /etc/ssl/ca/trusted.key -CAcreateserial -out /etc/ssl/certs/journal-remote.pem -days 1825 -sha256

Наконец, разрешаем запуск systemd-journal-remote и стартуем его:

systemctl enable systemd-journal-remote

systemctl start systemd-journal-remote

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

systemctl status systemd-journal-remote

* если возникли проблемы, то анализируем лог /var/log/messages (RPM) или /var/log/syslog (deb).

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

Перед тем, как переходить к настройке клиента, с сервера копируем ключи для CA на клиента. Это можно сделать, например, с помощью scp:

scp /etc/ssl/ca/trusted.{key,pem} user@192.168.0.11:/tmp

* в данном примере мы скопировали два ключа для CA на компьютер 192.168.0.11. Подключение идет от пользователя user, который должен быть на клиенте.

Теперь переходим к компьютеру, который должен отправлять свои логи на сервер. Для его настройки нам нужно также сгенерировать сертификаты, а также настроить и запустить компонент systemd-journal-upload.

Создание сертификата

Создаем каталоги для сертификатов: 

mkdir /etc/ssl/{private,certs,ca}

Копируем наши ключи для CA из каталога /tmp в /etc/ssl/ca:

cp /tmp/trusted.{key,pem} /etc/ssl/ca/

Теперь генериируем сертификат с помощью ключей CA:

openssl genrsa -out /etc/ssl/private/journal-upload.pem 2048

openssl req -new -key /etc/ssl/private/journal-upload.pem -out /etc/ssl/certs/journal-upload.csr -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=journal-upload"

openssl x509 -req -in /etc/ssl/certs/journal-upload.csr -CA /etc/ssl/ca/trusted.pem -CAkey /etc/ssl/ca/trusted.key -CAcreateserial -out /etc/ssl/certs/journal-upload.pem -days 1825 -sha256

Настройка и запуск journal-upload

Открываем файл для настройки journal-upload:

vi /etc/systemd/journal-upload.conf

Добавляем:

URL=https://journal-server.local:19532

* где journal-server.local — имя сервера логов, которое мы использовали при генерировании сертификата сервера. Обращение к серверу должно идти по имени, которое мы указали в сертификате, в противном случае, мы получим ошибку при запуске сервиса. Таким образом, данное имя должно быть либо в локальном DNS, либо в файле hosts.

Разрешаем автозапуск демона 

systemctl enable systemd-journal-upload

systemctl start systemd-journal-upload

Проверяем, что он корректно запустился:

systemctl status systemd-journal-upload

Чтение логов на сервере

Возвращаемся на сервер и проверяем, что в каталоге /var/log/journal/remote появился каталог, соответствующий удаленному компьютеру:

ll /var/log/journal/remote

В моем случае, это был remote-192.168.0.10.journal, где 192.168.0.10 — IP-адрес удаленной машины.

Чтение лога можно запустить командой:

journalctl -D /var/log/journal/remote --follow

Пробуем перезапустить какую-нибудь службу на удаленном компьютере — мы должны увидеть событие на сервере логов.

Если нам потребуется посмотреть логи за определенный период, можно воспользоваться опциями since (с, после) и until (до):

journalctl --since "2024-01-10 10:00" --until "2024-01-11 11:00"

* найти все логи с 10-и часов 10.01.2024 до 11-и следующего дня.

Чистка логов

Дисковая система на нашем сервере рискует быть переполненной из-за большого количества логов. Очень важно уметь выполнять чистку логов.

Для чистки логов можно использовать однку из команд:

journalctl --vacuum-time=3d

journalctl --vacuum-size=300M

* первая команда удалит все записи старше 3-х дней, вторая оставит 300 Мб логов.

Также мы можем настроить ограничение занимаемого пространства журналом:

vi /etc/systemd/journald.conf

SystemMaxUse=500М

После настройки необходимо перезапустить службу:

systemctl restart systemd-journald

# Linux # Серверы # Управление
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет