04.12.2017 | 07:19

krystian

Podstawy bezpieczeństwa, czyli jak sensownie logować zdarzenia systemowe

Wiele razy w naszej karierze trafialiśmy na sytuacje, w których wiadomo było, że stało się coś złego, ale brak było możliwości wyjaśnienia przebiegu zdarzeń – głównie ze względu na brak logów. Czas ten problem rozwiązać.

Mamy nadzieję, że wszystko logujecie na serwerach. Czy musimy tłumaczyć jak ważne jest logowanie? Logowanie może być wyjątkowo pomocne w kwestii ustalania szczegółów incydentu. Jeśli incydent będzie miał miejsce to warto go przeanalizować – tylko jak analizować incydent jeśli system nie zbierał żadnych logów lub logi z serwera zostały usunięte? Rozwiązaniem może być przesyłanie wszystkich zdarzeń do centralnego serwera (i zabezpieczenie go zgodnie z naszymi wcześniejszymi poradnikami).

Artykuł pod patronatem Aruba Cloud

We współpracy z firmą ArubaCloud pokazaliśmy Wam, jak postawić swój serwer backupów, jak skonfigurować własny serwer VPN i podłączyć do niego komputer, telefony komórkowe oraz domowy ruter a także jak schować się przed cenzurą sieci i jak zacząć serwer zabezpieczać, jak postawić swój własny zdalny pulpitswój serwer WWWjak monitorować zmiany w plikachjak zablokować reklamy na komórce, jak skonfigurować bezpieczną kopię zapasowąjak zabezpieczyć logowanie do serwera za pomocą jednorazowych tokenów  lub za pomocą klucza Yubikey a także jak monitorować swoje systemy w dwóch odsłonach oraz jak postawić swój serwer Jabbera.

Jeśli nie macie jeszcze swojego własnego serwera, to jest to dobra okazja by się w taki wyposażyć. Aruba oferuje dwa miesiące korzystania ze swojego podstawowego serwera gratis – a po zakończeniu promocji będzie on Was kosztował zaledwie 4 złote miesięcznie. Co więcej Aruba ma już serwerownię w Warszawie. Instrukcję jak krok po kroku skorzystać z promocji i uruchomić swój serwer znajdziecie w tym artykule. Jeśli macie już swój serwer – to zapraszamy do lektury kolejnych akapitów.

Zbieranie logów na dedykowanym serwerze

Poniżej znajdziecie zapis całej konfiguracji w formie filmu – a pod nim także wersję tekstową.

Do poprawnego wykonania zadania będziemy potrzebować trzech maszyn wirtualnych:

  • CA – jak nazwa wskazuje będzie to urząd certyfikacji – na tym serwerze będziemy tworzyli certyfikaty,
  • syslog-central – serwer na którym będzie uruchomiona usługa rsyslog. Serwer ten będzie przyjmował połączenia od „klientów”,
  • syslog-client – serwer, który będzie wysyłał zdarzenia do serwera centralnego.

Na serwerze w syslog-central uruchomimy usługę rsyslog, która będzie nasłuchiwała na porcie 10514/tcp. Do centralnego serwera podłączymy jednego „klienta” – syslog-client, który będzie wysyłał zdarzenia za pomocą protokołu TLS.

Bez urzędu certyfikacji…

… się nie uda. Urzędy certyfikacji CA (ang. Certification Authority) odpowiedzialne są za poświadczanie tożsamości  na zasadzie „Tak, ta osoba jest tym, za kogo się podaje, a my – ośrodek certyfikacji – potwierdzamy to”. Certyfikat ten musi być zaufany przez wszystkie serwery, które będą łączyły się do centralnego serwera rsyslog. Klucz prywatny musi być dobrze chroniony i nie powinien być przekazywany osobom trzecim. Sam certyfikat może (i musi) być rozpowszechniany.

Choć tworzenie certyfikatów oraz idea PKI może przyprawiać o ból głowy, wspomożemy się narzędziem `certtool` które ułatwi nam proces utworzenia odpowiednich certyfikatów. Program certtool znajduje się w pakiecie gnutls-utils (CentOS/RedHat).

