Table des matières

2024/02/25 (Préparation maintenance)

Heure de début : 13h00

Présences :

Météo

Moment informel durant lequel on exprime en peu de mots comment on se sent et si on a une attente forte pour la réunion. Ce n'est pas un moment de discussion mais d'expression individuelle et ce n'est pas obligatoire 🙂

Attente(s) forte(s)

Si l'une ou l'autre personne exprime une attente forte, merci de vous en occuper en priorité ou de la noter dans le hub ou dans un point approprié.

Fin: 17h30

Installation des nouveaux serveurs

Pour le contexte, on a trois serveur Dell PowerEdge R620 que l'on souhaite mettre à LouiseDC en remplacement de nos serveurs HP.

On a mis 128Go de RAM (8 barrettes DDR3 de 16Go). Sur le même serveur, elles sont toutes identiques, mais ce n'est pas le cas entre chaque serveur.

On a deux CPU E5-2640 (6 cores) sur chaque serveur.

Enfin, on a préparé des disques SSD, mais ils sont pas encore branché sur le serveur. Le disque de données prévu pour Ceph n'est pas encore utilisable (car on va réutiliser ceux des HP).

Se connecter à l'iDrac et boot de Debian

On va commencer par faire un arp-scan, parce qu'un serveur, c'est jamais qu'une grosse brique internet.

$ arp-scan -l
172.16.0.97 
172.16.0.98
172.16.0.99

On se connecte en HTTPS sur ces IP. Bon à savoir: le mot de passe par défaut est calvin pour l'utilisateur root.

Une fois connecté à l'interface, on va dans l'onglet “Media connecté”. On va mettre l'iso de Debian qu'on veut utiliser.

L'ISO est stockée sur un partage NFS au niveau du Caldarium. Tharyrok nous a indiqué le chemin de l'ISO à utiliser :

abu.home.caldarium.be:/media/data/publique/tharyrok/debian-live-12.5.0-amd64-standard.iso

On clique ensuite sur “Connecter” (si un ISO est déjà présent, on le déconnecte).

On active aussi “Activer Démarrer une seule fois”

Depuis la page de résumé, on allume les serveur en allant dans “Tâches de lancement rapide”, “Alimentation sous tension / hors tension”.

On peut lancer la console pour voir ce qu'il fait (il faut accepter les popup).

Le serveur se lance puis redémarre.

On va suivre ce qu'on avait il y a fort fort longtemps pour chiffrer les serveurs:

https://wiki.neutrinet.be/fr/rapports/2022/06-11#reinstallation_de_debian_et_chiffrement_de_nam

Pendant que le serveur s'allume, on découvre qu'on peut discuter par chat via l'idrac du serveur !

On se rend compte qu'on n'arrive pas à se connecter depuis le réseau. On pensait avoir réussi mais en réalité, le serveur boot sur le disque, où proxmox est installé parce que Tharyrok a fait des tests.

Après plusieurs essais infructueux, on tente de booter depuis un disque USB, cela fonctionne avec une Ventoy et une partition de 16Gb. Autre méthode: on a utilisé la fonction qui permet de mapper l'iso depuis la console.

Pour forcer le démarrage sur le disque USB ou le CD virtuel, on tape F11 au démarrage du serveur, ce qui lance le gestionnaire de boot. Ensuite, on choisit BOOT mode, et Hard Drive pour le disque USB ou Virtual CD pour le disque virtuel. Pour un boot depuis une image sur le réseau (serveur NFS), apparemment, il faut aussi choisir le Virtual CD (c'est super intuitif).

Là, on arrive à lancer l'intsallation de Debian sur base de l'ISO. Mais l'installation échoue au moment de partitionner les disques, il dit qu'il y a un problème avec le RAID.

On l'annule et on lance un shell.

On se connecte sur le serveur. On vérifie son IP et qu'il a internet.

NB : en testant si le serveur est connecté à internet avec ping, la console est restée bloquée et ne répondait plus pour arrêter le ping. Il a fallu la redémarrer.

On lance un serveur ssh… Problème, à ce stade, on n'a pas encore ssh d'installé. On ne parvient pas à faire un apt update non plus. Et fdisk ne fonctionne pas. 😨

En revenant en arrière, on a encorre moins de commande…

On se dit que le problème vient de la swap qui est installée sur les disques. On essaie de la supprimer en bootant sur les disques, sauf que à présent on a une erreur:

error: failure reading sector […]
error: disk mduuid/[…] not found

On va tenter de booter via un system rescue: https://www.system-rescue.org/Download/

Depuis le system rescue, on a supprimé les partitions sur les disques.

En relançant l'installation, cette fois ça passe. Le preseed est configuré pour faire toutes les opérations automatiquement donc on attend.

Après tous ces essais, on réalise qu'en fait on utilisait la mauvaise image de Debian: il fallait prendre un live debian (ce qu'on avait fait au début, mais en changeant de méthode de boot on a pris la mauvaise image).

On finit donc au bout de 4h par booter sur la bonne image.

[En fait il fallait faire F11 et choisir virtual CD pour booter sur l'iso renseigné dans “Média Connectés”… c'était tout siiiiimple /o\ (mais pas très logique)]

On fait ip a ainsi que sudo apt update et sudo apt install openssh-server pour avoir un serveur SSH et continuer depuis un terminal digne de ce nom. On lance le serveur ssh: sudo systemctl start ssh

Enfin, on donne un mot de passe à l'utilisateur user pour pouvoir s'y connecter en ssh.

En résumé

On va sur l'iDrac, en se connectant en HTTPS. Les identifiants par défaut sont root et calvin.

Dans Média connecté on attache le disque sur le réseau:

abu.home.caldarium.be:/media/data/publique/tharyrok/debian-live-12.5.0-amd64-standard.iso

Ensuite, on (re)démarre le serveur via l'iDrac, et on lance la console.

Lors du démarrage, on appuie sur F11 pour lancer le gestionnaire de boot. On choisit ensuite BIOS boot, puis Virtual CD.

Le menu du Debian Live s'affiche, on démarre le live debian.

On fait ip a ainsi que sudo apt update et sudo apt install openssh-server pour avoir un serveur SSH et continuer depuis un terminal digne de ce nom. On lance le serveur ssh: sudo systemctl start ssh

Enfin, on donne un mot de passe à l'utilisateur user pour pouvoir s'y connecter en ssh:

sudo passwd user

Partitionnement

On installe les dépendances nécessaire pour chiffrer les disques:

apt install -y cryptsetup debootstrap arch-install-scripts xfsprogs

On vérifie les disques présents avec lsblk. On voit qu'on a bien les deux disques SSD qui sont présents. S'il y avait un RAID matériel, on ne verrait qu'un seul disque. Comme ce n'est pas le cas, on va donc devoir créer un RAID software avec mdadm, qui est déjà installé dans le live Debian.

:::info ❓ Pourquoi faisons-nous un raid logiciel et pas un raid matériel ?

On flash les cartes raid pour qu'elles deviennent des cartes SAS passthrough, cela ameliore les performances mais c'est surtout utilisé pour ceph pour avoir un acces direct sans surcouche pour les OSD.

On s'est basé sur ce wiki pour flasher les cartes raid de Dell https://fohdeesha.com/docs/perc.html :::

user@debian:~$ lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0 981.5M  1 loop /usr/lib/live/mount/rootfs/filesystem.squashfs
                                 /run/live/rootfs/filesystem.squashfs
