Централизованный сбор логов Linux: journald и rsyslog

Журнал, который хранится только на самом сервере, исчезнет вместе с ним или будет стёрт тем, кто сервер взломал. Ниже порядок: включить постоянное хранение journald, отправить журналы на отдельный хост и научиться быстро искать нужное.
Шаг 1. Постоянное хранение journald
На многих системах журнал хранится в памяти и пропадает после перезагрузки. Включите хранение на диске:
sudo mkdir -p /var/log/journal
sudo sed -i 's/^#\?Storage=.*/Storage=persistent/' /etc/systemd/journald.conf
sudo sed -i 's/^#\?SystemMaxUse=.*/SystemMaxUse=1G/' /etc/systemd/journald.conf
sudo systemctl restart systemd-journald
Лимит SystemMaxUse защищает диск от переполнения. Выберите значение по месту, с запасом под срок хранения.
Шаг 2. Сервер приёма (rsyslog)
На сервере логов включите приём по TCP в /etc/rsyslog.conf:
module(load="imtcp")
input(type="imtcp" port="514")
template(name="PerHost" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log")
*.* action(type="omfile" dynaFile="PerHost")
sudo mkdir -p /var/log/remote
sudo systemctl restart rsyslog
Порт 514 откройте только для адресов ваших серверов (firewall). Передача по открытому TCP не шифруется и подходит только внутри доверенной сети. Для передачи через недоверенную сеть настройте TLS (gtls) по документации rsyslog или пересылайте логи через VPN: WireGuard.
Шаг 3. Клиент (отправка)
Создайте /etc/rsyslog.d/90-forward.conf:
*.* action(type="omfwd" target="logs.example.com" port="514" protocol="tcp"
action.resumeRetryCount="-1"
queue.type="LinkedList" queue.size="10000" queue.filename="fwd" queue.saveOnShutdown="on")
sudo systemctl restart rsyslog
Очередь на диске нужна, чтобы при недоступности сервера логов события не терялись. journald передаёт события в rsyslog через сокет по умолчанию в большинстве дистрибутивов.
Шаг 4. Ротация на сервере логов
Файл /etc/logrotate.d/remote:
/var/log/remote/*/*.log {
daily
rotate 90
compress
delaycompress
missingok
notifempty
}
Срок хранения определяется вашими требованиями и объёмом диска. Не копите журналы на том же диске, на котором работают сервисы.
Запросы, которые пригодятся
journalctl -p err -b # ошибки с последней загрузки
journalctl -u ssh --since "1 hour ago" # SSH за час (на RHEL: -u sshd)
journalctl -u ssh -g "Failed password" # неудачные входы
journalctl _COMM=sudo --since today # действия через sudo
last -a | head # последние входы
lastb -a | head # неудачные входы (нужен root)
Как проверить
logger -t test "проверка пересылки" # на клиенте
grep -r "проверка пересылки" /var/log/remote/ # на сервере
Запись должна появиться на сервере в течение секунд. Остановите rsyslog на сервере на минуту, отправьте ещё запись и запустите обратно: запись должна дойти из очереди. Что делать с собранными журналами дальше и чем SIEM отличается от мониторинга: SOC и SIEM.





