Na serwerze CA instalujemy wspomniany pakiet:

# yum install gnutls-utils

Tworzymy katalog /etc/ssl/rsyslog/ w który będziemy przechowywać certyfikaty.

# mkdir -p /etc/ssl/rsyslog/

Generujemy klucz prywatny CA o długości 2048 bitów:

# certtool --generate-privkey --outfile ca-key.pem
Generating a 2048 bit RSA private key...

Następnie utworzymy klucz publiczny dla serwera „CA”:

# certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca.pem

Większość opcji należy ustawić według własnego uznania, szczególną uwagę należy zwrócić na:

Generating a self signed certificate...
Common name: CA.arubacloud.pl
The certificate will expire in (days): 3650 #uwaga! certyfikat ma ważność 10 lat.

Does the certificate belong to an authority? (y/N): Y
Will the certificate be used to sign other certificates? (y/N): Y
Will the certificate be used to sign CRLs? (y/N): Y
Is the above information ok? (y/N): Y

Podsumowanie:

Utworzyliśmy dwa pliki:

  • ca-key.pem – klucz prywatny, nie rozpowszechniamy tego pliku,
  • ca.pem – klucz publiczny.

Klucze… wszędzie klucze

Każdy serwer będzie posiadał oddzielną parę kluczy. W zależności od tego ile chcemy podłączyć serwerów, tyle certyfikatów musimy wygenerować – jedną parę na każdy serwer.

Będąc zalogowanym na serwerze CA, generujemy parę kluczy dla serwera syslog-central:

# certtool --generate-privkey --outfile syslog-central-private.pem

W celu uzyskania certyfikatu od CA należy zgłosić żądanie wystawienia certyfikatu:

# certtool --generate-request --load-privkey syslog-central-private.pem --outfile request-central.pem

Podobnie jak przy CA – poszczególne pola wypełniamy według naszego uznania zwracając uwagę na:

Common name: syslog-central.arubacloud.pl
Is this a TLS web client certificate? (y/N): y
Is this also a TLS web server certificate? (y/N): y

Aby utworzyć klucz na podstawie żądania wydajemy polecenie:

# certtool --generate-certificate --load-request request-central.pem --outfile syslog-central-cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem
 Is this a TLS web client certificate? (Y/N): y
 Is this also a TLS web server certificate? (Y/N): y
 Enter the dnsName of the subject of the certificate: syslog-central.arubacloud.pl
 Is the above information ok? (Y/N): y

Utworzyliśmy dwa pliki:

  • syslog-central-cert.pem – klucz publiczny,
  • syslog-central-key.pem – klucz prywatny.

Bazując na powyższym opisie generujemy kolejną parę kluczy, tym razem dla serwera syslog-client. Powtarzamy kroki opisane wyżej, zmieniając nazwę pliku:

# certtool --generate-privkey --outfile syslog-client-private.pem
# certtool --generate-request --load-privkey syslog-client-private.pem --outfile request-client.pem
# certtool --generate-certificate --load-request request-client.pem --outfile syslog-client-cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem

Utworzyliśmy kolejne dwa pliki:

  • syslog-client-cert.pem – klucz publiczny,
  • syslog-client-key.pem – klucz prywatny.

Bezpiecznie przesyłamy klucze

Na serwerze syslog-central oraz syslog-client tworzymy katalog /etc/ssl/rsyslog/ do którego prześlemy odpowiednie klucze:

# mkdir /etc/ssl/rsyslog/

Z serwera CA przesyłamy klucz ca.pem oraz klucz prywatny i publiczny dla serwera syslog-central:

# scp {ca.pem,syslog-central-*.pem} root@syslog-central:/etc/ssl/rsyslog/

Nie zapominajmy o serwerze syslog-client:

# scp {ca.pem,syslog-client-*.pem} root@syslog-client:/etc/ssl/rsyslog/

Ostatnie szlify

Sewer syslog-central:

Na serwerze syslog-central tworzymy plik /etc/rsyslog.d/tls.conf z następującą zawartością:

$DefaultNetstreamDriver gtls

