Parce que la paranoïa n'a pas de limites (et aussi parce que j'avais une après midi à m'occuper avec leurs nouvelles offres), après ne plus avoir aucun byte de données en clair sur mes disques à la maison, il était temps de commencer sur les serveurs distants !

Autant sur un dédié c'est assez simple, on vous fournit probablement un IPMI ou un KVM digne de ce nom (laissez moi rêver) pour lancer l'installateur Debian et choisir les options qui vont bien et le tour est joué, autant sur un VPS, c'est pas la même.

⚠️ Je ne suis en aucun cas responsable de pertes de données, soyez conscient qu'il s'agit d'un tutoriel prévu pour une nouvelle installation.
Aussi, je donne pas mal de commandes que vous pouvez copier coller, cepandant pensez à les adapter si votre configuration diffère de la miène :)

Rescue !

Si vous venez commander votre VPS et qu'on vous demande une distro à installer, choisissez en une au pif, ça n'a pas d'importance vu qu'on va wipe le disque après.

Une fois sur le panel, demandez le mode Rescue, les identifiants vous seront envoyés par e-mail.

Nettoyage !

Une fois connecté au rescue, il est temps de faire un peu de ménage.

Pour commencer, vérifiez quel disque est le disque de votre VPS : utilisez la commande blkid et comparez par rapport à la taille.
Dans mon cas il s'agit de /dev/sdb.

Pour commencer on va le remplir entièrement avec des zéros.
(pensez à adapter les commandes selon votre config)

dd if=/dev/zero of=/dev/sdb status=progress

Une fois la passe de zéros effectuée, vous pouvez écrire des données aléatoires sur le disque autant de fois que vous le souhaitez (j'ai tendance à recommander 2-3 passes minimum)

dd if=/dev/urandom of=/dev/sdb status=progress

Partitionnement !

Maintenant qu'on a remplis le disque de données aléatoires, il est temps de créer une table de partition.

Utilisez la commande cfdisk /dev/sdb.
Choisissez une nouvelle table de partition de type "dos", puis créez une nouvelle partition primaire de 1Gio et rendez la bootable / amorçable.
Puis avec l'espace restant, créez une deuxième partition primaire.
Une fois cela fait, écrivez la table de partition sur le disque et quittez cfdisk.

(Oui c'est marqué sda alors que j'ai dis sdb, chut t'as rien vu)

LUKS !

Maintenant qu'on a des partitions de prêtes, il faut lancer cryptsetup sur la partition /dev/sdb2 et pour cela il faut commencer par l'installer.

apt update; apt install cryptsetup -y

Maintenant on exécute cryptsetup avec la commande suivante :

cryptsetup -q luksFormat --verify-passphrase --hash sha256 --key-size=512 --cipher aes-xts-plain64 /dev/sdb2

Spécifiez une passphrase robuste, c'est elle qui protégera votre installation.
(Pensez à rendre votre mot de passe "Qwerty-proof", car pour le taper dans le KVM, il faudra obligatoirement le taper en layout Qwerty)

Debian !

Il est temps de se préparer à installer Debian, pour commencer, on déverrouille notre volume chiffré : cryptsetup luksOpen /dev/sdb2 crypt_system

Ensuite on formate nos volumes en ext4 pour être utilisables :

mkfs.ext4 -F /dev/sdb1 -L boot -m 0
mkfs.ext4 /dev/mapper/crypt_system

puis on les monte :

mount /dev/mapper/crypt_system /mnt
mkdir -p /mnt/boot
mount /dev/sdb1 /mnt/boot

Dans le doute, on prépare une structure de dossiers pour acceuillir Debian :

mkdir -p /mnt/{var,tmp,home,srv,opt,proc,dev,sys}
mkdir -p /mnt/var/log

Maintenant que tout ça est prêt, on installe deboostrap sur le rescue :

apt install debootstrap debian-archive-keyring dialog -y

Une fois installé, c'est parti pour installer la base de Debian ! :D

debootstrap --arch=amd64 --variant=minbase buster /mnt http://deb.debian.org/debian/
(ça va prendre un moment)

Fini ? Aucune erreur ? On continue !

Configuration

Avant de chroot pour configurer l'installation, on va juste bind les /proc, /sys et /dev courant pour faire croire à l'installation qu'elle tourne directement.

for i in proc sys dev; do mount -o bind "/${i}" "/mnt/${i}"; done

Maintenant on peut chroot dans notre installation de Debian : chroot /mnt

Afin d'éviter que des services démarrent pendant la configuration, on va créer un fichier policy-rc.d que l'on supprimera plus tard.

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod +x /usr/sbin/policy-rc.d

Maintenant on va configurer les dépôts Debian :

cat > /etc/apt/sources.list <<EOF
deb http://deb.debian.org/debian/ buster main contrib
deb http://deb.debian.org/debian/ buster-updates main contrib
deb http://deb.debian.org/debian/ buster-backports main contrib
deb http://deb.debian.org/debian-security/ buster/updates main contrib
EOF

Et on va s'assurer de bloquer l'installation des paquets "Recommandés" et "Suggérés" :

cat > /etc/apt/apt.conf.d/60recommends <<EOF
APT::Install-Recommends "0";
APT::Install-Suggests "0";
EOF

On met à jour le cache apt local et on vérifie si il n'y a pas des mises à jours :

chmod 777 /tmp
apt update
apt dist-upgrade -y
Le chmod de /tmp est voulu, autrement apt-key panique car il n'a pas les droits sur /tmp.

Maintenant on met en place le réseau :)

cat > /etc/network/interfaces <<EOF
auto lo
iface lo inet loopback

auto ens3
iface ens3 inet static
	address X.X.X.X/32
	gateway X.X.X.X
iface ens3 inet6 static
	address XXXX:XXXX:XXXX:XXX/128
	gateway XXXX:XXXX:XXXX:XXXX
EOF
Si votre interface n'est pas ens3, vérifiez l'interface à remplacer avec cat /proc/net/dev

Si vous ne savez pas quoi remplir dans les champs address et gateway, vérifiez votre pannel OVH.

On dispose d'une IPv4 (en /32), d'une IPv6 (en /128) et de la gateway pour l'IPv6.
Ok, mais la gateway IPv4 dans tout ça ? C'est assez simple, faîtes un mtr/traceroute vers une IPv4 de votre choix (46.227.16.8 par exemple) et regardez le premier saut, c'est cette adresse qui vous servira de gateway IPv4.

On configure le hostname ainsi que le fichier hosts :

echo kurome > /etc/hostname
hostname -F /etc/hostname

cat > /etc/hosts <<EOF
127.0.0.1       kurome.tuto-craft.com kurome
127.0.0.1       localhost

::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
EOF
Pareil, pensez à éditer le hostname par quelque chose qui vous conviens :)

