OS maison centré sur la sécurité, la virtualisation et un peu de fun¶
Voici un guide faisant partie d'une série, sur l'installation d'un système compartimenté et centralisé sur la virtualisation. C'est une installation pas à pas d'un système plutôt complexe. Je vous recommanderai d'avoir des connaissances sur Linux (avoir au moins installé Arch à la main), la virtualisation et la sécurité avant de suivre ce guide qui ne sera pas toujours parfait. Également, vous pouvez aussi vous tourner vers des solutions existantes comme QubesOS.
C'est quoi un OS compartimenté ?¶
Aujourd'hui l'informatique à beaucoup évolué, a tel point que nos ordinateurs sont assez puissant pour utiliser plusieurs systèmes en même temps. Avec un ordinateur solide et performant, on a moyen de se créer un système vraiment complet et sécurisé.
Par exemple: - Windows 10 et 11 acceuillent la solution WSL (windows subsystem for linux) - Des solutions logicielles populaire pour la virtualisation de systèmes (virtualbox, vmware...) - Des OS complet centrés sur la virtualisation (on parle parfois d'hyperviseurs) - La conteneurisation via Docker
Toutes ces solutions permettent d'exécuter plusieurs OS en même temps et sur une même machine sans passer par un redémarrage de celle-ci.
En fait, il existe déjà une solution populaire (que Snowden recommande, rien que ça !) qui permet de compartimenté son OS: QubesOS
QubesOS repose sur l'hyperviseur de type 1 Xen, ça permet une haute isolation entre l'hyperviseur et les machines virtuelles. C'est une solution que je conseille si vous voulez pas trop vous casser la tête pour l'installation.
En revanche: - QubesOS dépend de la VM Dom0 pour afficher un environnement graphique (Dom0 utilise le vieux serveur graphique Xorg :/) - Utilisation et administration du système parfois + compliqué - Performances pas toujours au rendez-vous - Moins flexible et moins "à la carte" que KVM/Qemu
Mon choix¶
Je vais donc partir sur une base Linux minimaliste : Artix Linux.
-
Virtualisation lourde :
J’ajouterai QEMU, KVM et libvirt (KVM est déjà intégré au noyau Linux) pour faire tourner des OS complets, Linux ou Windows, pour différentes tâches. -
Environnement graphique :
Hyprland sera utilisé pour le bureau. - C’est joli 😄
- Basé sur Wayland, qui a moins de couches d’attaque que Xorg.
À venir : VFIO passthrough
Lorsque j’aurai une carte graphique, j’utiliserai la technique du VFIO passthrough pour :
- Une VM gaming (accès direct au GPU pour des performances quasi natives)
- Une VM d’expérimentation pour l’IA
- Déjà dès maintenant, sur une VM MAO (Musique Assistée par Ordinateur) pour brancher ma guitare sur une interface audio.
⚠️ Explications : Le VFIO passthrough est une technique du noyau Linux permettant de donner un périphérique PCI directement à une VM, pour des performances quasi natives.
## Pourquoi Artix Linux ? - Basé sur Arch Linux (le meilleur compromis entre programme compilés avec AUR et les binaires) - Rolling Release -> donc màj assez fréquentes - Sans systemD (systemd est devenu un système d'init lourd avec le temps bien qu'efficace) - version de base avec le strict minimum pour installer un Linux - (J'aime bien cette proposition d'arch et j'aime peut-être me compliquer la vie xD)
Ces points montrent qu'Artix Linux est un OS assez sécurisé et surtout modulaire de par sa conception.
On peut évidemment ajouter plus de programme pour sécuriser tout ça (firewall, AppArmor, SElinux)
L’intérêt du setup¶
But recherché :
- L’hôte = une base Linux solide, stable et minimaliste
- L’hyperviseur QEMU/KVM s’occupe du cloisonnement et de la virtualisation
- S'approcher d'une philosophie type QubesOS mais avec des meilleurs performances.
⚠️ La distribution Linux de l’hôte n’est pas critique en soi, tant que vous partez sur une base fiable et connue (évitez les ISO obscures !).
Pour de plus amples informations à propos de mon matos physique et du BIOS Libre Coreboot, voir ici.
Procédure d'installation¶
ISO et Live USB¶
Il faut évidemment récupérer l'ISO officiel d'Artix Linux sur le site (via les miroirs les plus proches) et créer notre clé Bootable, le plus rapide sera avec la commande 'dd'
dd if=artix-base-{votre_init_choisi}-{date_de_dernière_release}-x86_64.iso of=/dev/sd{x} status=progress bs=4M; sync
Une fois la commande dd terminé (ça prend un petit moment) on peut débrancher notre clé puis la préparer sur notre ordinateur "cible". Sur Coreboot au démarrage, on peut accéder au
options de Boot avec la touche Échap.
Et voici un des soucis que je rencontre avec mon moniteur, la console "déborde" de l'écran.
Pas de panique ! il va falloir oeuvrer un peu à l'aveugle, quand ça a fini de défiler (ce n'est pas très long) il faut se connecter, user=artix password=artix par défaut sur le live usb de cette distribution.
En faisant entré pour l'utilisateur puis le mot de passe, on pourra faire un clear ou un CTRL-L pour afficher notre invite de commande.
Maintenant on peut voir ce qu'on tape, mais ce n'est pas fini on doit régler la taille de police du terminal et le nombre de lignes et colonnes qu'on veut afficher pour ne plus faire déborder la console de notre écran.
sudo setfont /usr/share/kbd/consolefonts/{policedevotrechoix}
stty rows 30 cols 100
Partitionnement¶
J'utiliser sudo cfdisk pour faciliter notre Partitionnement de disque.
Une fois dessus, on va tout supprimer et repartir sur une base saine.
- Faites une partition EFI de 512 Mo ou plus type EFI system pour démarrer en UEFI
- Et une seconde pour le reste du système
Dans mon cas je n'utilise pas de swap. 32Go de Ram physique sont suffisant.
⚠️ N'oubliez pas d'utiliser l'option "Écrire" pour enregistrer votre partitionnement.
Hors cfdisk on peut formater la partition EFI, cette partition nous permettra de booter sur notre distribution Linux:
mkfs.fat -F32 /dev/sdX1
cryptsetup luksFormat /dev/sdX2 -> suivez les instructions puis choisissez votre mdp
cryptsetup open /dev/sdX2 cryptroot -> on ouvre et mappe notre partition
/dev/mapper/cryptroot, on formate en Btrfs puis on monte la partition sur /mnt
mkfs.btrfs /dev/mapper/cryptroot
mount /dev/mapper/cryptroot /mnt
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@snapshots
btrfs subvolume create /mnt/@var
umount /mnt
Les sous-volumes créer, on peut démonter /mnt puis monter les sous-volumes nouvellement créés.
mount -o noatime,compress=zstd,space_cache=v2,subvol=@ /dev/mapper/cryptroot /mnt
mkdir -p /mnt/{boot,home,var,.snapshots}
mount -o noatime,compress=zstd,space_cache=v2,subvol=@home /dev/mapper/cryptroot /mnt/home
mount -o noatime,compress=zstd,space_cache=v2,subvol=@var /dev/mapper/cryptroot /mnt/var/
mount -o noatime,compress=zstd,space_cache=v2,subvol=@snapshots /dev/mapper/cryptroot /mnt/.snapshots
mount /dev/sdX1 /mnt/boot
Tout est monté ! On peut procéder a l'installation du système.
Installation du Système¶
Je vais poursuivre cette installation en me référant a la méthode d'artix linux, Arch Linux a déjà plein de tutos en plus d'un wiki très complet sur le site d'Arch.
Artix Linux n'est pas encore bien connu et la documentation n'est pas toujours nette (je me souviens devoir naviguer entre 3 docs pour installer proprement mon système.)
À ce stade on ne pourra peut-être pas installer no paquets tout de suite, il faut rafraichir le trousseau GPG sinon, basetrap et pacman n'installeront rien. Pour ce faire:
rm -rf /etc/pacman.d/gnupg
pacman-key --init
pacman-key --populate artix
pacman -Sy artix-keyring archlinux-keyring
pacman-key --populate artix
pacman-key --refresh-keys
basetrap pour installer les paquets sur un point de montage
basetrap /mnt base base-devel dinit elogind-dinit neovim grub efibootmgr btrfs-progs vim linux(-kerneldésiré) linux-firmware cryptsetup mkinitcpio artix-archlinux-support
Le chroot est une commande permettant d'entrer dans un Système linux
genfstab -U /mnt >> /mnt/etc/fstab
artix-chroot /mnt
Configuration de base¶
Maintenant que nous sommes dans notre nouveau système grâce au artix-chroot, on va effectuer la configuration de base. C'est ce qui permettra à notre installation de démarrer correctement et d'avoir les bons paramètres dès le premier boot.
Fuseau horaire¶
On commence par définir notre fuseau horaire. Dans mon cas je suis en France.
ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
hwclock --systohc
La première commande crée un lien vers le bon fuseau horaire, la seconde synchronise l'horloge matérielle avec l'heure système.
Configuration de la langue¶
On va maintenant configurer les locales.
Éditez le fichier :
nvim /etc/locale.gen
Décommentez la ligne correspondant à votre langue, par exemple :
en_US.UTF-8 UTF-8
fr_FR.UTF-8 UTF-8
Puis générez les locales :
locale-gen
Définissez ensuite la locale utilisée par défaut :
echo "LANG=fr_FR.UTF-8" > /etc/locale.conf
Libre à vous d'utiliser une locale anglaise si vous préférez avoir les messages système en anglais.
Nom de la machine¶
On choisit maintenant un nom pour notre ordinateur.
echo "artix-host" > /etc/hostname
Ensuite, on complète le fichier /etc/hosts :
nvim /etc/hosts
En ajoutant :
127.0.0.1 localhost
::1 localhost
127.0.1.1 artix-host.localdomain artix-host
Remplacez évidemment artix-host par le nom que vous avez choisi.
Clavier de la console¶
Même si nous utiliserons plus tard un environnement graphique, autant avoir un clavier correctement configuré dès maintenant.
echo "KEYMAP=fr" > /etc/vconsole.conf
Si vous utilisez un clavier différent, adaptez simplement la valeur.
Création des utilisateurs¶
Il est fortement déconseillé d'utiliser le compte root au quotidien.
On commence par définir son mot de passe :
passwd
Puis on crée un utilisateur classique.
useradd -m -G wheel -s /bin/bash votre_utilisateur
On lui attribue ensuite un mot de passe :
passwd votre_utilisateur
Le groupe wheel permettra d'utiliser les privilèges administrateur, tandis que libvirt et kvm seront utiles lorsque nous installerons notre environnement de virtualisation.
Installation de sudo¶
On installe ensuite sudo.
pacman -S sudo
Puis on édite sa configuration.
EDITOR=nvim visudo
Décommentez la ligne suivante :
%wheel ALL=(ALL:ALL) ALL
Les membres du groupe wheel pourront ainsi exécuter des commandes administrateur avec sudo.
Si vous préférez doas, libre à vous de l'utiliser, mais la majorité des documentations utilisent sudo.
Configuration de mkinitcpio¶
Comme notre système utilise un disque chiffré avec LUKS ainsi que Btrfs, il faut maintenant vérifier que l'image de démarrage contient les bons modules.
Éditez le fichier :
nvim /etc/mkinitcpio.conf
Les hooks doivent contenir au minimum les éléments nécessaires au chiffrement et au système de fichiers.
Par exemple :
HOOKS=(base udev autodetect microcode modconf kms block keyboard keymap consolefont encrypt filesystems btrfs fsck)
⚠️ Selon votre version d'Artix, de mkinitcpio ou votre système d'init, les hooks peuvent légèrement varier. N'hésitez pas à consulter la documentation officielle si nécessaire.
Une fois les modifications effectuées, on régénère l'image de démarrage.
mkinitcpio -P
Si aucune erreur n'apparaît, tout est prêt pour démarrer un système chiffré.
Installation du chargeur de démarrage¶
Il ne reste plus qu'à installer GRUB afin que notre ordinateur puisse démarrer sur notre nouvelle installation.
Installation sur la partition EFI :
grub-install \
--target=x86_64-efi \
--efi-directory=/boot \
--bootloader-id=GRUB
Comme notre système est chiffré, GRUB doit connaître l'identifiant de la partition LUKS.
On récupère son UUID :
blkid /dev/sdX2
Copiez la valeur de l'UUID puis éditez :
nvim /etc/default/grub
Repérez la ligne :
GRUB_CMDLINE_LINUX_DEFAULT=
et ajoutez les paramètres nécessaires au déverrouillage du disque, par exemple :
cryptdevice=UUID=<UUID>:cryptroot root=/dev/mapper/cryptroot
Remplacez bien <UUID> par celui obtenu précédemment.
Enfin, on génère la configuration finale de GRUB.
grub-mkconfig -o /boot/grub/grub.cfg
Si aucune erreur n'est affichée, notre système est maintenant capable de démarrer, de déverrouiller automatiquement la partition LUKS et de lancer Artix Linux.
Fin d'installation¶
Il ne reste plus qu'a installer les premiers programmes ainsi que l'interface graphique souhaité. Pour ma part j'ai choisi hyprland avec DankMaterialShell, mais vous pouvez prendre ce que vous souhaiter.
pacman -S git curl wget networkmanager snapper qemu-full libvirt virt-manager kitty apparmor apparmor-utils nftables polkit hyprland xdg-desktop-portal-hyprland pipewire
pipewire-alsa pipewire-pulse pipewire-jack wireplumber mesa vulkan-radeon ...
On peut redémarrer et si tout se passe bien vous avez un système opérationnel et prêt à créer des machines virtuelles.
Ceci conclut cette 1ere longue partie, prochainement nous verrons les options de libvirt et le VFIO passthrough.