SSH do odszyfrowania zaszyfrowanej LVM podczas uruchamiania bezgłowego serwera?


59

Kiedy zainstalowałem Ubuntu 10.04, a teraz 10.10, zaoferowano mi opcję włączenia „szyfrowanego LVM” na moim dysku twardym. Po wybraniu tej opcji podczas uruchamiania systemu pojawia się monit o podanie hasła w celu odszyfrowania LVM.

Teraz myślę o skonfigurowaniu bezgłowego serwera z systemem Linux (niekoniecznie Ubuntu), ale martwię się, że ponieważ serwer jest bezgłowy, nie będę w stanie go odszyfrować podczas uruchamiania. Czy będę mógł włączyć SSH podczas rozruchu, aby wprowadzić hasło do zaszyfrowanego LVM? Jeśli tak, jak to skonfigurować? A może jest inne rozwiązanie? Ponownie to pytanie NIE jest specyficzne dla Ubuntu. Dzięki.


4
Zobacz także:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

Myślę, że odpowiedź @Nate powinna być zaakceptowana: (zasadniczo, ponieważ edycja jest wymagana, aby odzwierciedlić zmiany w połączonym blogu) używa kluczy publicznych zamiast prywatnych .
Jonathan Y.

Odpowiedzi:


25

Dla nowszych wersjach Ubuntu, na przykład, 14.04, znalazłem kombinacji @dragly i Ta blogposts' odpowiedzi bardzo pomocne. Parafrazować:

  1. (Na serwerze) Zainstaluj Dropbear

    sudo apt-get install dropbear
    
  2. (Na serwerze) Kopiuj i przypisuj uprawnienia do logowania na klucz publiczny / prywatny root

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

pamiętaj, aby zmienić użytkownika na swoją nazwę użytkownika na serwerze

  1. (Na kliencie) Pobierz klucz prywatny z serwera

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (Na kliencie) Dodaj wpis do konfiguracji ssh

    Host parkia
        Hostname 192.168.11.111
        User root
        UserKnownHostsFile ~/.ssh/know_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    Remember to change _parkia_ to whatever you'd like to type `ssh my-box` to be.
    
  3. (Na serwerze) Utwórz ten plik na/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (Na serwerze) Ustaw ten plik jako wykonywalny

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. Zaktualizuj initramfs

    sudo update-initramfs -u
    
  6. Wyłącz usługę dropbear podczas rozruchu, aby po odszyfrowaniu partycji używany był openssh

    sudo update-rc.d dropbear disable
    

Jesteś skończony. Wypróbuj to. Sprawdź post na blogu, do którego prowadzi link powyżej, aby dowiedzieć się, jak skonfigurować serwer ze statycznym adresem IP, jeśli jest to coś, co musisz zrobić.


Połączony blog dodał odniesienie do dołączania klucza publicznego klienta do serwera /etc/initramfs-tools/root/.ssh/authorized_keys, nawet jeśli nadal przechodzi przez kopiowanie klucza prywatnego Dropbear, co można całkowicie zignorować. Przestrzeganie pozostałych instrukcji działa dla mnie, co oznacza, że ​​powinna to być zaakceptowana odpowiedź (po odzwierciedleniu tej zmiany), ponieważ używa tylko kluczy publicznych.
Jonathan Y.

23

Przewodnik dotyczący takiej konfiguracji w BusyBox i Dropbear znajduje się w tym poście na blogu . wczesne ssh nie działało dla mnie i najwyraźniej nie jest już potrzebne.

