Przejdź do treści

Skrypt automatyzujący procedurę zabezpieczania danych

Skrypt wykonuje wszystkie kroki opisane w procedurze Zabezpieczenie danych z działającego systemu Linux i zapisuje artefakty na podmontowanym nośniku zewnętrznym, a następnie pakuje je do pojedynczego archiwum. Dodatkowe funkcje skryptu:

  • sprawdza uprawnienia root oraz poprawność punktu montowania nośnika,
  • weryfikuje dostępne miejsce na nośniku i dobiera zakres zabezpieczania /var/log (cały katalog lub tylko pliki z poziomu /var/log/*),
  • zabezpiecza pliki konfiguracyjne powłok użytkowników (.bash_profile, .bashrc, .cshrc, .tcshrc, config.fish),
  • oblicza sumy kontrolne SHA-256 wszystkich zebranych plików,
  • pakuje wszystkie artefakty (wraz z logami i sumami kontrolnymi) do archiwum ${HOSTNAME}_zabezpieczenie.tar.gz i pozostawia na nośniku tylko to archiwum,
  • bezpiecznie odmontowuje nośnik po zakończeniu.

Nie instalować oprogramowania na badanym systemie

Skrypt nie wymaga instalacji żadnych pakietów. Nie modyfikuje badanego systemu poza wykonaniem poleceń zabezpieczających, opisanych w procedurze. Jeżeli aplikacja, z której skrypt próbuje zabezpieczyć dane, nie jest dostępna na badanym systemie, skrypt przechodzi do kolejnej. Użytkownik nie musi podejmować dodatkowych działań, takich jak instalacja oprogramowania.


Skrypt

Skrypt działa pod dowolną powłoką POSIX-sh (dash, ash/busybox, ksh, zsh, bash) i nie wymaga obecności powłoki bash w systemie.

Pobierz zabezpieczenie-posix.sh


Wymagania wstępne

Przed uruchomieniem skryptu należy:

  1. Przygotować czysty nośnik zewnętrzny na zaufanym urządzeniu, zgodnie z instrukcją Przygotowanie nośnika.
  2. Podłączyć nośnik do badanego urządzenia i podmontować go w wybranym katalogu, np. /mnt/nosnik.
  3. Skopiować skrypt na nośnik zewnętrzny.

Skrypt weryfikuje, czy podany argument jest punktem montowania, oraz czy użytkownik ma do niego uprawnienia do zapisu. Wymaga uprawnień root.


Weryfikacja skryptu

Przed pierwszym użyciem należy zweryfikować sumę kontrolną pobranego pliku z wartością referencyjną opublikowaną w bieżącej wersji artykułu. Służy do tego polecenie sha256sum:

Weryfikacja sumy kontrolnej skryptu
sha256sum zabezpieczenie-posix.sh

Oczekiwana suma kontrolna dla aktualnej wersji skryptu:

Plik SHA-256
zabezpieczenie-posix.sh 6bc0b6ca032c721e36f7526f18f9b8e16567d4ba2c8e1fadca934786b461b77b

Niezgodność sumy kontrolnej

Jeśli obliczona suma kontrolna nie zgadza się z wartością referencyjną, należy przerwać procedurę i pobrać skrypt ponownie.


Uruchomienie skryptu

Skrypt przyjmuje jeden obowiązkowy argument, jest nim punkt montowania nośnika zewnętrznego, na którym zapisane zostaną artefakty.

Uruchomienie skryptu
sudo sh zabezpieczenie-posix.sh /mnt/nosnik

Pomoc skryptu wyświetla się poleceniem:

Pomoc skryptu
sh zabezpieczenie-posix.sh --help
Użycie: sudo sh zabezpieczenie-posix.sh <punkt_montowania_nosnika>

Skrypt wykonuje procedurę zabezpieczania danych z działającego systemu Linux,
zapisuje artefakty na podmontowanym nośniku zewnętrznym, a na koniec pakuje je
do archiwum <hostname>_zabezpieczenie.tar.gz (na nośniku pozostaje tylko archiwum).

Kroki wykonywane przez skrypt

Skrypt realizuje następujące kroki w jednej sesji, w stałej kolejności. Każdy krok zapisuje znacznik czasu rozpoczęcia i zakończenia do logu błędów (error.log), co ułatwia późniejszą analizę przebiegu działania skryptu.

  1. Procesy i usługips axjfww, systemctl list-units, pstree -p.
  2. Siećss/netstat/lsof (pierwszy dostępny), ip neigh, ip addr/ifconfig, iptables-save, ip6tables-save, nft list ruleset, ufw status verbose, firewall-cmd --list-all-zones, ip route, ip -6 route, ip rule, ip -6 rule.
  3. Podstawowe informacje o urządzeniutimedatectl, hostnamectl, uname -a, systemd-detect-virt, /etc/timezone, /etc/os-release, lsblk.
  4. Konta i grupy – kopie /etc/passwd, /etc/group, /etc/sudoers oraz /etc/sudoers.d.
  5. Historia logowańlast -aF.
  6. Klucze SSHauthorized_keys i known_hosts z /root i /home (find z maxdepth 3).
  7. Zadania cyklicznecrontab -l dla każdego użytkownika, archiwum tar katalogów /etc/cron.* oraz /var/spool/cron, systemctl list-timers, systemctl list-unit-files --state=enabled.
  8. Historia poleceń – pliki historii powłok użytkowników (.bash_history, .zsh_history, .sh_history, .history, .tcsh_history, historia fish).
  9. Pliki konfiguracyjne powłoki.bash_profile, .bashrc, .cshrc, .tcshrc, .config/fish/config.fish w katalogach domowych użytkowników.
  10. Dziennik systemowy journaldjournalctl --merge --all --output export oraz journalctl --merge --all --output json.
  11. Listing plikówfind /root /home /var /tmp -printf (metadane plików w katalogach /root, /home, /var oraz /tmp).
  12. Dzienniki zdarzeń /var/log – archiwum tar z zachowaniem atrybutów rozszerzonych. Przed wykonaniem procedury skrypt weryfikuje dostępne miejsce na nośniku (df) i porównuje je z rozmiarem /var/log (du). Jeżeli cały katalog zmieści się na nośniku, zabezpieczany jest rekursywnie cały /var/log; w przeciwnym razie zabezpieczane są tylko pliki z poziomu /var/log/* (bez podkatalogów).
  13. Sumy kontrolne SHA-256sha256sum wszystkich plików na nośniku.
  14. Archiwizacja artefaktówtar wszystkich zebranych plików (wraz z session.log, error.log i sumami kontrolnymi) do archiwum ${HOSTNAME}_zabezpieczenie.tar.gz na nośniku, a następnie usunięcie pojedynczych plików – na nośniku pozostaje tylko archiwum.
  15. Odmontowanie nośnikasync, umount.

Opis każdego kroku wraz z uzasadnieniem znaczenia artefaktów w analizie powłamaniowej znajduje się w procedurze ręcznej oraz w opisach artefaktów.


Pliki wyjściowe

Po poprawnym zakończeniu działania skryptu na nośniku pozostaje wyłącznie archiwum ${HOSTNAME}_zabezpieczenie.tar.gz zawierające wszystkie poniższe artefakty (wraz z session.log, error.log i sumami kontrolnymi):

Artefakt Wzorzec nazwy
Procesy processes_.txt
Usługi services_.txt
Drzewo procesów pstree_.txt
Połączenia sieciowe connections_ss_.txt (lub _netstat_/_lsof_)
Tablica ARP arp_.txt
Adresy interfejsów ip_addr_.txt (lub ifconfig_)
Reguły zapory iptables_.txt, ip6tables_.txt, nftables_.txt, ufw_.txt, firewalld_.txt
Routing routes_.txt, routes6_.txt, ip_rules_.txt, ip6_rules_.txt
Informacje o urządzeniu info_.txt
Konta i grupy ${HOSTNAME}_passwd_${TS}.txt, ${HOSTNAME}_group_${TS}.txt, ${HOSTNAME}_sudoers_${TS}.txt, ${HOSTNAME}_sudoers.d_${TS}
Historia logowań last_.txt
Klucze SSH ${USER}_${authorized_keys|known_hosts}_${TS}
Cron – wpisy użytkowników crontabs_all_.txt
Cron – archiwum cron_.tar.gz
Timery systemd timers_.txt
Jednostki włączone units_enabled_.txt
Historia poleceń history_${USER}_${plik}_${TS}
Pliki konfiguracyjne powłoki shell_${USER}_${plik}_${TS}
Archiwum /var/log varlog_.tar.gz
Dziennik journald journal_export_.export, journal_all_.json
Listing plików filelist_.tsv
Sumy kontrolne hashes_.txt
Rejestr przebiegu session.log
Log błędów error.log
Archiwum zabezpieczenia ${HOSTNAME}_zabezpieczenie.tar.gz

${HOSTNAME} to nazwa badanego hosta, ${TS} – znacznik czasu w formacie YYYYmmddTHHMMSS-UTC, ${USER} – nazwa właściciela pliku. Po zakończeniu skryptu wszystkie powyższe pliki (poza archiwum) zostają usunięte z nośnika – jedynym pozostawionym plikiem jest ${HOSTNAME}_zabezpieczenie.tar.gz.


Zapis przebiegu działania skryptu

Skrypt tworzy dwa osobne dzienniki zdarzeń na nośniku:

  • session.log – rejestr przebiegu zabezpieczania.
  • error.log – komunikaty błędów i ostrzeżeń.

Oba dzienniki stają się częścią archiwum ${HOSTNAME}_zabezpieczenie.tar.gz i po jego utworzeniu zostają usunięte z nośnika wraz z pozostałymi pojedynczymi plikami.

Różnica względem ręcznej procedury

Ręczna procedura rejestruje pełną sesję terminala przy pomocy polecenia script, co pozwala odtworzyć dokładne wyjście każdego polecenia wraz z rejestrem czasowym. Skrypt prowadzi jedynie rejestr kroków w session.log.


Ograniczenia i ostrzeżenia

Nośnik musi być podmontowany przed uruchomieniem

Skrypt weryfikuje, czy argument jest punktem montowania. Jeśli nośnik nie został podmontowany, skrypt odmówi uruchomienia (kod wyjścia 1).

Brakujące narzędzia w dystrybucji

Niektóre polecenia mogą nie być dostępne w danej dystrybucji. W takim przypadku wyjście polecenia jest puste, a komunikat błędu (command not found) trafia do error.log. Nie wpływa to negatywnie na pozostałe etapy skryptu.

Zakres zabezpieczania /var/log zależy od dostępnego miejsca

Skrypt porównuje rozmiar /var/log z dostępnym miejscem na nośniku przed rozpoczęciem procedury. Jeżeli cały /var/log zmieści się na nośniku, zabezpieczany jest rekursywnie (z podkatalogami takimi jak /var/log/journal czy /var/log/audit). W przeciwnym razie zabezpieczane są tylko pliki z poziomu /var/log/* bez podkatalogów, co pozwala zachować kluczowe dzienniki tekstowe (np. syslog, auth.log, security, wtmp) przy ograniczonej pojemności nośnika. Wybrany tryb jest odnotowany w session.log, a po zakończeniu skrypt wypisuje minimalną pojemność nośnika potrzebną do zabezpieczenia całego /var/log, na tej podstawie należy przygotować nośnik o większej pojemności i powtórzyć procedurę.

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