Archives pour l'étiquette unlock

Déverrouiller une partition chiffrée par SSH au démarrage (Ubuntu)

(Testé sur Ubuntu 14.04 et +)

Sur une distribution Linux comme Ubuntu, le chiffrement de la totalité du root file system assure un bon niveau de sécurité, mais pose un problème si l’on veut démarrer la machine sans avoir accès à une interface clavier+écran. Deux exemples :

Dans ce cas, comment faire pour entrer la passphrase au démarrage alors que le système n’a pas encore démarré et que l’on a aucun accès du genre SSH ?

L’idée est d’installer dropbear, un serveur SSH léger, dans l’initramfs. L’initramfs se trouve sur la partition /boot (qui n’est pas chiffrée) et il est le système minimal en charge de démarrer le vrai système.

Note : toutes les commandes sont à exécuter en root

Installer openssh-server et dropbear :

# apt-get install openssh-server dropbear

Dropbear est désactivé par défaut sous Ubuntu quand openssh est installé. Dropbear est installé en même temps dans l’initramfs et ne sera donc actif que là.

Les clés DSA et RSA de dropbear sont générées, mais comme elles sont différentes de celles d’openssh, on se retrouverait avec une erreur « host identification changed » sur le client SSH à chaque basculement entre openssh et dropbear. Pour éviter ça, on va utiliser les clés de openssh pour dropbear :

# /usr/lib/dropbear/dropbearconvert openssh dropbear /etc/ssh/ssh_host_dsa_key /etc/dropbear/dropbear_dss_host_key
# /usr/lib/dropbear/dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear/dropbear_rsa_host_key
# cp /etc/dropbear/dropbear_* /etc/initramfs-tools/etc/dropbear/

L’initramfs ne connaît que l’utilisateur root, il faut donc s’assurer qu’il soit activé et lui affecter un mot de passe :

# passwd root

Note : pour se connecter à dropbear en utilisant une clé SSH plutôt que le mot de passe root, ajouter les clés publiques autorisées dans /etc/initramfs-tools/root/.ssh/authorized_keys

Un bug dans plymouth empêche normalement d’entrer la passphrase par un autre moyen que le clavier sur la machine. Un workaround existe sous la forme d’un script hook (source) :

# vi /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}'\`
    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
# chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

Tout est prêt, on peut mettre à jour l’initramfs :

# update-initramfs -u

Optionnel : si la machine n’obtient pas sa configuration réseau par DHCP, il est nécessaire de passer la config en paramètre au kernel pour que le réseau soit disponible au niveau de l’initramfs.

# vi /etc/default/grub
[...]
GRUB_CMDLINE_LINUX="ip=[ip-address]::[default-gateway]:[netmask]::eth0:none net.ifnames=0 biosdevname=0"
[...]

Note : les paramètres « net.ifnames=0 » et « biosdevname=0 » permettent d’éviter que l’interface réseau eth0 ne soit renommée en autre chose (force le nommage legacy)

# update-grub

Redémarrer la machine. Au moment où la passphrase est demandée, la connexion SSH devrait marcher. On se connecte et on entre la commande unlock, puis la passphrase. On peut ensuite se déconnecter et laisser le système finir de démarrer.

Sources :