web-dev-qa-db-fra.com

SSH pour décrypter LVM crypté lors du démarrage du serveur sans tête?

Lorsque j'ai installé Ubuntu 10.04 et, maintenant, 10.10, on m'a proposé d'activer "LVM crypté" pour mon disque dur. Après avoir choisi cette option, je suis invité à saisir mon mot de passe lors du démarrage pour décrypter le LVM.

Maintenant, je pense à mettre en place un serveur sans tête qui exécute Linux (pas nécessairement Ubuntu), mais je crains que puisque le serveur est sans tête, je ne puisse pas le décrypter au démarrage. Serais-je capable de SSH pendant le démarrage pour entrer mon mot de passe pour le LVM chiffré? Si oui, comment puis-je le configurer? Ou existe-t-il une autre solution? Encore une fois, cette question n'est PAS spécifique à Ubuntu. Merci.

62
hpy

Pour les versions plus récentes d'ubuntu, par exemple, 14.04, j'ai trouvé une combinaison de @dragly et ce blogposts ' réponses très utiles. Paraphraser:

  1. (Sur le serveur) Installez Dropbear

    Sudo apt-get install dropbear
    
  2. (Sur le serveur) Copiez et attribuez des autorisations pour la connexion de la clé publique/privée racine

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

n'oubliez pas de changer utilisateur en votre nom d'utilisateur sur le serveur

  1. (Sur le client) Récupérer la clé privée du serveur

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (Sur le client) Ajouter une entrée à la configuration 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. (Sur le serveur) Créez ce fichier à /etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (Sur le serveur) Rendre ce fichier exécutable

    Sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. Mettre à jour les initramfs

    Sudo update-initramfs -u
    
  6. Désactivez le service dropbear au démarrage pour qu'opshsh soit utilisé après le décryptage de la partition

    Sudo update-rc.d dropbear disable
    

Vous avez terminé. Essaye le. Consultez le billet de blog lié ci-dessus pour obtenir des instructions sur la façon de configurer le serveur avec une adresse IP statique si c'est quelque chose que vous devez faire.

26
nsg

Un guide pour faire une telle configuration avec BusyBox et Dropbear est montré dans ce billet de blog . early-ssh n'a pas fonctionné pour moi et n'est apparemment plus nécessaire.

J'ai résumé ce que vous devez faire dans ce qui suit. Pour plus de détails, consultez le post ci-dessus:

  1. Installez BusyBox et Dropbear sur votre serveur

    Sudo apt-get install dropbear busybox
    
  2. Mettez à jour vos initramfs sur le serveur

    Sudo update-initramfs -u
    
  3. Copiez la clé privée générée par dropbear sur votre ordinateur client. Vous devrez peut-être le copier dans un nouveau répertoire et changer de propriétaire pour ce faire. Sur votre serveur procédez comme suit:

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

    N'oubliez pas de remplacer l'utilisateur par votre nom d'utilisateur. Les connexions par mot de passe ne semblent pas fonctionner.

  4. Vous pouvez maintenant transférer la clé privée avec scp en appelant ce qui suit sur votre client :

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Configurez le fichier ~/.ssh/config de votre client pour une connexion facile. Ouvrez-le avec un éditeur de texte et ajoutez ce qui suit:

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

    Remplacez l'hôte par ce que vous voulez et HostName par le nom de votre serveur. Laissez l'utilisateur être root. Il semble être le seul utilisateur accepté dans Dropbear. Enregistrez et fermez le fichier.

  6. Redémarrez votre serveur et attendez l'invite de phrase secrète. Accordez quelques secondes à Dropbear pour détecter et configurer sa connexion Internet. Connectez-vous à votre serveur avec la commande suivante sur votre client :

    ssh myremoteserver # or any name you chose
    
  7. Une fois connecté, exécutez la commande suivante sur votre serveur . Voir le blog pour plus de détails:

    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;
    

    Il vous faudra un certain temps (30 secondes) avant de saisir votre phrase secrète. Tapez-le lorsque vous y êtes invité.

  8. Fermez la connexion en tapant

    exit
    
  9. Votre serveur devrait maintenant avoir déverrouillé son disque dur chiffré et démarrer normalement.

(Un grand merci à l'auteur original du billet de blog!)

23
dragly

Je pense que early-ssh fournit ce que vous recherchez:

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

Il y a déjà un paquet .deb disponible, donc vous êtes probablement d'accord avec Ubuntu.

18
wag

Jetez un œil au fichier Lisez-moi de cryptsetup pour cela dans /usr/share/doc/cryptsetup/README.remote.gz (Paquet Ubuntu cryptsetup). Il y a un guide complet pour y parvenir. C'est similaire à réponse de dragly , mais je pense que c'est un peu plus élégant. (Clés formatées Dropbear, passant la phrase secrète via un FIFO plutôt qu'un script Shell fragile, etc.)

déverrouillage de rootfs via la connexion ssh dans initramfs

Vous pouvez déverrouiller vos rootfs au démarrage à distance, en utilisant ssh pour vous connecter au système de démarrage pendant qu'il est en cours d'exécution avec les initramfs montés.

Installer

Pour que le déverrouillage à distance fonctionne, les packages suivants doivent être installés avant de construire les initramfs: dropbearbusybox

Le fichier /etc/initramfs-tools/initramfs.conf Contient les options de configuration utilisées lors de la construction des initramfs. Il doit contenir BUSYBOX=y (Défini par défaut lorsque le package busybox est installé) pour que busybox soit installé dans les initramfs, et ne doit pas contenir DROPBEAR=n, Ce qui désactiverait l'installation de dropbear sur initramfs . S'il est défini sur DROPBEAR=y, Dropbear sera installé dans tous les cas; si DROPBEAR n'est pas du tout défini, alors dropbear ne sera installé qu'en cas de configuration de cryptroot existante.

Les clés d'hôte utilisées pour les initramfs sont dropbear_dss_Host_key Et dropbear_rsa_Host_key, Toutes deux situées dans /etc/initramfs-tools/etc/dropbear/. S'ils n'existent pas lors de la compilation des initramfs, ils seront créés automatiquement. Voici les commandes pour les créer manuellement:

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

Comme les initramfs ne seront pas chiffrés, l'authentification publickey est supposée. La ou les clés utilisées à cet effet proviendront de /etc/initramfs-tools/root/.ssh/authorized_keys. Si ce fichier n'existe pas lors de la compilation des initramfs, il sera créé et /etc/initramfs-tools/root/.ssh/id_rsa.pub Y sera ajouté. Si ce dernier fichier n'existe pas non plus, il sera généré automatiquement - vous trouverez la clé privée correspondante dont vous aurez besoin plus tard pour vous connecter aux initramfs sous /etc/initramfs-tools/root/.ssh/id_rsa (Ou id_rsa.dropbear Dans si vous en avez besoin au format dropbear). Voici les commandes pour effectuer manuellement les étapes respectives:

Pour créer une clé (au format dropbear):

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

Pour convertir la clé du format dropbear au format openssh:

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

Pour extraire la clé publique:

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

Pour ajouter la clé publique au fichier authorized_keys:

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

Si vous souhaitez configurer une interface à l'aide de dhcp, le réglage de DEVICE= Dans /etc/initramfs-tools/initramfs.conf Devrait être suffisant. Les initramfs doivent également respecter le paramètre de noyau ip=. Si vous utilisez grub, vous souhaiterez probablement le définir dans /boot/grub/menu.lst, Soit dans la ligne '# kopt=', Soit ajouté à une ou plusieurs lignes spécifiques 'kernel'. Le paramètre du noyau ip= Est documenté dans Documentation/nfsroot.txt Dans l'arborescence des sources du noyau.

Problèmes

N'oubliez pas d'exécuter update-initramfs Lorsque vous avez modifié la configuration pour la rendre efficace!

Recueillir suffisamment d'entropie pour le démon ssh semble parfois être un problème. Le démarrage du démon ssh peut être retardé jusqu'à ce que suffisamment d'entropie ait été récupérée. Ceci n'est pas bloquant pour le processus de démarrage, donc lorsque vous êtes sur la console, vous n'aurez pas à attendre que sshd termine son démarrage.

Procédure de déverrouillage

Pour déverrouiller à distance, vous pouvez faire quelque chose comme ceci:

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

Cet exemple suppose que vous avez un fichier known_hosts "~/.ssh/known_hosts.initramfs" Supplémentaire qui contient la clé d'hôte du système cryptroot, que vous avez un fichier "~/id_rsa.initramfs" Qui contient le fichier autorisé- clé pour le système cryptroot, que le nom du système cryptroot est "initramfshost.example.com" et que la phrase secrète cryptroot est "secret"

- <[email protected]> Mer. 30 sept. 2009

Merci à jap de me l'avoir signalé sur un autre canal.

16
gertvdijk

Si vous voulez pouvoir démarrer sans surveillance ainsi qu'à distance, vous devriez également regarder Mandos (que moi et d'autres ont écrit):

Mandos est un système permettant aux serveurs dotés de systèmes de fichiers racine chiffrés de redémarrer sans surveillance et/ou à distance. Voir la page de manuel d'introduction fichier pour plus d'informations, y compris une liste FAQ.

En bref, le serveur de démarrage obtient le mot de passe sur le réseau, de manière sécurisée. Voir le README pour plus de détails.

6
Teddy

Serveur sans tête? S'il a un port série, utilisez-le.

GRUB peut être configuré pour fonctionner sur le port série. Votre noyau peut également être configuré à l'aide du port série pour générer les messages de démarrage initiaux, entrer le mot de passe pour déverrouiller vos disques et vous connecter. (Si votre serveur prend en charge le BIOS série, activez-le également. Ensuite, vous n'aurez jamais à vous connecter un moniteur à la machine).

