it-swarm.it

SSH per decrittografare LVM crittografato durante l'avvio del server senza testa?

Quando ho installato Ubuntu 10.04 e, ora, 10.10, mi è stata offerta la possibilità di abilitare "LVM crittografato" per il mio disco rigido. Dopo aver scelto quell'opzione, mi viene richiesta la password durante l'avvio per decrittografare LVM.

Ora, sto pensando di configurare un server senza testa che esegue Linux (non necessariamente Ubuntu), ma sono preoccupato che, poiché il server è senza testa, non sarò in grado di decrittografarlo durante l'avvio. Potrei accedere a SSH durante l'avvio per inserire la mia password per LVM crittografato? In tal caso, come posso impostarlo? O c'è un'altra soluzione? Ancora una volta questa domanda NON è specifica per Ubuntu. Grazie.

62
hpy

Per le versioni più recenti di Ubuntu, ad esempio 14.04, ho trovato molto utile una combinazione di @dragly e questo blogposts . Per parafrasare:

  1. (Sul server) Installa Dropbear

    Sudo apt-get install dropbear
    
  2. (Sul server) Copia e assegna le autorizzazioni per l'accesso alla chiave pubblica/privata root

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

ricordati di cambiare utente con il tuo nome utente sul server

  1. (Sul client) Recupera chiave privata dal server

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (Sul client) Aggiungi una voce alla configurazione di 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. (Sul server) Crea questo file a /etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (Sul server) Rendi eseguibile quel file

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

    Sudo update-initramfs -u
    
  6. Disabilita il servizio dropbear all'avvio in modo che openssh venga usato dopo la decodifica della partizione

    Sudo update-rc.d dropbear disable
    

Hai finito. Provalo. Controlla il post sul blog collegato sopra per istruzioni su come configurare il server con un indirizzo IP statico se è qualcosa che dovresti fare.

26
nsg

Una guida per eseguire tale configurazione con BusyBox e Dropbear è mostrata in questo post del blog . early-ssh non ha funzionato per me e apparentemente non è più necessario.

Ho riassunto ciò che devi fare di seguito. Per maggiori dettagli, dai un'occhiata al post sopra:

  1. Installa BusyBox e Dropbear sul tuo server

    Sudo apt-get install dropbear busybox
    
  2. Aggiorna i tuoi initramfs sul server

    Sudo update-initramfs -u
    
  3. Copia la chiave privata generata da dropbear sul tuo computer client. Potrebbe essere necessario copiarlo in una nuova directory e cambiare proprietà per farlo. Sul tuo server procedi come segue:

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

    Ricorda di sostituire l'utente con il tuo nome utente. Gli accessi con password non sembrano funzionare.

  4. Ora puoi trasferire la chiave privata con scp chiamando quanto segue sul tuo client :

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Configura il tuo file client ~/.ssh/config per un facile accesso. Aprilo con un editor di testo e aggiungi quanto segue:

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

    Cambia l'host come preferisci e HostName con il nome del tuo server. Lascia che l'utente sia root. Sembra essere l'unico utente accettato in Dropbear. Salva e chiudi il file.

  6. Riavvia il server e attendi il prompt della passphrase. Concedi a Dropbear qualche secondo per rilevare e configurare la sua connessione Internet. Connettiti al tuo server con il seguente comando sul tuo client :

    ssh myremoteserver # or any name you chose
    
  7. Una volta effettuato l'accesso, immettere il seguente comando sul server . Vedi il post sul blog per i dettagli:

    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;
    

    Ci vorrà del tempo (30 secondi) prima di riuscire a digitare la passphrase. Digita quando richiesto.

  8. Chiudi la connessione digitando

    exit
    
  9. Il server dovrebbe ora aver sbloccato il suo disco rigido crittografato e avviarsi normalmente.