sda      8:0    0 232.9G  0 disk 
├─sda1   8:1    0     1M  0 part 
├─sda2   8:2    0   4.8G  0 part 
├─sda3   8:3    0   1.9G  0 part 
└─sda4   8:4    0 226.2G  0 part 
sdb      8:16   0 232.9G  0 disk 
├─sdb1   8:17   0     1M  0 part 
├─sdb2   8:18   0   4.8G  0 part 
├─sdb3   8:19   0   1.9G  0 part 
└─sdb4   8:20   0 226.2G  0 part 
sdc      8:32   1     0B  0 disk 
sr0     11:0    1   1.4G  0 rom  /usr/lib/live/mount/medium
                                 /run/live/medium

S'il y a déjà un RAID software présent, on doit arrêter avant de pouvoir le supprimer:

mdadm --stop /dev/mdX

Dans notre cas, il y avait deux RAID (/dev/md127 et /dev/md126), on a donc fait:

mdadm --stop /dev/md126
mdadm --stop /dev/md127

Ensuite, on supprime les partitions existantes pour avoir quelque chose de propre:

fdisk /dev/sda

Et on appuie 4 fois sur d pour supprimer les 4 partitions. Enfin, on appuie p pour vérifier que tout est supprimé, et sur w pour appliquer les modifications. En cas de doute, la touche m permet d'afficher l'aide.

On fait pareil pour /dev/sdb.

À la fin, on a quelque chose comme ceci:

NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0   7:0    0 981.5M  1 loop /usr/lib/live/mount/rootfs/filesystem.squashfs
                                /run/live/rootfs/filesystem.squashfs