Podsumowałem, co musisz zrobić w dalszej części. Aby uzyskać więcej informacji, spójrz na powyższy post:

  1. Zainstaluj BusyBox i Dropbear na swoim serwerze

    sudo apt-get install dropbear busybox
    
  2. Zaktualizuj initramfs na serwerze

    sudo update-initramfs -u
    
  3. Skopiuj klucz prywatny wygenerowany przez dropbear na maszynę klienta. Może być konieczne skopiowanie tego do nowego katalogu i zmiana właściciela, aby to zrobić. Na serwerze wykonaj następujące czynności:

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

    Pamiętaj, aby zastąpić użytkownika swoją nazwą użytkownika. Loginy do hasła nie działają.

  4. Teraz możesz przenieść klucz prywatny za pomocą scp, dzwoniąc pod następujący numer na swoim kliencie :

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Skonfiguruj plik ~ / .ssh / config swojego klienta, aby ułatwić logowanie. Otwórz go za pomocą edytora tekstu i dodaj następujące elementy:

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    

    Zmień hosta na dowolny, a HostName na nazwę swojego serwera. Pozwól użytkownikowi na rootowanie. Wygląda na to, że jest to jedyny zaakceptowany użytkownik w Dropbear. Zapisz i zamknij plik.

  6. Uruchom ponownie serwer i poczekaj na monit o podanie hasła. Daj Dropbear kilka sekund na wykrycie i skonfigurowanie połączenia internetowego. Połącz się z serwerem za pomocą następującego polecenia na kliencie :

    ssh myremoteserver # or any name you chose
    
  7. Po zalogowaniu wydaj następujące polecenie na swoim serwerze . Zobacz wpis na blogu, aby uzyskać szczegółowe informacje:

    pid=`ps | grep "/scripts/local-top/cryptroot" | cut -d " " -f 3`
    kill -9 $pid
    sleep 35
    /scripts/local-top/cryptroot
    pid=`ps | grep "/bin/sh" | cut -d " " -f 3`
    kill -9 $pid;
    

    Zanim zaczniesz wpisywać swoje hasło, zajmie to trochę czasu (30 sekund). Wpisz go po wyświetleniu monitu.

  8. Zamknij połączenie, pisząc

    exit
    
  9. Twój serwer powinien teraz odblokować zaszyfrowany dysk twardy i uruchomić się normalnie.

(Ogromne podziękowania dla oryginalnego autora posta na blogu!)


2
Nie do końca rozumiem powód poruszania się z kluczami prywatnymi. Wystarczy skopiować klucz publiczny z komputera klienckiego na serwer jako klucz autoryzowany dla serwera root, prawda?
gertvdijk

Jestem pewien, że możliwe jest utworzenie pary kluczy na komputerze klienckim i przeniesienie tylko klucza publicznego stamtąd na serwer, ale jeśli dobrze pamiętam, myślę, że wystąpiły problemy ze znalezieniem formatu, który zaakceptowałby BusyBox. Ponowne użycie kluczy, które były już na serwerze, było jedyną opcją, jaką udało mi się uruchomić.
przeciągle

1
Masz pomysł, co powinienem zrobić, aby to działało na Arch Linux?
Gerharddc

1
@ Gerhman Sprawdź pakiet dropbear_initrd_encrypt w AUR, aby uzyskać wczesną obsługę ssh na Archlinux.
Caleb

1
@Gerhman archwiki page: Zdalne odblokowanie roota lub innej partycji Jeszcze tego nie zrobiłem, ale wygląda interesująco. Będę musiał to sprawdzić :)
hanetzer

18

Myślę, że wczesne ssh zapewnia to, czego szukasz:

Early-ssh is a simple initramfs hook, which installs Dropbear SSH server into  
your initramfs, and starts it at boottime, so you will be able to do a lot of  
things remotely over SSH, before your root partition gets mounted, for example:

* unlocking LUKS encrypted crypto devices - 
  even your root can be an encrypted filesystem
* assembling/altering RAID arrays (mdadm)
* checking the root filesystem in read-write mode, 
  taking action in case of errors
* and so on...

Dostępny jest już pakiet .deb, więc prawdopodobnie nie masz nic przeciwko Ubuntu.


Wygląda na to, że właśnie tego szukam, dzięki!
hpy

3
Czy masz link do dobrego samouczka lub poradnika? Utknąłem z wczesnym ssh na moim pudełku do ściśnięcia Debiana.

