Klucze SSH w systemie Linux¶
Klucze SSH to jedna z najpopularniejszych metod uwierzytelniania w protokole SSH. Plik authorized_keys w katalogu domowym użytkownika zawiera listę kluczy publicznych uprawnionych do logowania. Zabezpieczenie tych plików jest istotne, ponieważ atakujący często dodają własne klucze, aby utrzymać dostęp do przejętego systemu. Technika ta pozwala na trwałe logowanie bez znajomości hasła.
Warto zabezpieczyć również pliki known_hosts. Plik known_hosts przechowuje klucze publiczne hostów, z którymi użytkownik łączył się przez SSH, i pozwala ustalić, do jakich urządzeń atakujący próbował uzyskać dostęp z przejętej maszyny.
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 |
|---|---|
find /root /home -maxdepth 3 -type f -name authorized_keys |
Wyszukuje pliki authorized_keys w katalogach domowych użytkowników, ograniczając głębokość przeszukiwania do 3 poziomów. |
find /root /home -maxdepth 3 -type f -name known_hosts |
Wyszukuje pliki known_hosts w katalogach domowych użytkowników. |
stat -c '%U' |
Zwraca nazwę właściciela pliku, używaną w nazwie pliku docelowego na nośniku. |
cp -a |
Kopiuje plik z zachowaniem oryginalnych atrybutów (właściciel, uprawnienia, znaczniki czasu). |
cp -a /etc/ssh/sshd_config |
Kopiuje główny plik konfiguracyjny serwera SSH, z zachowaniem atrybutów. |
cp -a /etc/ssh/sshd_config.d |
Kopiuje katalog z dodatkowymi plikami konfiguracyjnymi serwera SSH. |
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. |
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
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"
Ostatnia aktualizacja artykułu: 2026-09-02.