SSH pour déchiffrer le LVM chiffré lors du démarrage du serveur sans interface utilisateur?

60

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 à la mise en place d’un serveur sans tête fonctionnant sous Linux (pas nécessairement Ubuntu), mais je crains que, le serveur étant sans tête, je ne puisse pas le déchiffrer au démarrage. Est-ce que je pourrais entrer SSH pendant le démarrage pour entrer mon mot de passe pour le LVM crypté? Si oui, comment puis-je le configurer? Ou y a-t-il une autre solution? Encore une fois, cette question n'est PAS spécifique à Ubuntu. Merci.

hpy
la source
4
Voir aussi:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L
Je pense que la réponse de @Nate devrait être celle qui a été acceptée: elle utilise (essentiellement, une édition étant nécessaire pour refléter les modifications apportées au blog lié), elle utilise des clés publiques au lieu de clés privées .
Jonathan Y.

Réponses:

25

Pour les versions plus récentes d’ubuntu, par exemple 14.04, j’ai trouvé très utile de combiner les réponses de @dragly et de ces articles de blog . Paraphraser:

  1. (Sur le serveur) Installer Dropbear

    sudo apt-get install dropbear
    
  2. (Sur le serveur) Copier et attribuer des autorisations pour la connexion à 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 d' utilisateur avec 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 à ssh config

    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ésactiver le service dropbear au démarrage afin que openssh soit utilisé après le déchiffrement de la partition

    sudo update-rc.d dropbear disable
    

Vous avez terminé. Essaye le. Consultez la publication de blog liée à ci-dessus pour savoir comment configurer le serveur avec une adresse IP statique si vous devez le faire.

NS g
la source
Le blog lié a ajouté une référence à l'ajout de la clé publique d'un client à celle du serveur /etc/initramfs-tools/root/.ssh/authorized_keys, même s'il continue à copier la clé privée de Dropbear, ce que l'on peut ignorer complètement. Suivre le reste des instructions fonctionne pour moi, ce qui signifie que cela devrait être la réponse acceptée (une fois que cela reflète ce changement), car il utilise uniquement des clés publiques.
Jonathan Y.
23

Un guide pour faire une telle configuration avec BusyBox et Dropbear est présenté dans cet article 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 copier ceci dans un nouveau répertoire et changer de propriétaire pour le faire. Procédez comme suit sur votre serveur :

    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. Maintenant, vous pouvez 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 faciliter la connexion. 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
    

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

  6. Redémarrez votre serveur et attendez l'invite de la phrase secrète. Donnez à Dropbear quelques secondes 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é, lancez 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) pour taper votre phrase secrète. Tapez-le lorsque vous y êtes invité.

  8. Fermez la connexion en tapant

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

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

à la traîne
la source
2
Je ne comprends pas très bien la raison pour laquelle je me déplace avec des clés privées. Il devrait suffire de copier la clé publique de votre ordinateur client sur le serveur en tant que clé autorisée pour le serveur racine, non?
gertvdijk
Je suis sûr qu'il est possible de créer la paire de clés sur la machine client et de déplacer uniquement la clé publique de celui-ci vers le serveur, mais si je me souviens bien, je pense qu'il était difficile de trouver un format que BusyBox accepterait. Donc, réutiliser les clés déjà présentes sur le serveur était la seule option qui me convenait.
Dragly
1
Avez-vous une idée de ce que je devrais faire pour que cela fonctionne avec Arch Linux?
Gerharddc
1
@Gerhman Découvrez le paquetage dropbear_initrd_encrypt dans AUR pour la prise en charge précoce de ssh sur Archlinux.
Caleb
1
@Gerhman archwiki page: Déverrouillage à distance de la racine ou d'une autre partition Vous ne l'avez pas encore fait, mais cela semble intéressant. Faudra le vérifier :)
hanetzer
18

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

Un paquet .deb est déjà disponible, vous êtes donc probablement satisfait d'Ubuntu.

remuer
la source
On dirait que c'est exactement ce que je recherche, merci!
hpy
3
Avez-vous un lien vers un bon tutoriel ou howto? Je suis coincé avec early-ssh sur mon squeeze box debian.
1
Oui, un tutoriel serait génial.
hpy
16