1
Tak, samouczek byłby świetny.
hpy


16

Zapoznaj się z plikiem Readme cryptsetup w tym celu /usr/share/doc/cryptsetup/README.remote.gz(pakiet Ubuntu cryptsetup). Tam jest pełny przewodnik, aby to osiągnąć. Jest podobny do odpowiedzi Dragly'ego , ale myślę, że jest to nieco bardziej eleganckie. (Klucze sformatowane w Dropbear, przekazujące hasło przez FIFO zamiast delikatnego skryptu powłoki itp.)

odblokowywanie rootfs poprzez logowanie ssh w initramfs

Możesz odblokować rootfs podczas uruchamiania ze zdalnego, używając ssh do zalogowania się do systemu rozruchowego, gdy jest uruchomiony z zamontowanym initramfs.

Ustawiać

Aby zdalne odblokowanie działało, przed zbudowaniem initramfs należy zainstalować następujące pakiety: dropbear busybox

Plik /etc/initramfs-tools/initramfs.confzawiera opcje konfiguracji używane podczas budowania initramfs. Powinien zawierać BUSYBOX=y (jest ustawiony jako domyślny po zainstalowaniu pakietu busybox), aby mieć busybox zainstalowany w initramfs i nie powinien zawierać DROPBEAR=n, co uniemożliwiłoby instalację dropbeara w initramfs. Jeśli ustawione na DROPBEAR=y, dropbear zostanie zainstalowany w każdym przypadku; jeśli DROPBEARw ogóle nie jest ustawiony, to dropbear zostanie zainstalowany tylko w przypadku istniejącej konfiguracji cryptroot.

Klucze hosta używane dla initramfs znajdują się dropbear_dss_host_keyi dropbear_rsa_host_keyoba znajdują się w /etc/initramfs-tools/etc/dropbear/. Jeśli nie istnieją podczas kompilacji initramfs, zostaną utworzone automatycznie. Poniżej znajdują się polecenia, aby utworzyć je ręcznie:

dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

Ponieważ initramfs nie będą szyfrowane, zakłada się uwierzytelnianie publickey. Klucz (y) użyte do tego zostaną pobrane /etc/initramfs-tools/root/.ssh/authorized_keys. Jeśli ten plik nie istnieje podczas kompilacji initramfs, zostanie utworzony i /etc/initramfs-tools/root/.ssh/id_rsa.pubzostanie do niego dodany. Jeśli ten drugi plik również nie istnieje, zostanie wygenerowany automatycznie - znajdziesz pasujący klucz prywatny, który później będziesz musiał zalogować się do initramfs pod /etc/initramfs-tools/root/.ssh/id_rsa (lub id_rsa.dropbearw razie potrzeby w formacie dropbear). Poniżej znajdują się polecenia ręcznego wykonania odpowiednich kroków:

Aby utworzyć klucz (w formacie dropbear):

dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

Aby przekonwertować klucz z formatu dropbear na format openssh:

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa

Aby wyodrębnić klucz publiczny:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

Aby dodać klucz publiczny do pliku autoryzowanych_kluczy:

cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

W przypadku, gdy chcesz, aby jakiś interfejs skonfigurowany przy użyciu DHCP, ustawienie DEVICE=w /etc/initramfs-tools/initramfs.confpowinno być wystarczające. Initramfs powinien również honorować ip=parametr jądra. Jeśli używasz gruba, prawdopodobnie możesz chcieć go ustawić /boot/grub/menu.lst, albo w linii „ # kopt=”, albo dołączony do określonej kernellinii ”. ip=Parametr jądra jest udokumentowany Documentation/nfsroot.txtw drzewie źródłowym jądra.

Zagadnienia

Nie zapomnij uruchomić update-initramfspo zmianie konfiguracji, aby była skuteczna!

