Aller au contenu principal

Protéger les sites k3s avec Let’s Encrypt

· 3 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Le protocole HTTP, simple et efficace, a cependant un énorme défaut : toutes les informations envoyées sont "en clair". Donc cela signifie qu’elles peuvent être interceptées et modifiées par des personnes plus ou moins bien intentionnées (pirates, gouvernements, fournisseurs d’accès...)

Pourquoi passer vos sites en HTTPS

Le protocole HTTPS, lui, résout ce problème en encryptant les données avec le TLS (Transport Layer Security). C’est pourquoi Google a décidé en 2014 de mettre en avant les sites hébergés en HTTPS dans ses algorithmes de calcul des SERP.

Installer Helm

Helm est un package manager soutenu et recommandé par Kubernetes. Helm permet de déployer des applications ou des stacks complètes en utilisant un système de templating et de dépendances.

Un package Kubernetes est appelé Charts dans Helm. Ces Charts contiennent les informations nécessaires pour créer une instance d’application Kubernetes. Ces informations sont stockées dans des configs. Une fois instancié sur un cluster son occurrence s’appelle une release.

Installer Helm sur Ubuntu:

Rien de plus simple avec snap:

sudo snap install helm --classic

Tiller est préinstallé dans k3s, il est donc inutile de l’installer. Il suffit juste de l’initialiser :

kubectl create serviceaccount tiller --namespace=kube-systemhelm repo update
kubectl create clusterrolebinding tiller-admin --serviceaccount=kube-system:tiller --clusterrole=cluster-adminhelm repo update
helm init --service-account=tiller

Quelques commandes utiles

Voici quelques commandes de bases pour Helm :

  • helm install my-chart Instancie un release de votre chart : my-chart avec comme nom de release aléatoire dans votre cluster kubernetes
  • helm upgrade my-release my-chart Permet d’upgrade notre release avec une nouvelle version.
  • helm ls``` ou ```helm list Permet de lister les Charts installés sur votre Cluster
  • helm delete my-release Permet de désinstaller la release my-release de kubernetes

Installation de Cert-manager sur k3s

Cert-manager est une stack complète permettant de créer à la volée vos certificats :

helm repo add jetstack https://charts.jetstack.io && helm repo update
kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.8.1/deploy/manifests/00-crds.yaml
kubectl create namespace cert-manager
kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
helm install --name cert-manager --namespace cert-manager --version v0.8.1 jetstack/cert-manager --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer

Création d’un certificate issuer

Copier ces lignes en modifiant les infos <a changer> avec les vôtres dans un fichier lets-encrypt-issuer.yml :

apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  labels:
    name: letsencrypt-prod
  name: letsencrypt-prod
spec:
  acme:
    email: EMAIL-ADDRESS
    http01: {}
    privateKeySecretRef:
      name: letsencrypt-prod
    server: https://acme-v02.api.letsencrypt.org/directory

Appliquons-le maintenant :

kubectl apply -f lets-encrypt-issuer.yml

Intégration dans vos ingress

Ajouter les informations suivantes au metadata:

  annotations:
    kubernetes.io/ingress.class: "traefik"
    certmanager.k8s.io/issuer: "letsencrypt-prod"
    certmanager.k8s.io/acme-challenge-type: http01
    traefik.ingress.kubernetes.io/frontend-entry-points: http,https
    traefik.ingress.kubernetes.io/redirect-entry-point: https
    traefik.ingress.kubernetes.io/redirect-permanent: "true"

Ajouter également le certificat à la partie spec en faisant attention à mettre un secret unique si vous héberger plusieurs sites :

  tls:
  - hosts:
    - www.stephane-robert.info
    secretName: secret-tls-www

Ce qui donne par exemple :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    certmanager.k8s.io/acme-challenge-type: http01
    certmanager.k8s.io/issuer: letsencrypt-prod
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/frontend-entry-points: http,https
    traefik.ingress.kubernetes.io/redirect-entry-point: https
    traefik.ingress.kubernetes.io/redirect-permanent: "true"
  name: www-ingress
  namespace: default
spec:
  rules:
  - host: www.stephane-robert.info
    http:
      paths:
      - backend:
          serviceName: blog
          servicePort: webport
        path: /
  tls:
  - hosts:
    - www.stephane-robert.info
    secretName: secret-tls-www

Il faut attendre un peu de temps que cert-manager génère le certificat. Vous pouvez vérifier les logs du pod :

kubectl -n cert-manager logs -f cert-manager-xxxxxxxxx-xxxxxx

En cas d’upgrade

Il vaut mieux tout rincer, car sinon lors de l’upgrade vous aurez des erreurs dans les logs et ça ne fonctionnera pas !

helm delete --purge cert-manager
kubectl delete namespace cert-manager
kubectl delete -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.8.1/deploy/manifests/00-crds.yaml