Installation d'un système

Les hôtes sont basés sur Debian stretch, dont le guide d’installation sert de base à ce document.

Contrainte non négligeable : les machines employées sont nécessairement préinstallées par le fournisseur de services IaaS. En conséquence, les options d’installation ne correspondent pas exactement aux attentes et des ajustements doivent être effectués.

Partitionnement

Le partitionnement par défaut convient plutôt :

  • un RAID1 software entre les deux disques ;
  • une partition système de 25G ;
  • une partition de données pour le reste ;
  • pas de swap (par sécurité).

Première connexion, gestion des utilisateurs

A la première connexion, on s’assure :

  • que seul l’utilisateur root est activé ;
  • que la connexion SSH est autorisée exclusivement grâce aux clés ;
  • que le mot de passe de root est réinitialisé pour l’accès console.

Chez online par exemple, après s’être connecté en tant qu’utilisateur :

sudo su
mkdir ~/.ssh
echo "..." > ~/.ssh/authorized_keys
userdel tedomum
rm -rf /home/tedomum

… puis reconnexion directement en tant que root.

Gestion des paquets et nettoyage du système

Mettre à jour le sources.list :

deb http://ftp.fr.debian.org/debian stretch main
deb http://security.debian.org/ stretch/updates main
deb http://apt.dockerproject.org/repo debian-stretch main

Puis supprimer les paquets superflus :

apt autoremove -y exim4-base exim4-config bind9 exim4-config nfs-common pinentry-gtk2

Enfin, installer les outils de base :

apt install docker-engine cryptsetup btrfs-tools

On désactive le démon Docker par défaut afin que celui-ci ne démarre pas avant que LUKS ne soit monté :

systemctl disable docker

On installe Docker Compose depuis le site officiel (téléchargement via Github).

Partition de données

On complète en chiffrant la partition de données :

cryptsetup luksFormat /dev/md1
cryptsetup luksOpen /dev/md1 data
mkfs.btrfs /dev/mapper/data

On adapte en conséquence le fstab :

# /etc/fstab: static file system information.
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/md0	/               ext4    errors=remount-ro 0       1
/dev/mapper/data /srv           btrfs   defaults,noauto   0       2

Récupération de la configuration

La configuration est stockée sur un dépôt Git. On génère d’abord les clés SSH de l’hôte :

ssh-keygen -b 4096

On installe la clé publique sur le dépôt Git et on clône le dépôt en activant le sparse-checkout :

mount /srv
cd /srv
git init .
git remote add origin git@git.tedomum.net:tedomum/documentation.git
git config core.sparseCheckout true
echo core >> .git/info/sparse-checkout
echo other >> .git/info/sparse-checkout
git pull origin master

Configuration réseau

La configuration réseau est particulièrement simple. Les bridges sont créés par Docker. On copie et on adapte le fichier de configuration fourni :

cp /srv/other/interfaces /etc/network/interfaces
vim /etc/network/interfaces

Le fichier hôtes doit contenir quelques références :

2001:bc8:212d:121::12   logs.local # Adresse du serveur de logs
2001:bc8:212d:101::1    docker.local # Adresse du bridge Docker
2001:bc8:212d:1ff::1    services.local # Adresse où sont exposés les services
212.129.34.247          services.local
2001:bc8:212d:100::1    admin.local # Adresse d'administration
62.210.182.192          admin.local

Configuration docker

Docker est configuré directement dans /etc/docker/daemon.json, on copie la configuration :

cp /srv/other/docker/daemon.json /etc/docker/

La configuration désactive notamment le support iptables et le support du proxy userland, pour permettre au script nftables de fonctionner. Toutefois, Docker ne supporte pas encore la désactivation complète de iptables.

On force la désactivation des modules iptables :

cp /srv/other/modprobe.conf /etc/modprobe.d/iptables.conf

On installe ensuite le paquet de compatibilité iptables :

apt install iptables-nftables-compat
ln -s /sbin/iptables-compat /usr/local/sbin/iptables

On redémarre, puis on démarre Docker et crée le réseau par défaut (en adaptant les adresses IP) :

systemctl start docker
docker network create --ipv6 --subnet 172.18.0.0/16 --gateway 172.18.0.1 --subnet 2001:bc8:212d:101::/64 --gateway 2001:bc8:212d:101::1

Configuration des services mutualisés

Dans /srv/core, on crée un fichier .env contenant les adresses publiques pour les service HTTP :

ipv4=1.2.3.4
ipv6=2001:bc8:212d:1ff::1

On démarre ensuite les service mutualisés :

docker-compose up -d