web-dev-qa-db-fra.com

Ubuntu ne démarrera pas dans busybox pour le déchiffrement de LUKS à distance à l'aide de dropbear

Je souhaite déverrouiller un LVM chiffré au démarrage sur un serveur sans tête Ubuntu 16.04. Ceci est une installation assez récente. Les seules installations que j'ai effectuées sont mate-desktop, xrdp, dropbear et busybox. Mon client est PuTTY sur une machine Windows. Je suis assez nouveau sous Linux, mais voici les progrès que j'ai accomplis:

  1. Dropbear et busybox installés

  2. Utilisé puttygen pour générer une paire de clés

  3. Copie de la clé publique dans ~/.ssh/authorized_keys et définition des autorisations appropriées (700 sur le répertoire, 600 sur le fichier)

  4. Copie de la clé publique dans /etc/initramfs-tools/root/.ssh/authorized_keys et définition des autorisations appropriées (700 sur le répertoire, 600 sur le fichier)

  5. Confirmé que mes clés sont bonnes en me connectant avec succès à la session utilisateur normale via PuTTY en utilisant l'authentification par clé

  6. Créé le script et modifié les fichiers de configuration comme indiqué à la section ce lien

    (Remarque: je n'ai pas exécuté l'étape 8, mais mon fichier /var/log/auth.log ne contenait pas les erreurs présentées dans la section Dépannage de cet article de blog si l'étape 8 n'était pas effectuée.)

  7. Initramfs mis à jour

Lorsque le système démarre et affiche l'invite graphique de déverrouillage de LUKS, le serveur ne répond pas lorsque j'essaie de me connecter via PuTTY. La connexion expire. Je n'ai pas pu trouver de ressources traitant de dropbear/busybox ne fonctionnant pas au démarrage. Je suis certain que si je pouvais obtenir une réponse, ma clé fonctionnerait et que je pourrais déverrouiller sans problèmes.

Comment savoir pourquoi dropbear/busybox ne fonctionne pas au démarrage?

(Pour plus de clarté, je peux toujours déverrouiller sur le serveur et SSH en session utilisateur.)

1
IRCraziestTaxi

Après ce qui ressemble à une éternité de plongée profonde dans Google et d'essais et d'erreurs, j'ai finalement compris ce qui se passait.

Voici les étapes que j'ai suivies par rapport aux étapes que j'ai décrites dans la question:

  1. Suppression du script dans l'article de blog référencé dans la question
  2. Dans le feu croisé des essais et des erreurs, a fini par retirer ifconfig eth0 0.0.0.0 down de usr/share/initramfs-tools/scripts/init-bottom/dropbear cette étape 6 de la publication de blog décrite; Je ne l'ai jamais rajouté mais n'en ai jamais eu besoin
  3. Modifié et ajouté les scripts suivants de this post :

    # Comment lines in /usr/share/initramfs-tools/scripts/local-top/cryptroot as follows:
    #
    if [ -z "$cryptkeyscript" ]; then
    cryptkey="Unlocking the disk $cryptsource ($crypttarget)\nEnter passphrase: "
    #if [ -x /bin/plymouth ] && plymouth --ping; then
    # cryptkeyscript="plymouth ask-for-password --Prompt"
    # cryptkey=$(echo -e "$cryptkey")
    #else
    cryptkeyscript="/lib/cryptsetup/askpass"
    #fi
    fi
    
    
    
    # Add /usr/share/initramfs-tools/hooks/cryptroot_unlock and make executable
    #
    # Prompt to unlock LUKS encrypted root partition remotely
    #
    # See linked post for sources and acknowledgements
    #
    #!/bin/sh
    PREREQ=""
    prereqs()
    {
    echo "$PREREQ"
    }
    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac
    . /usr/share/initramfs-tools/hook-functions
    #
    # Begin real processing
    #
    SCRIPTNAME=unlock
    # 1) Create script to unlock luks partitions
    cat > ${DESTDIR}/bin/${SCRIPTNAME} << '__EOF'
    #!/bin/sh
    /lib/cryptsetup/askpass "Enter volume password: " > /lib/cryptsetup/passfifo
    __EOF
    chmod 700 ${DESTDIR}/bin/${SCRIPTNAME}
    # 2) Enhance Message Of The Day (MOTD) with info how to unlock luks partition
    cat >> ${DESTDIR}/etc/motd << '__EOF'
    To unlock root-partition run "${SCRIPTNAME}"
    __EOF
    
    
    
    # Add /usr/share/initramfs-tools/scripts/local-bottom/dropbear_kill_clients and make executable
    #
    #
    # Kills all DropBear client sessions if InitRAMFS is left
    #
    # See linked post for sources and acknowledgements
    #
    #!/bin/sh
    PREREQ=""
    prereqs()
    {
    echo "$PREREQ"
    }
    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac
    #
    # Begin real processing
    #
    NAME=dropbear
    PROG=/sbin/dropbear
    # get all server pids that should be ignored
    ignore=""
    for server in `cat /var/run/${NAME}*.pid`
    do
    ignore="${ignore} ${server}"
    done
    # get all running pids and kill client connections
    for pid in `pidof "${NAME}"`
    do
    # check if correct program, otherwise process next pid
    grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" || {
    continue
    }
    # check if pid should be ignored (servers)
    skip=0
    for server in ${ignore}
    do
    if [ "${pid}" == "${server}" ]
    then
    skip=1
    break
    fi
    done
    [ "${skip}" -ne 0 ] && continue
    # kill process
    echo "$0: Killing ${pid}..."
    kill -KILL ${pid}
    done
    

