Renouvellement de certificats LetsEncrypt avec systemd

Qu'est-ce que c'est donc ?

« Let's Encrypt (abrégé LE) est une autorité de certification lancée le 3 décembre 2015 (Bêta Version Publique). Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique TLS au moyen d'un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l'installation et le renouvellement des certificats pour la sécurisation des sites internet1. » (Contenu soumis à la licence CC-BY-SA 3.0. Source : Article Let's Encrypt de Wikipédia en français (auteurs) )

Bref, c'est bien pratique pour faire du HTTPS (entre autres) et on peut automatiser le renouvellement des certificats. Il y a plusieurs années, j'aurais fait un cron, mais comme j'ai appris que systemd pouvait gérer des tâches répétitives, je me suis dit que c'était l'occasion de m'y mettre ! 😉

Comment on fait ?

Voici les étapes suivies, détaillées ci-dessous puis quelques documents qui m'ont permis de le faire, sans compter le conseil d'un ami: « T'as qu'à faire un timer ! » :

  • Copier certbot sur le serveur, logiciel (libre, non-copyleft) de gestion des certificats de Let's Encrypt
  • Créer un script pour renouveler les certificats avec certbot
  • Créer un service systemd pour lancer le script
  • Créer une minuterie (timer) systemd pour lancer le service à intervalles réguliers

Enfin, activer et lancer la minuterie puis vérifier que ça fonctionne.

1. Copier certbot sur le serveur

Je le copie dans le dossier /opt du serveur:

root@serveur:~# cd /opt/ && git clone https://github.com/certbot/certbot
[…]

2. Créer le script pour utiliser certbot

Le script se nomme certbot-renew, il est créé dans /opt/certbot/, au même endroit que certbot. Créez aussi le dossier pour les journaux avec la commande mkdir /var/log/letsencrypt/.

Si vous utilisez le serveur web apache, changez le service que systemd doit arrêter et redémarrer, en gras dans le code ci-dessous:

root@serveur:~# cat > /opt/certbot/certbot-renew << EOF
#!/bin/sh
# Inspired by <https://letsencrypt.org/getting-started/>
systemctl stop nginx.service
/opt/certbot/certbot-auto renew -nvv --standalone > /var/log/letsencrypt/renew.log 2>&1
LE_STATUS=$?
systemctl start nginx.service
if [ "$LE_STATUS" != 0 ]; then
echo Automated renewal failed:
tail -n 200 /var/log/letsencrypt/renew.log
exit 1
fi
EOF

3. Créer le service systemd

C'est ce service qui va lancer le script /opt/certbot/certbot-renew créé à l'étape précédente:

root@serveur:~# cat > /etc/systemd/system/certbot-renew.service << EOF
# Voir <https://mjanja.ch/2015/06/replacing-cron-jobs-with-systemd-timers/>
[Unit]
Description=Renouvellement des certificats letsencrypt

[Service]
Type=simple
nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/opt/certbot/certbot-renew
EOF

4. Créer la minuterie systemd

C'est cette minuterie qui va lancer le service créé à l'étape précédente. Notez que la valeur daily pour OnCalendar lance le service à minuit. Comme le serveur était programmé pour faire d'autres choses à minuit, j'ai utilisé un autre moment. ^^

root@serveur:~# cat > /etc/systemd/system/certbot-renew.timer << EOF
# Voir <https://mjanja.ch/2015/06/replacing-cron-jobs-with-systemd-timers/>
[Unit]
Description=Renouvellement des certificats letsencrypt

[Timer]
#OnCalendar=daily
OnCalendar=*-*-* 04:20:42

[Install]
WantedBy=timers.target
EOF

 

Il ne reste plus qu'à activer cette minuterie pour qu'elle soit lancée à chaque démarrage du serveur:  systemctl enable certbot-renew.timer

Pour éviter un redémarrage, la minuterie peut être lancée manuellement: systemctl start certbot-renew.timer

Pour vérifier que tout fonctionne bien le service peut aussi être lancé manuellement: systemctl start certbot-renew.service. Vérifiez alors les journaux pour voir si tout s'est bien déroulé.

 