On en profite pour configurer quelques résolveurs DNS :

cat > /etc/resolv.conf <<EOF
# Lorraine Data Network (LDN)
nameserver 80.67.188.188
nameserver 2001:913::8
# French Data Network (FDN)
nameserver 80.67.169.40
nameserver 2001:910:800::40
# Quad 9
nameserver 9.9.9.9
nameserver 2620:fe::fe
# CloudFlare
nameserver 1.1.1.1
nameserver 2606:4700:4700::1111
nameserver 1.0.0.1
nameserver 2606:4700:4700::1001
EOF
Assurément il s'agit d'une configuration que je recommande, libre à vous de configurer d'autres serveurs.

Et maintenant, le fstab :

cat > /etc/fstab <<EOF
proc				/proc			proc	defaults			0	0
sysfs				/sys			sysfs	defaults			0	0
cgroup				/sys/fs/cgroup	cgroup	defaults			0	0
tmpfs				/tmp			tmpfs	nodev,nosuid,nodev,noatime,size=1G	0	0

$(blkid /dev/mapper/crypt_system | awk '{print $2}' | tr -d '"')	/			ext4	errors=remount-ro,noatime	0	1
$(blkid /dev/disk/by-label/boot | awk '{print $3}' | tr -d '"')	/boot		ext4	defaults,noatime			0	2
EOF

Puis le crypttab :

cat > /etc/crypttab <<EOF
crypt_system $(blkid /dev/sdb2 | awk '{print $2}' | tr -d '"') none luks
EOF

Maintenant on installe quelques compléments et on purge les locales :

apt -y install dialog locales
apt -y install localepurge
localepurge
dpkg-reconfigure localepurge
apt -y install bash-completion less rsyslog systemd-sysv kbd console-setup console-data net-tools inetutils-ping inetutils-traceroute mtr-tiny ifupdown cryptsetup ca-certificates curl wget dnsutils lsb-release gnupg2 vim nano iptables
Pour les locales, configurez fr_FR@UTF-8 et en_US@UTF8.

Maintenant le grand fun, j'ai nommé GRUB !

apt -y install linux-image-amd64 linux-headers-amd64 grub2

Si jamais un device grub est demandé, spécifiez votre disque, dans mon cas /dev/sdb par exemple.
Dans le cas où aucune demande est effectuée, vous pouvez toujours executer :

grub-install --target=i386-pc /dev/sdb

Maintenant on configure grub pour qu'il puisse gérer notre cryptdevice et on regénère une configuration :

cat > /etc/default/grub <<EOF
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX="cryptdevice=$(blkid /dev/sdb2 | awk '{print $2}' | tr -d '"'):crypt_system"
EOF

update-grub

Presque fini ! On installe un serveur OpenSSH, on active le TTY principal, on rajoute une clé SSH dans root, on met une passphrase, on retire notre policy-rc.d et on peut sortir de notre chroot !

apt install openssh-server -y
systemctl enable getty@ttyS1.service

mkdir -p /root/.ssh
cat > /root/.ssh/authorized_keys <<EOF
<SSH PUBLIC KEY>
EOF

passwd

rm -f /usr/sbin/policy-rc.d

exit

Démontage ~

Maintenant qu'on a fini, on démonte tout ce beau monde et on vérouille le volume LUKS.

for i in dev sys proc boot; do umount "/mnt/${i}"; done
umount /mnt
cryptsetup luksClose crypt_system
sync

Reboot time !

Maintenant on redémarre depuis le panel OVH et le faire de cette façon est primordiale, autrement vous redémarrez à nouveau en mode rescue.

Utilisez la console "KVM" pour taper votre passphrase pour déverouiller le volume LUKS.

N'oubliez pas que vous devez taper votre passphrase en layout QWERTY.

Fini !

Et voilà, maintenant vous avez un beau VPS tout neuf avec votre / chiffré ! :)

Notez cepandant que étant donné que /boot est une partition en clair, il est nécéssaire de vérifier l'intégrité des fichiers présents régulièrement pour déceler toute potentielle tentative d'injection dans l'optique de récupérer votre passphrase.