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.
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/
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
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 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
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
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
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.