(Un grande grazie all'autore originale del post sul blog!)

23
dragly

Penso che early-ssh fornisca ciò che stai cercando:

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...

C'è già un pacchetto .deb disponibile, quindi probabilmente stai bene con Ubuntu.

18
wag

Dai un'occhiata al readme di cryptsetup per questo in /usr/share/doc/cryptsetup/README.remote.gz (Pacchetto Ubuntu cryptsetup). Vi è una guida completa per raggiungere questo obiettivo. È simile a la risposta di Dragly , ma penso che sia un po 'più elegante. (Chiavi formattate Dropbear, passando la passphrase tramite un FIFO piuttosto che un fragile script Shell, ecc.)

sbloccare rootfs tramite login ssh in initramfs

Puoi sbloccare i tuoi rootfs all'avvio da remoto, usando ssh per accedere al sistema di avvio mentre è in esecuzione con initramfs montato.

Impostare

Affinché lo sblocco remoto funzioni, è necessario installare i seguenti pacchetti prima di creare initramfs: dropbearbusybox

Il file /etc/initramfs-tools/initramfs.conf Contiene le opzioni di configurazione utilizzate durante la creazione di initramfs. Dovrebbe contenere BUSYBOX=y (Questo è impostato come predefinito quando è installato il pacchetto busybox) per avere busybox installato in initramfs e non dovrebbe contenere DROPBEAR=n, Che disabiliterebbe l'installazione di dropbear su initramfs . Se impostato su DROPBEAR=y, Dropbear verrà installato in ogni caso; se DROPBEAR non è impostato affatto, dropbear verrà installato solo nel caso di un'impostazione di crittografia esistente.

Le chiavi host utilizzate per initramfs sono dropbear_dss_Host_key E dropbear_rsa_Host_key, Entrambi situati in /etc/initramfs-tools/etc/dropbear/. Se non esistono quando viene compilato initramfs, verranno creati automaticamente. Di seguito sono riportati i comandi per crearli manualmente:

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

Poiché initramfs non verrà crittografato, si presuppone l'autenticazione con chiave pubblica. Le chiavi utilizzate per questo verranno prese da /etc/initramfs-tools/root/.ssh/authorized_keys. Se questo file non esiste quando viene compilato initramfs, verrà creato e verrà aggiunto /etc/initramfs-tools/root/.ssh/id_rsa.pub. Se anche quest'ultimo file non esiste, verrà generato automaticamente - troverai la chiave privata corrispondente che dovrai successivamente accedere agli initramfs sotto /etc/initramfs-tools/root/.ssh/id_rsa (O id_rsa.dropbear In caso ne hai bisogno in formato dropbear). Di seguito sono riportati i comandi per eseguire manualmente i rispettivi passaggi:

Per creare una chiave (in formato dropbear):

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

Per convertire la chiave dal formato dropbear al formato openssh:

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

Per estrarre la chiave pubblica:

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

Per aggiungere la chiave pubblica al file authorized_keys:

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

Nel caso in cui si desideri configurare un'interfaccia utilizzando dhcp, l'impostazione DEVICE= In /etc/initramfs-tools/initramfs.conf Dovrebbe essere sufficiente. Initramfs dovrebbe anche rispettare il parametro del kernel ip=. Nel caso in cui usi grub, probabilmente potresti volerlo impostare in /boot/grub/menu.lst, O nella riga '# kopt=' O aggiunto a specifiche righe 'kernel'. Il parametro del kernel ip= È documentato in Documentation/nfsroot.txt Nella struttura dei sorgenti del kernel.

Problemi

Non dimenticare di eseguire update-initramfs Quando hai modificato la configurazione per renderla effettiva!

Raccogliere abbastanza entropia per il demone ssh a volte sembra essere un problema. L'avvio del demone ssh potrebbe essere ritardato fino a quando non è stata recuperata abbastanza entropia. Questo non è un blocco per il processo di avvio, quindi quando sei sulla console non dovrai aspettare che sshd completi il ​​suo avvio.

Procedura di sblocco

Per sbloccare da remoto, potresti fare qualcosa del genere:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" [email protected] \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

Questo esempio presuppone che tu abbia un file known_hosts Extra "~/.ssh/known_hosts.initramfs" Che contiene la chiave Host del sistema cryptroot, che hai un file "~/id_rsa.initramfs" Che contiene il permesso- chiave per il sistema di crittografia, che il nome del sistema di crittografia è "initramfshost.example.com" e che la passphrase di crittografia è "secret"

- <[email protected]>, Mer, 30 set 2009

Grazie a jap per avermelo segnalato su un altro canale.

16
gertvdijk

Se vuoi essere in grado di avviare incustodito oltre che da remoto, dovresti anche guardare Mandos (che io e altri hanno scritto):

Mandos è un sistema che consente ai server con file system root crittografati di riavviare senza sorveglianza e/o in remoto. Vedere la pagina del manuale di introduzione file per ulteriori informazioni, incluso un elenco FAQ.

In breve, il server di avvio ottiene la password sulla rete, in modo sicuro. Vedi README per i dettagli.

6
Teddy

Server senza testa? Se ha una porta seriale, usala.

GRUB può essere configurato per funzionare tramite la porta seriale. Il tuo kernel può anche essere configurato utilizzando la porta seriale per inviare i messaggi di avvio iniziali, inserire la password per sbloccare le unità e accedere. (Se il tuo server supporta il BIOS seriale, abilita anche quello. Quindi non dovrai mai connetterti un monitor alla macchina).

Sempre una buona idea avere un modo "non di rete" per entrare in un server senza testa.

2
LawrenceC

Sfortunatamente, nessuna delle risposte sopra ha funzionato per me. Inoltre, la copia di una chiave privata dal server sembra paradossale.

Comunque, seguenti istruzioni risolto:

Avviare il SERVER collegando e sbloccando la partizione crittografata tramite CLIENT

Installa pacchetti obbligatori (su SERVER)

apt-get install dropbear initramfs-tools busybox

Aggiungi le tue chiavi pubbliche desiderate nel file authorized_keys del SERVER

Basta copiare e incollare le chiavi pubbliche in /etc/dropbear-initramfs/authorized_keys su SERVER

Crea lo script di sblocco

Crea il seguente script in /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 "\[email protected]"
EOF

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

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

fi

Renderlo eseguibile:

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

Crea un IP statico (o salta questo passaggio per utilizzare DHCP)

Modificare /etc/initramfs-tools/initramfs.conf per aggiungere (o modificare) la riga:

#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

Aggiorna initialramfs

update-initramfs -u

Disabilita il servizio dropbear all'avvio in modo che openssh venga usato dopo la decodifica della partizione

Sudo update-rc.d dropbear disable

Analisi

  • Riavvia il tuo server
  • Collegati al tuo server tramite ssh [email protected] [-i ~/.ssh/id_rsa]
2
ceremcem

Su Arch Linux, esiste un pacchetto AUR dropbear_initrd_encrypt che fa ciò che desideri immediatamente. Funziona abbastanza bene per le interfacce cablate. Ho dovuto hackerarlo leggermente per il wireless.

2
user3188445

Su debian 9 (stabile), questa soluzione era obsoleta. Durante l'installazione, ricevo un avviso su dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work! e non sono riuscito a trovare le chiavi necessarie. Questo metodo è molto semplice e mi è stato spiegato sul grande canale #debian (grazie ancora):

Per prima cosa assicurati che busybox, dropbear e dropbear-initramfs sono installati

Sudo apt install busybox dropbear*

quindi aggiungi la tua chiave pubblica (la maggior parte delle volte ~/.ssh/id_rsa.pub) nel file /etc/dropbear-initramfs/authorized_keys.

Aggiorna quindi initramfs per tenere conto delle modifiche:: update-initramfs -u

È tutto!

Nota, se vuoi evitare di avere uno scontro tra le chiavi tra dropbear e openssh (condividono lo stesso IP, ma usano una chiave diversa), potresti voler inserire il tuo client ~/.ssh/config qualcosa del genere:

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

Quindi, ti connetti semplicemente usando:

ssh myserver_luks_unlock

e una volta ricevuto un prompt, digitare come suggerito dal prompt di busybox:

cryptroot-unlock

e digita la tua password.

Godere!

2
tobiasBora

Sto usando la tecnica spiegata da altri in questa pagina (SSH negli initramfs con un parametro del kernel IP per configurare la rete) da diversi anni ormai per sbloccare da remoto i server Ubuntu Linux senza testa (12.02, 14.04, 16.04 e 18.04).

Sono persino arrivato al punto di sviluppare un Python ( nlock-remote-system ) che fa l'effettivo sblocco per me, perché il processo di fare questo mi è sembrato manualmente un po 'fragile e ho iniziato a temere di riavviare i miei server, quindi nello spirito di "se fa male vale la pena automatizzare" ho codificato le mie conoscenze in Python ???? (e questo è stato davvero ha reso molto più semplice il riavvio regolare per applicare gli aggiornamenti di sicurezza).

Da allora ho deciso di condividere anche le mie note personali su Crittografia del disco root remoto con il mondo. La pagina collegata contiene alcuni dettagli sulla procedura (anche alcuni suggerimenti che non sono menzionati qui) e intendo tenerlo aggiornato.

1
xolox

Ho scritto un ruolo Ansible che fa questo per te. Ottieni il ruolo debops-contrib.dropbear_initramfs ed eseguilo. Fare riferimento a documentazione del ruolo per i dettagli.

0
ypid