Sécuriser ses sites tournant sous k3s avec Let’s Encrypt
Publié le : 9 octobre 2019 | Mis à jour le : 22 janvier 2023Le 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 kuberneteshelm 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 Clusterhelm 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 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