Raven - Blog
12. Août 2022

LUKS : quelques scripts...

Posté le 12. Août 2022  •  5 minutes  • 928 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 :

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 :

Ni plus, ni moins !

Voici un petit aperçu avec ce GIF :

bash-gif

Et enfin, voici le script que vous pouvez récupérer et adapter à votre usage :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/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 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/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.

Follow me

Subscribe to my RSS feed !