C'est toujours une bonne idée d'avoir un moyen "hors réseau" de pénétrer dans un serveur sans tête.

2
LawrenceC

Malheureusement, aucune des réponses ci-dessus n'a fonctionné pour moi. De plus, la copie d'une clé privée à partir du serveur semble paradoxale.

Quoi qu'il en soit, suivant les instructions a fonctionné:

Démarrez votre SERVER en connectant et déverrouillant la partition cryptée via votre CLIENT

Installer les packages obligatoires (sur SERVER)

apt-get install dropbear initramfs-tools busybox

Ajoutez vos clés publiques souhaitées dans le fichier authorized_keys du SERVEUR

Copiez et collez simplement votre ou vos clés publiques dans /etc/dropbear-initramfs/authorized_keys sur SERVEUR

Créez le script de déverrouillage

Créer le script suivant dans /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

Rendez-le exécutable:

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

Créez une adresse IP statique (ou ignorez cette étape pour utiliser DHCP)

Éditer /etc/initramfs-tools/initramfs.conf pour ajouter (ou modifier) ​​la ligne:

#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

Mettre à jour initialramfs

update-initramfs -u

Désactivez le service dropbear au démarrage pour qu'opshsh soit utilisé après le décryptage de la partition

Sudo update-rc.d dropbear disable

Essai

  • Redémarrez votre serveur
  • Connectez-vous à votre serveur via ssh [email protected] [-i ~/.ssh/id_rsa]
2
ceremcem

Sur Arch Linux, il existe un package AUR dropbear_initrd_encrypt qui fait ce que vous voulez hors de la boîte. Fonctionne assez bien pour les interfaces filaires. J'ai dû le pirater légèrement pour le sans fil.

2
user3188445

Sur debian 9 (stable), cette solution était obsolète. Pendant l'installation, je reçois un avertissement concernant dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!, et je n'ai pas pu trouver les clés nécessaires. Cette méthode est d'ailleurs très simple et m'a été expliquée sur la grande chaîne #debian (merci encore):

Assurez-vous d'abord que busybox, dropbear et dropbear-initramfs sont installés

Sudo apt install busybox dropbear*

puis ajoutez votre clé publique (la plupart du temps ~/.ssh/id_rsa.pub) dans le fichier /etc/dropbear-initramfs/authorized_keys.

Mettez à jour puis initramfs pour prendre en compte les changements:: update-initramfs -u

C'est tout!

Remarque, si vous voulez éviter d'avoir des conflits entre les clés entre dropbear et openssh (elles partagent la même IP, mais utilisent une clé différente), vous pouvez mettre votre client ~/.ssh/config quelque chose comme ca:

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

Ensuite, vous vous connectez simplement en utilisant:

ssh myserver_luks_unlock

et une fois que vous obtenez une invite, tapez comme suggéré par l'invite busybox:

cryptroot-unlock

et tapez votre mot de passe.

Prendre plaisir!

2
tobiasBora

J'utilise la technique expliquée par d'autres sur cette page (SSH dans les initramfs avec un paramètre de noyau IP pour configurer la mise en réseau) depuis plusieurs années maintenant pour déverrouiller à distance des serveurs Ubuntu Linux sans tête (12.02, 14.04, 16.04 et 18.04).

Je suis même allé jusqu'à développer un programme Python ( nlock-remote-system ) qui fait le déverrouillage réel pour moi, parce que le processus de le faire se sentait manuellement un peu fragile et j'ai commencé à redouter de redémarrer mes serveurs, donc dans l'esprit "si ça fait mal ça vaut le coup d'automatiser" j'ai encodé mes connaissances en Python ???? (et cela a été en effet simplifié les redémarrages réguliers pour appliquer les mises à jour de sécurité).

Depuis lors, j'ai décidé de partager mes notes personnelles sur Cryptage du disque racine distant avec le monde. La page liée contient pas mal de détails sur la procédure (également quelques astuces qui ne sont pas mentionnées ici) et j'ai l'intention de la mettre à jour.

1
xolox

J'ai écrit un rôle Ansible qui le fait pour vous. Obtenez simplement le rôle debops-contrib.dropbear_initramfs et exécutez-le. Reportez-vous à la documentation du rôle pour plus de détails.

0
ypid