Centralny syslog-ng po SSH

25 listopada 2007, by: kozik

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:

  1. Wygenerowanie kluczy RSA dla roota (ssh-keygen).
  2. 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
  3. 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:

  1. 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
  2. Dodanie dla tego użytkownika do ~/.ssh/authorized_keys kluczy publicznych klientów (używanych przez SSH).
  3. 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:

  1. Próba utworzenia pierwszego tunelu SSH od klienta do serwera:
    # /usr/bin/ssh -nNTx -L 5014:localhost:5014 ssh_logger@SERWER_CENTRALNY
  2. Jeśli tunel został utworzony (netstat -an | grep 5014), przeładowanie initu na kliencie:
    # kill -HUP 1
  3. 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.

Wysłano w Blog - Linux i Unix | Tagi: , , , | Brak komentarzy »

Adres dla trackback. RSS dla komentarzy w tym wpisie.
Dodaj komentarz




Uwaga: Włączona jest moderacja komentarzy, więc nowy komentarz nie ukaże się bezpośrednio po jego wysłaniu.

Uwaga: Działa filtr antyspamowy. Jeśli umieścisz w komentarzu odnośniki, to może on zostać błędnie zakwalifikowany jako spam.