Wydaje się, że zbieranie wystarczającej ilości entropii dla demona ssh wydaje się być problemem. Uruchomienie demona ssh może być opóźnione do momentu odzyskania wystarczającej ilości entropii. Nie blokuje to procesu uruchamiania, więc kiedy jesteś przy konsoli, nie będziesz musiał czekać na sshd, aby zakończyć jego uruchamianie.

Procedura odblokowania

Aby odblokować zdalnie, możesz zrobić coś takiego:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" root@initramfshost.example.com \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

W tym przykładzie założono, że masz dodatkowy known_hostsplik „ ~/.ssh/known_hosts.initramfs”, który zawiera klucz hosta systemu kryptograficznego, że masz plik „ ~/id_rsa.initramfs”, który zawiera klucz autoryzowany dla systemu kryptograficznego, że nazwa systemu kryptograficznego to „ initramfshost.example.com”, i że hasło cryptroot to „ secret

- < debian@x.ray.net>, śr., 30 września 2009 r

Dzięki jap za wskazanie mi tego na innym kanale.


1
To wydaje się być znacznie lepszym pomysłem (opisanym w oficjalnych dokumentach i wszystkim) niż hackerskie ps-grepping. Na marginesie uwagi na temat procedury odblokowywania można być ostrożnym, wpisując hasło bezpośrednio w wierszu poleceń, ponieważ najprawdopodobniej znajdzie się ono gdzieś w pliku historii powłoki. Możliwym rozwiązaniem jest utworzenie małego skryptu opakowującego z pytaniem o użycie hasła read -s -p.
joelpet

1
zauważ, że w ostatnich wersjach Ubuntu występują problemy z tym podejściem, tj. bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord

6

Jeśli chcesz mieć możliwość uruchamiania bez nadzoru, jak i zdalnie, powinieneś także spojrzeć na Mandos (które ja i inni napisaliśmy):

Mandos to system umożliwiający serwerom z zaszyfrowanym głównym systemem plików restartowanie się bez nadzoru i / lub zdalnie. Aby uzyskać więcej informacji, zobacz plik strony podręcznika wprowadzającego , w tym listę najczęściej zadawanych pytań.

Krótko mówiąc, serwer rozruchowy otrzymuje hasło przez sieć w bezpieczny sposób. Szczegółowe informacje można znaleźć w pliku README.


Dziękujemy za Twój wkład, ale pamiętaj, że 100% twoich postów stanowiących prawie identyczne wzmianki o twoim produkcie to zachowanie graniczne , a Ty ryzykujesz, że zostaniesz uznany za spam (oznaczyłbym twoje posty, gdyby Mandos nie było wolnym oprogramowaniem lub nie masz historii postów innych niż Mandos na innych stronach).
Gilles

@Gilles: Gotowe teraz.
Teddy

2

Serwer bezgłowy? Jeśli ma port szeregowy, użyj go.

GRUB można skonfigurować do pracy przez port szeregowy. Jądro można również skonfigurować za pomocą portu szeregowego do wysyłania początkowych komunikatów rozruchowych, wprowadzania hasła w celu odblokowania dysków i logowania. (Jeśli serwer obsługuje szeregowy system BIOS, włącz to również. Wówczas nigdy nie będziesz musiał się łączyć monitor do maszyny w ogóle).

Zawsze dobrym pomysłem jest posiadanie „niesieciowego” sposobu wejścia na serwer bezgłowy.


Świetny punkt! Chociaż „ niesieciowe ” sposoby wejścia na serwer bezgłowy są w większości ( tylko ) istotne, jeśli fizyczna bliskość między klientem / serwerem jest bliska; chyba że przeoczę jakąś inną możliwość / funkcję połączenia szeregowego.
ILMostro_7,


2

Niestety żadna z powyższych odpowiedzi nie działała dla mnie. Co więcej, kopiowanie klucza prywatnego z serwera wydaje się paradoksalne.

W każdym razie opracowano następujące instrukcje :

Uruchom SERWER, podłączając i odblokowując zaszyfrowaną partycję za pośrednictwem KLIENTA

Zainstaluj obowiązkowe pakiety (na SERWERZE)

