Przejdź do treści

Zabezpieczenie danych z działającego systemu Linux

Procedura opisuje sposób zabezpieczenia danych z działającego systemu Linux. Każda sekcja zawiera opis artefaktu oraz polecenia jego pozyskania. Szegółowe informacje o artefaktach znajdują się w sekcji Artefakty.

NIE URUCHAMIAJ WYŁĄCZONEGO URZĄDZENIA

Jeżeli urządzenie było połączone z zaatakowaną domeną lub siecią, mogło zostać skompromitowane. W takim przypadku nie jest zalecane uruchomienie go przed ustaleniem zakresu incydentu. Należy uznać je za skompromitowane i poddać analizie. Uruchomienie takiego urządzenia może spowodować zaszyfrowanie danych przez szkodliwe oprogramowanie, nawet jeśli urządzenie jest odłączone od sieci wewnętrznej instytucji.

Jeżeli urządzenie nie jest objęte atakiem ransomware, samo uruchomienie systemu operacyjnego może nadpisać kluczowe dla analizy dane, takie jak dzienniki zdarzeń czy pliki usunięte przez atakującego.

Zalecanym rozwiązaniem jest przekazanie dysków z takiego urządzenia lub całego urządzenia do wyspecjalizowanej instytucji, która zabezpieczy dane znajdującie się na dyskach w sposób nie nadpisujący ich zawartości, bez uruchamiania systemu.

Zakres zabezpieczenia Szczegóły
procesy i usługi uruchomione procesy i usługi, które mogą pomóc ustalić, czy na urządzeniu działa niepożądane oprogramowanie
połączenia sieciowe aktywne połączenia, nasłuchujące porty, tablica ARP, reguły zapory sieciowej i routing
podstawowe informacje o urządzeniu nazwa hosta, dystrybucja, wersja jądra, architektura i układ dysków
konta i grupy listy użytkowników i grup systemowych pozwalające wykryć konta dodane przez atakującego oraz konfiguracja sudoers
historia logowań udane logowania z nazwą hosta i pełnym znacznikiem czasu (last -aF)
klucze SSH pliki authorized_keys oraz known_hosts (z pominięciem kluczy prywatnych)
zadania cykliczne wpisy cron i timery systemd, mechanizmy, które mogą pozwalać atakującemu regularnie odnawiać dostęp do urządzenia
historia poleceń pliki historii powłok użytkowników mogące pomóc w ustaleniu poleceń wykonanych przez atakującego
listing plików metadane plików pozwalające zbudować oś czasu ułatwiającą zlokalizowanie niepożądanych pliki
dzienniki zdarzeń dzienniki z katalogu /var/log rejestrujące logowania, zmiany uprawnień i uruchamianie usług
dziennik systemowy wpisy journald

Wymagania

  • Uruchomione urządzenie
  • Dostęp do konta z uprawnieniami root

Wymagane narzędzia

Rozpoczęcie procedury

Automatyzacja procedury

Procedurę można wykonać automatycznie za pomocą skryptu, który realizuje te same kroki, dodatkowo zabezpiecza pliki konfiguracyjne powłok, oblicza sumy kontrolne SHA-256 i odmontowuje nośnik.

Skrypt automatyzujący procedurę zabezpieczania

Przed uruchomieniem polecenia należy spełnić poniższe warunki:

  • powłoka systemowa jest uruchomiona z uprawnieniami roota.
  • zmienna $nosnik wskazuje na katalog docelowy na zewnętrznym nośniku, w przeciwnym wypadku należy przypisać ją poniższym poleceniem
    export nosnik=<katalog docelowy na zewnętrznym nośniku>
    

Całą procedurę należy wykonać w jednym oknie terminala (sesji). W przypadku przerwania sesji, należy powtórzyć procedurę od początku.

Uzyskanie podwyższonych uprawnień
sudo -i
Uzyskanie podwyższonych uprawnień
su

Aby sprawdzić gdzie jest zamontowany nośnik po podłączeniu należy wykonać poniższe polecenie.

Sprawdznie punktu montowania nośnika
lsblk

Jeżeli dysk nie zamontował się automatycznie należy stworzyć folder i zamontować nośnik. Za znak X należy wprowadzić literę przypisaną do dysku zewnętrznego.