sda     8:0    0 232.9G  0 disk 
sdb     8:16   0 232.9G  0 disk 
sdc     8:32   1     0B  0 disk 
sr0    11:0    1   1.4G  0 rom  /usr/lib/live/mount/medium
                                /run/live/medium`

On va partitionner et puis ensuite faire le raid. On va faire un raid pour la swap aussi au cas où un disque casse.

On va utiliser parted, qu'on doit installer. On pourrait aussi utiliser fdisk…

On commence avec le disque /dev/sda:

parted -s -a optimal -- /dev/sda mklabel gpt
parted -s -a optimal -- /dev/sda mkpart primary 1MiB 3MiB
parted -s -a optimal -- /dev/sda set 1 bios_grub on
parted -s -a optimal -- /dev/sda mkpart primary 3MiB 1GiB
parted -s -a optimal -- /dev/sda set 2 raid on
parted -s -a optimal -- /dev/sda mkpart primary 1GiB 5GiB
parted -s -a optimal -- /dev/sda set 3 raid on
parted -s -a optimal -- /dev/sda mkpart primary 5GiB 100%
parted -s -a optimal -- /dev/sda set 4 raid on

Puis le disque /dev/sdb:

parted -s -a optimal -- /dev/sdb mklabel gpt
parted -s -a optimal -- /dev/sdb mkpart primary 1MiB 3MiB
parted -s -a optimal -- /dev/sdb set 1 bios_grub on
parted -s -a optimal -- /dev/sdb mkpart primary 3MiB 1GiB
parted -s -a optimal -- /dev/sdb set 2 raid on
parted -s -a optimal -- /dev/sdb mkpart primary 1GiB 5GiB
parted -s -a optimal -- /dev/sdb set 3 raid on
parted -s -a optimal -- /dev/sdb mkpart primary 5GiB 100%
parted -s -a optimal -- /dev/sdb set 4 raid on

:::info ❓ Pourquoi ce partitionnement ? Aussi, pourquoi le faire avec parted et pas fdisk ? Pour pouvoir renseigner des commandes directes ?

L'outil parted permet de faire des copier/coller facilement, et d'avoir le même partitionnement sur chaque disque et chaque serveur.

Le partitionnement GPT permet d'être compatible sur tous les formats.

La petite partition de 2Mo est l'étape 0 du GRUB (avec gestion du raid et du chiffrement), qui indique où va se trouver la partition contenant le GRUB. C'est parce qu'on utilise le partitionement de type GPT qu'on a besoin de cette partition. :::

Au final, on se retrouve avec une partition de 2Mo pour le GRUB, puis une partition de 1Go pour le boot, une partition de 4Go pour la swap, et la dernière partition pour le système.

Cela donne ça :

root@debian:~# lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0 981.5M  1 loop /usr/lib/live/mount/rootfs/filesystem.squashfs
                                 /run/live/rootfs/filesystem.squashfs
sda      8:0    0 232.9G  0 disk 
├─sda1   8:1    0     2M  0 part 
├─sda2   8:2    0  1021M  0 part 
├─sda3   8:3    0     4G  0 part 
└─sda4   8:4    0 227.9G  0 part 
sdb      8:16   0 232.9G  0 disk 
├─sdb1   8:17   0     2M  0 part 
├─sdb2   8:18   0  1021M  0 part 
├─sdb3   8:19   0     4G  0 part 
└─sdb4   8:20   0 227.9G  0 part 
sdc      8:32   0 136.7G  0 disk 
sdd      8:48   1     0B  0 disk 
md126    9:126  0     0B  0 md   
sr0     11:0    1   1.4G  0 rom  /usr/lib/live/mount/medium
                                 /run/live/medium

Création du RAID

:::info ⚠ On ne devrait pas utliser la swap pour ces serveurs. En plus, si on l'utilise, c'est du cache, donc pas d'infos importantes. Après, ce n'est important, c'est des sujets qui font débat, des manières de voire différemment la criticité de la swap. :::

On utilise mdadm pour créer notre RAID:

mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2
mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3
mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4

On doit avoir ce résultat:

# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: size set to 1044480K
Continue creating array? 
Continue creating array? (y/n) y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Pas de panique ! Le warning est tout à fait normal 🔥🐶🔥

On ne crée pas de RAID sur la première partition, car elle va contenir le GRUB (qui ne comprend pas le RAID).

Chiffrement des disques

Avant de créer le système de fichier, on doit maintenant chiffrer les partitions.

On génère un fichier random qui va servir de clé de chiffrement pour la partie boot et root :

dd bs=512 count=4 if=/dev/random of=/tmp/encrypted-boot.key iflag=fullblock
dd bs=512 count=4 if=/dev/random of=/tmp/encrypted-root.key iflag=fullblock

On crée les volumes chiffrés. Grub pour l'instant ne sait pas traiter du luks 2, on doit donc prendre luks 1. Puis on monte ces volumes.

cryptsetup --type luks2 --cipher aes-xts-plain64 --hash sha512 --iter-time 5000 --key-size 512 --pbkdf argon2id --use-urandom --key-file /tmp/encrypted-root.key luksFormat /dev/md2

cryptsetup --type luks1 --cipher aes-xts-plain64 --hash sha512 --iter-time 5000 --key-size 512 --use-urandom --key-file /tmp/encrypted-boot.key luksFormat /dev/md0

cryptsetup open /dev/md2 encrypted-root --perf-no_write_workqueue --perf-no_read_workqueue --allow-discards --persistent --key-file /tmp/encrypted-root.key

cryptsetup open /dev/md0 encrypted-boot --perf-no_write_workqueue --perf-no_read_workqueue --allow-discards --persistent --key-file /tmp/encrypted-boot.key

Pour le cryptsetup open, on ajoute des options qui sont des optimisations pour les SSD.

Formattage des disques

On formate, en XFS pour le root filesystem, et EXT2 pour le boot :

mkfs.xfs /dev/mapper/encrypted-root
mkfs.ext2 /dev/mapper/encrypted-boot

On monte les deux système de fichier:

mount /dev/mapper/encrypted-root /mnt
mkdir /mnt/boot
mount /dev/mapper/encrypted-boot /mnt/boot

On peut vérifier avec lsblk que ça a pris forme. On a 4 points de montage :

user@debian:~$ lsblk 
NAME                 MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
loop0                  7:0    0 981.5M  1 loop  /usr/lib/live/mount/rootfs/filesystem.squashfs
                                                /run/live/rootfs/filesystem.squashfs
sda                    8:0    0 232.9G  0 disk  
├─sda1                 8:1    0     2M  0 part  
├─sda2                 8:2    0  1021M  0 part  
│ └─md0                9:0    0  1020M  0 raid1 
│   └─encrypted-boot 253:1    0  1018M  0 crypt /mnt/boot
├─sda3                 8:3    0     4G  0 part  
│ └─md1                9:1    0     4G  0 raid1 
└─sda4                 8:4    0 227.9G  0 part  
  └─md2                9:2    0 227.8G  0 raid1 
    └─encrypted-root 253:0    0 227.7G  0 crypt /mnt
sdb                    8:16   0 232.9G  0 disk  
├─sdb1                 8:17   0     2M  0 part  
├─sdb2                 8:18   0  1021M  0 part  
│ └─md0                9:0    0  1020M  0 raid1 
│   └─encrypted-boot 253:1    0  1018M  0 crypt /mnt/boot
├─sdb3                 8:19   0     4G  0 part  
│ └─md1                9:1    0     4G  0 raid1 
└─sdb4                 8:20   0 227.9G  0 part  
  └─md2                9:2    0 227.8G  0 raid1 
    └─encrypted-root 253:0    0 227.7G  0 crypt /mnt
sdc                    8:32   1     0B  0 disk  
sr0                   11:0    1   1.4G  0 rom   /usr/lib/live/mount/medium
                                                /run/live/medium

On crée la swap:

mkswap /dev/md1

Installation de Debian

Puis installation de bookworm avec debootstrap

debootstrap bookworm /mnt 

On génère le fstab pour la debian:

genfstab -U /mnt > /mnt/etc/fstab 

On vérifie le fstab:

cat /mnt/etc/fstab

On voit qu'il a fait des trucs \o/

On chroot dans la machine debian :

arch-chroot /mnt

On utilise arch-chroot qui est un alias (un peux plus malin) de :

mount --bind /dev /mnt/dev
mount --bind /dev/pts /mnt/dev/pts
mount -t proc /proc /mnt/proc
mount -t sysfs /sys /mnt/sys
mount --bind /run /mnt/run
chroot /mnt

On remplace le contenu de /etc/apt/sources.list, parce que par défaut c'est hyper léger. On réutilise juste les dépôts qu'on a mis sur nos autres VMs :

deb http://deb.debian.org/debian/ bookworm contrib main non-free non-free-firmware
deb http://deb.debian.org/debian/ bookworm-updates contrib main non-free non-free-firmware
deb http://deb.debian.org/debian/ bookworm-backports contrib main non-free non-free-firmware
deb http://security.debian.org/debian-security/ bookworm-security contrib main non-free non-free-firmware

On installe quelques outils pour le réseau et le chiffrement :

apt update
apt install -y bash-completion kitty-terminfo locales ifupdown2 bridge-utils vlan grub2 linux-image-amd64 xfsprogs openssh-server cryptsetup cryptsetup-initramfs opensmtpd zstd wget ca-certificates uuid-runtime vim console-setup mdadm

On choisi le clavier belge et ensuite on accepte les valeurs par défaut lors des différents prompt.

On installe aussi mdadm pour qu'il puisse gérer le raid software:

apt install mdadm

On doit ensuite sauver la configuration du RAID pour qu'il démarre au.. démarrage:

mdadm --detail --scan

On vérifie que le résultat de cette commande se trouve bien dans le fichier /etc/mdadm/mdadm.conf. Quelque chose comme ceci:

# definitions of existing MD arrays

ARRAY /dev/md0 metadata=1.2 name=debian:0 UUID=7feb1f92:58693726:99168fd8:6118fd73
ARRAY /dev/md1 metadata=1.2 name=debian:1 UUID=5aafae11:ad168267:16b4826f:5b2ae7f5
ARRAY /dev/md2 metadata=1.2 name=debian:2 UUID=c96e8faf:20951c17:5289a7f9:6e226d83

On définit un mot de passe pour root:

passwd root

On autorise les connexions SSH avec mot de passe pour root, en remplaçant cette ligne dans /etc/ssh/sshd_config:

# PermitRootLogin without-password

par

PermitRootLogin yes

Configuration de CryptSetup

On va rechercher les informations liées aux partitions. La commande suivante find -L /dev/disk -samefile /dev/md2 permet de voir tous les volumes qui correspondent à /dev/md2. On fait la même chose pour /dev/md1 et /dev/md0:

$ find -L /dev/disk -samefile /dev/md2
/dev/disk/by-uuid/5ae98cfb-f1a1-4f58-abae-3a62a38c97e0
/dev/disk/by-id/md-uuid-65ce0231:81f110e0:af83f6c3:a9ec0f2b
/dev/disk/by-id/md-name-debian:2

Dans notre cas, on prend la seconde ligne (md-uuid).

À partir de ces infos, on configure CryptSetup.

Attention que la Swap est un peu un cas particulier : à chaque redémarrage il va créer un volume avec un nouveau UUID. Cela permet qu'entre deux redémarrage on ne puisse pas lire ce qu'il y avait dans la Swap.

Pour rappel, /dev/md0 c'est le boot, /dev/md1 c'est la swap, et /dev/md2 c'est la partition système.

Dans /etc/crypttab, on insère :

# <target name> <source device>         <key file>      <options>
encrypted-swap   /dev/disk/by-id/md-uuid-d27432a2:b589dadd:fb58eca5:df12dc58        /dev/urandom   swap,cipher=aes-xts-plain64:sha512,size=512

encrypted-root   /dev/disk/by-id/md-uuid-65ce0231:81f110e0:af83f6c3:a9ec0f2b        /etc/keys/encrypted-root.key
encrypted-boot   /dev/disk/by-id/md-uuid-8d303b22:22705f09:4ecdb7db:ff9b71d0        /etc/keys/encrypted-boot.key

On peut vérifier que cela correspond bien au résultat de la commande lsblk -f.

On s'occupe de générer les locales, on décommente en_US.UTF-8 dans /etc/locale.gen et on lance locale-gen.

Configuration de GRUB

On peut maintenant configurer grub dans /etc/default/grub. On configure grub en mode série et on active l'option cryptsetup, sinon grub n'ira pas chercher ces disques-là.

On rajoute ces lignes:

GRUB_TERMINAL_INPUT="console serial"
GRUB_TERMINAL_OUTPUT="gfxterm serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"

GRUB_ENABLE_CRYPTODISK=y

Et on modifie la ligne GRUB_CMDLINE_LINUX_DEFAULT:

GRUB_CMDLINE_LINUX_DEFAULT="quiet console=tty0 console=ttyS0,115200"

Contrairement à ce qu'on avait fait ici, on mett tty0 pour que la console serial fonctionne. En effet, sur les HP c'est 0 et non 1.

Ce qui donne comme fichier de configuration final:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet console=tty0 console=ttyS0,115200"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

GRUB_TERMINAL_INPUT="console serial"
GRUB_TERMINAL_OUTPUT="gfxterm serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"

GRUB_ENABLE_CRYPTODISK=y

On crée le dossier /etc/keys qui va contenir toutes les clés de déchiffrement des disques:

mkdir /etc/keys

On les a générées tout à l'heure dans le /tmp du live cd et on va maintenant les copiers sur le disque chiffré. On sort du chroot, puis on fait:

cp /tmp/encrypted-* /mnt/etc/keys/.

On re chroot dans /mnt

Attention que le dossier /etc/keys ne doit être accessible que par root ! Donc :

chmod 0700 /etc/keys
chmod 0600 /etc/keys/encrypted-*.key

Génération du mot de passe

On met le même mot de passe sur boot et root (question de pratique car si les clés de déchiffrement sans uniquement dans l'initramfs, c'est pénible en cas de recovery)

Pour définir un mot de passe lisible par des humains, on utilise un petit outil qu'on installe sur notre PC :

git clone https://github.com/mbelivo/diceware-wordlists-fr
cd ./diceware-wordlists-fr
src/rolldice -e 100 wordlist_fr_5d.txt

On peut donner en paramètre l'entropie désirée et le nombre de lettre par mots générés (ici 5)

Ca génère une liste de mots, qui devient la passephrase avec les espaces. On peut en générer plusieurs jusqu'à en trouver une amusante.

Pourquoi on fait tout ça ? Parce qu'on ne peut pas faire de copier coller sur l'interface serie, sinon il manque des lettres. Donc il faut quand même un truc qui soit lisible par un humain.

On ajoute le mot de passe dans notre gestionnaire de mot de passe:

gopass insert neutrinet/servers/blue/topi/encrypted-dell

On fait pareil pour nam et bour.

Dans cryptsetup, on peut définir plusieurs slots pour déchiffrer un volume. Par exemple, on a défini deux slots :

Si cryptsetup ne trouve pas le premier, il va demander le second.

Le jour où on souhaite changer la passphrase, il faudra juste présenter à cryptsetup le fichier binaire. Et il ne faudra pas rechiffrer les disques 🙂 cryptsetup luksAddKey --key-file=/etc/keys/encrypted-boot.key /dev/md0 Ca demande la passerphrase (mieux vaut la copier une fois dans son shell pour être sûr du copier / coller).

idem pour root

cryptsetup luksAddKey --key-file=/etc/keys/encrypted-root.key /dev/md2

Puis ajout de la swap à la main, dans /etc/fstab:

/dev/mapper/encrypted-swap  none        swap    sw            0       0

Configuration de l'initramfs

On désactive l'hibernation (car à chaque redémarrage, on a une nouvelle swap avec un nouveau chiffrement)

echo "RESUME=none" >/etc/initramfs-tools/conf.d/resume

Et ensuite d'autres options pour initramfs à ajouter dans le fichier de conf:

nano /etc/initramfs-tools/initramfs.conf
KEYMAP=y
COMPRESS=zstd
UMASK=0077

On rajoute une option pour ajouter les clés de chiffrement dans l'initramfs. Si le dossier cryptsetup-initrampfs n'existe pas, alors il faut installer cryptsetup-initramfs:

nano /etc/cryptsetup-initramfs/conf-hook
KEYFILE_PATTERN="/etc/keys/*.key"

Puis on met à jour l'initramfs :

update-initramfs -u

On installe Grub sur chaque disque:

grub-install /dev/sda
grub-install /dev/sdb
update-grub

On retire “os-prober” qui ne nous sert à rien :

apt remove os-prober

On modifie le hostname ! On change le fichier /etc/hostname et on lance la commande:

hostname topi.louise.neutri.net

Configuration du réseau

On met ce contenu dans /etc/network/interfaces:

auto lo
iface lo inet loopback

auto  eno4
iface eno4 inet dhcp

En remplaçant l'interface eno4 par celle qui reçoit de l'internet.

Configuration du BIOS

Lors du démarrage, on appuie sur F2 pour entrer dans le BIOS.

On active le port série pour pouvoir taper le mot de passe:

On active le redirect after boot. C'est assez bizarre parce que sur les PowerEdge R420 il n'y a pas besoin de l'activer, mais sur les R620 on doit l'activer pour avoir la console série.

Le moment de vérité

Au démarrage, GRUB nous enjoint à entrer notre mot de passe.

Soit on lance la console dans le navigateur (dans ce cas, attention: le clavier est en QWERTY!).

Soit on se connecte à l'iDrac en SSH, puis on fait:

console com2

Si jamais on se trompe dans le mot de passe (ça arrive), il faut faire:

cryptomount -a

Puis retaper le mot de passe leeeeentement en faisant le vide dans sa tête.

Ensuite, on fait:

insmod normal
normal

Si ça ne boot pas, vérifier que cryptsetup-initramfs et mdadm sont installés.

Dépannage depuis un live cd

Si on veut déchiffrer les disques depuis un live cd, on installe un serveur SSH et donne un mot de passe à l'utilisateur user (voir plus haut).

Ensuite, on installe les outils pour cryptsetup et debootstrap:

apt install -y cryptsetup debootstrap arch-install-scripts xfsprogs

Puis, on déchiffre les disques:

cryptsetup open /dev/md125 encrypted-root --perf-no_write_workqueue --perf-no_read_workqueue --allow-discards --persistent
cryptsetup open /dev/md126 encrypted-boot --perf-no_write_workqueue --perf-no_read_workqueue --allow-discards --persistent

On monte les disques:

mount /dev/mapper/encrypted-root /mnt
mount /dev/mapper/encrypted-boot /mnt/boot

Et on fait arch-chroot.

Des erreurs de secteurs non lus

Au reboot, a des erreurs de secteurs non lus au démarrage.

C'est parce que l'iso est encore lié au serveur et considéré comme un CD virtuel même si on ne boot plus dessus.

Donc, c'est normal !

Installation de Proxmox

Quelques ressources: - https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_12_Bookworm - https://wiki.lab.ytopia.xyz/lab:lab-proxmox

On commence par mettre l'IP locale et le nom de domaine dans /etc/hosts:

127.0.0.1       localhost
172.16.0.128    topi.louise.neutri.net topi
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

On peut vérifier avec la commande hostname --ip-address.

On télécharge la clé GPG de Proxmox:

wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/keyrings/proxmox-release-bookworm.gpg

On a adapte un peu ce qui est dans la doc de Proxmox pour tenir une convention qu'on s'est donnée, qui est celle recommandée d'apt mais que tout le monde ne respecte pas, pour stocker le fichier gpg.

Puis on ajoute le dépôt de Proxmox:

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/proxmox-release-bookworm.gpg] http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list

On fait une mise à jour avec ce nouveau dépôt:

apt update && apt full-upgrade

Et on installe le kernel fournit par Proxmox:

apt install proxmox-default-kernel

⚠ On reboot pour appliquer le nouveau kernel.

Après une pause café, on peut enfin installer Proxmox:

apt install proxmox-ve opensmtpd open-iscsi chrony

On retire le dépôt entreprise de Proxmox:

rm /etc/apt/sources.list.d/pve-enterprise.list

Et on supprime l'ancien kernel de Debian:

apt remove linux-image-amd64 'linux-image-6.1*'

Enfin, on met à jour le GRUB: update-grub

Interface web de Proxmox

On peut maintenant se rendre sur l'interface web: https://172.16.0.128:8006/

Si elle n'apparaît pas, vérifier que le service pveproxy est bien démarré. S'il y a un problème avec des certificats SSL, c'est dû à une mauvaise config du fichier /etc/hosts. Il suffit de redémarrer le service.

Configuration du réseau

Tharyrok a préparé le réseau avec le nouveau switch. Chaque serveur peut parler avec les autres en IPv6. Le fichier /etc/hosts est également configuré pour qu'on puisse utiliser topi, nam et bour comme raccourcis.

Installation de Ceph

On commence par installer Ceph:

pveceph install --repository no-subscription

L'installateur nous demande de confirmer notre choix, cela doit ressembler à ceci:

HINT: The no-subscription repository is not the best choice for production setups.
Proxmox recommends using the enterprise repository with a valid subscription.
This will install Ceph Quincy - continue (y/N)? y
update available package list
start installation
... [APT stuff]
installed ceph quincy successfully!

reloading API to load new Ceph RADOS library...

On génère des nouvelles clés de chiffrement pour Ceph:

dd bs=512 count=4 if=/dev/random of=/etc/keys/encrypted-osd-0.key iflag=fullblock

On met les bonnes permissions sur la clé qu'on vient de générer:

chmod 0600 /etc/keys/encrypted-osd-0.key

Et on configure pour cryptsetup le disque de 2Tb (/dev/sdc) de la même manière qu'on avait fait pour les disques SSD et on monte le volume:

cryptsetup --type luks2 --cipher aes-xts-plain64 --hash sha512 --iter-time 5000 --key-size 512 --pbkdf argon2id --use-urandom --key-file /etc/keys/encrypted-osd-0.key luksFormat /dev/sdc

cryptsetup open /dev/sdc encrypted-osd-0 --perf-no_write_workqueue --perf-no_read_workqueue --allow-discards --persistent --key-file /etc/keys/encrypted-osd-0.key

cryptsetup luksAddKey --key-file=/etc/keys/encrypted-osd-0.key /dev/sdc

On ajoute le disque dans crypttab, toujours de la même façon que pour les SSD. Par contre, on n'a pas de partition sur ce disque-là, on va utiliser l'UUID scsi pour l'identifier:

# find -L /dev/disk -samefile /dev/sdc
/dev/disk/by-uuid/e3ab736a-5d09-4503-80f9-f79e54a73ed4
/dev/disk/by-path/pci-0000:03:00.0-sas-phy6-lun-0
/dev/disk/by-id/scsi-35000c5004cf940d7
/dev/disk/by-id/wwn-0x5000c5004cf940d7
/dev/disk/by-diskseq/11

:::info ❓ Pourquoi utilise-t-on l'UUID SCSI plutôt que by-uuid comme précédemment ?

Parce que c'est le numéro de série du disque physique. Comme on n'a pas créé de partition, on utilise ce qui est le plus proche possible du matériel. :::

Notre fichier /etc/crypttab ressemble donc à ceci:

# cat /etc/crypttab 
# <target name> <source device>         <key file>      <options>
encrypted-swap   /dev/disk/by-id/md-uuid-d27432a2:b589dadd:fb58eca5:df12dc58        /dev/urandom   swap,cipher=aes-xts-plain64:sha512,size=512

encrypted-root   /dev/disk/by-id/md-uuid-65ce0231:81f110e0:af83f6c3:a9ec0f2b        /etc/keys/encrypted-root.key
encrypted-boot   /dev/disk/by-id/md-uuid-8d303b22:22705f09:4ecdb7db:ff9b71d0        /etc/keys/encrypted-boot.key
encrypted-osd-0  /dev/disk/by-id/scsi-35000c5004cf940d7                             /etc/keys/encrypted-osd-0.key

Ceph a besoin que ses disques soient configurés en LVM. Donc on configure le physical volume LVM :

pvcreate /dev/mapper/encrypted-osd-0

On génère un UUID:

# uuidgen
5a964d51-ace1-403e-a196-ba1da3d09d1e

Puis on crée le volume group:

vgcreate ceph-5a964d51-ace1-403e-a196-ba1da3d09d1e /dev/mapper/encrypted-osd-0

On génère un autre UUID:

# uuidgen
dea0261c-9dc5-4667-a248-3b9482f4c00a

Et enfin on crée le logical volume, on utilise le second UUID dans le nom:

lvcreate -l100%FREE ceph-5a964d51-ace1-403e-a196-ba1da3d09d1e -n osd-block-dea0261c-9dc5-4667-a248-3b9482f4c00a

On met à jour l'initramfs, puisqu'on a rajouté une clé de chiffrement, avec l'option -k all pour cibler tous les kernels:

update-initramfs -u -k all

On a cette petite erreur :

Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.

A priori, cela ne pose pas de problème pour la suite.

On met à jour le GRUB par acquis de conscience:

update-grub

Et on reboot \o/

Création du cluster Proxmox

On commence par créer le cluster depuis topi:

pvecm create patata

Puis, à partir des autres serveurs, on demande à rejoindre le cluster patata:

pvecm add topi

On peut vérifier l'état du cluster:

# pvecm status
...
Votequorum information
----------------------
Expected votes:   3
Highest expected: 3
Total votes:      3
Quorum:           2  
Flags:            Quorate 
...

:::warning ⚠ En cas de réinstallation, il faudrait effacer les anciennes clés ssh si on reconnecte l'un des serveurs au cluster, comme ici : https://wiki.neutrinet.be/fr/rapports/2022/06-11#retour_de_nam_dans_le_cluster :::

On ajoute le paquet systemd-timesyncd pour être sûr que l'heure soit la même dans tout le cluster, sinon Ceph va râler pendant la synchronisation… :

apt install systemd-timesyncd

Comme on installe un nouveau cluster, il faut initialiser CEPH sur un des serveurs:

pveceph init --network 2001:913:1000:30::/64

Cela crée un config dans /etc/pve/ceph.conf, et elle doit se retrouver sur les autres serveurs.

On vérifie que ce fichier est bien un lien symbolique vers /etc/pve/ceph.conf (si ce n'est pas le cas, on crée ce lien symbolique):

# ls -lh /etc/ceph/ceph.conf
lrwxrwxrwx 1 root root 18 Mar 16 19:02 /etc/ceph/ceph.conf -> /etc/pve/ceph.conf

On crée les Monitors et Managers de Ceph sur chaque serveur du cluster:

pveceph mon create
pveceph mgr create

À cette étape, on doit avoir quelque chose comme ceci:

# ceph -s
  cluster:
    id:     4edfe49e-538c-4de2-9d34-5498dc2cc2f4
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3
 
  services:
    mon: 3 daemons, quorum topi,nam,bour (age 119s)
    mgr: topi(active, since 4m), standbys: nam, bour
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

On peut voir que Ceph est pas content car il n'y a pas les OSD, ce qui est normal puisqu'on les a pas encore créés 😛

Comme on utilise LVM, on doit créer l'OSD manuellement. On commence par faire un bootstrap des clés:

/usr/bin/ceph auth get client.bootstrap-osd > /var/lib/ceph/bootstrap-osd/ceph.keyring

:::info ❓ À quoi servent ces clés ? Quand on démarre un cluster ceph, plusieurs clés sont créées par défaut. En particulier, il y a les clés de bootstrap pour les MGR, MON, etc. On voit le bootstrap dans leurs capabilities. Le bootstrap permet d'initier des daemons de ceph pour rejoindre le cluster de ceph. Depuis une certaine version, tous ces deamons doivent s'authentifier les uns auprès des autres. C'est pourquoi dans la ligne ci-dessus, on va chercher la clé pour que proxmox puisse s'authentifier auprès du cluster ceph quand on monte les volumes. (Un exemple : dans la doc d'ovh pour ceph, ils expliquent cela et indiquent à leurs clients comment ajouter leur clé pour s'authentifier à leur cluster.) :::

Ensuite, on crée l'OSD avec cette commande magique:

ceph-volume lvm create --osd-id 0 --data /dev/ceph-5a964d51-ace1-403e-a196-ba1da3d09d1e/osd-block-dea0261c-9dc5-4667-a248-3b9482f4c00a

Chaque serveur aura un ID différent. Ici, topi a l'ID 0, nam l'ID 1, et bour l'ID 2.

Pour chaque serveur, il est aussi nécessaire d'utiliser la commande qui précède pour le bootstrap des clés. On crée chaque OSD sur son propre serveur.

Cela crache des stderr, mais a priori c'est normal. Ce qui est important, c'est de vérifier que les OSD sont bien up à la fin (attendre un peu si jamais ce n'est pas encore up):

ceph -s

Si jamais on a eu des soucis avec la création d'un OSD, on peut le supprimer avec toutes ces commandes:

ceph osd stop osd.0
ceph osd destroy osd.0
ceph osd purge osd.0
ceph-volume lvm zap /dev/ceph-5a964d51-ace1-403e-a196-ba1da3d09d1e/osd-block-dea0261c-9dc5-4667-a248-3b9482f4c00a

La dernière commande efface les métadonnées qui se trouvaient sur la partition LVM, voir aussi la doc: https://docs.ceph.com/en/latest/rados/operations/add-or-rm-osds/

Pour terminer, on crée la pool sur un des serveurs:

pveceph pool create data --add_storages

Par contre, on voit que la nouvelle pool est en warning:

HEALTH_WARN: 1 pools have too many placement groups
Pool data has 128 placement groups, should have 32
Si l'on reprend ce qu'on avait noté pendant l'atelier Proxmox :
Les placement de groupes sont des sous-blocs qui permettrent de régir le fait qu'on duplique une donnée ou non, qu'on change une donnée ou pas. C'est une algorithme qui gère dans quel node vont se retrouver les données. Il y a une formule pour calculer ce chiffre, mais ici OSEF (Ô CEPH, aide-nous).
Source : https://wiki.neutrinet.be/fr/rapports/2022/05-07

Il faut utiliser cette commande pour activer le pilote automatique:

ceph osd pool set data pg_autoscale_mode on

On voit dans l'interface web de Proxmox qu'il réduit peu à peu ses placements de groupe, ouf!

Enfin, on a remarqué qu'il y avait une pool mgr déjà crééé. Il est utilisé par les daemons mgr pour sauvegarder leurs paramètres. Si on l'a supprimé, il est recréé quand on démarre les mgr.

On peut vérifier que tout est correct avec:

pveceph pool ls

On a remarqué que Proxmox affichait cette erreur:

proxmox HEALTH_ERR: Module 'devicehealth' has failed: disk I/O error
Module 'devicehealth' has failed: disk I/O error

La solution :

ceph device monitoring off

En fait, CEPH s'attend à être passthrough sur les disques durs, sauf qu'il passe par du lvm, donc il ne récupère pas l'état de santé du disque.

Watchdog :dog:

Constamment, le kernel va contacter le watchdog pour lui dire qu'il est en vie. Si au bout de 10s il ne l'a pas contacter, le watchdog va faire une action prévue. Ici, ce sera redémarrer le système si il n'a toujours pas de nouvelle après 30 secondes supplémentaires..

Pour voir les informations liées au watchdog :

ipmitool mc watchdog get

Et pour l'activer : Dans /etc/default/pve-ha-manager on décommante la ligne :

WATCHDOG_MODULE=ipmi_watchdog

Dans /etc/default/grub, ajouter nmi_watchdog=0 dans la default grub line dans GRUBCMDLINELINUX_DEFAULT

Si au bout de 10s le watchdog n'a pas reçu de nouvelles du kernel, on va lui dire d'attendre encore 30s avant de faire un redémarrage:

echo 'options ipmi_watchdog action=power_cycle panic_wdt_timeout=30' > /etc/modprobe.d/ipmi_watchdog.conf

Le watchdog est pratique pour ne pas avoir un serveur dans un etat zombie.

Config réseau

On utilise la config réseau suivante:

auto lo
iface lo inet loopback

auto eno4
iface eno4 inet dhcp

auto enp5s0f1
iface enp5s0f1 inet manual
        mtu 9000
# LINK TO BACKBONE-01

auto bond0
iface bond0 inet manual
        mtu 9000
        bond-slaves enp5s0f1
        bond-miimon 100
        bond-mode 802.3ad
        bond-xmit-hash-policy layer3+4
# LACP TO BACKBONE

auto bond0.30
iface bond0.30 inet manual
        mtu 9000
# VLAN INTERNAL

auto vmbr0
iface vmbr0 inet manual
        mtu 8500
        bridge-ports bond0.30
        bridge-stp off
        bridge-fd 0
# INTERNAL VIRTUAL SWITCH

auto vmbr1
iface vmbr1 inet manual
        mtu 9000
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
# EXTERNAL VIRTUAL SWITCH

auto vmbr1.10
iface vmbr1.10
        mtu 9000
        address 10.0.10.14/24
        #gateway 10.0.10.1
        address 2001:0913:1000:10::14/64
        #gateway 2001:0913:1000:10::1
# VLAN MANAGEMENT

auto vmbr0.30
iface vmbr0.30
        mtu 8500
        address 2001:913:1000:30::4/64
# VLAN CLUSTER

Dans cette config, l'interface bond0 (bonding), permet de redonder un lien l2. On a plusieurs technologies, la plus simple est d'avoir deux interfaces connectées à un switch, mais seule la première est vraiment connectée. La seconde est en attente et s'active si la première tombe.

Mais dans notre cas on utilise le protocole 802.3ad autrement appeler LACP (actif / actif). Cela permet d'une certaine manière de doubler la bande passante, en ayant deux sessions TCP en même temps utilisant chacune toute la capacité d'un lien physique.

Pour le moment, on n'a pas encore le second lien, donc on ne voit qu'une seule interface (enp5s0f1) définie dans les bond slaves.

vmbr0 : l'interface par défaut quand on crée une VM, c'est le réseau interne.

vmbr1 : toute la communication interne publique, dont les liens de transit et de peering.

vmbr1.10 : le réseau de management

vmbr0.30 : on ne l'utilise pas encore mais c'est celui qui sert à l'interaction des proxmox dans le cluster patata (31 pour Chez Mémé).

Quand on a une interface . un chiffre, c'est un vlan de l'interface. Exemple vmbr0.10, c'est le vlan 10 de l'interface vmbr0.

On ne déclare pas le VLAN 11 (patata) car Proxmox n'en a pas besoin. On ne déclare que les VLANs utilisés par Proxmox.

Une bizarrerie si on va voir les interfaces qui y sont liées : bond0.30 sur le bridge vmbr0 et ensuite vmbr0.30. En fait, on a un vlan dans un vlan. Le switch connaît le vlan 30, et dedans on a le bridge et son vlan 30.

On fait du Vlan Q-IN-Q pour la communication entre les VM du cluster patata, cela sera le même pour chez-meme.

Lien physique - vlan10 (Management) - vlan30 (Cluster Patata)

  1. Vlan11 (VM Patata)
  2. Vlan30 (Proxmox & Ceph)
  3. VlanXXX

Donc le switch voit le vlan 30, sans se préoccuper du second vlan. Quand le vmbr0 reçoit le paquet (le bridge pour les VM), celui-ci a été décapsulé, et le switch ne voit que le second vlan, par ex le vlan 11.

L'interface pour la communication ceph & proxmox pourrait être écrit autrement, comme ceci : bond0.30.30

Avec cette config, on peut pinguer le nouveau switch sur l'IP 10.0.10.93 \o/

Playbook Ansible

TODO: Tharyrok s'assure que la branche bookworm est à jour

On lancera le playbook le 18 mars.

Divers

On a réactivé le lifecycle de Dell. Cela n'a pas vraiment de sens de l'avoir actif car les serveurs ne sont plus maintenus par Dell. Mais par contre, cela permet d'avoir les infos à jour du matériel visibles dans l'iDrac. Par exemple, le nombre de barettes de RAM, etc.

Le SAN

On se connecte avec un câble série DB9. Attention, si jamais on veut acheter un câble femelle-femelle, il faut faire attention à ce que ce soit un câble croisé, car chaque bout aura sa pin pour la réception associée à la pin de transmission de l'autre bout. Bref, demander conseil à Tharyrok en cas de doute.

On démarre avec CTRL+P pour changer le mot de passe temporairement. On exécute setenv RESETPASSWORD 1, puis reload. Le login est alors grpadmin, et le mot de passe pareil.

Une fois dans le machin propriétaire, on peut utiliser la commande help pour savoir ce qu'on peut faire.

Pour rappel, il y a deux boards dans le SAN, on va devoir reset les deux. Pour faire un reset complet, on utilise la commande … reset tout simplement.

S'il nous lâche qu'il peut faire son reset que sur l'active CM, cela veut dire qu'on doit brancher notre câble série sur l'autre board, et recommencer avec l'histoire du CTRL+P.

On décide de boire un shot à chaque fois qu'on doit redémarrer le serveur. Là on est à 2 🍹

On confirme la suppression de la config avec DeleteAllMyDataNow, la commande est assez explicite. Cela va redémarrer le serveur, et passer en mode secondary.

On change à nouveau le câble série pour aller sur l'autre serveur. Comme les deux modules doivent être reset, on reset le second.

Maintenant qu'on tout crâmé, on accepte de configurer la baie de stockage.

Ensuite, on dit qu'on veut lancer l'outil de configuration (setup). Il va détecter les disques et le réseau, et faire de la magie.

Quand on reset le san et qu'il redémarre, on est invité à lui choisir un petit nom. On l'a appelé san-01.

Puis on doit entrer l'interface sur laquelle on va configurer le réseau (ce sera eth0) l'adresse IP sur l'interface eth0.

Puis on lui donne une IP, le masque et la gateway.

Pour que cela fonctionne, il faut que le réseau soit correctement configuré. Sinon, il va échouer et recommencer le setup depuis le début, ce qui est un peu relou.

On branche un câble SFP+ dans le port eth0 du serveur.

On va utiliser :

10.0.32.11
255.255.255.0
10.0.32.1

On choisit ensuite le nom du groupe san-backup. On peut avoir plusieurs SAN dans un même groupe, donc on ne numérote pas ce groupe. Le nom sera commun à tous les SAN de ce groupe. Puis on donne une adresse au groupe 10.0.32.10.

Comme le groupe n'existe pas encore, le SAN demande de le créer. On accepte.

Il demande ensuite des mot de passe pour la gestion du groupe et pour le compte administrateur. On met notre mot de passe root super sécurisé habituel. Mais ! Avec une majuscule, car le SAN veut un mot de passe sécurisé.

On doit ensuite définir la stratégie de RAID. Dans la doc, il y a une commande : member <nom du membre> raid-policy <type de raid>. Cela nous donne :

member select san-01 raid-policy raid6

Avec unshow, on peut voir combien d'espace on a dans le raid. Ici, on voit qu'il a gardé un disque en spare, ce qu'on ne veut pas forcément, car cela nous fait 9,4 To au lieu de 12 To.

On lui rajoute un disque (comme ça, à chaud), et on va voir s'il change automatiquement pour passer à 12 To. Il ne le met pas à jour pour le moment. Probablement parce qu'il est encore en train de construire le raid.

On va ensuite faire un :

volume create backup 9000000MB

Il râle, peut-être aussi parce que l'étape précédente n'est pas terminée. Avec un peti volume, ça marche.

volume create backup 1024MB   
Volume creation succeeded.
iSCSI target name is iqn.2001-05.com.equallogic:8-661fc6-7891d93cd-9620000003365ede-backup.

Une fois qu'on a ça, ce volume est reconnu comme un disque réseau.

On peut ajouter des règles à ce volume, comme des contrôles d'accès, mais on ne le fera pas.

Prochaine réunion

On décide de reporter la maintenance du 2 mars au 6 avril (et la maintenance du 6 avril à plus tard).

Le 2 mars, HgO et Célo ont continué l'installation des Proxmox.

Le 8 mars à 14h, HgO et Célo continuent l'installation des Ceph.

Le 10 mars, on fait le point et on avance sur soit le switch soit le SAN.

Le 18 mars à 14h, HgO et Célo continuent l'installation des serveurs.

Le 6 avril, on fait une dernière journée de préparatifs, avant le 7 avril où on place le matériel.

Le 4 mai, Neutriton reseau, mise en pratique de la refonte du reseau.

Liste d'ateliers a faire:

Les sujets non urgent:

Prochaine réunion : 08/03 à 14h

Lieu: Caldarium

Garde-Pad:

Météo de fin

Moment informel durant lequel on exprime en peu de mots comment, à titre personnel, la réunion a été vécue que ce soit positif ou négatif. Si une ou plusieurs tension est née durant la réunion, il est peut-être nécessaire d'envisager l'une ou l'autre réunion pour y remédier.

En cas rajouter un membre dans un cluster ceph

Rejoindre un mon quand il y en a d'autre

Si il y a cette erreur :

Mar 16 19:21:35 nam.blue.neutri.net ceph-mon[59559]: 2024-03-16T19:21:35.196+0000 7fd2aba5a700 -1 mon.nam@0(probing) e0 handle_auth_bad_method hmm, they didn't like 2 result (13) Permission denied
``` 

