Contenu

Création d'un ISO personnalisé Debian avec persistance chiffrée

Bien qu’il existe un nombre très important de distributions Linux, on peut parfois avoir envie de créer sa propre distribution qui réponde totalement à nos besoins et qui n’embarque pas d’outils qui nous seront inutiles et qui, de ce fait, allourdiront la machine.

Ce tutoriel détaillera étape par étape la marche à suivre pour créer sa distribution Linux (Debian) sur mesure.

Installation des packages nécessaires

Pour commencer, il faut installer les packages nécessaires via la commande :

1
apt-get install live-build live-manual live-tools

Création de l’espace de travail

Il faut ensuite créer un dossier de travail dans lequel on va construire l’image et se déplacer dans ce dernier :

1
mkdir -p  isolive/iso && cd isolive/iso

À partir de là, on va lancer la configuration afin de créer l’arborescence de travail :

1
sudo lb config

Comme précisé, cette commande permet de créer les dossiers auto, .build, config et local.

Configuration du build

Cette partie permettra de personnaliser l’image Linux (Debian en l’occurence).

Afin de configurer l’image correctement, on va venir indiquer à live-build les bonnes propriétés à l’image. Il suffit pour ça de lancer la commande suivante depuis le dossier isolive/iso que l’on a créé précédemment :

1
2
3
4
5
6
7
8
sudo lb config noauto \
--bootappend-live "boot=live components locales=fr_FR.UTF-8 keyboard-layouts=fr username=test hostname=shin-audit noautologin" \
--architectures amd64 \
--distribution bullseye \
--debian-installer live \
--grub-splash "/home/auditor/isolive/config/bootloaders/splash.png" \
--archive-areas "main contrib non-free" \
    "${@}"

Ici, les paramètres correspondent à :

  • “bootappend-live” permet la spécification du type de clavier, du nom d’utilisateur et du nom de la machine.
  • “distribution bullseye” précise la version du système à installer. Dans notre cas, on est sur une Debian 11, appelée “Bullseye”
  • “debian-installer live” permet de spécifier qu’en cas d’installation, la session live sera reproduite à l’identique sur le disque dur.

Création du fichier packages

Il faut désormais définir les packages que notre Debian modifiée devra contenir lors de son boot version live ou son installation.

On va donc créer le fichier config/package-lists/audit.list.chroot et y placer les paquets suivants :

1
alsa-utils apt-utils build-essential xfce4 xfce4-goodies nmap openssl netcat wget wireshark nano vim firefox-esr firmware-iwlwifi libfontconfig1-dev ifupdown wpasupplicant mpv scrot doas sxiv sxhkd zathura dwm xwallpaper cryptsetup

Si vous souhaitez rajouter un paquet, il suffit de le mettre à la suite des autres, en espacant bien chaque paquet d’un espace.
Néanmoins, il faut faire très attention à l’écriture du paquet. En effet, la moindre erreur sur le nom d’un paquet empêchera live-build de créer l’image et mettra un terme au processus de création.

Pour retirer un paquet, il suffit de retirer son nom.

Création du dossier personnel

Étant donné que nous allons créer un utilisateur sur notre debian personnalisée, il est essentiel de lui attribuer un home ainsi que l’architecture reliée.

L’architecture devra être placée dans /skel, qui est lui même à l’intérieur de config/includes.chroot/etc/. Il faudra, comme tout à l’heure, créer les dossiers nécessaires avant les manipulations via la commande :

1
mkdir -p config/includes.chroot/etc/skel

Il suffit donc de copier une architecture déjà existante et de la placer dans /includes.chroot/etc/skel comme ci-dessous :

/images/blog/iso/copie3.png

Le résultat doit donc être le suivant :

/images/blog/iso/copie4.png

Création du hook

Un hook permet d’attribuer à l’image certaines spécifités. Le hook sera exécuté lors de la compilation de l’ISO.

Il suffira de créer un nouveau fichier dans /config/hooks/normal/.

Les hooks fonctionnent selon un niveau de priorité, un hook avec une priorité plus faible sera exécuté avant les autres.
Pour définir cette priorité, il suffit de définir des nombres au début de son nom. Par exemple, un hook appelé 0031-auditor-user-setup.hook.chroot sera exécuté avant 0150-auditor-user-setup.hook.chroot car sa priorité est plus faible.

