Etape 1 (V1) – Installation – ZFS Native Encryption & Debian Bullseye avec Proxmox

Etape 1 (V1) – Installation – ZFS Native Encryption & Debian Bullseye avec Proxmox

Vous êtes ici :

Article 4/12 de la série suivante :

0. Mises à jour

  • 02/03/2022 : Version de base

1. Introduction

Suite à la mise à jour de la V2 de cette étape (installation sur serveur distant mais en mdraid et luks), je me suis interessé à l’installation de proxmox avec ZFS au lieu du mdraid.

Et justement depuis 2019 ZFS prends en charge nativement les partitions cryptées ce qui change tout 🙂

Donc dans le cas où vous avez un serveur distant (chez Scaleway pour mon cas), je vous recommande de faire une installation sur un disque crypté directement en ZFS.

Pour les VM j’ai choisi d’utiliser Proxmox, qui est une solution basée sur Debian et qui est open-source.

Ce tutoriel est fortement inspiré des précédents et surtout de la doc d’open zfs.

Ici je n’ai volontairement pas utilisé le bios EFI car sur les serveurs Scaleway Elastic Metal que je loue cela sous-entends de modifier le bios pour l’activer. Ce qui n’est pas permis dans les CGV

2. Lancer l’installation depuis la rescue

Il est tout à fait possible d’installer depuis l’iso par le biais d’une session KVM mais bon c’est probablement plus compliqué que le mode rescue (si vous avez cette possibilité bien évidemment). D’ailleurs c’est la seule solution me concernant car pas de KVM disponible pour le moment sur les serveurs elastic metal à l’heure où j’écris ces lignes.

Ici j’ai donc repris les commandes qui sont applicables sur un serveur Scaleway Elastic Metal en mode rescue (Ubuntu LTS 20.04) à vous d’adapter selon votre environnement (mais sur un live cd debian ça devrait être pareil).

3. Préparation de l’environnement d’installation

3.1 Accès SSH & installation des packages

  • On se logue en SSH, normalement directement en root et on mets à jour
apt update
apt upgrade
  • On arrête zed qui tourne par défaut sous Ubuntu
systemctl stop zed
  • On installe les logiciels dont on va avoir besoin (normalement la plupart sont déjà présents) :
apt install mdadm gdisk zfsutils-linux debian-archive-keyring debootstrap
  • Dans les lignes qui suivent il faut remplacer scsi-SATA_disk par le disque adapté (faire un ls -l /dev/disk/by-id/) pour identifier le disque.
  • On enregistre 2 variables qui servirons par la suite
DISK1=/dev/disk/by-id/scsi-SATA_disk1
DISK2=/dev/disk/by-id/scsi-SATA_disk2

3.2 Formatage

Si les disques étaient déjà utilisés en RAID Logiciel (attention ici ça touche tous les disques présents !):

mdadm  --stop /dev/md*
mdadm --zero-superblock --force ${DISK1}*
mdadm --zero-superblock --force ${DISK2}*

Si les disques étaient déjà utilisés en ZFS :

