diff --git a/helm/certificates/ops/docs/CERTIFICAT-WILDCARD.md b/helm/certificates/ops/docs/CERTIFICAT-WILDCARD.md new file mode 100644 index 0000000..8993afb --- /dev/null +++ b/helm/certificates/ops/docs/CERTIFICAT-WILDCARD.md @@ -0,0 +1,162 @@ +# Certificat Wildcard avec DNS-01 Challenge + +## Vue d'ensemble + +Le certificat wildcard `*.dev.gkdomaine.fr` permet de couvrir tous les sous-domaines de l'environnement DEV avec un seul certificat Let's Encrypt. + +## Configuration + +### 1. ClusterIssuer DNS-01 + +Le ClusterIssuer `letsencrypt-dns01-prod` utilise le DNS-01 challenge pour valider le domaine via DNS au lieu de HTTP. + +**Important** : Vous devez configurer votre fournisseur DNS dans `cluster-issuer-letsencrypt-dns01.yaml`. + +### 2. Certificat Wildcard + +Le certificat `wildcard-dev-tls` couvre : +- `*.dev.gkdomaine.fr` (tous les sous-domaines) +- `dev.gkdomaine.fr` (le domaine racine) + +## Configuration du Fournisseur DNS + +### Cloudflare (Recommandé) + +1. Créez un token API dans Cloudflare : + - Allez dans "My Profile" > "API Tokens" + - Créez un token avec les permissions : Zone DNS:Edit, Zone:Read + +2. Créez le Secret Kubernetes : +```bash +kubectl create secret generic cloudflare-api-key \ + --from-literal=api-key=VOTRE_TOKEN_CLOUDFLARE \ + -n certificates-ops +``` + +3. Décommentez la section Cloudflare dans `cluster-issuer-letsencrypt-dns01.yaml` : +```yaml +solvers: +- dns01: + cloudflare: + email: gkpoubelle78@gmail.com + apiKeySecretRef: + name: cloudflare-api-key + key: api-key +``` + +### Route53 (AWS) + +1. Créez un utilisateur IAM avec les permissions Route53 +2. Configurez les credentials AWS (via IAM Role ou Secret) +3. Décommentez la section Route53 dans le ClusterIssuer + +### OVH + +1. Créez une application API dans OVH +2. Créez un Secret avec les credentials : +```bash +kubectl create secret generic ovh-credentials \ + --from-literal=application-secret=VOTRE_SECRET \ + -n certificates-ops +``` +3. Décommentez la section OVH dans le ClusterIssuer + +### Autres Fournisseurs + +Consultez la [documentation cert-manager](https://cert-manager.io/docs/configuration/acme/dns01/) pour votre fournisseur DNS. + +## Utilisation du Certificat Wildcard + +### Pour une nouvelle application + +Au lieu de créer un certificat spécifique, utilisez directement le secret `wildcard-dev-tls` dans votre Ingress : + +```yaml +ingress: + enabled: true + className: traefik + host: monapp.dev.gkdomaine.fr + tls: + enabled: true + secretName: wildcard-dev-tls # Utilise le certificat wildcard +``` + +### Migration des certificats existants + +Les applications existantes peuvent être migrées pour utiliser le certificat wildcard : + +1. Supprimez le certificat spécifique (ex: `homarr-dev-tls`) +2. Mettez à jour l'Ingress pour utiliser `wildcard-dev-tls` +3. Le secret sera synchronisé automatiquement vers le cluster DEV + +## Avantages + +- ✅ **Un seul certificat** pour tous les sous-domaines DEV +- ✅ **Certificat Let's Encrypt valide** (pas d'avertissement navigateur) +- ✅ **Renouvellement automatique** par cert-manager +- ✅ **Fonctionne pour les serveurs internes** (validation via DNS uniquement) + +## Inconvénients + +- ⚠️ Nécessite un fournisseur DNS compatible avec DNS-01 +- ⚠️ Nécessite des credentials API pour votre DNS +- ⚠️ Si le certificat est compromis, tous les sous-domaines le sont aussi + +## Vérification + +```bash +# Vérifier le ClusterIssuer +kubectl get clusterissuer letsencrypt-dns01-prod + +# Vérifier le certificat wildcard +kubectl get certificate wildcard-dev-tls -n certificates-ops + +# Vérifier le secret TLS généré +kubectl get secret wildcard-dev-tls -n certificates-ops + +# Voir les détails du certificat +kubectl describe certificate wildcard-dev-tls -n certificates-ops + +# Vérifier les challenges DNS +kubectl get challenges -n certificates-ops +``` + +## Troubleshooting + +### Le certificat ne se génère pas + +1. Vérifiez que le ClusterIssuer est configuré correctement : +```bash +kubectl describe clusterissuer letsencrypt-dns01-prod +``` + +2. Vérifiez que le Secret DNS existe : +```bash +kubectl get secret cloudflare-api-key -n certificates-ops +``` + +3. Vérifiez les logs de cert-manager : +```bash +kubectl logs -n cert-manager -l app.kubernetes.io/name=cert-manager +``` + +### Le challenge DNS échoue + +1. Vérifiez que le domaine est résolvable publiquement : +```bash +dig _acme-challenge.dev.gkdomaine.fr TXT +``` + +2. Vérifiez que les permissions API sont correctes +3. Vérifiez les logs des challenges : +```bash +kubectl describe challenge -n certificates-ops +``` + +## Notes Importantes + +- Le domaine `dev.gkdomaine.fr` doit être résolvable publiquement via DNS +- Les serveurs peuvent rester internes (pas besoin d'accès HTTP depuis Internet) +- Le certificat wildcard couvre tous les sous-domaines de `dev.gkdomaine.fr` +- Le secret `wildcard-dev-tls` sera synchronisé automatiquement vers le cluster DEV + diff --git a/helm/certificates/ops/docs/CONFIGURATION-DNS01.md b/helm/certificates/ops/docs/CONFIGURATION-DNS01.md new file mode 100644 index 0000000..e131e33 --- /dev/null +++ b/helm/certificates/ops/docs/CONFIGURATION-DNS01.md @@ -0,0 +1,165 @@ +# Configuration DNS-01 Challenge pour Certificat Wildcard + +## Étapes de Configuration + +### 1. Choisir votre Fournisseur DNS + +Le ClusterIssuer `letsencrypt-dns01-prod` doit être configuré selon votre fournisseur DNS. + +### 2. Configuration Cloudflare (Recommandé) + +#### Étape 1 : Créer un Token API Cloudflare + +1. Connectez-vous à [Cloudflare](https://dash.cloudflare.com/) +2. Allez dans "My Profile" > "API Tokens" +3. Cliquez sur "Create Token" +4. Utilisez le template "Edit zone DNS" ou créez un token personnalisé avec : + - Permissions : `Zone` > `DNS` > `Edit` + - Zone Resources : `Include` > `Specific zone` > `gkdomaine.fr` + +#### Étape 2 : Créer le Secret Kubernetes + +```bash +kubectl create secret generic cloudflare-api-key \ + --from-literal=api-key=VOTRE_TOKEN_CLOUDFLARE \ + -n certificates-ops \ + --context=cluster-ops +``` + +#### Étape 3 : Activer la Configuration dans le ClusterIssuer + +Éditez `helm/certificates/ops/templates/cluster-issuer-letsencrypt-dns01.yaml` et décommentez la section Cloudflare : + +```yaml +solvers: +- dns01: + cloudflare: + email: gkpoubelle78@gmail.com + apiKeySecretRef: + name: cloudflare-api-key + key: api-key +``` + +### 3. Configuration Route53 (AWS) + +#### Étape 1 : Créer un Utilisateur IAM + +Créez un utilisateur IAM avec la politique `AmazonRoute53FullAccess` ou une politique personnalisée. + +#### Étape 2 : Créer le Secret Kubernetes + +```bash +kubectl create secret generic route53-credentials \ + --from-literal=access-key-id=VOTRE_ACCESS_KEY \ + --from-literal=secret-access-key=VOTRE_SECRET_KEY \ + -n certificates-ops \ + --context=cluster-ops +``` + +#### Étape 3 : Activer la Configuration dans le ClusterIssuer + +```yaml +solvers: +- dns01: + route53: + region: eu-west-1 + accessKeyIDSecretRef: + name: route53-credentials + key: access-key-id + secretAccessKeySecretRef: + name: route53-credentials + key: secret-access-key +``` + +### 4. Configuration OVH + +#### Étape 1 : Créer une Application API OVH + +1. Connectez-vous à [OVH API](https://eu.api.ovh.com/) +2. Créez une application API +3. Notez l'Application Key et l'Application Secret +4. Générez un Consumer Key + +#### Étape 2 : Créer le Secret Kubernetes + +```bash +kubectl create secret generic ovh-credentials \ + --from-literal=application-secret=VOTRE_APPLICATION_SECRET \ + -n certificates-ops \ + --context=cluster-ops +``` + +#### Étape 3 : Activer la Configuration dans le ClusterIssuer + +```yaml +solvers: +- dns01: + ovh: + applicationKey: "VOTRE_APPLICATION_KEY" + applicationSecretRef: + name: ovh-credentials + key: application-secret + consumerKey: "VOTRE_CONSUMER_KEY" +``` + +### 5. Autres Fournisseurs DNS + +Consultez la [documentation cert-manager](https://cert-manager.io/docs/configuration/acme/dns01/) pour : +- Google Cloud DNS +- Azure DNS +- DigitalOcean +- Namecheap +- Et d'autres... + +## Vérification + +Après avoir configuré le ClusterIssuer : + +```bash +# Vérifier le ClusterIssuer +kubectl get clusterissuer letsencrypt-dns01-prod --context=cluster-ops + +# Vérifier la configuration +kubectl describe clusterissuer letsencrypt-dns01-prod --context=cluster-ops + +# Vérifier que le certificat wildcard est en cours de génération +kubectl get certificate wildcard-dev-tls -n certificates-ops --context=cluster-ops + +# Voir les détails du certificat +kubectl describe certificate wildcard-dev-tls -n certificates-ops --context=cluster-ops + +# Vérifier les challenges DNS +kubectl get challenges -n certificates-ops --context=cluster-ops +``` + +## Troubleshooting + +### Le certificat ne se génère pas + +1. Vérifiez que le ClusterIssuer est correctement configuré +2. Vérifiez que le Secret DNS existe et contient les bonnes valeurs +3. Vérifiez les logs de cert-manager : +```bash +kubectl logs -n cert-manager -l app.kubernetes.io/name=cert-manager --context=cluster-ops +``` + +### Le challenge DNS échoue + +1. Vérifiez que le domaine est résolvable publiquement : +```bash +dig _acme-challenge.dev.gkdomaine.fr TXT +``` + +2. Vérifiez que les permissions API sont correctes +3. Vérifiez les détails du challenge : +```bash +kubectl describe challenge -n certificates-ops --context=cluster-ops +``` + +## Notes Importantes + +- Le domaine `dev.gkdomaine.fr` doit être résolvable publiquement via DNS +- Les serveurs peuvent rester internes (pas besoin d'accès HTTP depuis Internet) +- Le certificat wildcard couvre tous les sous-domaines `*.dev.gkdomaine.fr` +- Le secret `wildcard-dev-tls` sera synchronisé automatiquement vers le cluster DEV + diff --git a/helm/certificates/ops/docs/CONFIGURATION-OVH.md b/helm/certificates/ops/docs/CONFIGURATION-OVH.md new file mode 100644 index 0000000..2e0ac0a --- /dev/null +++ b/helm/certificates/ops/docs/CONFIGURATION-OVH.md @@ -0,0 +1,228 @@ +# Configuration DNS-01 avec OVH + +## Vue d'ensemble + +Ce guide explique comment configurer cert-manager pour générer des certificats Let's Encrypt wildcard en utilisant le DNS-01 challenge avec OVH comme fournisseur DNS. + +## Prérequis + +- Un compte OVH avec accès à la gestion DNS du domaine `gkdomaine.fr` +- Le domaine `dev.gkdomaine.fr` doit être résolvable publiquement via DNS OVH + +## Étape 1 : Créer une Application API OVH + +### 1.1 Accéder à l'API OVH + +1. Connectez-vous à votre compte OVH +2. Allez sur [https://eu.api.ovh.com/createApp/](https://eu.api.ovh.com/createApp/) (pour l'Europe) +3. Connectez-vous avec votre compte OVH + +### 1.2 Créer l'Application + +1. Remplissez le formulaire : + - **Application name** : `cert-manager-gkdomaine` (ou un nom de votre choix) + - **Application description** : `Cert-manager pour certificats Let's Encrypt` + - **Application validity** : `Unlimited` (ou la durée souhaitée) + - **Callback URL** : Laissez vide + +2. Cliquez sur **Create application** + +3. **Notez les identifiants** : + - **Application Key** (AK) : `xxxxxxxxxxxxxxxx` + - **Application Secret** (AS) : `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` + +⚠️ **Important** : Notez ces valeurs, vous ne pourrez plus les voir après ! + +## Étape 2 : Générer les Permissions et Consumer Key + +### 2.1 Générer les Permissions + +Vous devez générer les permissions pour que l'application puisse modifier les enregistrements DNS. + +Utilisez l'API OVH ou le script suivant : + +```bash +# Remplacer par vos valeurs +APPLICATION_KEY="VOTRE_APPLICATION_KEY" +APPLICATION_SECRET="VOTRE_APPLICATION_SECRET" + +# Générer les permissions pour DNS +curl -X POST "https://eu.api.ovh.com/v1/auth/credential" \ + -H "X-Ovh-Application: $APPLICATION_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "accessRules": [ + { + "method": "GET", + "path": "/domain/zone/*" + }, + { + "method": "POST", + "path": "/domain/zone/*" + }, + { + "method": "PUT", + "path": "/domain/zone/*" + }, + { + "method": "DELETE", + "path": "/domain/zone/*" + } + ], + "redirection": "https://www.ovh.com" + }' +``` + +Cela retournera une URL de validation. Ouvrez cette URL dans votre navigateur et validez les permissions. + +### 2.2 Récupérer le Consumer Key + +Après validation, vous recevrez un **Consumer Key** (CK). Notez-le également. + +## Étape 3 : Créer le Secret Kubernetes + +Créez un Secret Kubernetes contenant l'Application Secret : + +```bash +kubectl create secret generic ovh-credentials \ + --from-literal=application-secret=VOTRE_APPLICATION_SECRET \ + -n certificates-ops \ + --context=cluster-ops +``` + +**Important** : Remplacez `VOTRE_APPLICATION_SECRET` par la valeur réelle de votre Application Secret. + +## Étape 4 : Configurer le ClusterIssuer + +### 4.1 Mettre à jour le ClusterIssuer + +Éditez `helm/certificates/ops/templates/cluster-issuer-letsencrypt-dns01.yaml` et remplacez : + +```yaml +solvers: +- dns01: + ovh: + endpoint: ovh-eu # ovh-eu pour l'Europe + applicationKey: "VOTRE_APPLICATION_KEY" # Remplacez par votre Application Key + applicationSecretRef: + name: ovh-credentials + key: application-secret + consumerKey: "VOTRE_CONSUMER_KEY" # Remplacez par votre Consumer Key +``` + +**Remplacez** : +- `VOTRE_APPLICATION_KEY` par votre Application Key +- `VOTRE_CONSUMER_KEY` par votre Consumer Key + +### 4.2 Endpoints OVH disponibles + +- `ovh-eu` : Pour l'Europe (recommandé pour la France) +- `ovh-us` : Pour les États-Unis +- `ovh-ca` : Pour le Canada + +## Étape 5 : Vérifier la Configuration + +### 5.1 Vérifier le Secret + +```bash +kubectl get secret ovh-credentials -n certificates-ops --context=cluster-ops + +# Vérifier le contenu (la valeur sera encodée en base64) +kubectl get secret ovh-credentials -n certificates-ops --context=cluster-ops -o yaml +``` + +### 5.2 Vérifier le ClusterIssuer + +```bash +kubectl get clusterissuer letsencrypt-dns01-prod --context=cluster-ops + +# Voir la configuration complète +kubectl describe clusterissuer letsencrypt-dns01-prod --context=cluster-ops +``` + +### 5.3 Vérifier le Certificat Wildcard + +```bash +# Vérifier que le certificat est créé +kubectl get certificate wildcard-dev-tls -n certificates-ops --context=cluster-ops + +# Voir les détails +kubectl describe certificate wildcard-dev-tls -n certificates-ops --context=cluster-ops + +# Vérifier les challenges DNS +kubectl get challenges -n certificates-ops --context=cluster-ops +``` + +## Étape 6 : Tester la Génération du Certificat + +Une fois déployé via ArgoCD, cert-manager tentera automatiquement de générer le certificat wildcard. + +Vous pouvez forcer la régénération en supprimant le certificat : + +```bash +kubectl delete certificate wildcard-dev-tls -n certificates-ops --context=cluster-ops +``` + +Cert-manager le recréera automatiquement. + +## Troubleshooting + +### Le certificat ne se génère pas + +1. **Vérifier les logs de cert-manager** : +```bash +kubectl logs -n cert-manager -l app.kubernetes.io/name=cert-manager --context=cluster-ops --tail=100 +``` + +2. **Vérifier que le Secret existe** : +```bash +kubectl get secret ovh-credentials -n certificates-ops --context=cluster-ops +``` + +3. **Vérifier les credentials OVH** : + - Vérifiez que l'Application Key est correcte + - Vérifiez que l'Application Secret dans le Secret Kubernetes est correcte + - Vérifiez que le Consumer Key est correct et valide + +### Le challenge DNS échoue + +1. **Vérifier que le domaine est résolvable** : +```bash +dig _acme-challenge.dev.gkdomaine.fr TXT +``` + +2. **Vérifier les permissions OVH** : + - Assurez-vous que l'application API a les permissions pour modifier les zones DNS + - Vérifiez que le Consumer Key est toujours valide + +3. **Vérifier les détails du challenge** : +```bash +kubectl describe challenge -n certificates-ops --context=cluster-ops +``` + +### Erreur "Invalid credentials" + +- Vérifiez que l'Application Key, Application Secret et Consumer Key sont corrects +- Vérifiez que le Consumer Key n'a pas expiré +- Régénérez un nouveau Consumer Key si nécessaire + +## Sécurité + +⚠️ **Important** : +- Ne commitez **jamais** les credentials OVH dans Git +- Utilisez des secrets Kubernetes pour stocker l'Application Secret +- L'Application Key et Consumer Key sont dans le ClusterIssuer (déployé via Git) - considérez utiliser Sealed Secrets ou External Secrets Operator pour les sécuriser + +## Documentation OVH + +- [Documentation API OVH](https://docs.ovh.com/fr/api/) +- [Génération des credentials OVH](https://docs.ovh.com/fr/api/first-steps-with-ovh-api/) +- [Gestion DNS OVH via API](https://docs.ovh.com/fr/domains/editer-ma-zone-dns/) + +## Notes Importantes + +- Le domaine `dev.gkdomaine.fr` doit être géré par OVH DNS +- Les serveurs peuvent rester internes (pas besoin d'accès HTTP depuis Internet) +- Le certificat wildcard couvre tous les sous-domaines `*.dev.gkdomaine.fr` +- Le secret `wildcard-dev-tls` sera synchronisé automatiquement vers le cluster DEV + diff --git a/helm/certificates/ops/templates/cluster-issuer-letsencrypt-dns01.yaml b/helm/certificates/ops/templates/cluster-issuer-letsencrypt-dns01.yaml new file mode 100644 index 0000000..6fd6eb2 --- /dev/null +++ b/helm/certificates/ops/templates/cluster-issuer-letsencrypt-dns01.yaml @@ -0,0 +1,39 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-dns01-prod +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: gkpoubelle78@gmail.com + privateKeySecretRef: + name: letsencrypt-dns01-prod-key + solvers: + # Configuration DNS-01 pour OVH + - dns01: + ovh: + endpoint: ovh-eu # ovh-eu pour l'Europe, ovh-us pour les USA, ovh-ca pour le Canada + applicationKey: "e598bb73ded17ee6" # À remplacer par votre Application Key OVH + applicationSecretRef: + name: ovh-credentials + key: application-secret + consumerKey: "372e273858204d972dbf7c50506d12a1" # À remplacer par votre Consumer Key OVH + + # Option 4 : Generic (webhook personnalisé) + # - dns01: + # webhook: + # groupName: acme.example.com + # solverName: my-dns-solver + # config: + # # Configuration spécifique au webhook + + # Option 5 : RFC2136 (DNS dynamique standard) + # - dns01: + # rfc2136: + # nameserver: 8.8.8.8 + # tsigSecretSecretRef: + # name: rfc2136-credentials + # key: tsig-secret + # tsigKeyName: "keyname" + # tsigAlgorithm: HMACSHA256 + diff --git a/helm/certificates/ops/templates/cluster-issuer-selfsigned.yaml b/helm/certificates/ops/templates/cluster-issuer-selfsigned.yaml new file mode 100644 index 0000000..81660bd --- /dev/null +++ b/helm/certificates/ops/templates/cluster-issuer-selfsigned.yaml @@ -0,0 +1,7 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: selfsigned-issuer +spec: + selfSigned: {} + diff --git a/helm/certificates/ops/templates/longhorn/certificate-dev.yaml b/helm/certificates/ops/templates/longhorn/certificate-dev.yaml deleted file mode 100644 index ca3c887..0000000 --- a/helm/certificates/ops/templates/longhorn/certificate-dev.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: longhorn-dev-tls - namespace: certificates-ops -spec: - secretName: longhorn-dev-tls - issuerRef: - name: letsencrypt-prod - kind: ClusterIssuer - dnsNames: - - longhorn.dev.gkdomaine.fr - diff --git a/helm/certificates/ops/templates/wildcard/certificate-wildcard-dev.yaml b/helm/certificates/ops/templates/wildcard/certificate-wildcard-dev.yaml new file mode 100644 index 0000000..290c8d9 --- /dev/null +++ b/helm/certificates/ops/templates/wildcard/certificate-wildcard-dev.yaml @@ -0,0 +1,16 @@ +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: wildcard-dev-tls + namespace: certificates-ops +spec: + secretName: wildcard-dev-tls + issuerRef: + name: letsencrypt-dns01-prod + kind: ClusterIssuer + dnsNames: + - "*.dev.gkdomaine.fr" + - dev.gkdomaine.fr # Inclut aussi le domaine racine + # Note: Certificat wildcard pour tous les sous-domaines dev + # Nécessite DNS-01 challenge (le domaine doit être résolvable publiquement) + diff --git a/helm/longhorn/dev/values.yaml b/helm/longhorn/dev/values.yaml index 288c311..34804b0 100644 --- a/helm/longhorn/dev/values.yaml +++ b/helm/longhorn/dev/values.yaml @@ -33,11 +33,11 @@ longhorn: className: traefik host: longhorn.dev.gkdomaine.fr pathType: Prefix - # Configuration TLS avec le secret synchronisé depuis OPS - # Le secret est généré par cert-manager dans OPS et synchronisé vers ce cluster + # Configuration TLS avec le certificat wildcard synchronisé depuis OPS + # Le secret wildcard-dev-tls couvre tous les sous-domaines *.dev.gkdomaine.fr tls: enabled: true - secretName: longhorn-dev-tls + secretName: wildcard-dev-tls # Persistence persistence: