→ Using NBDE to unlock a LUKS encrypted volume

→ Preamble

This document will explain how to use NBDE to unlock a LUKS encrypted drive at boot on a RedHat based system. Thus mitigating the need to enter a password. This will require a client and a server machine.

→ Installing the server side packages

The server side package for NBDE is called Tang. This will listen on port 80 by default.

yum install -y tang

→ Start and enable Tang

systemctl start tangd.socket
systemctl enable tangd.socket

→ Installing the client side packages

The client side package for NBDE is called clevis. It requires no configuration out of the box.

yum install -y clevis

→ Configuring manual enrollment of root volumes

This will allow you to unlock your root LUKS encrypted root volume.

yum install -y clevis-luks

→ Bind encrypted drive with Tang server

This assumes that your drive is /dev/sdb3 and the tang server's hostname is tang.domain.tld.

clevis luks bind -d /dev/sdb3 tang '{"url":"http://tang.domain.tld"}'

→ Regenerate the initial ramdisk

This will install the necessary kernel modules in your initrd. Without these modules, you will not be able to automatically unlock your volume.

yum install -y clevis-dracut
dracut -f --regenerate-all

→ Conclusion

At this point, you should be able to reboot and test. You will see your normal LUKS password prompt as usual. It should take no more than ten seconds. If it does not unlock, you did something wrong.

→ Automatic enrollment via kickstart

This will allow you to set a password for your LUKS volume as well as enroll the volume on the Tang server. You will need to tailor this to work for your particular needs.

→ Kickstart Pre Section

This section is prompting for a password for your LUKS volume. It is creating the root partition details and storing them in /tmp/password.ks. It is also generating the Post section for use later in the kickstart.


%pre
chvt 3

while true; do
    read -s -p "Password: " password
    echo
    read -s -p "Password (again): " password2
    echo
    [ "$password" = "$password2" ] && break
    echo "Please try again"
done
clear
chvt 1
echo "part / --fstype="ext4" --size=1000 --grow --encrypted --ondisk=sda --passphrase=\"${password}\"" > /tmp/password.ks

cat << EOF >> /tmp/centos-encrypted_post.cfg
clevis luks bind -f -k- -d /dev/sda2 \
tang '{"url":"http://tang.domain.tld","thp":"dPCsoxxHOLw8grXMXxdmHE4c7fI"}' \ <<< "${password}"

dracut -vf --regenerate-all
EOF
%include /tmp/password.ks
%end

→ Disk partitioning

We will need to create a non encrypted /boot partition.

part /boot --fstype="ext4" --ondisk=sda --size=512