Deux reverse-proxys sont installés, sur proxy.adm.auro.re pour les services sur les serveurs à Saclay et proxy-ovh.adm.auro.re pour ceux installés sur une machine virtuelle à OVH.
Un reverse-proxy permet à partir d'une URL de rediriger vers le bon
service. Ainsi, un seul serveur expose les port 80
et 443
et protège les
machines virtuelles du monde extérieur.
Le reverse-proxy est entièrement géré par Ansible, et il est proscrit de modifier la configuration à la main.
Le rôle Ansible est disponible sur Gitea.
Tout se passe dans les fichiers host_vars/proxy*.adm.auro.re
. Ce
fichier de configuration est séparé en deux sections :
Certbot est un outil qui permet de générer et de signer des certificats afin de sécuriser les connexions. C'est ce qui fournit le HTTPS.
Dans cette configuration, on définit l'ensemble des domaines qui vont être signés. Sur le proxy local, à l'heure où cette documentation est écrite, on a la configuration suivante :
certbot:
domains:
- bbb.auro.re
- drone.auro.re
- gitea.auro.re
- intranet.auro.re
- nextcloud.auro.re
- re2o.auro.re
- re2o-server.auro.re
- re2o-test.auro.re
mail: tech.aurore@lists.crans.org
certname: auro.re
Le mail permet d'indiquer à letsencrypt qui contacter lorsque des certificats arriveront à expiration.
C'est tout ce qu'il y a à changer pour les certificats de sécurité. Il n'est pas nécessaire de faire un appel à certbot : Ansible détecte lorsque cette liste est modifiée et régénère le certificat si nécessaire. Si toutefois il s'avère nécessaire d'appeler Certbot manuellement, la commande à exécuter est :
certbot --config /etc/letsencrypt/conf.d/auro.re.ini certonly
Nginx sert effectivement de reverse-proxy, et c'est lui qui est chargé d'écouter les connexions entrantes et de les rediriger là où il faut.
La section ssl
n'est pas à toucher, elle indique où doivent se
trouver les certificats :
ssl:
cert: /etc/letsencrypt/live/auro.re/fullchain.pem
cert_key: /etc/letsencrypt/live/auro.re/privkey.pem
trusted_cert: /etc/letsencrypt/live/auro.re/chain.pem
La section redirect_dnames
permet de gérer les redirections *.ndd1 -> .ndd2
. Par exemple, on peut avoir une redirection wiki.aurores.net -> wiki.auro.re
. Les noms de domaines doivent exister et être bien
configurés pour que la redirection fonctionne, bien que Nginx s'en
fiche (et heureusement car la redirection citée n'est pas
fonctionnelle).
La section redirect_tcp
permet de rediriger un port non conventionnel
(ni 80 ni 443, pas quelque chose basé sur le protocole HTTP) vers un
service. C'est le cas par exemple de
Gitea, qui redirige le port 2222 vers le
port 2222 du service.
redirect_tcp:
- name: Gitea
port: 2222
destination: "10.128.0.60:2222"
Le champ name
n'est utile que pour le lecteur. Une telle
configuration permettra de rediriger *.auro.re:2222
->
10.128.0.60:2222
, et en particulier de pouvoir se connecter en SSH sur
gitea.auro.re:2222
.
La section redirect_sites
permet de faire directement une redirection
d'un site à un autre, comme www.auro.re
-> auro.re
:
redirect_sites:
- from: www.auro.re
to: auro.re
Enfin, la section reverseproxy_sites
configure le reverse-proxy. Cela
consiste juste en une liste d'objets avec un champ from
et un champ
to
, et une connexion entrante sur l'URL from
sera redirigée vers le
service présent au chemin to
.
reverseproxy_sites:
- from: wiki.auro.re
to: 10.128.0.51
Il suffit donc de 2 lignes pour configurer le reverse-proxy pour un service.
Le rôle Ansible du reverse-proxy est disponible ici et celui de certbot ici.
Concernant certbot, Ansible commence par installer certbot
et le
plugin python3-certbot-nginx
:
sudo apt update
sudo apt install certbot python3-certbot-nginx
Ansible copie ensuite la configuration de letsencrypt dans
/etc/letsencrypt/conf.d/auro.re.ini
, à partir des informations données
en configuration :
# Pour appliquer cette conf et générer la conf de renewal :
# certbot --config /etc/letsencrypt/conf.d/auro.re.ini certonly
# Use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096
# Always use the staging/testing server
# server = https://acme-staging.api.letsencrypt.org/directory
# Uncomment and update to register with the specified e-mail address
email = tech.aurore@lists.crans.org
# Uncomment to use a text interface instead of ncurses
text = True
# Use nginx challenge
authenticator = nginx
cert-name = auro.re
domains = auor.re, www.auro.re, wiki.auro.re, ...
Puis, si ce fichier a été modifié (et donc si un domaine a été rajouté ou enlevé), Ansible appelle :
certbot --config /etc/letsencrypt/conf.d/auro.re.ini certonly
et redémarre bien Nginx.
Pour ce qui concerne Nginx, Ansible commence par installer Nginx :
sudo apt update
sudo apt install nginx
Puis il copie des fichiers utiles à letsencrypt. Ensuite, il installe tous les différents sites. Les templates utilisés sont disponibles ici.
Il y a donc un fichier redirect
qui contient les redirections de site,
reverseproxy
qui contient les redirections de service et
reverseproxy_redirect_dname
qui s'occupe des redirections pour les
noms de domaines alternatifs. Pour ce qui concerne les redirections TCP,
il s'agit d'un module Nginx lançant un serveur de stream écoutant sur
le port demandé et redirigeant au bon endroit, ignorant les certificats
de sécurité.
Enfin, Ansible recharge la configuration de Nginx.