Tworzenie folderu i montowanie nośnika.
mkdir /mnt/nosnik
mount /dev/sdX1 /mnt/nosnik

Należy dodać zmienną wskazującą punkt montowania nośnika zewnętrznego, wykorzystaną do zapisania pozyskanych danych.

Dodanie zmiennej $nosnik
export nosnik=<punkt montowania nośnika zewnętrznego> #np export nosnik=/mnt/nosnik

W celach diagnostycznych należy uruchomić rejestrację wszystkich wykonywanych poleceń wraz z czasem i wynikami ich wykonania.

Rejestracja sesji (script)
script -a --log-timing="$nosnik/timing.log" "$nosnik/session.log"

Zapis rozpoczęty

Od tej chwili wszystko, co zostanie wpisane w terminalu, trafia do pliku session.log.

Należy zapisać czas rozpoczęcia oraz informacje o urządzeniu:

Informacje początkowe
date -u; uptime; who -a; echo "$nosnik"

Procesy i usługi

Informacje o uruchomionych programach i usługach pozwalające ustalić, czy na urządzeniu uruchomiono niepożądane oprogramowanie.

Poniższe polecenia służą do zabezpieczenia informacji o procesach i usługach uruchomionych na badanym urządzeniu.

Procesy i usługi
echo "Rozpoczęcie zabezpieczania informacji o procesach i usługach $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
ps axjfww > "$nosnik/processes.txt" 2>>"$nosnik/error.log"
systemctl list-units --type=service > "$nosnik/services_.txt" 2>>"$nosnik/error.log"
pstree --show-pids > "$nosnik/pstree_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o procesach i usługach $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Połączenia sieciowe

Aktywne połączenia, nasłuchujące porty, tablica ARP, reguły zapory sieciowej i routing.

Poniższe polecenia zabezpieczają informacje o aktualnej aktywności sieciowej badanego urządzenia oraz tablicę ARP.

Wykonanie jednego z trzech poniższych poleceń zapisze informacje o aktywnych połączeniach sieciowych.

Aktywne połączenia i nasłuchujące porty (ss)
echo "Rozpoczęcie zabezpieczania informacji o połączeniach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
ss -tunap > "$nosnik/connections_ss_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o połączeniach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
Aktywne połączenia i nasłuchujące porty (netstat)
echo "Rozpoczęcie zabezpieczania informacji o połączeniach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
netstat -peanut > "$nosnik/connections_netstat_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o połączeniach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
Otwarte gniazda sieciowe (lsof)
echo "Rozpoczęcie zabezpieczania informacji o połączeniach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
lsof -i -P -n -R +c 0 > "$nosnik/connections_lsof_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o połączeniach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Wykonanie poniższego polecenia zapisze informacje dotyczące tablicy ARP badanego urządzenia.

Tablica ARP
echo "Rozpoczęcie zabezpieczania informacji o tablicy ARP $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
ip neigh > "$nosnik/arp_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o tablicy ARP $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Informacje o interfejsach sieciowych

Wykonanie jednego z dwóch poniższych poleceń zapisze informacje o aktualnym stanie interfejsów sieciowych badanego urządzenia.

Adresy interfejsów sieciowych (ip addr)
echo "Rozpoczęcie zabezpieczania informacji o interfejsach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
ip a > "$nosnik/ip_addr_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o interfejsach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
Adresy interfejsów sieciowych (ifconfig)
echo "Rozpoczęcie zabezpieczania informacji o interfejsach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
ifconfig -a > "$nosnik/ifconfig_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o interfejsach sieciowych $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Zapora sieciowa

Reguły zapory sieciowej określają, który ruch jest dozwolony, blokowany czy przekierowywany. Atakujący może modyfikować te reguły, aby otworzyć porty dla komunikacji z serwerem C2, zezwolić na połączenia z określonych adresów IP lub wyłączyć mechanizmy obronne. Zabezpieczenie konfiguracji zapory pozwala wykryć takie modyfikacje.

Różne dystrybucje Linux korzystają z różnych mechanizmów zapory. Poniższe polecenie zabezpiecza reguły ze wszystkich popularnych rozwiązań: iptables/ip6tables, nftables, ufw oraz firewalld. Narzędzia nieobecne w systemie wygenerują jedynie wpis w dzienniku błędów.

