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