Aller au contenu

Protéger les sites k3s avec Let’s Encrypt

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:

Terminal window
sudo snap install helm --classic

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

Terminal window
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 :

Terminal window
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 :

Terminal window
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 :

Terminal window
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 !

Terminal window
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