Bezpieczeństwo Linuksa z Aruba Cloud – monitorowanie zmian w systemie plików

dodał 20 lutego 2017 o 09:37 w kategorii HowTo  z tagami:
Bezpieczeństwo Linuksa z Aruba Cloud – monitorowanie zmian w systemie plików

Częstą przyczyną długiej przerwy między włamaniem a jego wykryciem jest niski poziom monitoringu ważnych zdarzeń w zaatakowanym systemie. Dzisiaj pokażemy Wam, jak prosto i skutecznie monitorować linuksowy system plików.

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ć oraz jak postawić swój własny zdalny pulpit i swój serwer WWW. Dzisiaj z kolei pokażemy, jak wdrożyć czasem bardzo przydatny monitoring dowolnie wybranych plików lub katalogów.

Po co taki monitoring

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. 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.

To, do czego może się Wam przydać monitoring plików, ogranicza jedynie Wasza wyobraźnia. Przykładowe rozwiązania to np. otrzymywanie emaila zawsze, gdy zmieni się zawartość katalogów serwera WWW – może to pomóc wykryć udaną próbę włamania na serwer. Inne pomysły na wykrycie intruza to np. monitoring pliku /etc/shadow (gdy ktoś spróbuje zmodyfikować lub dodać swojego użytkownika) czy plików z kluczami SSH pozwalającymi logować się na konto roota. Niekoniecznie muszą to być tylko funkcje wykrywania prób włamania – można także np. zaprogramować restart serwera WWW gdy następuje zmiana jego pliku konfiguracyjnego – jeśli ktoś często w nim grzebie, to może oszczędzić w ten sposób kilka minut życia.

Kilka słów wstępu

Aby opisać metodę monitorowania zmian, warto zacząć od tego, co będziemy tak naprawdę monitorować. Każdemu obiektowi w systemie plików (np. katalogowi czy plikowi) odpowiada i-węzeł (ang. inode, index node). Uproszczając jest to struktura określająca obiekt w systemie plików w której zawarte są różne informacje o obiekcie, z wykluczeniem jego nazwy i jego zawartości.

Jak wygląda struktura i-węzła w systemie plików ext4? W repozytorium jądra systemu Linux w pliku nagłówkowym ext4.h zadeklarowana jest następująca struktura:

Zamiast nazwy, i-węzeł wykorzystuje wskaźnik do punktu dla konkretnego pliku, katalogu lub obiektu. Wskaźnik jest unikalnym numerem, który zwykle określa się jako liczbę. Na przykład, aby uzyskać numer węzła, należy użyć następującego polecenia:

Numer i-węzła zmieni się podczas przeniesienia pliku na inną partycję – w obrębie tej samej partycji numer i-węzła nie ulega zmianie. Zmiana zawartości lub zmiana właściciela pliku (itp.) nie zmienia numeru i-węzła. Można pozyskać wszystkie metainformacje zawarte w i-węźle. W tym celu najpierw utworzymy przykładowy plik z dowolna zawartością, a następnie sprawdzimy metainformacje o pliku:

Mając tak utworzony plik możemy pozyskać więcej informacji niż tylko numer węzła:

Monitorujemy i-węzły

W celu monitorowania i-węzłów użyjemy funkcji Inotify, która jest wbudowana w jądro Linuxa. Inotify (inode notify) to funkcja jądra która powiadamia o zdarzeniach w systemie plików. Za pomocą Inotify API można w łatwy sposób monitorować zdarzenia. W ramach omawianego przykładu będziemy chcieli monitorować zmiany i-węzłów dla katalogu /etc. Aby rozpocząć monitorowanie określonego katalogu potrzebujemy narzędzia, które umożliwi nam komunikację za pomocą Inotify API.

Jednym z takich narzędzi jest incron, który dostępny jest w repozytorium EPEL:

Incron jest zbliżonym narzędziem do crontaba lecz w przeciwieństwie do niego nie bazuje na określonych odstępach czasowych, a na zdarzeniach w systemie plików. Logując się jako administrator wydajemy polecenie:

