Syslog-ng to rozbudowany i potężny syslog, ale jego otwarta wersja nie wspiera komunikacji po TLS/SSL. Rozwiązaniem jest tunel SSH – postawienie centralnego serwera logowania z pełnym szyfrowaniem transmisji to kilka chwil.
Założenia:
- Centralny host, działający „cały czas”, czyli jakaś stabilna maszyna.
- Klienci (farma serwerów?) łączą się z nim po SSH tworząc tunel (użyty port: 5014).
- Tym tunelem przesyłane są wszystkie logi z klientów do centralnego systemu logowania.
- Tunel musi być bezpieczny (SSH, uwierzytelnienie po public key) i samo-odnawialny (np. w przypadku zerwania połączenia z powodu uszkodzenia sieci).
Na kliencie:
- Wygenerowanie kluczy RSA dla roota (ssh-keygen).
- Dodanie do /etc/inittab instrukcji tworzenia respawnującego się tunelu:
# Syslog over SSH
log0:345:respawn:/usr/bin/ssh -nNTx -L 5014:localhost:5014 ssh_logger@SERWER_CENTRALNY - Wysyłanie syslogiem wszystkich logów na lokalny port 5014, czyli /etc/syslog-ng/syslog-ng.conf:
options {
chain_hostnames(off);
keep_hostname(yes);
check_hostname(yes);
};
source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };
destination central_loghost { tcp("localhost" port(5014)); };
log { source(src); destination(central_loghost); };
Na centralnym serwerze:
- Utworzenie nieuprzywilejowanego konta do połączeń SSH:
# useradd -s /sbin/nologin -m -c 'Syslog over SSH' -g nobody ssh_logger
# chmod og-rwx /home/ssh_logger - Dodanie dla tego użytkownika do ~/.ssh/authorized_keys kluczy publicznych klientów (używanych przez SSH).
- Przyjmowanie przez syslog-ng danych z lokalnego portu 5014, czyli /etc/syslog-ng/syslog-ng.conf:
options {
chain_hostnames(off);
check_hostname(yes);
keep_hostname(yes);
};
source central_src {
unix-stream("/dev/log");
internal();
pipe("/proc/kmsg");
tcp(ip("localhost") port (5014) max_connections(100));
};
destination central_logpile {
file("/var/log/$HOST/$YEAR/$MONTH/$FACILITY.$YEAR$MONTH$DAY"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(central_src); destination(central_logpile); };
Teraz tylko na kliencie:
- Próba utworzenia pierwszego tunelu SSH od klienta do serwera:
# /usr/bin/ssh -nNTx -L 5014:localhost:5014 ssh_logger@SERWER_CENTRALNY - Jeśli tunel został utworzony (netstat -an | grep 5014), przeładowanie initu na kliencie:
# kill -HUP 1 - oraz przeładowanie syslogów na centrali i kliencie:
# /etc/init.d/syslog-ng reload
Voila! Logi będą w centrali w /var/log/HOSTNAME/ROK/MIESIĄC/.
Możliwości poprawy? Teoretycznie proces tworzenia tunelu SSH na kliencie nie musi działać na koncie roota – może użyć jakiegoś nieuprzywilejowanego lokalnego konta. Tylko jak to podpiąć pod /etc/inittab?
Zobacz też syslog-ng-client.conf oraz syslog-ng-central.conf z dodatkowymi filtrami i bardziej zaawansowanymi logami docelowymi.
kozik