Il faut s'assusré que tout les /var/lib/ceph/mon/ceph-xxx/keyring soit les même sur chaque serveur

## Remplacer un OSD de Ceph

On vérifie le numéro de l'OSD, la commande `df -h` nous donne l'info, sinon `systemctl status ceph-osd@x`, avec x le numéro de l'OSD.

On commence par sortir l'OSD du cluster:

ceph osd out 0


Puis on l'éteint:

ceph osd down 0 systemctl stop ceph-osd@0.service


On ferme le cryptsetup:

cryptsetup close encrypted-osd-0


Si jamais on a des soucis, on peut lister les devices chiffrés (avec une tabulation pour voir les volumes chiffrés actifs):

cryptsetup close [tab]

Et par exemple fermer le device correspondant à l'OSD de Ceph:

cryptsetup close ceph–5a964d51–ace1–403e–a196–ba1da3d09d1e-osd–block–dea0261c–9dc5–4667–a248–3b9482f4c00a


On peut ensuite remplacer le disque. Dans notre cas, le nouveau disque se trouve sur `/dev/sdf`.

On chiffre le disque:

cryptsetup –type luks2 –cipher aes-xts-plain64 –hash sha512 –iter-time 5000 –key-size 512 –pbkdf argon2id –use-urandom –key-file /etc/keys/encrypted-osd-0.key luksFormat /dev/sdf

