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

0
13
Обложка статьи: Централизованный сбор логов 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.

Оставьте свой ответ