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¶
- Czysty nośnik zewnętrzny przygotowany na zaufanym urządzeniu, zgodnie z instrukcją Przygotowanie nośnika
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.
Przed uruchomieniem polecenia należy spełnić poniższe warunki:
- powłoka systemowa jest uruchomiona z uprawnieniami roota.
- zmienna
$nosnikwskazuje na katalog docelowy na zewnętrznym nośniku, w przeciwnym wypadku należy przypisać ją poniższym poleceniem
Całą procedurę należy wykonać w jednym oknie terminala (sesji). W przypadku przerwania sesji, należy powtórzyć procedurę od początku.
Aby sprawdzić gdzie jest zamontowany nośnik po podłączeniu należy wykonać poniższe polecenie.
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.
Należy dodać zmienną wskazującą punkt montowania nośnika zewnętrznego, wykorzystaną do zapisania pozyskanych danych.
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.
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:
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.
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.
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"
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"
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.
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.
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"
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
Należy obliczyć sumy kontrolne zebranych danych. Służy do tego poniższe polecenie.
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.
tar -czpf "$nosnik/${HOSTNAME}_zabezpieczenie.tar.gz" --exclude="${HOSTNAME}_zabezpieczenie.tar.gz" -C "$nosnik" .
Następnie należy bezpiecznie odmontować nośnik.
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.