cryptsetup open /dev/sdf encrypted-osd-0 –perf-nowriteworkqueue –perf-noreadworkqueue –allow-discards –persistent –key-file /etc/keys/encrypted-osd-0.key

cryptsetup luksAddKey –key-file=/etc/keys/encrypted-osd-0.key /dev/sdf


On récupère son UUID:

find -L /dev/disk -samefile /dev/sdf

/dev/disk/by-id/ata-SamsungSSD870EVO2TB_S754NS0WA23443T /dev/disk/by-id/wwn-0x5002538f33a3d058 /dev/disk/by-path/pci-0000:03:00.0-sas-phy6-lun-0 /dev/disk/by-diskseq/26


Comme c'est un SATA, on n'a pas d'identifiant SCSI. Ce n'est pas grave, on va prendre le WWN qui est son numéro de série.

On remplace l'identifiant dans `/etc/crypttab`, ce qui nous donne ceci:

<target name> <source device> <key file> <options>

encrypted-swap /dev/disk/by-id/md-uuid-d27432a2:b589dadd:fb58eca5:df12dc58 /dev/urandom swap,cipher=aes-xts-plain64:sha512,size=512

encrypted-root /dev/disk/by-id/md-uuid-65ce0231:81f110e0:af83f6c3:a9ec0f2b /etc/keys/encrypted-root.key encrypted-boot /dev/disk/by-id/md-uuid-8d303b22:22705f09:4ecdb7db:ff9b71d0 /etc/keys/encrypted-boot.key encrypted-osd-0 /dev/disk/by-id/wwn-0x5002538f33a3d058 /etc/keys/encrypted-osd-0.key


