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.gzi 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:
- Przygotować czysty nośnik zewnętrzny na zaufanym urządzeniu, zgodnie z instrukcją Przygotowanie nośnika.
- Podłączyć nośnik do badanego urządzenia i podmontować go w wybranym katalogu, np.
/mnt/nosnik. - 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:
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.
Pomoc skryptu wyświetla się poleceniem:
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.
- Procesy i usługi –
ps axjfww,systemctl list-units,pstree -p. - 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. - Podstawowe informacje o urządzeniu –
timedatectl,hostnamectl,uname -a,systemd-detect-virt,/etc/timezone,/etc/os-release,lsblk. - Konta i grupy – kopie
/etc/passwd,/etc/group,/etc/sudoersoraz/etc/sudoers.d. - Historia logowań –
last -aF. - Klucze SSH –
authorized_keysiknown_hostsz/rooti/home(findzmaxdepth 3). - Zadania cykliczne –
crontab -ldla każdego użytkownika, archiwumtarkatalogów/etc/cron.*oraz/var/spool/cron,systemctl list-timers,systemctl list-unit-files --state=enabled. - Historia poleceń – pliki historii powłok użytkowników (
.bash_history,.zsh_history,.sh_history,.history,.tcsh_history, historia fish). - Pliki konfiguracyjne powłoki –
.bash_profile,.bashrc,.cshrc,.tcshrc,.config/fish/config.fishw katalogach domowych użytkowników. - Dziennik systemowy journald –
journalctl --merge --all --output exportorazjournalctl --merge --all --output json. - Listing plików –
find /root /home /var /tmp -printf(metadane plików w katalogach/root,/home,/varoraz/tmp). - Dzienniki zdarzeń
/var/log– archiwumtarz 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). - Sumy kontrolne SHA-256 –
sha256sumwszystkich plików na nośniku. - Archiwizacja artefaktów –
tarwszystkich zebranych plików (wraz zsession.log,error.logi sumami kontrolnymi) do archiwum${HOSTNAME}_zabezpieczenie.tar.gzna nośniku, a następnie usunięcie pojedynczych plików – na nośniku pozostaje tylko archiwum. - Odmontowanie nośnika –
sync,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.