Mon blog avec HTTPS

· Read in about 4 min · (719 words)

Après les révélations de Snowden, j’ai décidé de sécuriser mon blog avec HTTPS.

Pour comprendre l’utilité de HTTPS, il est nécessaire de comprendre le problème avec un site qui n’implémente pas ce protocole. Quand vous établishez une connexion avec un site, comme mon blog, vous envoyez une requête et mon blog y répond et chaque paquets - requêtes et réponses, sont en clair. Parfois, vous envoyé des informations confidentielles (page d’authentification, édition de votre profil, …) and ces informations seront toujours transmises en clair. Nous pouvons imaginer qu’un hacker s’interpose entre vous et le site internet et il pourra lire ces données. Ce n’est pas très sécuriser pour vous car il risque d’avoir une usurpation d’identité.

Comment un hacker peut lire vos données entre vous et le site ? Quand vous vous connecter à un site interne, vous devez résoudre le nom de domaine (comme bucchino.org) en une adresse IP avec un résolveur DNS. Ce processus de résolution consist à contacter plusieurs serveur DNS pour obtenir cette IP, un hacker peut corrompre le cache DNS en insérant de fausse données, avec une attaque d’empoisonnement de cache. Pour résoudre ce problème, le fournisseur DNS doit mettre en place DNSSEC qui va garantir l’intégrité des données dans le DNS.

Alors, comment vais-je sécuriser mes connexions ? En utilisant un protocol de chiffrement, comme SSL ou TLS. Avec HTTP, nous ajoutons une nouvelle couche, qui va chiffrer les données HTTP avec un de ces protocols and garantir la sécurité des données. Ce protocole est HTTP over SSL.

Mes sites internet sont hébergés dans un environnement Docker et j’utilise un reverse proxy, Traefik pour rediriger mes requêtes dans le bon container. Traefik est en frontend. Avec Traefik, il est possible d’utiliser Let’s Encrypt, qui va générer mon certificat avec ma clé publique.

Avan, vous devez configurer votre serveur DNS et votre zone DNS doit contenir une entrée A pointant sur votre site internet. Pour ma part, j’ai deux entrées:

$ dig www.bucchino.org +noall +answer A; dig geoffrey.bucchino.org +noall +answer A

; <<>> DiG 9.10.3-P4-Debian <<>> www.bucchino.org +noall +answer A
;; global options: +cmd
www.bucchino.org.   5297    IN  A   176.137.208.123

; <<>> DiG 9.10.3-P4-Debian <<>> geoffrey.bucchino.org +noall +answer A
;; global options: +cmd
geoffrey.bucchino.org.  10800   IN  A   176.137.208.123

Pour générer un certificat avec Traefik, vous devez utiliser ACME protocol. Premièrement, vous devez configurer TRraefik, dans le fichier de configuration traefik.toml, ajouter ces lignes:

[acme]
    email = "[email protected]"
    # Only for test
    caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"
    # Uncomment this line for production
    #caServer = "https://acme-v02.api.letsencrypt.org/directory"
    entryPoint = "https"
    onHostRule = true
    storage = "/etc/traefik/acme.json"
    [acme.dnsChallenge]
        provider = "gandiv5"
        delayBeforeCheck = 0
    [[acme.domains]]
        main = "bucchino.org"
        sans = ["www.bucchino.org", "geoffrey.bucchino.org"]

La clé caServer contient le serveur AC (Autorité de Certification) qui va signer notre clé publique. La clé dnsChallenge va générer et renouveller notre certificat en utilisant DNS avec mon résolveur DNS gandi. Si vous utilisez Gandi, vous devez générer votre clé API. Nous allons voir après comment spécifier votre clé API. In acme.domains, je spécifie mon domain principale: bucchino.org, puis, je spécifie mes deux sites via SAN certificates.

Après ça, vous devez créer votre fichier de stockage pour le certificat:

$ touch acme.json && chmod 600 acme.json

Il est important de mettre en place le NAT pour votre container TRraefik, alors, j’ai spécifié cette ligne de commande dans IPTables:

sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/24 -j MASQUERADE

Pour générer mon certificat, j’ai choisis d’utiliser DNS challenge avec mon résolveur DNS Gandi. Alors, il est important de générer une nouvelle clé API pour autoriser Traefik à contacter GAndi. Pour générer cette clé, vous devez accéder dans la configuration de votre compte. Après avoir généré votre clé, vous devez la spécifier dans la variable d’environnement pour Traefik. Ci-dessous, vous pouvez voir mon docker-compose:

services:
  traefik:
    image: traefik:latest
    container_name: 'traefik'
    environment:
      - GANDIV5_API_KEY=<Your API KEY>
    ports:
      - '80:80'
      - "8383:8383"
      - '443:443'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/etc/traefik/traefik.toml
      - ./acme.json:/etc/traefik/acme.json
    labels:
      - "traefik.enable=false"
    depends_on:
      - geoffrey
      - www
      - www_en

Si vous remarquez, j’ai spécifier de monter le fichier de storage acme.json dans mon container Traefik. Puis, pour tous mes containers pour mes sites, j’ai spécifié ce point d’entrée:

labels:
  - "traefik.enable=true"
  - "traefik.frontend.rule=Host:<Host rule>"
  - "traefik.frontend.entryPoints=https"
  - "traefik.frontend.protocols=https"
  - "traefik.backend=<container name>"

Après ça, vous pouvez démarrer vos containers et attendre, parceque la génération du certificat prend quelques minutes.