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:
Dropbear et busybox installés
Utilisé puttygen
pour générer une paire de clés
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)
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)
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é
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.)
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.)
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:
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 besoinModifié 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:
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
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.
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