Zadania cykliczne w systemie Linux¶
Zadania cykliczne i timery systemd uruchamiają kod o określonych porach, również po restarcie systemu. To mechanizmy, które mogą posłużyć atakującemu do utrzymania i regularnego odnawiania dostępu do przejętego wcześniej urządzenia. Zabezpieczenie list zadań cyklicznych pozwala wykryć nieautoryzowane wpisy dodane przez atakującego.
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.
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
Opis poleceń wykorzystanych w procedurze
| Polecenie | Opis |
|---|---|
date -u +%Y%m%dT%H%M%S-UTC |
Generuje bieżący znacznik czasu w strefie UTC. |
echo "..." >> $nosnik/error.log |
Dopisuje komunikat o rozpoczęciu i zakończeniu procedury do dziennika błędów na nośniku zewnętrznym. |
cut -d: -f1 /etc/passwd |
Wyodrębnia pierwsze pole (nazwę użytkownika) z pliku /etc/passwd, używając dwukropka jako separatora. |
crontab -l -u "$u" |
Wyświetla wpisy crontab wskazanego użytkownika, czyli jego zaplanowane zadania cykliczne. |
printf '===== %s =====\n' "$u" |
Wypisuje nagłówek z nazwą użytkownika oddzielający wpisy crontab poszczególnych użytkowników w pliku wynikowym. |
tar --xattrs --acls --selinux --ignore-failed-read -czf |
Tworzy skompresowane (-z) archiwum tar katalogów cron, zachowując uprawnienia, rozszerzone atrybuty (--xattrs), listy ACL (--acls) oraz konteksty SELinux (--selinux), a w przypadku nieczytelnych plików kontynuuje archiwizację (--ignore-failed-read). |
systemctl --no-pager --full list-timers --all |
Wyświetla wszystkie timery systemd, w tym nieaktywne, z pełnymi liniami bez skracania (--full) i bez uruchamiania pagera (--no-pager). |
systemctl --no-pager --full list-unit-files --state=enabled |
Wyświetla jednostki systemd włączone do autostartu, z pełnymi liniami i bez pagera. Pozwala wykryć timery i usługi trwale włączone przez atakującego. |
2>> $nosnik/error.log |
Przekierowuje strumień błędów polecenia do dziennika błędów na nośniku zewnętrznym. |
Procedura¶
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
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"
Ostatnia aktualizacja artykułu: 2026-09-02.