A virer (?)
>On reformate le nouveau disque pour être sûr qu'il est vierge:
>```
>ceph-volume lvm zap /dev/sdf
>```

On purge complètement l'OSD, car on va l'ajouter par après:

ceph osd purge 0 –yes-i-really-mean-it


On crée le LVM pour Ceph:

pvcreate /dev/mapper/encrypted-osd-0


On génère un UUID:

uuidgen

92b0cedc-a4a7-4947-ac0c-4a9b1d60cefc


Puis on crée le volume group:

vgcreate ceph-92b0cedc-a4a7-4947-ac0c-4a9b1d60cefc /dev/mapper/encrypted-osd-0


On génère un autre UUID:

uuidgen

0765219a-4b5b-41a6-b210-608d12860ddb


Et enfin on crée le logical volume, on utilise le second UUID dans le nom:

lvcreate -l100%FREE ceph-92b0cedc-a4a7-4947-ac0c-4a9b1d60cefc -n osd-block-0765219a-4b5b-41a6-b210-608d12860ddb


On met à jour l’initramfs, puisqu’on a rajouté une clé de chiffrement, avec l’option -k all pour cibler tous les kernels:

update-initramfs -u -k all


Enfin, on crée le volume Ceph:

ceph-volume lvm create –osd-id 0 –data /dev/ceph-92b0cedc-a4a7-4947-ac0c-4a9b1d60cefc/osd-block-0765219a-4b5b-41a6-b210-608d12860ddb