Voici donc comment j'ai procédé, il doit exister bien d'autres façons de faire, n'hésitez-pas à m'en faire part et/ou à améliorer ce que je présente ici.

Documentation, ressources:

Manuels de systemd: systemd.exec, systemd.service et systemd.timer.
Manuel de ioprio_set.
Remplacer les cron jobs par des minuteries systemd (en anglais).
Pour débuter avec Let's Encrypt (en anglais).

Un brin de persévérance, un tonneau de tests et quelques couplets de corrections. 😉

 

Debian Jessie et Thinkpad X201 – première configuration

Après avoir installé Debian sur mon ordinateur, j'ai commencé à installé mon environnement habituel.

Sauvegarde

Je commence par sauvegarder les éléments essentiels pour accéder au disque chiffré tout récemment installé:

$ sudo fdisk -l /dev/sda | sudo tee fdisk-l_dev_sda
$ sudo cryptsetup luksHeaderBackup --header-backup-file header_dev_sda5 /dev/sda5

Je copie ensuite ces 2 éléments sur une autre machine, dans un endroit pas (assez) protégé.

Edit: désormais, j'utilise sfdisk pour sauvegarder la table des partitions:

$ sudo sfdisk -d -uB /dev/sda > sfdisk-d-uB_dev_sda

Installation de mes outils usuels

Il s'agit d'installer un éditeur de texte, un shell et son environnement, un gestionnaire de fenêtres (Windows Manager), un gestionnaire de trousseaux de mots de passes, et de permettre à l'utilisateur fernando d'accéder aux journaux et aux commandes d'administration.

# apt-get install sudo vim zsh keepassx awesome vcsh screen wireshark
# adduser fernando sudo
# adduser fernando adm
# adduser fernando staff
# adduser fernando wireshark

 

Récupération des configurations

Une fois les outils installés, je récupère mes clés ssh sauvegardées (tout le dossier ${HOME}/.ssh) et je l'utilise pour récupérer mes différentes configurations:

$ vcsh clone git@oasis.demo-tic.org:fernando/mr.git
…là, ça défile…
$ cd .config/mr/config.d/
$ ln -sf ../available.d/vim.vcsh vim.vcsh
$ ln -sf ../available.d/zsh.vcsh zsh.vcsh
$ ln -sf ../available.d/awesome.vcsh awesome.vcsh
$ cd
$ mr update
…là, ça défile encore…
$ chsh
Mot de passe :
Changement d'interpréteur de commandes initial pour fernando
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
Interpréteur de commandes initial /bin/sh: /usr/bin/zsh

Enfin, je configure la disposition du clavier (j'utilise bépo), en utilisant ALT droite pour ALT-GR et la touche logo de gauche pour compose:

$ sudo dpkg-reconfigure keyboard-configuration

Debian Jessie et Thinkpad X201

Voici comment j'ai procédé pour installer Debian Jessie sur mon Thinkpad X201.

Téléchargement installateur et création de clé USB de démarrage

J'ai téléchargé l'installateur, encore en cours de développement sur <https://www.debian.org/devel/debian-installer/>.
J'ai rendu bootable une clé USB avec la commande suivante (attention à /dev/sdc : cela dépend de votre configuration !):
sudo cp debian-jessie-DI-b1-amd64-netinst.iso /dev/sdc

Choix du mirroir Debian

J'ai configuré manuellement le miroir http.debian.net avec le dossier /debian/.
Cela me permet d'utiliser le miroir le plus proche du réseau au moment où je suis connecté. Voir sur http://http.debian.net pour plus d'informations.

Formatage et partitionnement du disque dur

Durant l'installation, j'ai indiqué vouloir utiliser tout mon disque dur du LVM chiffré avec une partition /home séparée. J'ai ensuite modifié les partitions proposées par défaut pour utiliser:

  • 8Go de swap (au lieu des 16Go proposés)
  • 40Go pour / (au lieu des 10Go proposés)
  • le reste pour /home

Choix des programmes

J'ai installé les éléments proposés par défaut et ajouté le dernier:

  • Environnement graphique de bureau
  • Serveur d'impression
  • Ordinateur portable
  • Système standard
  • Serveur ssh (ajout personnel)

Et voilà: une Debian Jessie qui fonctionne avec XFCE !