Используемые термины: CentOS , Ubuntu , Linux .
Централизованный сервер логов может помочь с анализом событий на компьютерах в нашей инфраструктуре. Настроить их сбор с журналов можно разными способами — мы разберем использование journald. В качестве сервера и клиентов могут выступать различные системы на базе Linux. Для примера, будем собирать логи NGINX.
Установка компонентов
Настройка сервера
Брандмауэр
SELinux
Запуск journal-remote
Настройка клиента
Создание сертификата
Настройка и запуск journal-upload
Чтение логов на сервере
Чистка журналов
Установка компонентов
Для работы нам понадобятся следующие компоненты — 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