Reguły zapory sieciowej
echo "Rozpoczęcie zabezpieczania informacji o zaporze sieciowej $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

iptables-save   > "$nosnik/iptables_.txt"    2>>"$nosnik/error.log"
ip6tables-save  > "$nosnik/ip6tables_.txt"  2>>"$nosnik/error.log"
nft list ruleset > "$nosnik/nftables_.txt"  2>>"$nosnik/error.log"
ufw status verbose > "$nosnik/ufw_.txt"      2>>"$nosnik/error.log"
firewall-cmd --list-all-zones > "$nosnik/firewalld_.txt" 2>>"$nosnik/error.log"

echo "Zakończenie zabezpieczania informacji o zaporze sieciowej $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Routing

Tablica routingu określa, w jaki sposób pakiety sieciowe są kierowane do ich celów. Atakujący może modyfikować trasy routingu, aby przekierować ruch przez kontrolowany serwer.

Tablica routingu i reguły politykowego routingu
echo "Rozpoczęcie zabezpieczania informacji o routingu $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

ip route    > "$nosnik/routes_.txt"    2>>"$nosnik/error.log"
ip -6 route > "$nosnik/routes6_.txt"   2>>"$nosnik/error.log"
ip rule     > "$nosnik/ip_rules_.txt"   2>>"$nosnik/error.log"
ip -6 rule  > "$nosnik/ip6_rules_.txt"  2>>"$nosnik/error.log"

echo "Zakończenie zabezpieczania informacji o routingu $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Podstawowe informacje o urządzeniu

Nazwa hosta, dystrybucja, wersja jądra, architektura i układ dysków stanowiące punkt wyjścia do dalszej analizy.

Aby zabezpieczyć podstawowe informacje o analizowanym systemie, należy wykonać poniższe polecenia.

Podstawowe informacje o urządzeniu
echo "Rozpoczęcie zabezpieczania podstawowych informacji o urządzeniu $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
timedatectl          >  "$nosnik/info_.txt" 2>>"$nosnik/error.log"
hostnamectl          >> "$nosnik/info_.txt" 2>>"$nosnik/error.log"
uname --all          >> "$nosnik/info_.txt" 2>>"$nosnik/error.log"
systemd-detect-virt  >> "$nosnik/info_.txt" 2>>"$nosnik/error.log"
cat /etc/timezone    >> "$nosnik/info_.txt" 2>>"$nosnik/error.log"
cat /etc/os-release  >> "$nosnik/info_.txt" 2>>"$nosnik/error.log"
lsblk                >> "$nosnik/info_.txt" 2>>"$nosnik/error.log"

echo "Zakończenie zabezpieczania podstawowych informacji o urządzeniu $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Konta i grupy

Listy użytkowników i grup pozwalające wykryć konta dodane w celu utrzymania dostępu oraz konfiguracja sudoers ujawniająca ścieżki eskalacji uprawnień.

Poniższe polecenia służą do zabezpieczenia listy kont użytkowników i grup w systemie.

Konta i grupy
echo "Rozpoczęcie zabezpieczania informacji o kontach i grupach $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
cp -a /etc/passwd "$nosnik/passwd.txt"   2>>"$nosnik/error.log"
cp -a /etc/group "$nosnik/group.txt"     2>>"$nosnik/error.log"
cp -a /etc/sudoers "$nosnik/sudoers.txt" 2>>"$nosnik/error.log"
cp -a /etc/sudoers.d "$nosnik/sudoers.d" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o kontach i grupach $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Historia logowań

Historia udanych logowań użytkowników. Polecenie last odczytuje dane z pliku /var/log/wtmp. Flaga -a dołącza nazwę hosta, z którego odbyło się logowanie, a -F wyświetla pełne znaczniki czasowe.

Historia logowań (last -aF)
echo "Rozpoczęcie zabezpieczania informacji o historii logowań $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
last -aF > "$nosnik/last_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o historii logowań $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Klucze SSH

Pliki authorized_keys i known_hosts mogące wskazać mechanizmy utrzymania dostępu do badanego urządzenia oraz infrastrukturę, z którą łączono się z poziomu tego urządzenia.

