Chapitre 03

Domaine, HTTPS et protection

Le nom, le certificat et le videur à l'entrée : trois choses que vous n'aurez presque jamais à faire vous-même. Voici quand même ce qui se passe, et les cas où il faut un coup de main.

Niveau intermédiaire  ·  Lecture 9 min  ·  Pour les développeurs

Renseignez le domaine de votre plateforme et votre namespace : les commandes et les manifestes de la page s'adaptent. Les valeurs restent dans votre navigateur.

01Choisir un nom

Tout nom sous demo.k8s.exemple.fr placé dans un Ingress est créé automatiquement dans le DNS. Une convention évite les collisions entre équipes :

Convention de nommage
<application>-<équipe>.demo.k8s.exemple.fr

boutique-mon-equipe.demo.k8s.exemple.fr
api-boutique-mon-equipe.demo.k8s.exemple.fr

Deux Ingress qui revendiquent le même nom se marchent sur les pieds : Traefik ne sait plus lequel servir, et le certificat de l'un peut écraser celui de l'autre. En cas de doute, un dig +short sur le nom avant de le choisir : une réponse veut dire qu'il est pris.

02Le certificat, sans rien faire

L'annotation cert-manager.io/cluster-issuer: letsencrypt et le bloc tls de l'Ingress suffisent. cert-manager prouve à Let's Encrypt que le nom vous appartient en publiant un fichier temporaire, obtient le certificat, le range dans le secret nommé par secretName, et le renouvelle un mois avant l'échéance.

Suivre l'émission
kubectl get certificate
kubectl describe certificate hello-tls      # en cas d'attente prolongée
kubectl get challenges                      # les défis en cours, s'il y en a
Let's Encrypt compte les essais

Let's Encrypt limite le nombre de certificats par nom et par semaine. Un Ingress supprimé et recréé en boucle pendant un après-midi de tests peut atteindre la limite. Gardez le même secretName : le certificat existant est réutilisé tant qu'il est valide.

03Le domaine d'un client

Pour servir www.client.fr, deux étapes :

  1. Chez le registraire du client, un enregistrement CNAME de www.client.fr vers le nom de l'application sur la plateforme.
  2. Le nom du client ajouté dans l'Ingress, dans tls.hosts et dans une règle.
DNS chez le client
www.client.fr.   3600  IN  CNAME  boutique-mon-equipe.demo.k8s.exemple.fr.
Extrait de l'Ingress
spec:
  tls:
    - hosts: [www.client.fr, boutique-mon-equipe.demo.k8s.exemple.fr]
      secretName: boutique-tls
  rules:
    - host: www.client.fr
      http: { paths: [ { path: /, pathType: Prefix,
              backend: { service: { name: boutique, port: { number: 80 } } } } ] }

Le certificat sera émis dès que le CNAME répond. Un domaine nu, sans www, ne peut pas porter de CNAME : on utilise alors un enregistrement A vers 203.0.113.47, en sachant qu'il faudra le modifier si l'adresse de la plateforme change un jour.

04CrowdSec, déjà en place

CrowdSec analyse les journaux de l'entrée HTTP de la plateforme, repère les scanners, les tentatives de force brute et les chemins connus des outils d'attaque, et bloque les adresses concernées, ainsi que celles signalées par la communauté CrowdSec. La protection est activée au niveau de la plateforme : vous n'avez rien à ajouter à vos Ingress.

Contrepartie : si vous lancez un outil d'audit agressif contre votre propre application, c'est votre adresse qui sera bannie. Prévenez l'administrateur avant de jouer au pirate ; il peut lever un blocage en une commande.

05L'IP réelle des visiteurs

La plateforme conserve l'adresse d'origine des visiteurs jusqu'à Traefik, qui la transmet à votre application dans l'en-tête X-Forwarded-For. Pour vos journaux et vos limitations de débit, faites confiance à cet en-tête quand la requête vient du réseau interne du cluster, et à lui seul : un en-tête ajouté par le visiteur lui-même ne prouve rien.

Vous codez, nous veillons sur le cluster

Cette plateforme existe pour que vos développeurs déploient sans attendre personne et sans ticket. Nous l'hébergeons et l'exploitons pour vous : réseau, certificats, sauvegardes, mises à jour et surveillance des attaques. Il vous reste le plus intéressant.