Rsyslog — стандартный syslog-демон в большинстве Linux-дистрибутивов. Мы настроили его на всех устройствах для отправки логов на центральные relay-серверы.
Первым шагом мы создали внутренний CA для подписи сертификатов syslog:
# Создание корневого CA
mkdir -p /etc/pki/rsyslog && cd /etc/pki/rsyslog
# Генерация ключа CA
openssl genrsa -out ca-key.pem 4096
# Самоподписанный сертификат CA (10 лет)
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem \
-subj "/C=RU/ST=Moscow/O=FinProcess/CN=Syslog CA"
# Генерация ключа и CSR для relay-сервера
openssl genrsa -out relay-key.pem 2048
openssl req -new -key relay-key.pem -out relay.csr \
-subj "/C=RU/ST=Moscow/O=FinProcess/CN=syslog-relay.finprocess.local"
# Подпись сертификата relay-сервера
openssl x509 -req -days 1825 -in relay.csr \
-CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial \
-out relay-cert.pem
# Генерация клиентских сертификатов (скрипт для массового выпуска)
for host in app-srv-{01..65} db-srv-{01..10} mon-srv-{01..03}; do
openssl genrsa -out "${host}-key.pem" 2048
openssl req -new -key "${host}-key.pem" -out "${host}.csr" \
-subj "/C=RU/ST=Moscow/O=FinProcess/CN=${host}.finprocess.local"
openssl x509 -req -days 1825 -in "${host}.csr" \
-CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial \
-out "${host}-cert.pem"
rm "${host}.csr"
done
Relay-серверы принимают логи от всех устройств, буферизуют их и надёжно передают в Graylog:
# /etc/rsyslog.d/10-relay.conf (на обоих relay-нодах)
# Модули
module(load="imtcp")
module(load="imudp") # Для устройств без TLS (коммутаторы)
module(load="omrelp") # Reliable Event Logging Protocol
# TLS-параметры
global(
defaultNetstreamDriverCAFile="/etc/pki/rsyslog/ca-cert.pem"
defaultNetstreamDriverCertFile="/etc/pki/rsyslog/relay-cert.pem"
defaultNetstreamDriverKeyFile="/etc/pki/rsyslog/relay-key.pem"
)
# Приём по TCP с TLS (порт 6514)
input(type="imtcp"
port="6514"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.AuthMode="x509/name"
PermittedPeer=["*.finprocess.local"]
)
# Приём по UDP (514) для сетевого оборудования без TLS
input(type="imudp" port="514")
# Дисковая очередь (буфер при недоступности Graylog)
$WorkDirectory /var/spool/rsyslog
# Пересылка в Graylog через RELP
action(
type="omrelp"
target="graylog-input.finprocess.local"
port="5140"
tls="on"
tls.caCert="/etc/pki/rsyslog/ca-cert.pem"
tls.myCert="/etc/pki/rsyslog/relay-cert.pem"
tls.myPrivKey="/etc/pki/rsyslog/relay-key.pem"
tls.authMode="name"
tls.permittedPeer=["graylog-input.finprocess.local"]
queue.type="LinkedList"
queue.filename="relay-to-graylog"
queue.maxDiskSpace="10g"
queue.saveOnShutdown="on"
action.resumeRetryCount="-1"
action.resumeInterval="10"
)
Дисковая очередь queue.maxDiskSpace="10g" — страховка: если Graylog недоступен, relay накопит до 10 ГБ логов на диске и автоматически доставит их при восстановлении связи. При 140 ГБ/сутки это примерно 1,5 часа буферизации.
Для отказоустойчивости мы развернули два relay-сервера в конфигурации active-active. Каждый клиент отправляет логи на оба relay через два action-блока с разными приоритетами. Если основной relay недоступен, rsyslog автоматически переключается на резервный благодаря параметру action.resumeRetryCount. При восстановлении основного relay — переключение обратно.
Мы также настроили фильтрацию на уровне relay: логи уровня DEBUG от приложений не пересылались в Graylog (только в локальные файлы), что снизило нагрузку на центральное хранилище на 15–20%.