Run2 - Certificats
Quickstart : Déploiement de cert-manager sur k3s avec Traefik sur une machine virtuelle
Ce quickstart guide à travers l'installation et la configuration de cert-manager sur k3s avec Traefik sur une machine virtuelle. Pour plus de détails, visitez la documentation officielle de cert-manager.
Étape 1 : Installer k3s
- Installer k3s avec Traefik activé
curl -sfL https://get.k3s.io | sh -
Vérifiez que kubectl utilise le bon contexte
kubectl config view
Assurez-vous que kubectl pointe vers le bon cluster
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
Étape 2 : Installer Helm
- Installer Helm
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
Étape 3 : Ajouter le dépôt de cert-manager
- Ajouter le dépôt Helm de cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
Étape 4 : Installer cert-manager
- Créer un namespace pour cert-manager
kubectl create namespace cert-manager
- Installer cert-manager
helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.6.1 --set installCRDs=true
Étape 5 : Configurer l'Issuer et le Certificate
- Configurer l'Issuer (issuer.yaml)
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-staging
namespace: cert-manager
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: your-email@%YOURDOMAIN%
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: traefik
- Configurer le Certificate (certificate.yaml)
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: cert-manager
spec:
secretName: example-com-tls
issuerRef:
name: letsencrypt-staging
commonName: %YOURDOMAIN%
dnsNames:
- %YOURDOMAIN%
- Appliquer les configurations
kubectl apply -f issuer.yaml
kubectl apply -f certificate.yaml
Étape 6 : Vérifier le fonctionnement
kubectl get events -w -n cert-manager
kubectl logs -n cert-manager deploy/cert-manager
kubectl describe issuer letsencrypt-staging -n cert-manager
kubectl get secret letsencrypt-staging -n cert-manager -o yaml
Historique de l'Intégration des Certificats TLS dans Kubernetes
- Débuts de Kubernetes (2014-2016) : La gestion des certificats TLS était principalement manuelle. Les utilisateurs devaient configurer leurs certificats et secrets TLS directement.
- Introduction des Ingress Controllers : Avec l'apparition des Ingress controllers comme NGINX, HAProxy, et Traefik, la gestion des certificats TLS est devenue plus automatisée et intégrée. Let's Encrypt et des projets comme Cert-Manager ont facilité l'obtention et le renouvellement des certificats.
- Émergence des Services Mesh (2016-2018) : Les services mesh ont introduit la gestion automatique des certificats TLS pour sécuriser les communications entre microservices au sein du cluster.
- Gateway API (2020-présent) : Le modèle Gateway API offre des capacités avancées de gestion des certificats TLS, intégrant des fonctionnalités issues des services mesh et des Ingress controllers.
Interaction des Services Mesh, des Ingress et des Gateway avec les Certificats TLS dans Kubernetes
La gestion des certificats TLS dans Kubernetes a évolué pour offrir des solutions automatisées et intégrées, simplifiant la sécurité des communications entre services.
Les évolutions récentes comme la Gateway API et les avancées dans les services mesh continuent de pousser cette intégration vers des modèles plus flexibles, sécurisés et automatisés.
Services Mesh
Les services mesh comme Istio, Linkerd et Consul Connect offrent des fonctionnalités avancées de gestion du trafic et de sécurité, y compris la gestion des certificats TLS. Voici comment ils interagissent avec les certificats TLS :
- MTLS (Mutual TLS) : Les services mesh implémentent généralement MTLS pour sécuriser les communications entre les microservices. Chaque service reçoit un certificat TLS et l'infrastructure du mesh gère la rotation et le renouvellement de ces certificats.
- Certificats Automatisés : Des solutions comme Istio utilisent des composants comme
Citadel
(maintenant intégré dansistiod
) pour générer et distribuer des certificats automatiquement. - Configuration Simplifiée : Les services mesh simplifient la configuration TLS pour les développeurs en centralisant la gestion des certificats et en appliquant des politiques de sécurité uniformes à travers le mesh.
Ingress
Le modèle Ingress dans Kubernetes permet de gérer les connexions HTTPS entrantes vers les services dans un cluster.
- Annotations TLS : Les ressources Ingress permettent d'utiliser des annotations pour spécifier des certificats TLS, souvent stockés dans des Secrets Kubernetes.
- Contrôleurs Ingress : Les contrôleurs Ingress (comme NGINX, Traefik) gèrent l'application des certificats TLS. Ils peuvent intégrer des solutions comme Let's Encrypt pour automatiser l'obtention et le renouvellement des certificats.
Gateway API
Le modèle Gateway API offre une approche plus flexible et puissante pour gérer le trafic entrant, incluant la gestion des certificats TLS :
- Configuration TLS Avancée : Gateway API permet une configuration plus granulaire des certificats TLS, incluant la gestion de plusieurs certificats et la sélection basée sur les hôtes ou les routes.
- Intégration avec les Services Mesh : Les services mesh peuvent s'intégrer avec Gateway API pour déléguer certaines tâches de gestion TLS, en utilisant des certificats fournis par le mesh ou des certificats configurés directement dans la Gateway API.
Principales solutions de gestion des certificats dans Kubernetes
Voyons leurs capacités respectives, et comment elles peuvent gérer des infrastructures PKI privées ou ACME.
Cert-Manager
Cert-Manager est un outil populaire pour la gestion des certificats dans Kubernetes. Il facilite l'automatisation de l'obtention, du renouvellement et de la distribution des certificats TLS.
Capacités :
- ACME : Cert-Manager prend en charge ACME, permettant l'intégration avec Let's Encrypt et d'autres CA compatibles ACME pour l'obtention et le renouvellement automatiques des certificats.
- CA Interne : Il peut s'intégrer avec des CA internes via des mécanismes comme le CA Issuer, permettant de signer des certificats avec une autorité de certification interne.
- Intégration avec Vault : Cert-Manager peut utiliser HashiCorp Vault comme backend pour la gestion des certificats, en utilisant l'issuer de Vault pour émettre des certificats pour les pods et les services.
- Autres Issuers : Supporte Venafi, Google CAS et d'autres systèmes de gestion de certificats d'entreprise.
Avantages :
- Automatisation complète de la gestion des certificats.
- Support étendu pour divers issuers et backends.
- Intégration transparente avec Kubernetes via Custom Resource Definitions (CRDs).
Application
- PKI Privée : Intégration avec des CA internes via le CA Issuer et HashiCorp Vault.
- ACME : Supporte Let's Encrypt et d'autres CA compatibles ACME pour l'automatisation complète.
Vault by HashiCorp
Vault est une solution de gestion des secrets et des identités qui inclut des capacités de gestion des certificats.
Capacités :
- PKI Secrets Engine : Vault dispose d'un moteur de secrets PKI qui permet de générer, signer et révoquer des certificats TLS.
- Rotation Automatique : Vault peut automatiser la rotation des certificats, en s'intégrant avec Kubernetes pour distribuer les certificats aux pods et services.
- ACME : Bien que Vault ne supporte pas directement ACME, il peut être configuré pour émettre des certificats compatibles avec les exigences de sécurité d'ACME.
Avantages :
- Gestion centralisée et sécurisée des certificats et autres secrets.
- Capacité de gérer des infrastructures PKI complexes et multi-cloud.
- API puissante et flexible pour l'automatisation et l'intégration.
Application
- PKI Privée : PKI Secrets Engine pour gérer une infrastructure PKI complète, y compris la génération, la signature et la révocation des certificats.
API certificates.k8s.io
API certificates.k8s.io est une API Kubernetes native pour la gestion des certificats.
Capacités :
- Signing Requests : Permet aux pods et autres composants de demander des certificats via des ressources
CertificateSigningRequest
(CSR). - CA Interne : Kubernetes peut signer les demandes de certificats en utilisant une CA interne configurée au niveau du cluster.
- Automatisation : Intègre des contrôleurs qui peuvent approuver et signer automatiquement les demandes de certificats basées sur des politiques définies.
- Signing Requests : Permet aux pods et autres composants de demander des certificats via des ressources
Avantages :
- Solution native à Kubernetes, sans besoin d'outils externes.
- Intégration transparente avec l'écosystème Kubernetes.
- Gestion simplifiée des certificats pour les composants internes du cluster.
Application
- PKI Privée : Utilise une CA interne configurée au niveau du cluster pour signer les demandes de certificats.
Cert-Controller
Cert-Controller est un contrôleur Kubernetes pour la gestion des certificats. Il peut être utilisé en complément de cert-manager ou de manière autonome.
Capacités :
- Gestion des Certificats : Peut surveiller les ressources de type
Certificate
et automatiser la création, le renouvellement et la distribution des certificats. - CA et ACME : Supporte à la fois les CA internes et les CA compatibles ACME pour l'émission des certificats.
- Integration avec les Secrets Kubernetes : Gère les certificats en tant que secrets Kubernetes, facilitant leur utilisation par les applications.
- Gestion des Certificats : Peut surveiller les ressources de type
Avantages :
- Flexible et facile à configurer.
- Peut être utilisé pour des cas d'utilisation spécifiques ou en complément de cert-manager.
- Supporte divers backends pour l'émission des certificats.
Application
- PKI Privée : Supporte les CA internes pour l'émission des certificats.
- ACME : Peut être configuré pour utiliser des CA compatibles ACME.
TP : Installation de Cert-Manager dans un Cluster Kubernetes pour l'Application Bookinfo avec Istio
Dans ce TP, nous allons installer Cert-Manager dans un cluster Kubernetes pour automatiser la gestion des certificats TLS.
Nous allons utiliser Cert-Manager pour sécuriser l'application d'exemple Bookinfo fournie par Istio, ainsi que pour configurer une Gateway Istio avec un certificat TLS émis automatiquement.
Prérequis
- Un cluster Kubernetes fonctionnel.
- kubectl installé et configuré pour accéder à votre cluster Kubernetes.
- Helm installé pour gérer les packages Kubernetes.
Étape 1 : Installation de Cert-Manager
Ajoutez le référentiel Helm de Cert-Manager :
Ajoutez d'abord le référentiel Cert-Manager :
helm repo add jetstack https://charts.jetstack.io
helm repo updateInstallez Cert-Manager :
Créez un namespace pour Cert-Manager :
kubectl create namespace cert-manager
Installez Cert-Manager avec Helm :
helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.7.0 --set installCRDs=true
Vérifiez que Cert-Manager est déployé :
kubectl get pods -n cert-manager
Assurez-vous que tous les pods dans le namespace
cert-manager
sont en étatRunning
.
Étape 2 : Déploiement de l'Application Bookinfo avec Istio
Déployez l'application Bookinfo :
Déployez l'application Bookinfo fournie par Istio :
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.13/samples/bookinfo/platform/kube/bookinfo.yaml
Exposez l'application Bookinfo via une Gateway Istio :
Créez une Gateway Istio pour exposer l'application Bookinfo :
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.13/samples/bookinfo/networking/bookinfo-gateway.yaml
Étape 3 : Configuration d'un Certificat TLS pour la Gateway Istio avec Cert-Manager
Créez un Issuer Let's Encrypt pour Cert-Manager :
Créez un fichier
issuer.yaml
avec le contenu suivant pour utiliser Let's Encrypt :apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-prod
namespace: cert-manager
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@%YOURDOMAIN%
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: istioAppliquez cette configuration :
kubectl apply -f issuer.yaml
Assurez-vous de remplacer
your-email@%YOURDOMAIN%
par votre adresse e-mail.Déployez un certificat TLS pour la Gateway Istio :
Créez un fichier
certificate.yaml
avec le contenu suivant pour demander un certificat TLS pour la Gateway Istio :apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: istio-ingressgateway-certificate
namespace: istio-system
spec:
secretName: istio-ingressgateway-certs
issuerRef:
name: letsencrypt-prod
kind: Issuer
commonName: "*.<your-domain>"
dnsNames:
- "*.<your-domain>"Appliquez cette configuration :
kubectl apply -f certificate.yaml
Assurez-vous de remplacer
<your-domain>
par votre domaine réel.
Étape 4 : Assurez-vous que le Certificat est Émis et Stocké
Vérifiez que le certificat est bien créé :
Utilisez la commande suivante pour vérifier que le certificat est correctement émis :
kubectl get certificates -n istio-system
Assurez-vous que le secret contient les certificats :
Vérifiez que le secret
istio-ingressgateway-certs
contient les certificats émis :kubectl get secret istio-ingressgateway-certs -n istio-system -o yaml
Vous devriez voir les clés
tls.crt
ettls.key
dans le secret.
Étape 5 : Modifier le Fichier bookinfo-gateway.yaml
Modifiez le fichier bookinfo-gateway.yaml
pour ajouter une configuration HTTPS :
Créez ou modifiez le fichier
bookinfo-gateway.yaml
:Voici un exemple de configuration ajustée pour ajouter le support HTTPS :
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
namespace: default
spec:
selector:
istio: ingressgateway # Utilise le label du pod de l'ingress gateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: istio-ingressgateway-certs # Référence au secret TLS
minProtocolVersion: TLSV1_2
maxProtocolVersion: TLSV1_3
hosts:
- "*.<your-domain>" # Remplacez par votre domaineRemplacez
<your-domain>
par le domaine que vous utilisez. Si vous testez localement, vous pouvez utiliser*.<cluster-ip>.nip.io
.Appliquez la configuration :
kubectl apply -f bookinfo-gateway.yaml
Étape 6 : Vérification et Tests
Vérifiez que la Gateway est créée correctement :
kubectl get gateways -n default
kubectl describe gateway bookinfo-gateway -n defaultVérifiez que le service Istio Ingress Gateway est bien configuré :
kubectl get svc istio-ingressgateway -n istio-system
Assurez-vous que le service écoute sur le port 443.
Testez l'accès à l'application Bookinfo via HTTPS :
Utilisez l'adresse IP externe du service
istio-ingressgateway
et testez aveccurl
ou dans un navigateur :kubectl get svc istio-ingressgateway -n istio-system
Exemple avec
curl
:curl -s https://<EXTERNAL-IP>/productpage | grep -o "<title>.*</title>"
Remplacez
<EXTERNAL-IP>
par l'adresse IP externe du service Istio Ingress Gateway.
Vous pouvez explorer davantage en configurant des politiques de renouvellement automatique, en intégrant d'autres fournisseurs de certificats, ou en utilisant des configurations plus avancées de Cert-Manager pour répondre aux exigences spécifiques de sécurité de votre environnement.