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).
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 pulpit, swój serwer WWW, jak monitorować zmiany w plikach, jak 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 ;) ).
Komentarze
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 ;)
Dobry pomysl z PKI, ja do tej pory spinalem serwery VPNem i w ten sposob zapisuje logi.
Ok, a co jeśli mam tylko jedną maszynę?
mozesz logi na maila wysylac
Drugi scp mały błąd: root@syslog-central, powinno być root@syslog-client :)
Faktycznie literówka, dzięki :)
Dwużyłowy UART
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.
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.
Ś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!
Ja nawet kodu nigdy nie dostałem, próbowałem kilka razy… Wole zapłacić pare dolarów za AWS :P