Poniższe polecenia zabezpieczają pliki SSH znalezione w katalogach domowych użytkowników: authorized_keys oraz known_hosts. Każdy plik jest kopiowany na nośnik zewnętrzny podmontowany pod zmienną środowiskową $nosnik. Nazwa pliku docelowego zawiera właściciela pliku, nazwę oryginalną oraz znacznik czasu UTC.

Plik authorized_keys

Plik authorized_keys w katalogu domowym użytkownika zawiera listę kluczy publicznych uprawnionych do logowania.

Klucze SSH (authorized_keys)
echo "Rozpoczęcie zabezpieczania informacji o kluczach autoryzowanych SSH $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
find /root /home -maxdepth 3 -type f -name authorized_keys 2>>"$nosnik/error.log" | while read -r f; do
    USER_OWNER="$(stat -c '%U' "$f")"
    cp -a "$f" "$nosnik/${USER_OWNER}_authorized_keys.txt"
done
echo "Zakończenie zabezpieczania informacji o kluczach autoryzowanych SSH $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Plik known_hosts

Plik known_hosts zawiera kluvcze publiczne urządzeń, z którymi użytkownik łączył się przez SSH.

Plik known_hosts
echo "Rozpoczęcie zabezpieczania informacji o plikach known_hosts $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
find /root /home -maxdepth 3 -type f -name known_hosts 2>>"$nosnik/error.log" | while read -r f; do
    USER_OWNER="$(stat -c '%U' "$f")"
    cp -a "$f" "$nosnik/${USER_OWNER}_known_hosts.txt"
done
echo "Zakończenie zabezpieczania informacji o plikach known_hosts $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Dodatkowe lokalizacje kluczy SSH

Atakujący może umieścić klucz w nietypowej lokalizacji, zmieniając konfigurację serwera SSH (/etc/ssh/sshd_config) lub pliki konfiguracyjne katalogu domowego użytkownika (~/.ssh/config).

Konfiguracja serwera i klienta SSH
echo "Rozpoczęcie zabezpieczania konfiguracji serwera i klienta SSH $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
cp -a /etc/ssh/sshd_config "$nosnik/sshd_config.txt"  2>>"$nosnik/error.log"
cp -a /etc/ssh/sshd_config.d "$nosnik/sshd_config.d_" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania konfiguracji serwera i klienta SSH $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Zadania cykliczne

Wpisy cron i timery systemd, mechanizm pozwalający regularnie odnawiać dostęp do przejętego urządzenia.

Aby zabezpieczyć informacje o zaplanowanych zadaniach, należy wykonać poniższe polecenia.

echo "Rozpoczęcie zabezpieczania informacji o zadaniach cyklicznych $(date -u +%Y%m%dT%H%M%S-UTC)" >>"$nosnik/error.log"

for u in $(cut -d: -f1 /etc/passwd); do
    printf '===== %s =====\n' "$u"
    crontab -l -u "$u" 2>&1
done > "$nosnik/crontabs_all_.txt" 2>>"$nosnik/error.log"

# Archiwum katalogów cron.
tar --xattrs --acls --selinux --ignore-failed-read \
    -czf "$nosnik/cron_.tar.gz" \
    /etc/crontab /etc/cron.d /etc/cron.hourly /etc/cron.daily \
    /etc/cron.weekly /etc/cron.monthly /etc/anacrontab \
    /etc/cron.allow /etc/cron.deny \
    /var/spool/cron /var/spool/anacron /var/spool/at 2>>"$nosnik/error.log"

systemctl --no-pager --full list-timers --all              > "$nosnik/timers_.txt"        2>>"$nosnik/error.log"
systemctl --no-pager --full list-unit-files --state=enabled > "$nosnik/units_enabled_.txt" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o zadaniach cyklicznych $(date -u +%Y%m%dT%H%M%S-UTC)" >>"$nosnik/error.log"

Historia poleceń

Pliki historii powłok użytkowników pozwalające ustalić działania wykonane przez atakującego po uzyskaniu dostępu.