apt-get install dropbear initramfs-tools busybox

Dodaj żądane klucze publiczne do pliku autoryzowanego_SERWERA SERWERA

Po prostu skopiuj i wklej swój klucz (-y) publiczny do /etc/dropbear-initramfs/authorized_keysSERWERA

Utwórz skrypt odblokowujący

Utwórz następujący skrypt w /etc/initramfs-tools/hooks/crypt_unlock.sh

#!/bin/sh

PREREQ="dropbear"

prereqs() {
  echo "$PREREQ"
}

case "$1" in
  prereqs)
    prereqs
    exit 0
  ;;
esac

. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

Spraw, by był wykonywalny:

chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

Utwórz statyczny adres IP (lub pomiń ten krok, aby użyć DHCP)

Edytuj, /etc/initramfs-tools/initramfs.confaby dodać (lub zmienić) linię:

#format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
#([hostname] can be omitted)
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off

Zaktualizuj initialramfs

update-initramfs -u

Wyłącz usługę dropbear podczas rozruchu, aby po odszyfrowaniu partycji używany był openssh

sudo update-rc.d dropbear disable

Testowanie

  • Uruchom ponownie serwer
  • Połącz się z serwerem za pośrednictwem ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

W debianie 9 (stabilnym) to rozwiązanie było nieaktualne. Podczas instalacji pojawia się ostrzeżenie dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!i nie udało mi się znaleźć potrzebnych kluczy. Ta metoda jest bardzo prosta i została mi wyjaśniona na świetnym kanale #debian (jeszcze raz dziękuję):

Najpierw upewnij się, że busybox, dropbeari dropbear-initramfssą zainstalowane

sudo apt install busybox dropbear*

następnie dodaj swój klucz publiczny (przez większość czasu ~/.ssh/id_rsa.pub) do pliku /etc/dropbear-initramfs/authorized_keys.

Zaktualizuj, initramfsaby uwzględnić zmiany:: update-initramfs -u

To wszystko!

Uwaga: jeśli chcesz uniknąć kolizji między kluczami pomiędzy dropbeari openssh(dzielą ten sam adres IP, ale używają innego klucza), możesz chcieć umieścić w swoim kliencie ~/.ssh/configcoś takiego:

Host myserver_luks_unlock
     User root
     Hostname <myserver>
     # The next line is useful to avoid ssh conflict with IP
     HostKeyAlias <myserver>_luks_unlock
     Port 22
     PreferredAuthentications publickey
     IdentityFile ~/.ssh/id_rsa

Następnie po prostu łączysz się za pomocą:

ssh myserver_luks_unlock

a gdy pojawi się monit, wpisz zgodnie z sugestią zajętego pola:

cryptroot-unlock

i wpisz swoje hasło.

Cieszyć się!



0

Używam techniki objaśnionej przez innych na tej stronie (SSH w initramfs z IPparametrem jądra do konfiguracji sieci) od kilku lat do zdalnego odblokowywania bezgłowych serwerów Linux Ubuntu (12.02, 14.04, 16.04 i 18.04).

Posunąłem się nawet tak daleko, że opracowałem program Python ( odblokowanie-system zdalny ), który wykonuje dla mnie faktyczne odblokowanie, ponieważ proces ręcznego robienia tego wydawał mi się trochę kruchy i zacząłem bać się ponownego uruchamiania moich serwerów, więc w duchu „jeśli boli, to warto zautomatyzować” Swoją wiedzę zakodowałem w Pythonie 😇 (i to rzeczywiście znacznie ułatwiło regularne ponowne uruchamianie w celu zastosowania aktualizacji zabezpieczeń).

Od tego czasu postanowiłem udostępnić światu moje osobiste notatki na temat zdalnego szyfrowania dysku głównego . Strona, do której prowadzi link, zawiera sporo szczegółów na temat procedury (także kilka wskazówek, które nie zostały tutaj wymienione) i zamierzam ją aktualizować.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.