# pełne ścieżki do certyfikatów
$DefaultNetstreamDriverCAFile /etc/ssl/rsyslog/ca.pem # certyfikat CA
$DefaultNetstreamDriverCertFile /etc/ssl/rsyslog/syslog-central-cert.pem # klucz publiczny
$DefaultNetstreamDriverKeyFile /etc/ssl/rsyslog/syslog-central-private.pem # klucz prywatny
$ModLoad imtcp
$InputTCPServerStreamDriverAuthMode x509/name
$InputTCPServerStreamDriverMode 1 # tylko TLS
$InputTCPServerStreamDriverPermittedPeer *.arubacloud.pl
$InputTCPServerRun 10514 # nasłuchujemy na porcie 10514

Restartujemy usługę rsyslog:

# service rsyslog restart

Sprawdzamy czy usługa rsyslog nasłuchuje na porcie 10514:

# netstat -a |grep 10514
tcp 0 0 0.0.0.0:10514 0.0.0.0:* LISTEN

Serwer syslog-client:

Na serwerze syslog-client tworzymy plik /etc/rsyslog.d/tls.conf z następującą zawartością:

$DefaultNetstreamDriver gtls

# pełne ścieżki do certyfikatów
$DefaultNetstreamDriverCAFile /etc/ssl/rsyslog/ca.pem # certyfikat CA
$DefaultNetstreamDriverCertFile /etc/ssl/rsyslog/syslog-client-cert.pem # klucz publiczny
$DefaultNetstreamDriverKeyFile /etc/ssl/rsyslog/syslog-client-private.pem # klucz prywatny
$DefaultNetstreamDriver gtls
$ActionSendStreamDriverMode 1 # wymagany TLS
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer *.arubacloud.pl
*.* @@(o)syslog-central:10514 # wysyłaj wszystkie zdarzenia

Restartujemy usługę rsyslog:

# service rsyslog restart

Na serwerze syslog-client wysyłamy przykładowy komunikat poleceniem:

# logger "123 test"

a na serwerze syslog-central sprawdzamy, czy komunikat pojawił się w logach:

# tail -f /var/log/messagess

Tak właściwie po co mi to?

Jeśli nie macie centralnego logowania to jak radzicie sobie z logowaniem zdarzeń? Jaką macie pewność, że logi nie zostały zmodyfikowane przez nieuprawnioną osobę? Podzielcie się w komentarzach z jakich rozwiązań korzystacie (nawet komercyjnych ;) ).

Powrót