wipefs -a /dev/disk/by-id/*

  • On efface les 2 disques :
sgdisk --zap-all $DISK1
sgdisk --zap-all $DISK2
  • Puis on partitionne CHAQUE disque :
sgdisk -a1 -n1:24K:+1000K -t1:EF02 -c1:"boot_bios_1" -n2:0:+8G -t2:FD00 -c2:"swap_1" -n3:0:+1G -t3:BF01 -c3:"linux_boot_1" -n4:0:0 -t4:BF00 -c4:"linux_zfs_1" -p $DISK1
sgdisk -a1 -n1:24K:+1000K -t1:EF02 -c1:"boot_bios_2" -n2:0:+8G -t2:FD00 -c2:"swap_2" -n3:0:+1G -t3:BF01 -c3:"linux_boot_2" -n4:0:0 -t4:BF00 -c4:"linux_zfs_2" -p $DISK2
Explications des paramètres :
-a1 : Fixe le « sector alignment multiple », important surtout pour les disques dont le nombre de secteurs physiques est supérieur aux secteurs logiques (de plus en plus fréquent)
-n1:24K:+1000K : nouvelle partition « boot_bios » (1)
-t1:EF02 : Le type de la partition 1 est BIOS boot
-n2:0:+8G : nouvelle partition « swap » (4) de 8g (Proxmox recommande entre 4 et 8g)
-t2:FD00 : Le type de la partition 2 est RAID (car le swap ne sera pas sur le ZFS cf infra)
-n3:0:+1G : nouvelle partition « linux_boot » (3) de 1g
-t3:BF01 : Le type de la partition 2 est SOLARIS
-n4:0:0 : nouvelle partition « linux_zfs » (4) de la taille restante du disque
-t4:BF00 : Le type de la partition 3 est SOLARIS (root)
-p : Afficher
  • Puis on crée le pool boot (bpool), non crypté avec des options limitées pour être compatible avec grub :
zpool create \
    -o cachefile=/etc/zfs/zpool.cache \
    -o ashift=12 -o autotrim=on -d \
    -o feature@async_destroy=enabled \
    -o feature@bookmarks=enabled \
    -o feature@embedded_data=enabled \
    -o feature@empty_bpobj=enabled \
    -o feature@enabled_txg=enabled \
    -o feature@extensible_dataset=enabled \
    -o feature@filesystem_limits=enabled \
    -o feature@hole_birth=enabled \
    -o feature@large_blocks=enabled \
    -o feature@lz4_compress=enabled \
    -o feature@spacemap_histogram=enabled \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O devices=off -O normalization=formD -O relatime=on -O xattr=sa \
    -O mountpoint=/boot -R /newdebian \
    bpool mirror ${DISK1}-part3 ${DISK2}-part3
  • Et enfin on crée le pool root (rpool), crypté en natif :
 zpool create \
    -o ashift=12 -o autotrim=on \
    -O encryption=aes-256-gcm \
    -O keylocation=prompt -O keyformat=passphrase \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O dnodesize=auto -O normalization=formD -O relatime=on \
    -O xattr=sa -O mountpoint=/ -R /newdebian \
    rpool mirror ${DISK1}-part4 ${DISK2}-part4
Enter passphrase:
Re-enter passphrase:
Explications des paramètres :
– ashift=12 : il faut spécifier Alignment Shift (ashift) à 12 car il existe de plus en plus de disque à 4096b physique.
– encryption=aes-256-gcm : mode d’encryption par défaut
– canmount=off : empêche le pool d’être monté (permet de faire de l’héritage)
– compression=lz4 : mode de compression de la base de donnée zfs
– normalization=formD : nécessaire si fichier en UTF-8
– mountpoint=/ : on définit le point de montage à /
– -R /newdebian : temporairement on définit la base de montage relative sur /newdebian (par défaut le chemin est fonction de /)
– rpool : nom du pool
– mirror /dev/… : pool en mode mirror (équivalent au mirroring du RAID).

3.3 Création des datasets

Par défaut un pool contient un dataset, mais il est possible de découper un pool en plusieurs datasets qui seront visualisés par le système comme des « disques » (mais totalement géré par ZFS, pas de passage par fstab par exemple).

Le concept est extrêmement fort car il permets par exemple :
– De faire des snapshots snapshots de datasets (des points de restauration et de restaurer à ce moment exactement)
– De limiter un dataset en espace disque.
– De faire plusieurs datasets de boot par exemple et de switcher d’un dataset à l’autre pour booter le système (et ne pas perdre de donner)
– De créer des sous-datasets (avec héritage des propriétés)
– Et bien plus…

  • On commence par créer le dataset ROOT qui va servir à contenir les sous-datasets système :
zfs create -o canmount=off -o mountpoint=none rpool/ROOT
zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/debian
zfs mount rpool/ROOT/debian
  • Puis on crée le dataset BOOT :
zfs create -o canmount=off -o mountpoint=none bpool/BOOT
zfs create -o mountpoint=/boot bpool/BOOT/debian
  • On crée un dataset home dans lequel on va mettre tous les répertoires des users y compris celui du root :
zfs create rpool/home
zfs create -o mountpoint=/root rpool/home/root
chmod 700 /newdebian/root
  • On crée un dataset var avec les sous-datasets log,cache,tmp que l’on exclura des snapshots
zfs create -o canmount=off rpool/var
zfs create -o canmount=off rpool/var/lib
zfs create rpool/var/log
zfs create rpool/var/spool
zfs create -o com.sun:auto-snapshot=false rpool/var/cache
zfs create -o com.sun:auto-snapshot=false rpool/var/tmp
chmod 1777 /newdebian/var/tmp
  • On créée un tmpfs utile par la suite :
mkdir /newdebian/run
mount -t tmpfs tmpfs /newdebian/run
mkdir /newdebian/run/lock

4. Installation du système de base

  • On installe une debian de base (la commande peut mettre plusieurs minutes à s’exécuter):
debootstrap --arch amd64 bullseye /newdebian http://ftp.fr.debian.org/debian
...
I: Configuring ifupdown...
I: Configuring tasksel-data...
I: Configuring tasksel...
I: Configuring libc-bin...
I: Base system installed successfully.
  • On copie le zpool.cache :
mkdir /newdebian/etc/zfs
cp /etc/zfs/zpool.cache /newdebian/etc/zfs/

5. Configuration du système de base

5.1 Nom de la machine

hostname MonServeur
hostname > /newdebian/etc/hostname

5.2 Interface réseau

  • On recherche le nom de l’interface réseau (ici pour l’exemple eno1):
ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:1a:1b:1c:1d:1e brd ff:ff:ff:ff:ff:ff
    inet 123.123.123.123/24 brd 123.123.123.255 scope global dynamic eno1
       valid_lft 1569sec preferred_lft 1569sec
    inet6 fe80::abcd/64 scope link 
       valid_lft forever preferred_lft forever
  • On crée les fichiers de configuration réseau (en utilisant la commande nano), à adapter selon votre environnement réseau (ici /newdebian/etc/network/interfaces.d/eno1) :
auto eno1
iface eno1 inet dhcp
auto eno1
iface eno1 inet static
address 1.2.3.4
netmask 255.255.255.0
broadcast 1.2.3.255
gateway 1.2.3.1

5.3 Chrooter dans le nouveau système

mount --make-private --rbind /dev  /newdebian/dev
mount --make-private --rbind /proc /newdebian/proc
mount --make-private --rbind /sys  /newdebian/sys
chroot /newdebian /bin/bash --login
  • On crée le fichier mtab (alter-ego de fstab mais des disques montés) :
ln -s /proc/self/mounts /etc/mtab
  • On monte /tmp dans la ram (TMPFS) :
cp /usr/share/systemd/tmp.mount /etc/systemd/system/
systemctl enable tmp.mount
  • On modifie le mot de passe root (ne pas oublier cette étape sinon vous allez vous retrouver dehors) :
passwd

5.4 Apt

  • On modifie les sources :
# Debian Bullseye - Depot officiel
deb http://deb.debian.org/debian bullseye main contrib non-free
deb-src http://deb.debian.org/debian bullseye main contrib non-free

# Debian Bullseye - Security
deb http://security.debian.org/ bullseye-security main contrib non-free
#deb-src http://security.debian.org/ bullseye-security main contrib non-free

# Debian Bullseye -  Updates
deb http://ftp.fr.debian.org/debian/ bullseye-updates main
#deb-src http://ftp.fr.debian.org/debian/ bullseye-updates main
  • On actualise les sources et on met à jour :
apt update
apt upgrade
  • On installe aptitude (optionnel mais bien pratique) :
apt install --yes aptitude

5.5 Locales

  • On installe Locales :
apt install --yes locales
dpkg-reconfigure locales
  • On sélectionne en_US.UTF-8 & fr_FR.UTF-8 avec fr_FR.UTF-8 par défaut :

5.6 Tzdata

  • On lance la reconfiguration du paquet :
dpkg-reconfigure tzdata
  • Puis on sélectionne Europe, puis Paris :

apt install screen
screen
Il suffit de faire un screen -r depuis une nouvelle session SSH en cas de deconnexion pour revenir au même endroit !

5.7 SSH

  • On installe le serveur SSH :
apt install --yes openssh-server
  • Temporairement on autorise le root à s’authentifier (nous modifierons la configuration SSH dans l’étape suivante) :
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config

5.8 Installation des packages nécessaires au boot

  • On lance la commande suivante :
apt install --yes dpkg-dev linux-headers-amd64 linux-image-amd64 dropbear-initramfs grub-pc zfs-dkms zfs-initramfs
echo REMAKE_INITRD=yes > /etc/dkms/zfs.conf
Vous pouvez avoir des erreurs notamment pour dropbear ou cryptsetup, veuillez ne pas en tenir compte
  • Si vous avez des erreurs du type W: Possible missing firmware [...] for module bnx2 :
apt install --yes firmware-bnx2
  • Si vous aviez aussi des erreurs du type W: Possible missing firmware [...] for module tg3 :
apt install --yes firmware-linux-nonfree

5.9 Activation de bpool

  • On édite le fichier /etc/systemd/system/zfs-import-bpool.service :
[Unit]
DefaultDependencies=no
Before=zfs-import-scan.service
Before=zfs-import-cache.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/zpool import -N -o cachefile=none bpool
# Work-around to preserve zpool cache:
ExecStartPre=-/bin/mv /etc/zfs/zpool.cache /etc/zfs/preboot_zpool.cache
ExecStartPost=-/bin/mv /etc/zfs/preboot_zpool.cache /etc/zfs/zpool.cache

[Install]
WantedBy=zfs-import.target
  • Et on lance la commande suivante :
systemctl enable zfs-import-bpool.service

5.10 Paramétrage du boot (et mise en place d’un unlock en SSH)

On va installer Dropbear, qui est un client léger SSH qui va permettre d’ouvrir une session SSH alors que votre serveur est bloqué au démarrage dans l’attente de la passphrase de luks (et ainsi permettre d’entrer cette clé à distance).

  • Tout d’abord, on créé le fichier /etc/initramfs-tools/conf.d/ip (en adaptant avec vos données réseaux, faites attention aux doubles ::) :
echo "IP=123.123.123.123::123.123.123.1:255.255.255.0:MonServeur:eno1"> /etc/initramfs-tools/conf.d/ip
  • On édite le fichier /etc/default/zfs pour ajouter un délai d’attente car zfs est appelé trop tôt (ce qui arrive quand le disque est un SSD):
    
    ....
    # A la fin du fichier :
    ZFS_INITRD_PRE_MOUNTROOT_SLEEP='4'
    • On édite le fichier le fichier /etc/dropbear-initramfs/config pour ouvrir le client sur le port 2244 (ou autre c’est vous qui voyez) :
    #
    # Configuration options for the dropbear-initramfs boot scripts.
    
    #
    # Command line options to pass to dropbear(8)
    #
    DROPBEAR_OPTIONS="-j -k -p 2244 -s -c /usr/bin/zfsunlock"
    
    #
    # On local (non-NFS) mounts, interfaces matching this pattern are
    # brought down before exiting the ramdisk to avoid dirty network
    # configuration in the normal kernel.
    # The special value 'none' keeps all interfaces up and preserves routing
    # tables and addresses.
    #
    #IFDOWN=*
    • Sur votre ordinateur, il faut générer une clé publique. Sur Mac OS il suffit de taper :
    ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (~/.ssh/id_rsa): ENTRÉE
    Enter passphrase (empty for no passphrase): ENTRÉE
    Enter same passphrase again: ENTRÉE
    Your identification has been saved in ~/.ssh/id_rsa.
    Your public key has been saved in ~/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:inhsPRNYmHlK+uciJXlV7UpNQFelvGqYq/Px+k8JT5s moi@monmac.local
    The key's randomart image is:
    +---[RSA 2048]----+
    |       .oo.....  |
    |     +  ..o. .   |
    |    = o. +  o    |
    |   o =. . o  .   |
    |  ..o...S.. o    |
    |  o+oo o.o = +   |
    |  .+* * + o E    |
    |  .o.o.o = .     |
    |   . .o++oo..    |
    +----[SHA256]-----+
    • Copier coller le contenu du fichier ~/.ssh/id_rsa.pub vers le nouveau fichier /etc/dropbear-initramfs/authorized_keys sur le serveur :
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6178cqH3MCUIoeXXlIoKx4rjFcjYDCt2RwsMsrRzFErLtOn5TBILqJCl3Y+efPtamxPtTU1JiWE6IogzVGem1s49gRFP+bAlwWi5bPjHqc+J2gXPzjrkUdv0HvtxKo6187FSnT03e7BVIeysA5XyJ1CVxNISiBDzziRYbpUArcthZnHbDffdYUNCN1DVORD2Tk9daEOvceyyezENqyEkBJ0IBxNzZQ8ym6Wof2Ss0Hq3jBuCXPE26zS1bgBGae1ND6lJiwGG/A3ejh+1T2LrYusQG6ouf4g1xNBbdSEXkiZGF6unisy1RK6Rf0K3mpiZAiOPD5x0PUq+hvEr+lE65 moi@monmac.local
    • On teste grub(vous devez obtenir en retour zfs) :
    grub-probe /boot
    zfs
    • On regénère l’initramfs :
    update-initramfs -c -k all
    • On spécifie à GRUB le pool à monter et on ajoute également un peu de délai pour ne pas lancer ZFS trop tôt pour les même raisons que précédemment en éditant le fichier /etc/default/grub :
    ...
    GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=30 quiet"
    GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/debian init_on_alloc=0"
    ...
    • On désinstall l’OS PROBER :
    apt remove --purge os-prober
    • On s’assure que grub est bien installé sur tous les disques :
    grub-install /dev/disk/by-id/scsi-SATA_disk1
    grub-install /dev/disk/by-id/scsi-SATA_disk2
    update-grub

    5.11 Configuration des montages automatique des partitions.

    • On commence par lancer les commandes suivante :
    sed -i "s/ZED_SYSLOG_SUBCLASS_EXCLUDE/#ZED_SYSLOG_SUBCLASS_EXCLUDE/g" /etc/zfs/zed.d/zed.rc
    mkdir /etc/zfs/zfs-list.cache
    touch /etc/zfs/zfs-list.cache/bpool
    touch /etc/zfs/zfs-list.cache/rpool
    zed -F &
    • On vérifie que les fichiers sont mis à jour :
    cat /etc/zfs/zfs-list.cache/bpool
    cat /etc/zfs/zfs-list.cache/rpool
    • Si l’un de ces fichiers est vide, on redémarre zed :
    fg

    zed -F &
    • Si les fichiers sont bien alimentés, on ferme zed :
    fg

    • On corrige les chemins en retirant /newdebian :
    sed -Ei "s|/newdebian/?|/|" /etc/zfs/zfs-list.cache/rpool
    sed -Ei "s|/newdebian/?|/|" /etc/zfs/zfs-list.cache/bpool

    6. Premier redémarrage

    • On fait un premier screenshot des 2 datasets :
    zfs snapshot bpool/BOOT/debian@install
    zfs snapshot rpool/ROOT/debian@install
    • Si screen lancé :
    exit
    • Puis, on quitte tout :
    exit
    mount | grep -v zfs | tac | awk '/\/newdebian/ {print $3}' |xargs -i{} umount -lf {}
    umount /newdebian/*
    umount -l /newdebian
    grep /newdebian /proc/*/mounts | tac| awk '{print $3}' FS="/" | uniq | xargs -i{} kill -9 {}
    zpool export -a
    reboot -f
    • N’oubliez pas de quitter le mode secours de Scaleway (ou autre)
    • Après un certain temps ou un temps certain en fonction du processus de démarrage du serveur, ouvrez la session SSH suivante :
    ssh -p 2244 root@IP.DU.SERVEUR
    Unlocking encrypted ZFS filesystems...
    Enter the password or press Ctrl-C to exit.
    
    🔐 Encrypted ZFS password for rpool: *****************************
    Password for rpool accepted.
    Unlocking complete.  Resuming boot sequence...
    Please reconnect in a while.
    Connection to monseveur.mondomaine.com closed.
    • La session précédent se ferme tout seul, attendez une minute et relancez une nouvelle session :
    ssh root@IP.DU.SERVEUR

    7. Création de la partition swap

    • On va utiliser une partition faites avec mdraid non crypté pour le swap compte-tenu du bug actuel avec le swap sur un zvol :
    apt install --no-install-recommends --yes mdadm
    mdadm --create /dev/md0 --metadata=1.2 --level=mirror --raid-devices=2 /dev/disk/by-id/scsi-SATA_disk1-part2 /dev/disk/by-id/scsi-SATA_disk2-part2
    mkswap -f /dev/md0
    echo /dev/disk/by-uuid/$(blkid -s UUID -o value /dev/md0) none swap discard 0 0 >> /etc/fstab

    8. Paquets utiles

    Voici quelques paquets bien pratique :

    • apt-transport-https :
    apt install --yes apt-transport-https

    Permet de se connecter en HTTPS aux miroirs APT.

    • ntp :
    apt install --yes ntp
    • man :
    apt install --yes man-db
    • command-not-found :
    apt install --yes command-not-found
    apt update
    update-command-not-found
    • bash-completion :
    apt install --yes bash-completion
    • Emacs :
    apt install --no-install-recommends --yes emacs-nox

    Paramètres d’Emacs (à copier-coller directement dans un terminal) :

    echo ";;Pour empecher de faire des backups ~
    (setq make-backup-files nil)
    
    ;; utf-8 grace a LOCALES
    ;;(set-selection-coding-system locale-coding-system)
    ;;(set-keyboard-coding-system locale-coding-system)
    ;;(set-terminal-coding-system locale-coding-system)
    
    ;; forcer utf-8
    (setq locale-coding-system 'utf-8)
    (set-selection-coding-system 'utf-8)
    (set-keyboard-coding-system 'utf-8)
    (set-terminal-coding-system 'utf-8)
    (prefer-coding-system 'utf-8)
    
    ;; Pb de copier-coller avec accent
    (setq selection-coding-system 'compound-text-with-extensions)" > ~/.emacs.el

    9. Personnalisation du root

    • Bash (à copier-coller directement dans un terminal) :
    echo "# If not running interactively, don't do anything
    [ -z \"\$PS1\" ] && return
    
    # don't put duplicate lines in the history. See bash(1) for more options
    # ... or force ignoredups and ignorespace
    HISTCONTROL=ignoredups:ignorespace
    
    # append to the history file, don't overwrite it
    shopt -s histappend
    
    # for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
    HISTSIZE=1000
    HISTFILESIZE=2000
    
    # check the window size after each command and, if necessary,
    # update the values of LINES and COLUMNS.
    shopt -s checkwinsize
    
    # make less more friendly for non-text input files, see lesspipe(1)
    [ -x /usr/bin/lesspipe ] && eval \"\$(SHELL=/bin/sh lesspipe)\"
    
    # set variable identifying the chroot you work in (used in the prompt below)
    if [ -z \"\$debian_chroot\" ] && [ -r /etc/debian_chroot ]; then
        debian_chroot=\$(cat /etc/debian_chroot)
    fi
    
    # set a fancy prompt (non-color, unless we know we \"want\" color)
    case \"\$TERM\" in
        xterm-color) color_prompt=yes;;
    esac
    
    # uncomment for a colored prompt, if the terminal has the capability; turned
    # off by default to not distract the user: the focus in a terminal window
    # should be on the output of commands, not on the prompt
    #force_color_prompt=yes
    
    if [ -n \"\$force_color_prompt\" ]; then
        if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
            color_prompt=yes
        else
            color_prompt=
        fi
    fi
    
    if [ \"\$color_prompt\" = yes ]; then
        PS1='\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\\$ '
    else
        PS1='\${debian_chroot:+(\$debian_chroot)}\u@\h:\w\\$ '
    fi
    unset color_prompt force_color_prompt
    
    # If this is an xterm set the title to user@host:dir
    case \"\$TERM\" in
    xterm*|rxvt*)
        PS1=\"\[\e]0;\${debian_chroot:+(\$debian_chroot)}\u@\h: \w\a\]\$PS1\"
        ;;
    *)
        ;;
    esac
    
    # enable color support of ls and also add handy aliases
    if [ -x /usr/bin/dircolors ]; then
        test -r ~/.dircolors && eval \"\$(dircolors -b ~/.dircolors)\" || eval \"\$(dircolors -b)\"
        alias ls='ls --color=auto'
        alias grep='grep --color=auto'
        alias fgrep='fgrep --color=auto'
        alias egrep='egrep --color=auto'
    fi
    
    # some more ls aliases
    alias ll='ls -alF'
    alias la='ls -A'
    alias l='ls -CF'
    
    # Alias definitions.
    # You may want to put all your additions into a separate file like
    # ~/.bash_aliases, instead of adding them here directly.
    # See /usr/share/doc/bash-doc/examples in the bash-doc package.
    
    if [ -f ~/.bash_aliases ]; then
        . ~/.bash_aliases
    fi
    
    # enable programmable completion features (you don't need to enable
    # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
    # sources /etc/bash.bashrc).
    #if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    #    . /etc/bash_completion
    #fi
    
    PATH=\$PATH:/root/binperso
    " > ~/.bashrc

    Assurez vous d’avoir un ficher /root/.profile :

    # if running bash                                                               
    if [ -n "$BASH_VERSION" ]; then
        # include .bashrc if it exists                                              
        if [ -f "$HOME/.bashrc" ]; then
            . "$HOME/.bashrc"
        fi
    fi
    
    # set PATH so it includes user's private bin if it exists                       
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi

    10. Fichier /etc/ssh/sshd_config

    Si vous souhaitez par la suite vous pouvez sécuriser votre installation SSH en mettant un port non standard (ça ne permettra pas d’éviter un hacking ciblé mais au moins d’avoir la paix dans les logs avec les scripts auto qui cherchent à entrer sur le port 22). Ce fichier spécifie également un utilisateur unique autorisé :

    # What ports, IPs and protocols we listen for
    Port 1022
    
    # Logging
    SyslogFacility AUTH
    LogLevel INFO
    
    # Authentication:
    LoginGraceTime 2m
    PermitRootLogin no
    StrictModes yes
    PermitEmptyPasswords no
    
    # Change to yes to enable challenge-response passwords (beware issues with
    # some PAM modules and threads)
    ChallengeResponseAuthentication no
    
    # Set this to 'yes' to enable PAM authentication, account processing,
    # and session processing. If this is enabled, PAM authentication will
    # be allowed through the ChallengeResponseAuthentication and
    # PasswordAuthentication.  Depending on your PAM configuration,
    # PAM authentication via ChallengeResponseAuthentication may bypass
    # the setting of "PermitRootLogin without-password".
    # If you just want the PAM account and session checks to run without
    # PAM authentication, then enable this but set PasswordAuthentication
    # and ChallengeResponseAuthentication to 'no'.
    UsePAM yes
    
    X11Forwarding no
    PrintMotd no
    PrintLastLog yes
    
    # KeepConnexion alive
    TCPKeepAlive yes
    ClientAliveInterval 300
    ClientAliveCountMax 6
    
    # Allow client to pass locale environment variables
    AcceptEnv LANG LC_*
    
    # override default of no subsystems
    Subsystem	sftp	/usr/lib/openssh/sftp-server
    
    AllowUsers monuser
    • On oublie pas de créer l’utilisateur monuser :
    adduser monuser
    cp -a /etc/skel/. /home/monuser
    chown -R monuser:monuser /home/monuser
    usermod -a -G audio,cdrom,dip,floppy,netdev,plugdev,sudo,video monuser

    11. Installation de Promox

    Vous avez désormais un debian de base prêt à recevoir la surcouche Proxmox.

    • On modifie le fichier /etc/apt/sources.list :
    # Debian Bullseye - Depot officiel
    deb http://deb.debian.org/debian bullseye main contrib non-free
    deb-src http://deb.debian.org/debian bullseye main contrib non-free
    
    # Debian Bullseye - Security
    deb http://security.debian.org/ bullseye-security main contrib non-free
    #deb-src http://security.debian.org/ bullseye-security main contrib non-free
    
    # Debian Bullseye -  Updates
    deb http://ftp.fr.debian.org/debian/ bullseye-updates main
    #deb-src http://ftp.fr.debian.org/debian/ bullseye-updates main
    
    # Proxmox
    deb [arch=amd64] http://download.proxmox.com/debian/pve bullseye pve-no-subscription
    • On met à jour le fichier /etc/hosts :
    # IPv4
    127.0.0.1 localhost
    SERVEUR.MON.IP monserveur monserveur.mondomaine.com
    
    # IPv6
    ::1     localhost ip6-localhost ip6-loopback
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    • On authentifie le serveur Proxmox et on met à jours les dépôts :
    apt install --yes wget
    wget https://enterprise.proxmox.com/debian/proxmox-release-bullseye.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg 
    apt update
    apt full-upgrade
    • Redémarrez ! :
    reboot
    • Une fois le redémarrage terminé et que vous vous êtes identifiés de nouveau, lancez l’installation
    apt install --yes proxmox-ve postfix open-iscsi
    • A l’écran mettre : « Pas de configuration »

    • Redémarrez ! (oui encore) :
    reboot
    • Retirer le kernel inutile (en fonction des cas et adapter la version au cas où) :
    apt remove --purge linux-image-amd64 'linux-image-5.10*'
    update-grub
    • On crée un dataset pour les backups de proxmox :
    zfs create rpool/proxdata

    12. Ajustement de la configuration de Proxmox

    Je ne présente pas le fonctionnement de proxmox, il existe de nombreux tutoriels sur le sujet. Ici il s’agit juste des petites modifications à faire pour revenir une installation de base
    • Entrez dans l’interface proxmox de votre serveur : https://IP.DU.SERVEUR:8006
    • Commencez par créer une interface réseau « Linux Bridge » que vous appellerez vmbr0 et vous remplacez par les informations de l’interface principale actuellement connectée à internet (dans notre exemple eno1) :

    • Effacez le fichier /etc/network/interfaces.d/eno1
    • Allez dans le menu de gauche dans « Datacenter« , puis dans la section « Storage« 
    • Désactivez « local » et créez « proxdata« . Vous devez avoir ceci :

    • Redémarrez ! (c’est fini)
    reboot
    • Un petit nettoyage de snapshot juste pour la fin
    zfs destroy bpool/BOOT/debian@install
    zfs destroy rpool/ROOT/debian@install
    zfs snapshot bpool/BOOT/debian@postinstall
    zfs snapshot rpool/ROOT/debian@postinstall

    13. En cas de maintenance

    Voici les commandes nécessaires en cas de boot depuis une rescue

    • On monte les datasets :
    /sbin/zpool export -a
    /sbin/zpool import -N -R /actudebian rpool
    /sbin/zpool import -N -R /actudebian bpool
    /sbin/zfs load-key -a
    /sbin/zfs mount rpool/ROOT/debian
    /sbin/zfs mount -a
    • On chroot le système :
    mount --make-private --rbind /dev  /actudebian/dev
    mount --make-private --rbind /proc /actudebian/proc
    mount --make-private --rbind /sys  /actudebian/sys
    mount -t tmpfs tmpfs /actudebian/run
    mkdir /actudebian/run/lock
    /sbin/chroot /actudebian /bin/bash --login
    • Faites ce que vous avez à faire
    • Et on quitte
    exit
    mount | grep -v zfs | tac | awk '/\/actudebian/ {print $3}' | xargs -i{} umount -lf {}
    umount /actudebian/*
    umount -l /actudebian
    grep /actudebian /proc/*/mounts | tac| awk '{print $3}' FS="/" | uniq | xargs -i{} kill -9 {}
    /sbin/zpool export -a
    /sbin/reboot -f

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.