Qu'est-ce que ça fait?

Une instance Nginx est installée sur le pare-feu Opnsense du serveur colocaté. Nginx sert de reverse proxy pour accepter les connections sur l'IP publique du routeur, qui peut ensuite rediriger les requêtes HTTP vers les divers services hostées sur les VMs des membres.

Comment ajouter un endpoint?

À faire une seule fois

  1. Pointer le nom de domaine à utiliser vers l'Opnsense, soit avec l'IP du firewall ou en ajoutant un record CNAME qui pointe sur mordor.urlab.be..

  2. Ajouter un nouvel utilisateur dans Services / ACME Client / Accounts avec:

    • Name: Ton username
    • E-Mail Address: Une vraie adresse email pour recevoir les notifications de Let's Encrypt si il y a un problème avec le certificat.
    • ACME CA: Let's Encrypt (option par défaut)
  3. Ajouter un nouvel accès au registrar DNS pour le domaine qui va être utilisé dans Services / ACME Client / Challenge Types avec:

    • Name: Peu importe, example: luxim-io-dns.
    • Challenge Type: DNS-01
    • DNS Service: Le nom du registrar qui gère le domaine. Par exemple, Gandi ou OVH.
    • Autres paramètres de l'API: Options qui diffèrent selon le provider, en général c'est une clé d'API qui est dispo sur le site de Gandi/OVH etc.
  4. Ajouter un nouvel upstream server dans Services / Nginx / Upstream / Upstream Server (petite flèche dans la barre de menu en haut) avec:

    • Description: Un nom qui explique à qui appartient la VM.
    • Server: L’adresse IP du serveur qui héberge le service. Peut être une IP privée d'une VM ou une IP publique.
    • Port: Le port du service.
    • Server Priority: 1, ou la priorité du serveur si il y a redondance.

À faire à chaque fois

  1. Créer un nouveau certificat depuis Let's Encrypt dans Services / ACME Client / Certificates avec:

    • Common Name: Le nom de domaine, par exemple monservice.lol.urlab.be.
    • ACME Account: L'utilisateur ACME créé dans la partie précédente.
    • Challenge Type: Le challenge créé précédemment, par exemple luxim-io-dns.
    • Auto Renewal: Cocher pour activer le renouvellement automatique du certificat.
    • Renewal Interval: Laisser à 60 pour renouveler tous les deux mois.
  2. Cliquer sur le bouton "Issue or renew certificate" à droite du nom du certificat. Attendre entre 30 secondes et 10 minutes selon le registrar que le certificat soit émis. Quand c'est fait, la colonne "Last ACME status" affiche OK et les logs d'ACME client indiquent AcmeClient: imported ACME X.509 certificate: lesous.nomdedomaine.com.

  3. Ajouter un nouvel upstream dans Services / Nginx / Upstream avec:

    • Cliquer sur Advanced mode en haut à gauche pour afficher les options avancées.
    • Description: Une bonne description de ce que le service fait.
    • Server Entries: Le ou les serveurs qui hébergent le service (c'est le truc de l'étape juste avant)
    • Enable TLS (HTTPS): Cocher si on veut que Nginx communique avec le backend en HTTPS/TLS.
    • TLS: Servername overrride: Si le backend attend un nom de domaine spécifique pour donner la bonne réponse aux requêtes, entrer le nom de domaine à envoyer au backend. Utile par exemple pour Traefik/virtual hosting ou pour proxy vers un site public.
    • TLS: Verify Certificate: Décocher si le certificat du backend est self-signed ou pas fourni par un CA public. Sinon Nginx va retourner une erreur à chaque fois si le backend essaye de parler en TLS avec un certificat auquel il ne fait pas confiance. Ça devrait être possible d'utiliser un certificat signé par l'opnsense lui-même (il y a un CA qui s'appelle UrLab Internal Web CA dans System / Trust / Authorities) mais c'est pas encore testé.
  4. Créer une nouvelle Location dans Services / Nginx / HTTP(S) / Location (petite flèche dans la barre de menu en haut) avec:

    • Description: Une bonne description du service.
    • URL Pattern: /
    • Match Type: None
    • Upstream Servers: Le upstream qu'on a créé plus haut.
  5. Créer un nouveau HTTP server dans Services / Nginx / HTTP(S) / HTTP Server avec:

    • HTTP Listen Address: Laisser par défaut pour accepter les connections HTTP non encryptées, ou enlever les ports 80 pour autoriser uniquement le HTTPS. Si ce champ est vide, Nginx est configuré pour rediriger automatiquement les requêtes du port 80 vers le port 443 en HTTPS.
    • HTTPS Listen Address: Laisser par défaut (443, [::]:443) pour écouter en IPv4 et IPv6.
    • Server Name: Le nom de domaine du serveur, par exemple monservice.lol.urlab.be.
    • Locations: La Location qu'on a créé plus haut.
    • TLS Certificate: Le nom du certificat qu'on a créé plus haut.
    • Enable Let's Encrypt Plugin Support: Laisser coché, ne semble pas avoir d'effet.
    • HTTPS Only: Cocher pour forcer la connection à utiliser le HTTPS (sans effet si il n'y a pas de port HTTP spécifié plus haut).

Fonctionnalités intéressantes de Nginx à explorer

  • Possibilité de définir des pages d'erreur custom si le backend est indisponible.
  • Possibilité de réécrire les URLs dynamiquement avec des regexs (par exemple, pour envoyer plusieurs domaines vers un seul backend, ou pour remplacer les extensions: https://mondomaine.com/file/23 -> mondomaine.com/file_23.pdf)
  • Rate limiter les requêtes au niveau du proxy pour éviter de surcharger le backend.
  • Ajouter automatiquement des flags de sécurité aux headers: Referrer, XSS Protection, HSTS, CSP...
  • Communiquer en HTTPS même si le backend supporte seulement HTTP.
  • Ajouter une liste de credentials et forcer le client à s'authentifier à Nginx avant d'accéder aux ressources derrière.
22 septembre 2022 00:16

modifié par: luxim
commentaire: Ajouter plus d'espaces

Visualiser
22 septembre 2022 00:15

modifié par: luxim
commentaire: Ajouter des espaces

Visualiser
22 septembre 2022 00:14

modifié par: luxim
commentaire: Expliquer comment faire marcher Nginx.

Visualiser