Komentarze

  • 2017.12.04 09:39 AlexP

    Log Analytics od Microsoftu mi ogarnia co trzeba, a jak logów nie jest więcej niż 500MB dziennie to się mieszczę w darmowym tierze ;)

    Odpowiedz
  • 2017.12.04 09:50 janmarian

    Dobry pomysl z PKI, ja do tej pory spinalem serwery VPNem i w ten sposob zapisuje logi.

    Odpowiedz
  • 2017.12.04 15:31 Piotr

    Ok, a co jeśli mam tylko jedną maszynę?

    Odpowiedz
    • 2017.12.05 13:10 janmarian

      mozesz logi na maila wysylac

      Odpowiedz
  • 2017.12.04 16:49 bbb

    Drugi scp mały błąd: root@syslog-central, powinno być root@syslog-client :)

    Odpowiedz
    • 2017.12.04 17:44 Krystian

      Faktycznie literówka, dzięki :)

      Odpowiedz
  • 2017.12.04 17:34 Nyuu

    Dwużyłowy UART

    Odpowiedz
  • 2017.12.04 21:15 S.J.

    Dla całej tej infrastruktury zabrakło jednak wykończenia. Co jakiś czas z centralnego serwera logów pliki logów powinny być odsyłane (najlepiej po jakimś vpn-ie) do np. zewnętrznego urządzenia jakim jest nasz komputer – po tej operacji trzeba (np. jakimś skryptem automatycznym) bezwzględnie czyścić te logi z CA w celu uniknięcia a) zwiększonego ryzyka przechwycenia całej bazy logów naszej odległej/lokalnej/itd. sieci/maszyn/itd. b) szybkiego zapełniania się tych tanich vps-ików za 4 zeta – nie oszukujmy się, jak jest porada dla określonego rozwiązania z aruba, to raczej nikt nie będzie brnął w dodatkowe koszta. W końcu nie każdy musi to robić z rozmachem setek maszyn na poziomie pół lub w pełni profesjonalnym – wtedy na pewno będzie go stać na profesjonalne narzędzia do tego.

    Odpowiedz
  • 2017.12.06 10:48 gosc

    Ja zastanawialem sie nad domowym sposobem:

    1. Zbieranie ostrzezen = „logwatch”

    Niestety logwatch choc daje duzo podstawowych info,
    to nie wylapie np. typu ataku z logow, albo skonfigurowac tego jeszcze nie umiem. Moral z tego ze jesli zauwaze cos podejrzanego musze recznie przegladac logi ( np. z serwera. )
    W przyszlosci moze warto bedzie to zamienić na „suricata”

    2. Stworzenie serwera poczty
    Dzieki temu bede mógł wybierać co wysłać i kiedy.

    3. Napisanie skryptu który
    – co jakiś czas dziennie bedzie
    otwieral zapore dla serwera poczty ( oczywiscie dla danego IP )
    niestety bedzie musial otworzyc takze zapore dla skryptu lub kienta który pobierze z serwera zaszyfrowany plik z IP, jesli bedzie nie aktualny lub nie znajdzie, nie wysle. Gdybym mial stale IP bylo by prosciej, bo wtedy nie musialbym pobierać aktualne IP.
    Mozna by tez spróbować dodać „podwójną weryfikację”
    – i wysylal logi na poczte wlasciciela.
    – logi mozna dowolnie szyfrować
    – nie udane wyslanie takze mozna logowac

    4. Skonfigurowanie
    – swojej zapory dla zmiennego IP,
    – swojego klienta poczty
    – skryptu do pobierania i wysylania swojego IP w postaci zaszyfrowanej

    W poradniku na samej gorze
    – jest o tyle lepiej że do odbiorcy trafia caly log.
    Nie jestem zwolennikiem otwierania portów na stałe, ale jeśli zaporę ustawiłeś otwartą tylko dla określonego IP, to powinno być bezpiecznie.
    – W twoim przypadku logi prawdopodobnie moga byc odczytywane tylko przez administratora ( nie wiem, zgaduję )
    A w moim przez uzytkownika, klienta poczty. W przypadku smieci, to bez roznicy, ale nigdy nie wiadomo co tam sie trafi.
    Moze znajde jakis sposob przez ssh i scp skryptem …
    – poza tym przydalo by sie jakies zabezpieczenie – informacja, jesli jakis log przypadkiem do Ciebie nie trafi. ( w postaci np. skryptu który przejzy log pod kątem czasu, czy wiadomosci informujacej ze serwer wciaz zyje ), no chyba ze o czyms zapomnialem.

    Odpowiedz
  • 2017.12.07 17:37 Mateusz

    Ściema z tym Aruba Cloud. Najpierw 3 dni czekałem na kod vouchera, a teraz nie mogę utworzyć żadnego serwera VPS. Wyskakuje błąd: Wystąpił błąd, proszę spróbować później. Helpdesk odzywa się po pół dnia, albo każe pisać maile gdzie indziej. Zaproponowali, żebym założył serwer w innym DC – co z tego, jak tam też nie działa? Partacze i tyle. Wolę nawet nie myśleć, bo by było gdyby nastąpiła jakaś awaria…

    Aruba Cloud? Nie polecam!

    Odpowiedz
    • 2017.12.08 12:30 Stefan

      Ja nawet kodu nigdy nie dostałem, próbowałem kilka razy… Wole zapłacić pare dolarów za AWS :P

      Odpowiedz

Zostaw odpowiedź do janmarian

Jeśli chcesz zwrócić uwagę na literówkę lub inny błąd techniczny, zapraszamy do formularza kontaktowego. Reagujemy równie szybko.

Podstawy bezpieczeństwa, czyli jak sensownie logować zdarzenia systemowe

Komentarze