Et on vérifie qu'on a bien tous les OSD qu'on veut:

ceph -s


## Ajout des backups chiffrés en RAID 0

mdadm –create –verbose /dev/md3 –level=0 –raid-devices=2 /dev/sdb /dev/sdc

dd bs=512 count=4 if=/dev/random of=/etc/keys/encrypted-backup.key iflag=fullblock

chmod 0600 /etc/keys/encrypted-backup.key

cryptsetup –type luks2 –cipher aes-xts-plain64 –hash sha512 –iter-time 5000 –key-size 512 –pbkdf argon2id –use-urandom –key-file /etc/keys/encrypted-backup.key luksFormat /dev/md3

cryptsetup open /dev/md3 encrypted-backup –perf-nowriteworkqueue –perf-noreadworkqueue –allow-discards –persistent –key-file /etc/keys/encrypted-backup.key

cryptsetup luksAddKey –key-file=/etc/keys/encrypted-backup.key /dev/md3

mkfs.xfs /dev/mapper/encrypted-backup

mdadm --detail --scan

ARRAY /dev/md/1 metadata=1.2 name=debian:1 UUID=e5fa6885:9bd3a3b3:b30bd8ff:902e2071 ARRAY /dev/md/0 metadata=1.2 name=debian:0 UUID=a475501f:f6a89d29:557a3064:10bb6910 ARRAY /dev/md/2 metadata=1.2 name=debian:2 UUID=2b88960d:0b917056:a8763436:9a956a67 ARRAY /dev/md3 metadata=1.2 name=bour.louise.neutri.net:3 UUID=2190c340:3aa1ed1c:9b90069a:c699f680