Aby zabezpieczyć historię poleceń wykonywanych przez użytkowników, należy uruchomić poniższy skrypt.

    echo "Rozpoczęcie zabezpieczania informacji o historii poleceń $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
   while IFS=: read -r username _ _ _ _ home _; do
        case "$home" in ""|/|/nonexistent|/dev/null|/var/empty) continue ;; esac
        [ -d "$home" ] || continue
        for hf in .bash_history .zsh_history .sh_history .history .tcsh_history \
                   .local/share/fish/fish_history .config/fish/fish_history; do
            [ -f "$home/$hf" ] && cp -a "$home/$hf" \
                "$nosnik/history_${username}_${hf//\//_}"
        done
    done < /etc/passwd
    echo "Zakończenie zabezpieczania informacji o historii poleceń $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Listing plików

Metadane plików pozwalające zbudować oś czasu zmian i zlokalizować niepożądane pliki.

Poniższe polecenie zabezpiecza metadane plików z katalogów /root, /home, /var oraz /tmp. Wynik zapisywany jest w pliku filelist_.tsv.

Pełny listing metadanych plików
echo "Rozpoczęcie zabezpieczania listingu plików $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
find /root /home /var /tmp -printf '%D\t%i\t%s\t%M\t%u\t%g\t%A@\t%T@\t%C@\t%y\t%p\n' 2>>"$nosnik/error.log" > "$nosnik/filelist_.tsv"
echo "Zakończenie zabezpieczania listingu plików $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Dzienniki zdarzeń

Dzienniki zdarzeń z katalogu /var/log rejestrujące logowania, zmiany uprawnień i uruchamianie usług.

Poniższe polecenie służy do zabezpieczenia dzienników zdarzeń z katalogu /var/log.

Archiwizacja /var/log z zachowaniem atrybutów
echo "Rozpoczęcie zabezpieczania dzienników zdarzeń $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
tar --xattrs --acls --selinux -czpf "$nosnik/varlog_.tar.gz" -C / var/log  2>> "$nosnik/error.log"
echo "Zakończenie zabezpieczania dzienników zdarzeń $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Dziennik systemowy

Wpisy journald obejmujące poprzednie uruchomienia systemu, stanowiące punkt odniesienia dla osi czasu incydentu.

echo "Rozpoczęcie zabezpieczania informacji o dzienniku systemowym $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"
journalctl --merge --all --output export > "$nosnik/journal_export_.export" 2>>"$nosnik/error.log"
journalctl --merge --all --output json   > "$nosnik/journal_all_.json" 2>>"$nosnik/error.log"
echo "Zakończenie zabezpieczania informacji o dzienniku systemowym $(date -u +%Y%m%dT%H%M%S-UTC)" >> "$nosnik/error.log"

Zakończenie procedury

Po wykonaniu wcześniejszych instrukcji należy zapisać czas zakończenia i zakończyć rejestrację sesji.

Zamknięcie sesji
date -u
exit   # kończy działanie polecenia script

Należy obliczyć sumy kontrolne zebranych danych. Służy do tego poniższe polecenie.

Obliczanie sum kontrolnych
find "$nosnik" -type f ! -name "hashes_.txt" -exec sha256sum {} + > "$nosnik/hashes_.txt"

Weryfikacja sum kontrolnych

Sumy kontrolne pozwalają udowodnić, że zabezpieczone dane nie zostały zmienione po zabezpieczeniu.

Należy utworzyć archiwum ze zabezpieczonymi danymi, co ułatwia ich przesyłanie i przechowywanie.

Tworzenie archiwum
tar -czpf "$nosnik/${HOSTNAME}_zabezpieczenie.tar.gz" --exclude="${HOSTNAME}_zabezpieczenie.tar.gz" -C "$nosnik" .

Następnie należy bezpiecznie odmontować nośnik.

Bezpieczne odmontowanie nośnika
sync "$nosnik"
umount "$nosnik"

Przed rozpoczęciem procedury zabezpieczania z kolejnego urządzenia należy przesłać archiwum zabezpieczenie.tar.gz do analizy.

Czyszczenie nośnika przed kolejnym zabezpieczeniem

Przed zabezpieczeniem danych z kolejnego urządzenia należy wyczyścić nośnik.

Ostatnia aktualizacja artykułu: 2026-09-02.