Jetez un coup d'œil au fichier Lisez-moi sur cryptsetup dans /usr/share/doc/cryptsetup/README.remote.gz(paquet Ubuntu cryptsetup). Dans il y a un guide complet pour accomplir ceci. C'est semblable à la 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 une FIFO plutôt qu'un script shell fragile, etc.)

déverrouillage de rootfs via la connexion ssh dans initramfs

Vous pouvez déverrouiller votre rootfs au démarrage à distance, en utilisant ssh pour vous connecter au système de démarrage lorsqu'il est exécuté avec initramfs monté.

Installer

Pour que le déverrouillage à distance fonctionne, les packages suivants doivent être installés avant de générer initramfs: dropbear busybox

Le fichier /etc/initramfs-tools/initramfs.confcontient les options de configuration utilisées lors de la construction de initramfs. Il devrait contenir BUSYBOX=y (ceci est défini comme valeur par défaut lorsque le paquetage busybox est installé) pour que busybox soit installé dans le initramfs, et ne devrait pas contenir DROPBEAR=n, ce qui désactiverait l'installation de dropbear dans initramfs. Si défini sur DROPBEAR=y, dropbear sera installé dans tous les cas; Si DROPBEARnon défini, dropbear ne sera installé que dans le cas d’une installation existante de cryptroot.

Les clés d’hôte utilisées pour initramfs sont dropbear_dss_host_keyet dropbear_rsa_host_key, toutes deux situées dans /etc/initramfs-tools/etc/dropbear/. S'ils n'existent pas lors de la compilation de 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, une authentification publique est supposée. La ou les clés utilisées pour cela seront extraites de /etc/initramfs-tools/root/.ssh/authorized_keys. Si ce fichier n'existe pas lors de la compilation de initramfs, il sera créé et /etc/initramfs-tools/root/.ssh/id_rsa.puby sera ajouté. Si ce dernier fichier n'existe pas non plus, il sera généré automatiquement - vous trouverez la clé privée correspondante sur laquelle vous devrez ultérieurement vous connecter à initramfs /etc/initramfs-tools/root/.ssh/id_rsa (ou id_rsa.dropbearau cas où vous en auriez besoin au format dropbear). Voici les commandes pour effectuer les étapes respectives manuellement:

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 allowed_keys:

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

Si vous voulez une interface pour obtenir configuré à l' aide dhcp, la mise DEVICE=en /etc/initramfs-tools/initramfs.confdevrait être suffisant. Initramfs doit également respecter le ip=paramètre du noyau. Si vous utilisez grub, vous voudrez probablement le définir /boot/grub/menu.lst, soit dans la # kopt=ligne " ", soit ajouté à une ou plusieurs lignes " kernel" spécifiques . Le ip=paramètre de noyau est documenté Documentation/nfsroot.txtdans l'arborescence des sources du noyau.

Problèmes

N'oubliez pas de courir update-initramfslorsque vous avez modifié la configuration pour la rendre efficace!

La collecte d’entropie suffisante pour le démon ssh semble parfois poser 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. Ainsi, lorsque vous êtes sur la console, vous n'avez pas à attendre que sshd ait terminé 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 known_hostsfichier supplémentaire " ~/.ssh/known_hosts.initramfs" qui contient la clé d’hôte du système cryptroot, un fichier " ~/id_rsa.initramfs" qui contient la clé autorisée du système cryptroot, que le nom du système cryptroot est " initramfshost.example.com" et que la phrase secrète de cryptroot est " secret"

- < [email protected]>, mer. 30 sept. 2009

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

Gertvdijk
la source
1
Cela semble être une bien meilleure idée (décrite dans la documentation officielle) que de bidouiller ps-grepping. En guise de remarque sur la procédure de déverrouillage fournie, il peut être prudent de taper la phrase secrète directement sur la ligne de commande, car elle risquerait fort de se retrouver quelque part dans un fichier d’historique du shell. Une solution possible consiste à créer un petit script wrapper demandant la phrase secrète à l'aide de read -s -p.
Joelpet
1
Notez qu'il existe des problèmes avec cette approche dans les versions récentes d'Ubuntu, c'est-à-dire bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord le
6