vim /etc/mdadm/mdadm.conf

ARRAY /dev/md/0 metadata=1.2 UUID=a475501f:f6a89d29:557a3064:10bb6910 name=debian:0 ARRAY /dev/md/1 metadata=1.2 UUID=e5fa6885:9bd3a3b3:b30bd8ff:902e2071 name=debian:1 ARRAY /dev/md/2 metadata=1.2 UUID=2b88960d:0b917056:a8763436:9a956a67 name=debian:2 ARRAY /dev/md/3 metadata=1.2 name=bour.louise.neutri.net:3 UUID=2190c340:3aa1ed1c:9b90069a:c699f680

find -L /dev/disk -samefile /dev/md3

/dev/disk/by-id/md-uuid-2190c340:3aa1ed1c:9b90069a:c699f680 /dev/disk/by-id/md-name-bour.louise.neutri.net:3 /dev/disk/by-uuid/929fcee4-d730-4745-833e-83b956e5f057

vim /etc/crypttab

encrypted-swap /dev/disk/by-id/md-uuid-e5fa6885:9bd3a3b3:b30bd8ff:902e2071 /dev/urandom swap,cipher=aes-xts-plain64:sha512,size=512

encrypted-root /dev/disk/by-id/md-uuid-2b88960d:0b917056:a8763436:9a956a67 /etc/keys/encrypted-root.key encrypted-boot /dev/disk/by-id/md-uuid-a475501f:f6a89d29:557a3064:10bb6910 /etc/keys/encrypted-boot.key encrypted-osd-2 /dev/disk/by-id/wwn-0x5002538f4231063e /etc/keys/encrypted-osd-2.key encrypted-backup /dev/disk/by-id/md-uuid-2190c340:3aa1ed1c:9b90069a:c699f680 /etc/keys/encrypted-backup.key

update-initramfs -u -k all

lsblk -f /dev/md3

NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS md3 crypto_LUKS 2 929fcee4-d730-4745-833e-83b956e5f057
`-encrypted-backup xfs 4481788d-7d11-44c9-a7ee-46e0bfbbea8d

vim /etc/fstab

/dev/mapper/encrypted-backup

UUID=4481788d-7d11-44c9-a7ee-46e0bfbbea8d /media/backup xfs rw,noatime,nodiratime,nosuid,noexec,nodev 0 2

systemctl daemon-reload

mkdir /media/backup mount /media/backup ```