Uruchamiamy incron w systemie:

oraz zapewniamy by incron był uruchamiany podczas startu systemu operacyjnego:

Po instalacji pakietu incron warto zapoznać się z zawartością następujących plików:

Składnia incron

Składnia incron jest następująca:

gdzie:

  • ścieżka określa pełną ścieżkę do pliku, katalogu lub innego obiektu w systemie plików, który chcemy monitorować
  • nazwa zdarzenia:
    • IN_ACCESS – Nastąpił dostęp do pliku (odczyt)
    • IN_ATTRIB – Nastąpiła zmiana metadanych (uprawnienia, znacznik czasu, itp.)
    • IN_CLOSE_WRITE – Zamknięto plik, który był otwarty z uprawnieniami do zapisu
    • IN_CLOSE_NOWRITE – Zamknięto plik, który był otwarty z uprawnieniami tylko do odczytu
    • IN_CREATE – Utworzono plik/katalog w monitorowanym katalogu
    • IN_DELETE – Usunięto plik/katalog z monitorowanego katalogu
    • IN_DELETE_SELF – Monitorowany plik/katalog został skasowany
    • IN_MODIFY – Monitorowany plik  został zmodyfikowany
    • IN_MOVE_SELF – Monitorowany plik/katalog został przeniesiony
    • IN_MOVED_FROM – Z monitorowanego katalogu przeniesiono plik
    • IN_MOVED_TO – Do monitorowanego katalogu przeniesiono plik
    • IN_OPEN – Monitorowany plik został otwarty
    • IN_ALL_EVENTS – Wszystkie wyżej wymienione zdarzenia
  • polecenie to pełna ścieżka do wskazanego przez nas skryptu/programu, który zostanie uruchomiony w razie wykrycia opisywanego zdarzenia
  • opcje (argumenty wywołania polecenia):
    • $@ – pełna ścieżka monitorowanego pliku/katalogu
    • $# – nazwa pliku/katalogu którego dotyczy zdarzenie
    • $% – nazwa zdarzenia
    • $& – numeryczna reprezentacja nazwy zdarzenia

Na podstawie powyższej składni edytujemy ustawienia incron wydając polecenie:

Aby monitorować katalog /etc/ pod kątem modyfikacji, utworzonych/usuniętych  plików lub katalogów, wpisujemy nastepująca linię:

Każde zdefiniowane przez nas zdarzenie (IN_MODIFY, IN_CREATE, IN_DELETE) będzie raportowane w pliku /var/log/messages.

Przyklad:

W pliku /var/log/messages pojawią się następuące wpisy:

W omawianym przykladzie program logger zapisuje informacje o zdarzeniu do pliku /var/log/messages. Możemy wskazać dowolny program który zostanie uruchomiony podczas wykrycia określonego zdarzenia. Innym przykładem może być skrypt, który wyśle pod wskazany adres e-mail informację o zdarzeniu.

Tworzymy plik /root/send_mail.sh, a jego zawartość wygląda następująco:

Nastepnie edytujemy incrontab

i wpisujemy następującą linię:

Od tego momentu w przypadku wystąpienia zdarzenia IN_MODIFY, IN_CREATE, IN_DELETE w katalogu /etc/ zostanie uruchomiony plik /root/send_mail.sh z argumentami: ścieżka do pliku, nazwa pliku oraz nazwa zdarzenia. Spowoduje to wysłanie emaila z informacją o zdarzeniu. Wystarczy teraz zmienić ścieżkę monitorowanego katalogu na ten, w którym przechowujemy pliki serwera WWW, by otrzymać prosty system ostrzegania o incydentach wartych analizy.

Cały proces włączenia monitoringu możecie zobaczyć na poniższym filmie a kod skryptu do wysyłania poczty znajdziecie na naszym GitHubie.

Zapraszamy także do testowania serwerów w ArubaCloud.

Dla pełnej przejrzystości – za przygotowanie oraz opublikowanie powyższego artykułu otrzymujemy wynagrodzenie.