Si vous voulez pouvoir démarrer sans surveillance et à distance, vous devriez aussi regarder Mandos (que moi et d'autres avons é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 le fichier de page de manuel d'introduction pour plus d'informations, y compris une liste de 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 fichier README pour plus de détails.

Nounours
la source
Merci pour vos contributions, mais notez que 100% de vos messages sont des mentions presque identiques. Le risque est alors considéré comme un comportement limite . Vous courez donc le risque d'être considéré comme du spam (j'aurais signalé vos messages si Mandos n'était pas un logiciel libre. ou vous n'aviez pas d'antécédents de publications non-Mandos sur d'autres sites).
Gilles 'SO- arrête d'être méchant'
@ Gilles: Fait maintenant.
Teddy
2

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

GRUB peut être configuré pour fonctionner sur le port série. Votre noyau peut également être configuré, utilisez le port série pour générer les messages de démarrage initiaux, saisir le mot de passe permettant de déverrouiller vos lecteurs et vous connecter. (Si votre serveur prend en charge le BIOS série, activez-le également. un moniteur à la machine du tout).

C'est toujours une bonne idée d'avoir un moyen "non réseau" d'entrer dans un serveur sans tête.

LawrenceC
la source
Excellent point! Cependant, les moyens " non-réseau " d'entrer dans un serveur sans accès à la tête sont généralement ( uniquement ) pertinents si la proximité physique entre client / serveur est proche; sauf si je néglige une autre possibilité / caractéristique d'une connexion série.
ILMostro_7
2

Sur arch linux, il existe un paquet AUR, dropbear_initrd_encrypt, qui fait ce que vous voulez immédiatement . Fonctionne plutôt bien pour les interfaces filaires. J'ai dû le pirater légèrement pour le sans fil.

utilisateur3188445
la source
2

Malheureusement, aucune des réponses ci-dessus n'a fonctionné pour moi. De plus, copier une clé privée depuis un serveur semble paradoxal.

Quoi qu'il en soit, les instructions suivantes ont fonctionné:

Démarrez votre serveur en connectant et déverrouillant la partition cryptée via votre client.

Installer les packages obligatoires (sur le serveur)

apt-get install dropbear initramfs-tools busybox

Ajoutez vos clés publiques souhaitées dans le fichier registered_keys du serveur

Il suffit de copier et coller votre clé publique /etc/dropbear-initramfs/authorized_keyssur SERVER

Créer le script de déverrouillage

Créez 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éer une adresse IP statique (ou ignorer cette étape pour utiliser DHCP)

Modifier /etc/initramfs-tools/initramfs.confpour ajouter (ou changer) 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ésactiver le service dropbear au démarrage afin que openssh soit utilisé après le déchiffrement 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]
ceremcem
la source
2

Sur debian 9 (stable), cette solution était obsolète. Lors de l'installation, un message d'avertissement s'affiche 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 le super canal #debian (merci encore):

Assurez-vous d'abord que busybox, dropbearet dropbear-initramfssont 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 initramfsà jour puis pour prendre en compte les changements:: update-initramfs -u

C'est tout!

Notez que si vous voulez éviter un conflit entre les clés entre dropbearet openssh(elles partagent la même adresse IP mais utilisent une clé différente), vous voudrez peut-être ajouter à votre client ~/.ssh/configquelque chose comme ça:

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!

tobiasBora
la source
0

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

Je suis même allé jusqu'à développer un programme Python ( unlock-remote-system ) qui effectue le déverrouillage pour moi, parce que le processus de le faire manuellement me semblait un peu fragile et que je commençais à craindre de redémarrer mes serveurs. de "si ça fait mal, ça vaut la peine d'automatiser", j'ai encodé mes connaissances en Python (et cela a en effet rendu beaucoup plus facile les redémarrages réguliers pour appliquer les mises à jour de sécurité).

Depuis lors, j'ai décidé de partager également mes notes personnelles sur le chiffrement du disque racine à distance avec le monde. La page liée contient de nombreux détails sur la procédure (ainsi que des astuces qui ne sont pas mentionnées ici) et je compte la tenir à jour.

xolox
la source