Après avoir modifié et ajouté ces scripts, dropbear a pu démarrer, mais mon périphérique réseau ne parvenait pas à se connecter au réseau. Je ne pouvais donc toujours pas me connecter au serveur.

J'ai finalement découvert en utilisant ls /sys/class/net que mon adaptateur réseau ne s'appelait pas eth0; apparemment, c’est une ancienne notation qui n’est plus utilisée par les versions récentes d’Ubuntu, et comme tous les articles que j’ai trouvés sont anciens sinon anciens, eth0 est tout ce que j’ai trouvé des références.

Donc, armé de cette information et de quelques extraits trouvés d’autres sources, j’ai modifié initramfs.conf comme suit:

  1. Modification de la partie DEVICE= de /etc/initramfs-tools/initramfs.conf comme suit:

    DEVICE=<name of network adapter discovered using ls /sys/class/net>
    IP=<Static IP Address>::<Default Gateway>:<Subnet Mask>::<name of network adapter>:off
    
  2. Mise à jour initramfs (Sudo update-initramfs -u)

Maintenant, dropbear se connecte au réseau et je peux me connecter au serveur et déverrouiller à distance.

2
IRCraziestTaxi

Je me suis cogné la tête dessus pendant presque une semaine avec toutes les mauvaises informations (comme installer simplement dropbear-initramfs).

Voici un script que j'ai écrit pour configurer et configurer dropbear automatiquement pour 16.0.4.

Assurez-vous de lire les commentaires de code et d'adapter le script à votre système!

#!/bin/bash
## LUKS remote decrypt for Ubuntu 16.04.1 - by BinaryShrub

# NOTES:
# Tailor lines 67 - 69 to your system before running!
# Use at your own risk!

# Safety Check
if [ "$EUID" -ne 0 ]
  then echo "You must run this as root"
  exit
fi

# Install Dropbear
apt -y install dropbear

# Setup authorized keys
mkdir -p /etc/initramfs-tools/root/.ssh
echo "Insert client id_rsa.pub (Leave empty to use ~/.ssh/authorized_keys):"
read -e r  
if [[ -z "$r" ]]; then
    cp ~/.ssh/authorized_keys /etc/initramfs-tools/root/.ssh/authorized_keys
else
    echo "$r" >> /etc/initramfs-tools/root/.ssh/authorized_keys
fi

# Add hook to create unlocker script
f=/usr/share/initramfs-tools/hooks/dropbear-unlocker
cat <<\END > "$f"
#!/bin/sh

PREREQ="dropbear"

prereqs() {
    echo "$PREREQ"
}

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

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

# Copy dropbear if explicitly enabled, or in case of a cryptroot setup if not explicitly disabled
[ "$DROPBEAR" = y ] || [ "$DROPBEAR" != n -a -r /etc/crypttab ] || exit 0

if [ ! -x "/usr/sbin/dropbear" ]; then
    if [ "$DROPBEAR" = y ]; then
        echo "dropbear-unlock: FAILURE: Dropbear not found, script wont start!" >&2
    else
        echo "dropbear-unlock: WARNING: Dropbear not found, script wont start" >&2
    fi
    exit 0
fi

# Copy the unlock script
s="$DESTDIR/$(ls $DESTDIR | grep root)/unlocker"
echo "#!/bin/sh

# Ask for decrypt key with one disk
# /scripts/local-top/cryptroot
# With Multiple Disks
/sbin/cryptsetup luksOpen /dev/sda3 sda3_crypt
/sbin/cryptsetup luksOpen /dev/sdb3 sdb3_crypt
/sbin/cryptsetup luksOpen /dev/sdc3 sdc3_crypt

# Hack to address https://goo.gl/2fGjCY
mknod /dev/btrfs-control c 10 234
btrfs device scan

# Kill these programs to keep 'init' moving.
echo "Loading OS..."
kill -9 \$(ps | grep cryptsetup | grep askpass | awk '{print \$1}') > /dev/null
kill -9 \$(ps | grep /bin/sh | grep cryptroot | awk '{print \$1}') > /dev/null
exit 0
" > "$s"

chmod +x "$s"

echo "unlocker: loaded"
END

chmod +x "$f"

# Rebuild initramfs
update-initramfs -u

echo "Done! Reboot to initramfs and run ~/unlocker"

https://Gist.github.com/BinaryShrub/0587b170dc22b1e7ff7b435c92b5309

0
BinaryShrub