LUKS : quelques scripts...
Posté le 12. Août 2022 • 4 minutes • 839 mots • Autres langues: English
Lors de mon dernier article au sujet de LUKS, que vous pouvez retrouver juste ici , je vous avais présenté le standard de chiffrement et sa mise en œuvre sur Debian dans un volume logique (LVM). En fin d’article, je vous avais promis deux choses :
- Un script bash de gestion pour le remontage de vos partitions chiffrées suite à un redémarrage.
- Un script bash d’alerte en cas de partition chiffrée non montée sur un serveur.
Si vous souhaitez assurer la sécurité maximale de vos données contenues dans un conteneur LUKS, il est nécessaire de rentrer manuellement la passphrase et d’éviter, dans la mesure du possible, l’automatisation de cette étape.
Vous êtes ainsi assuré qu’en cas de vol du matériel ou d’accès physique par un prestataire (cas d’un DC où vous n’auriez pas d’accès physique à la machine par exemple), il est impossible que le conteneur LUKS soit déverrouillé de manière automatique sans votre intervention.
Dans un contexte d’auto-hébergement, d’infrastructures de tailles moyenne ou critiques, il peut être intéressant de se simplifier la vie pour le remontage des conteneurs LUKS et d’être alerter si un conteneur n’est pas monté. C’est l’objectif de mes deux scripts.
Le script de gestion
Je vous propose donc un petit script de gestion très simple qui vous évitera de retenir les commandes LUKS et de gagner du temps à chaque maintenance de votre serveur.
Ce script est très basique et vous permettra de :
- monter votre conteneur LUKS (avec un prompt pour la passphrase)
- démonter votre conteneur LUKS
Ni plus, ni moins !
Voici un petit aperçu avec ce GIF :
Et enfin, voici le script que vous pouvez récupérer et adapter à votre usage :
#!/bin/bash
#By Raven - 12/08/2022
###### Parameters
mountPoint=/datas-enc
lvName=/dev/VG1/datasLuksLV
luksName=datasLuks
service=apache2
######
#Check if the partition is already mount or not.
#Case 1 : partition is already mount, ask for unmount or cancel.
if grep -qs /dev/mapper/$luksName /proc/mounts; then
if (whiptail --title "Unmounting the encrypted partition" --yesno "Would you like to unmount the partition and close the encrypted container ?" 8 78); then
umount $mountPoint
{
for ((i = 0 ; i <= 100 ; i+=5)); do
sleep 0.1
echo $i
done
} | whiptail --gauge "In progress, please wait..." 6 50 0
cryptsetup luksClose $luksName
{
for ((i = 0 ; i <= 100 ; i+=5)); do
sleep 0.1
echo $i
done
} | whiptail --gauge "Closing the encrypted LUKS volume..." 6 50 0
echo "Partition is unmount"
else
echo "Program completed"
fi
#Case 2 : partition is not mount, ask password, mount, restart the service and display it's status.
else
PASSWORD=$(whiptail --title "Decrypt partition" --passwordbox "Encryption passphrase" 10 60 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "$PASSWORD" | cryptsetup luksOpen $lvName $luksName
mount /dev/mapper/$luksName $mountPoint
/etc/init.d/$service restart
/etc/init.d/$service status
else
echo "You have canceled"
fi
fi
Le script d’alerte
Il peut arriver qu’un serveur redémarre inopinément, qu’un stockage réseau soit inaccessible, qu’on oublie de remonter un volume suite à de la maintenance… . Bref, pour être alerter lorsque votre conteneur LUKS n’est pas monté, j’ai créé le script suivant, dont vous trouverez les explications et informations d’installation en commentaires :
#!/bin/bash
#By Raven - 12/08/2022
#Objective of this script: send an alert email as soon as possible + 1 email every "x" hour if the mount of the encrypted volume is not effective.
#Installation :
#1- Put this script in /usr/local/bin/checkMontageLuks for example.
#2- Modify the luksMapper and mail variables for your needs.
#3- Create the file /usr/local/bin/semaphore.tmp
#4- Create a cron job with the following two lines, to be adapted to your needs :
# */5 * * * * root /usr/local/bin/checkMontageLuks.sh
# * 6,20 * * * root echo "1" > /usr/local/bin/semaphore.tmp
#HOW IT WORKS :
#If our variable sema = 1 it means that the assembly is done.
#
# My algorithm :
#if the mount is active AND sema = 1
# then do nothing
#else if the mount is active AND sema = 0
# then we change sema to 1
#else if the mount is inactive AND sema = 1
# then we set sema to 1 + send an email.
#else if the mount is inactive AND sema = 0
# then do nothing
#
# We set the sema to 1 with a cron task every "x" hour to limit the mail flow to 2 mails per day in case of unmount.
# You can vary this cron task to choose the number of alert emails per day.
##### PARAMETERS TO ADAPT
luksMapper=/dev/mapper/datasLuks
sema=/usr/local/bin/semaphore.tmp
mail=
serverName=
#####
if grep -qs $luksMapper /proc/mounts && grep -qs 0 $sema ; then
echo "1" > /usr/local/bin/semaphore.tmp
elif ! grep -qs $luksMapper /proc/mounts && grep -qs 1 $sema ; then
echo "0" > /usr/local/bin/semaphore.tmp
echo "Manual action required. Volume $luksMapper not mounted !" | mail -s "$serverName : Encrypted volume not mounted !" $mail
fi
Cet article me permet de clôturer ma présentation de LUKS et vous pourrez retrouver ces scripts sur mon github juste ici .