Code source wiki de Mettre en place un sous-domaine
Version 3.19 par Clément AUBIN le 2021/04/18 10:32
Masquer les derniers auteurs
author | version | line-number | content |
---|---|---|---|
|
1.2 | 1 | Lorsqu'une VM est mise en place, et que le service qu'elle doit héberger est installé, il est grand temps de rendre ce service accessible à l'extérieur du réseau d'ATILLA. |
|
1.3 | 2 | |
|
2.1 | 3 | {{toc/}} |
|
1.3 | 4 | |
|
2.1 | 5 | =Idée générale= |
|
1.4 | 6 | |
|
2.1 | 7 | Avant de suivre les étapes de mise en place, c’est intéressant de comprendre ce qu’on va faire ^^. |
8 | |||
9 | Dans l'infra d'ATILLA, les connexions à un service web (members.atilla.org, learn.atilla.org, …) passent en grande majorité par Bill, qui acte comme d'un frontal web : c’est lui qui réceptionne les connexions HTTP(s) et qui les renvoie aux bons services internes par la suite. On dit également que Bill joue le rôle de //reverse-proxy//. | ||
10 | |||
11 | En plus de cela, Bill gère la terminaison des connexions HTTPs : c’est à dire que lorsqu’une connexion HTTPs arrive sur Bill, elle est déchiffrée, puis renvoyée en HTTP à la machine virtuelle qui correspond. Cela permet de ne pas complexifier l’installation des services, et d’avoir un endroit central ou gérer les certificats SSL. | ||
12 | |||
13 | [[image:reverse-proxy-arch.png]] | ||
14 | |||
15 | En pratique, Bill dispose d'un serveur Nginx, qui va avoir réceptionner toute requête HTTP(s) sur un des sites d'ATILLA et qui transfère cette requête à la VM qui héberge le service correspondant. | ||
16 | |||
17 | =Enregistrement du sous-domaine= | ||
18 | |||
|
3.2 | 19 | La première chose à faire est de déclarer au monde que le domaine sur lequel vous souhaitez déployer votre service existe. Il n’y a pas de convention à proprement parler sur le choix du sous-domaine. Si vous déployez un service de gestion de tickets (par exemple, GLPI), le domaine auquel ce service pourra être accessible peut très bien être ##glpi.atilla.org## ou même ##tickets.atilla.org##. |
20 | |||
21 | Pour déclarer ce domaine, rendez-vous sur la machine qui sert de DNS dans l’infra (aujourd’hui, il s’agit de Bill). Deux fichiers devront être édités : | ||
22 | * ##/etc/bind/internal/db.atilla.org## : les entrées DNS qui sont exposées à tous les utilisateurs au sein du réseau d’ATILLA et de l’EISTI | ||
23 | * ##/etc/bind/external/db.atilla.org## : les entrées DNS qui sont exposées à tous les utilisateurs venant de l’extérieur | ||
24 | |||
|
3.7 | 25 | Dans ces deux fichiers, rajoutez une ligne comme celle-ci (note : les sous-domaines sont triés par ordre alphabétique) : |
|
3.2 | 26 | |
27 | {{code language="none"}} | ||
28 | monservice IN CNAME bill | ||
29 | {{/code}} | ||
30 | |||
31 | … puis redémarrez le serveur DNS : | ||
32 | |||
33 | {{code language="none"}} | ||
34 | systemctl restart bind9 | ||
35 | {{/code}} | ||
36 | |||
37 | Cela aura pour effet de déclarer le sous-domaine ##monservice.atilla.org##. | ||
38 | |||
39 | Si vous devez déclarer un service sur ##*.eistiens.net##, il faudra éditer les fichiers ##db.eistiens.net## dans les dossiers ##internal## et ##external## de la configuration du DNS. | ||
40 | |||
|
3.4 | 41 | {{warning}} |
42 | Lorsqu’on fait une modification dans une configuration DNS, il y a toujours un temps dit de "propagation", pendant lequel l’entrée qui a été déclarée n’est pas tout de suite accessible par tout le monde. Cela peut prendre jusqu’à 24h pour qu’une entrée soit réellement accessible par tous. Cela est également vrai lorsqu’on modifie ou supprime une entrée. | ||
43 | {{/warning}} | ||
44 | |||
|
3.3 | 45 | =Mise en place des certificats SSL= |
|
3.2 | 46 | |
|
3.5 | 47 | Maintenant qu’on a notre domaine, on va pouvoir récupérer des certificats SSL nous permettant de mettre en place le HTTPs sur ce domaine. |
|
3.2 | 48 | |
|
3.8 | 49 | L’idée, c’est de récupérer des informations (en l’ocurrence, un certificat et sa clé) nous permettant d’attester que le frontal web est bien le serveur qui correspond au domaine ##monservice.atilla.org##. Lorsqu’un utilisateur se connectera en HTTPs à ce domaine, la première action qui sera effectuée par le navigateur sera de vérifier que le serveur auquel il se connecte est bien le bon, et qu’il peut lui faire confiance. |
|
2.1 | 50 | |
|
3.8 | 51 | Il existe plusieurs fournisseurs de certificats SSL dans le monde. ATILLA utilise [[Let’s Encrypt>>https://letsencrypt.org/]], qui nous permet, une fois le certificat mis en place une première fois, de ne pas avoir à se soucier de son renouvellement (le renouvellement de tous les certificats est ensuite effectué de manière automatique). |
|
3.5 | 52 | |
|
3.8 | 53 | Let’s Encrypt vient avec un outil, appelé ##certbot##, qui permet d’enregistrer de nouveaux certificats SSL. On va utiliser cet outil pour demander le nouveau certificat. |
|
3.5 | 54 | |
|
3.8 | 55 | {{warning}} |
56 | La procédure pour demander un nouvau certificat SSL consiste à **éteindre** le serveur frontal, laisser ##certbot## vérifier que le serveur répond bien au domaine qu’on souhaite certifier, puis rallumer le serveur frontal. Cela occasionne généralement une interruption de service pour la grande majorité des domaines d’atilla.org et d’eistiens.net. Pour éviter que la coupure de service ne dure trop longtemps, assurez vous que Nginx est bien redémarré après la procédure. | ||
57 | {{/warning}} | ||
58 | |||
|
3.9 | 59 | Pour la demande du nouveau certificat, utilisez la commande suivante. Lorsque certbot demande quelle méthode de vérification utiliser pour générer le certificat, choisissez //Spin-up a temporary webserver//. |
60 | |||
|
3.17 | 61 | {{code language="shell"}} |
|
3.9 | 62 | systemctl stop nginx && certbot certonly -d monservice.atilla.org && systemctl start nginx |
|
3.8 | 63 | {{/code}} |
64 | |||
|
3.9 | 65 | Si certbot termine avec un message du type //Congratulations! Your certificate and chain … bla bla bla//, ça veut dire que c’est bon, le certificat a bien été enregistré. Il doit maintenant être stocké dans ##/etc/letsencrypt/live/monservice.atilla.org/##. |
66 | |||
67 | Si vous n’avez pas ce genre de message, avant de démarrer tout diagnostique, assurez-vous de bien redémarrer le serveur Nginx, pour éviter toute interruption de service trop longue : | ||
68 | |||
|
3.17 | 69 | {{code language="shell"}} |
|
3.9 | 70 | systemctl start nginx |
71 | ## Pour vérifier que tout va bien | ||
72 | systemctl status nginx | ||
73 | {{/code}} | ||
74 | |||
|
2.1 | 75 | =Mise en place de la configuration Nginx= |
|
3.10 | 76 | |
77 | Finalement, on va devoir mettre en place la configuration qui va tout lier ensemble, c’est elle qui va indiquer que, lorsqu’un utilisateur se connecte au service, on utilisera le certificat SSL qui a été généré plus haut, et on enverra les connexions à la machine voulue. | ||
78 | |||
|
3.11 | 79 | ==Méthode manuelle== |
|
3.10 | 80 | |
|
3.13 | 81 | ===Création de la configuration=== |
82 | |||
|
3.14 | 83 | On va créer la configuration d’Nginx dans le dossier ##/etc/nginx/sites-available##. Par convention, le nom du fichier de configuration va correspondre au nom du domaine sur lequel on expose le service. Dans notre cas, il s’agira de ##monservice.atilla.org##. |
84 | |||
85 | La plupart du temps, si on ne veut pas s’embêter dans la mise en place de la configuration, le plus simple consiste à copier / coller une configuration d’un service existant, en espérant que celle-ci soit suffisamment standard pour que ça marche. | ||
86 | |||
87 | Voici à peu près ce à quoi doit ressembler la configuration. Attention : il est possible que cela change au fil du temps et que le contenu de ce tuto n’ait pas été mis à jour :). | ||
88 | |||
89 | {{code language="none"}} | ||
90 | server { | ||
91 | listen 80; | ||
92 | server_name monservice.atilla.org; | ||
93 | return 301 https://monservice.atilla.org$request_uri; | ||
94 | } | ||
95 | |||
96 | server { | ||
97 | listen 443 ssl http2; | ||
98 | |||
99 | server_name monservice.atilla.org; | ||
100 | |||
101 | ssl on; | ||
102 | ssl_certificate_key /etc/letsencrypt/live/monservice.atilla.org/privkey.pem; | ||
103 | ssl_trusted_certificate /etc/letsencrypt/live/monservice.atilla.org/chain.pem; | ||
104 | ssl_certificate /etc/letsencrypt/live/monservice.atilla.org/fullchain.pem; | ||
105 | |||
106 | access_log /var/log/nginx/monservice.atilla.org/access.log; | ||
107 | error_log /var/log/nginx/monservice.atilla.org/error.log; | ||
108 | |||
109 | location / { | ||
110 | proxy_set_header Host $host; | ||
111 | proxy_set_header X-Forwarded-For $remote_addr; | ||
112 | proxy_pass http://monservice-prod.prod.infra.atilla.org/; | ||
113 | } | ||
114 | } | ||
115 | {{/code}} | ||
116 | |||
|
3.19 | 117 | Voici ci-après une description rapide des contenus de ce fichier. |
|
3.18 | 118 | |
|
3.19 | 119 | On commece par le premier bloc ##server##, celui-ci est très simple et concis, son job, c'est de rediriger tout le traffic HTTP qui arrive sur monservice.atilla.org en HTTPs. |
120 | |||
|
3.18 | 121 | {{code language="none"}} |
|
3.19 | 122 | server { |
123 | listen 80; | ||
124 | server_name monservice.atilla.org; | ||
125 | return 301 https://monservice.atilla.org$request_uri; | ||
126 | } | ||
|
3.18 | 127 | {{/code}} |
128 | |||
|
3.19 | 129 | Le second bloc ##server## permet de définir comment va être géré le traffic HTTPs, c'est ici qu'on a la plupart de la configuration importante. |
130 | |||
131 | |||
132 | |||
133 | |||
|
3.13 | 134 | ===Création du dossier de logs=== |
135 | |||
|
3.16 | 136 | ===Activation de la configuration Nginx=== |
|
3.13 | 137 | |
|
3.12 | 138 | ==Méthode plus ou moins automatique== |
|
3.11 | 139 | |
|
3.12 | 140 | On a un [[super projet sur GitLab>>https://gitlab.atilla.org/adminsys/nginx-config-generator]] qui permet d’effectuer les actions de la méthode manuelle de manière automatique. Ce projet est présent sur ##/root/nginx-config-generator## sur Bill, voici comment l’utiliser rapidement. En cas de besoin, référez vous au ##README.md## du projet. |
141 | |||
142 | {{code language="shell"}} | ||
143 | cd /root/nginx-config-generator | ||
144 | source venv/bin/activate | ||
145 | python nginx-config.py monservice.atilla.org monservice-prod.prod.infra.atilla.org | ||
146 | ## On vérifie que tout va bien avec la config qui a été générée | ||
147 | nginx -t | ||
148 | ## On redémarre | ||
149 | systemctl restart nginx | ||
150 | {{/code}} |