Dans notre cas, nous allons créer un hook nommé 0031-auditor-user-setupo.hook.chroot qui permettra de :

  • Créer le répertoire de notre utilisateur
  • Copier les fichiers et dossiers nécessaires au bon fonctionnement de ce répertoire (l’arborescence (Bureau, Documents, etc), les fichiers systèmes propres à l’utilisateur) depuis un utilisateur déjà existant vers notre nouvel utilisateur.
  • Créer l’utilisateur et lui attribuer son home ainsi que les droits sur ce dernier
  • Définir son mot de passe
  • Lui attribuer le rôle de sudoers
  • Lui attribuer son shell
  • Changer son fond d’écran

Le contenu du hook devra être le suivant :

 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
#!/bin/sh

#créer le répertoire de l'utilisateur
mkdir /home/auditor

#créer le squelette du répertoire de l'utilisateur en se basant sur un squelette déjà existant qui sera copié
cp -a /etc/skel/. /home/auditor/

#créer le squelette de script (.bash etc) du répertoire de l'utilisateur en se basant sur un squelette déjà existant qui sera copié
cp -r /home/test4/* /home/auditor

#créer l'utilisateur en lui attribuant un UID et un répertoire perso
sudo useradd auditor --uid 1010 --home /home/auditor -d /home/auditor

#donner à l'utilisateur les droits sur son répertoire personnel
sudo chown -R auditor:auditor /home/auditor

#définir un nouveau mot de passe utilisateur
echo 'auditor:testal' | sudo chpasswd

#changer le shell de l'utilisateur par le bash
sudo chsh -s /bin/bash auditor

#donne les droits sudoers à l'utilisateur
sudo usermod -aG sudo auditor

#les deux dernières commandes permettent de modifier le fond d'écran
sudo mv /home/auditor/Documents/1920x1080.svg /usr/share/desktop-base/homeworld-theme/wallpaper/contents/images/1920x1080.svg
sudo mv /home/auditor/Documents/desktop-background.xml /usr/share/images/desktop-base/desktop-background.xml

#permet d'attribuer un groupe à l'utilisateur
configure_auditor() {
    addgroup --system auditors|| true  # Ensures the group exists

    adduser auditor auditors
}

configure_auditor

Une fois le hook créé, il suffira de l’enregistrer.

Modification du GRUB

La modification du GRUB permet de modifier le menu de démarrage de la machine.
Que ce soit l’image, le nom des sessions ou les paramètres de lancement, il est possible de customiser totalement l’image.

Ici, nous allons créer 3 fichiers différents dans le dossier /config/includes.binary/isolinux :

  • Le premier, menu.cfg, permettra de configurer la taille du menu ainsi que les fichiers qui seront pris en compte. Par exemple, c’est dans ce fichier qu’il faudra indiquer que live.cfg et stdmenu.cfg existent pour que ces derniers soient pris en compte.
  • Le second, live.cfg, permettra de paramétrer les labels des options de lancement ainsi que leurs paramètres.
  • Le troisième, stdmenu.cfg, permettra de configurer l’aspect graphique du menu (couleurs, etc)

Commençons par menu.cfg :

1
2
3
4
5
6
menu hshift 27
menu width 62
include stdmenu.cfg
include live.cfg
menu end
menu clear

Puis, live.cfg :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
label live-amd64
    menu label audit-live
    menu default
    linux /live/vmlinuz
    initrd /live/initrd.img
    append boot=live components locales=fr_FR.UTF-8 keyboard-layouts=fr username=test hostname=shin-audit noautologin

label live-amd64
    menu label audit-live (w/ encrypted persistence)
    menu default
    linux /live/vmlinuz
    initrd /live/initrd.img
    append boot=live persistence persistence-encryption=luks,none components locales=fr_FR.UTF-8 keyboard-layouts=fr username=test hostname=shin-audit noautologin

Ici, on vient rappeler certains paramètres de lancement déjà utilisés dans la commande “lb config”.
On remarque également la présence des paramètres persistence et persistence-encryption sur le second label.
Ces paramètres permettent de pouvoir utiliser une partition persistante sur le système. Nous verrons par la suite comment créer une partition de ce type.

Enfin, stdmenu.cfg

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
menu background splash.png
menu color title    * #FFFFFFFF *
menu color border   * #00000000 #00000000 none
menu color sel      * #ffffffff #76a1d0ff *
menu color hotsel   1;7;37;40 #ffffffff #76a1d0ff *
menu color tabmsg   * #ffffffff #00000000 *
menu color help     37;40 #ffdddd00 #00000000 none
menu vshift 1
menu rows 10
menu helpmsgrow 15
# The command line must be at least one line from the bottom.
menu cmdlinerow 16
#menu timeoutrow 16
#menu tabmsgrow 18
#menu tabmsg Press ENTER to boot or TAB to edit a menu entry

Il faut également rajouter l’image de fond qui devra être utilisée dans le même dossier que les fichiers de configuration.
Pour que l’image soit reconnue, elle doit impérativement s’appeler “splash.png” et être au format 640x480 pixels.

Aperçu du GRUB modifié avec les paramètres actuels :

/images/blog/iso/grub2.png

Compilation de l’image

Il suffit désormais de lancer la commande pour build l’image :

1
sudo lb build

La commande prend pas mal de temps (selon les capacités de la machine et de la connexion internet)

Une fois l’image créée, elle se trouve à la racine de notre dossier projet isolive/iso.

Et voilà !

Création d’une persistance

Une persistance permet de garder les données et préférences même après le redémarrage de la machine. Dans le cas de nos audits de sécurité, cette fonctionnalité est bien pratique pour garder des notes importantes ou des rapports techniques.

Nous allons ici détailler la procédure pour créer une persistance.

Information sur le nom de la persistance
Dans le cadre de ce tutoriel, le disque utilisé sera sdb1 et le nom de la partition sera shin-persistence.
Néanmoins, et selon votre support, le disque utilisé pourrait être différent.
Le nom de la partition est également libre. Néanmoins, le paramètre “persistence” qui sera utilisé et nommé devra toujours être nommé dans sa version anglaise et non française (à savoir persistence et non persistance)

Tout d’abord, il faut vérifier les partitions via la commande :

1
sudo fdisk -l

/images/blog/iso/fdisk.png

On va donc venir sélectionner le disque sdb, étant donné que c’est sur ce dernier que nous voulons créer la partition chiffré.

On effectue la commande :

1
sudo fdisk /dev/sdb1

Puis on va définir les paramètres de la nouvelle partition via les options suivantes :

  • n : nouvelle partition
  • p : partition primaire
  • premier secteur, dernier secteur : étant donné que le disque est vide, on va utiliser son intégralité pour créer cette partition chiffré, il n’y a donc pas besoin de donner de valeurs
  • w : écrire sur le disque

La partition a bien été créée !

/images/blog/iso/parti.png

On va désormais mettre en place le chiffrement de la partition via la commande :

1
sudo cryptsetup --verbose --verify-passphrase luksFormat /dev/sdb1

Cette commande doit être confirmée par l’écriture du mot “YES” en majuscule et doit être agrémenté par la suite d’une passphrase (qui permettra le déchiffrement).

Une fois le chiffrement en place, on va venir créer un lien pour ouvrir le container vers la partition via la commande :

1
sudo cryptsetup luksOpen /dev/sdb1 shin-persistence

On va ensuite remplir le container de zéros afin de l’effacer complètement :

1
sudo dd if=/dev/zero of=/dev/mapper/shin-persistence

Puis, on va formater la partition :

1
sudo mkfs.ext4 /dev/mapper/shin-persistence

Enfin, on va ajouter un label à la partition pour mieux la reconnaître :

1
sudo e2label /dev/mapper/shin-persistence persistence

Désormais, il ne nous reste plus qu’à monter la partition via les commandes :

1
2
sudo mkdir /mnt/shin
sudo mount /dev/mapper/shin-persistence /mnt/shin

Et à ajouter le fichier persistence.conf, qui permettra à cette partition d’être reconnue comme telle :

1
sudo bash -c "echo '/ union' > /mnt/shin/persistence.conf"

Pour conclure, il suffit de démonter la partition et fermer le lien

1
2
sudo umount /dev/mapper/shin-persistence 
sudo cryptsetup luksClose /dev/mapper/shin-persistence

Utilisation de la persistance

Pour utiliser la partition il suffira de lancer la machine virtuelle en mode persistance :

/images/blog/iso/p4.png

Puis de rentrer la passphrase lorsque cette dernière est demandée :

/images/blog/iso/p2.png

Une fois la passphrase rentrée, le système se lancera normalement !