add secret store
This commit is contained in:
@@ -81,54 +81,34 @@ cert-manager-webhook-ovh:
|
|||||||
name: cert-manager-webhook-ovh
|
name: cert-manager-webhook-ovh
|
||||||
key: consumer-key
|
key: consumer-key
|
||||||
|
|
||||||
# Important pour vos domaines spécifiques
|
|
||||||
# Note : Vérifiez si votre chart supporte les selectors via values,
|
|
||||||
# sinon il faudra peut-être patcher le template.
|
|
||||||
|
|
||||||
# Configuration des credentials OVH (si External Secrets n'est pas utilisé)
|
|
||||||
# Ces valeurs sont utilisées uniquement si externalSecret.enabled = false
|
|
||||||
ovhCredentials:
|
|
||||||
applicationKey: "" # Application Key OVH (laisser vide si vous utilisez External Secrets)
|
|
||||||
applicationSecret: "" # Application Secret OVH (laisser vide si vous utilisez External Secrets)
|
|
||||||
consumerKey: "" # Consumer Key OVH (laisser vide si vous utilisez External Secrets)
|
|
||||||
|
|
||||||
# Configuration External Secrets Operator - Stratégie Multi-Namespace
|
# Configuration External Secrets Operator - Stratégie Multi-Namespace
|
||||||
# Cette configuration permet de partager les secrets OVH entre cert-manager-ops et cert-manager-webhook-ovh-ops
|
# Cette configuration permet de partager les secrets OVH entre cert-manager-ops et cert-manager-webhook-ovh-ops
|
||||||
# en utilisant un ClusterSecretStore et des ExternalSecrets dans chaque namespace
|
# en utilisant un ClusterSecretStore et des ExternalSecrets dans chaque namespace
|
||||||
externalSecret:
|
externalSecret:
|
||||||
enabled: false # Activez cette option pour utiliser External Secrets
|
enabled: true # ✅ Activé pour utiliser External Secrets avec Vault
|
||||||
refreshInterval: "1h" # Intervalle de rafraîchissement du secret
|
refreshInterval: "1h" # Intervalle de rafraîchissement du secret
|
||||||
secretName: "cert-manager-webhook-ovh" # Nom du Secret créé dans chaque namespace
|
secretName: "cert-manager-webhook-ovh" # Nom du Secret créé dans chaque namespace
|
||||||
|
|
||||||
# Références aux clés dans Vault
|
# Références aux clés dans Vault
|
||||||
|
# Format: "chemin/dans/vault#clef" pour KV v2
|
||||||
|
# Exemple: "secret/data/ovh#application-key"
|
||||||
remoteRef:
|
remoteRef:
|
||||||
applicationKey: "" # Chemin/clef dans Vault pour application-key (ex: "secret/data/ovh#application-key")
|
applicationKey: "secret/data/ovh#application-key" # ⚠️ À configurer avec votre chemin Vault
|
||||||
applicationSecret: "" # Chemin/clef dans Vault pour application-secret (ex: "secret/data/ovh#application-secret")
|
applicationSecret: "secret/data/ovh#application-secret" # ⚠️ À configurer avec votre chemin Vault
|
||||||
consumerKey: "" # Chemin/clef dans Vault pour consumer-key (ex: "secret/data/ovh#consumer-key")
|
consumerKey: "secret/data/ovh#consumer-key" # ⚠️ À configurer avec votre chemin Vault
|
||||||
|
|
||||||
# Configuration HashiCorp Vault
|
# Configuration HashiCorp Vault
|
||||||
vault:
|
vault:
|
||||||
secretStoreName: "vault-backend" # Nom du ClusterSecretStore à créer
|
secretStoreName: "vault-backend" # Nom du ClusterSecretStore à créer
|
||||||
server: "https://vault.example.com:8200" # URL de votre serveur Vault
|
server: "http://hashicorp-vault-0.hashicorp-vault-internal.hashicorp-ops.svc.cluster.local:8200" # ⚠️ À configurer avec l'URL de votre serveur Vault
|
||||||
path: "secret" # Chemin du secret engine (secret, kv, etc.)
|
path: "secret" # Chemin du secret engine (secret, kv, etc.)
|
||||||
version: "v2" # Version de l'API KV (v1 ou v2)
|
version: "v2" # Version de l'API KV (v1 ou v2)
|
||||||
auth:
|
auth:
|
||||||
# Authentification Kubernetes (recommandé pour la stratégie Multi-Namespace)
|
# Authentification Kubernetes (recommandé pour la stratégie Multi-Namespace)
|
||||||
kubernetes:
|
kubernetes:
|
||||||
mountPath: "kubernetes" # Chemin du mount Kubernetes dans Vault
|
mountPath: "kubernetes" # Chemin du mount Kubernetes dans Vault
|
||||||
role: "" # Nom du rôle Vault configuré pour Kubernetes auth
|
role: "cert-manager-webhook-ovh-role" # ⚠️ Nom du rôle Vault configuré pour Kubernetes auth
|
||||||
# Le ServiceAccount doit être autorisé dans les namespaces cert-manager-ops et cert-manager-webhook-ovh-ops
|
# Le ServiceAccount doit être autorisé dans les namespaces cert-manager-ops et cert-manager-webhook-ovh-ops
|
||||||
serviceAccountRef:
|
serviceAccountRef:
|
||||||
name: "cert-manager-webhook-ovh-sa" # ServiceAccount utilisé pour l'authentification
|
name: "cert-manager-webhook-ovh-sa" # ServiceAccount utilisé pour l'authentification
|
||||||
namespace: "cert-manager-webhook-ovh-ops" # Namespace du ServiceAccount
|
namespace: "cert-manager-webhook-ovh-ops" # Namespace du ServiceAccount
|
||||||
# Alternative : Authentification par token
|
|
||||||
# token:
|
|
||||||
# secretName: "vault-token" # Nom du Secret contenant le token
|
|
||||||
# secretKey: "token" # Clé dans le Secret
|
|
||||||
# Alternative : Authentification AppRole
|
|
||||||
# appRole:
|
|
||||||
# path: "approle"
|
|
||||||
# roleId: "" # Role ID
|
|
||||||
# secretRef:
|
|
||||||
# name: "vault-approle-secret" # Secret contenant le Secret ID
|
|
||||||
# key: "secretId"
|
|
||||||
|
|||||||
160
scripts/verify-external-secrets.sh
Normal file
160
scripts/verify-external-secrets.sh
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script de vérification des ExternalSecrets pour cert-manager-webhook-ovh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Détection automatique du contexte si non fourni
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
# Essayer de détecter le contexte actuel
|
||||||
|
CURRENT_CONTEXT=$(kubectl config current-context 2>/dev/null || echo "")
|
||||||
|
if [ -n "$CURRENT_CONTEXT" ]; then
|
||||||
|
CONTEXT="$CURRENT_CONTEXT"
|
||||||
|
echo "⚠️ Aucun contexte spécifié, utilisation du contexte actuel: $CONTEXT"
|
||||||
|
else
|
||||||
|
CONTEXT=""
|
||||||
|
echo "⚠️ Aucun contexte kubectl trouvé. Les commandes seront exécutées sans --context"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
CONTEXT="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fonction pour exécuter kubectl avec ou sans contexte
|
||||||
|
kubectl_cmd() {
|
||||||
|
if [ -n "$CONTEXT" ]; then
|
||||||
|
kubectl "$@" --context="$CONTEXT"
|
||||||
|
else
|
||||||
|
kubectl "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
SECRET_NAME="${2:-cert-manager-webhook-ovh}"
|
||||||
|
NAMESPACE_WEBHOOK="${3:-cert-manager-webhook-ovh-ops}"
|
||||||
|
NAMESPACE_CERTMANAGER="${4:-cert-manager-ops}"
|
||||||
|
SECRET_STORE_NAME="${5:-vault-backend}"
|
||||||
|
|
||||||
|
echo "=== Vérification des ExternalSecrets pour cert-manager-webhook-ovh ==="
|
||||||
|
echo "Contexte: $CONTEXT"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 1. Vérifier le ClusterSecretStore
|
||||||
|
echo "1. Vérification du ClusterSecretStore '$SECRET_STORE_NAME'..."
|
||||||
|
if kubectl_cmd get clustersecretstore "$SECRET_STORE_NAME" &>/dev/null; then
|
||||||
|
echo " ✅ ClusterSecretStore trouvé"
|
||||||
|
kubectl_cmd get clustersecretstore "$SECRET_STORE_NAME" -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Afficher les détails
|
||||||
|
echo " Détails du ClusterSecretStore:"
|
||||||
|
kubectl_cmd describe clustersecretstore "$SECRET_STORE_NAME" | grep -A 20 "Spec:" || true
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo " ❌ ClusterSecretStore '$SECRET_STORE_NAME' non trouvé"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Vérifier les ExternalSecrets
|
||||||
|
echo "2. Vérification des ExternalSecrets..."
|
||||||
|
|
||||||
|
# Dans cert-manager-webhook-ovh-ops
|
||||||
|
echo " a) Dans le namespace '$NAMESPACE_WEBHOOK':"
|
||||||
|
if kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" &>/dev/null; then
|
||||||
|
echo " ✅ ExternalSecret trouvé"
|
||||||
|
kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Afficher le statut
|
||||||
|
echo " Statut:"
|
||||||
|
kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o jsonpath='{.status}' | jq '.' 2>/dev/null || \
|
||||||
|
kubectl_cmd describe externalsecret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" | grep -A 10 "Status:" || true
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo " ❌ ExternalSecret '$SECRET_NAME' non trouvé dans '$NAMESPACE_WEBHOOK'"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dans cert-manager-ops
|
||||||
|
echo " b) Dans le namespace '$NAMESPACE_CERTMANAGER':"
|
||||||
|
if kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" &>/dev/null; then
|
||||||
|
echo " ✅ ExternalSecret trouvé"
|
||||||
|
kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Afficher le statut
|
||||||
|
echo " Statut:"
|
||||||
|
kubectl_cmd get externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o jsonpath='{.status}' | jq '.' 2>/dev/null || \
|
||||||
|
kubectl_cmd describe externalsecret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" | grep -A 10 "Status:" || true
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo " ❌ ExternalSecret '$SECRET_NAME' non trouvé dans '$NAMESPACE_CERTMANAGER'"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Vérifier les Secrets créés
|
||||||
|
echo "3. Vérification des Secrets créés par External Secrets..."
|
||||||
|
|
||||||
|
# Dans cert-manager-webhook-ovh-ops
|
||||||
|
echo " a) Secret dans '$NAMESPACE_WEBHOOK':"
|
||||||
|
if kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" &>/dev/null; then
|
||||||
|
echo " ✅ Secret trouvé"
|
||||||
|
kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Vérifier les clés présentes
|
||||||
|
echo " Clés présentes dans le secret:"
|
||||||
|
kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o jsonpath='{.data}' | jq 'keys' 2>/dev/null || \
|
||||||
|
kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_WEBHOOK" -o jsonpath='{.data}' | grep -o '"[^"]*":' | sed 's/"//g' | sed 's/://g' || true
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo " ❌ Secret '$SECRET_NAME' non trouvé dans '$NAMESPACE_WEBHOOK'"
|
||||||
|
echo " ⚠️ Le secret sera créé automatiquement par External Secrets une fois la synchronisation réussie"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dans cert-manager-ops
|
||||||
|
echo " b) Secret dans '$NAMESPACE_CERTMANAGER':"
|
||||||
|
if kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" &>/dev/null; then
|
||||||
|
echo " ✅ Secret trouvé"
|
||||||
|
kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Vérifier les clés présentes
|
||||||
|
echo " Clés présentes dans le secret:"
|
||||||
|
kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o jsonpath='{.data}' | jq 'keys' 2>/dev/null || \
|
||||||
|
kubectl_cmd get secret "$SECRET_NAME" -n "$NAMESPACE_CERTMANAGER" -o jsonpath='{.data}' | grep -o '"[^"]*":' | sed 's/"//g' | sed 's/://g' || true
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo " ❌ Secret '$SECRET_NAME' non trouvé dans '$NAMESPACE_CERTMANAGER'"
|
||||||
|
echo " ⚠️ Le secret sera créé automatiquement par External Secrets une fois la synchronisation réussie"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Vérifier les événements et logs d'External Secrets Operator
|
||||||
|
echo "4. Vérification des événements récents..."
|
||||||
|
echo " Événements pour ExternalSecret dans '$NAMESPACE_CERTMANAGER':"
|
||||||
|
kubectl_cmd get events -n "$NAMESPACE_CERTMANAGER" \
|
||||||
|
--field-selector involvedObject.name="$SECRET_NAME" \
|
||||||
|
--sort-by='.lastTimestamp' | tail -5 || echo " Aucun événement récent"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 5. Résumé
|
||||||
|
echo "=== Résumé ==="
|
||||||
|
echo ""
|
||||||
|
echo "Pour voir les détails complets d'un ExternalSecret:"
|
||||||
|
if [ -n "$CONTEXT" ]; then
|
||||||
|
echo " kubectl describe externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER --context=$CONTEXT"
|
||||||
|
echo ""
|
||||||
|
echo "Pour voir les logs d'External Secrets Operator:"
|
||||||
|
echo " kubectl logs -n external-secrets-system -l app.kubernetes.io/name=external-secrets --context=$CONTEXT --tail=50"
|
||||||
|
echo ""
|
||||||
|
echo "Pour forcer une synchronisation immédiate:"
|
||||||
|
echo " kubectl annotate externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER --context=$CONTEXT force-sync=\$(date +%s) --overwrite"
|
||||||
|
else
|
||||||
|
echo " kubectl describe externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER"
|
||||||
|
echo ""
|
||||||
|
echo "Pour voir les logs d'External Secrets Operator:"
|
||||||
|
echo " kubectl logs -n external-secrets-system -l app.kubernetes.io/name=external-secrets --tail=50"
|
||||||
|
echo ""
|
||||||
|
echo "Pour forcer une synchronisation immédiate:"
|
||||||
|
echo " kubectl annotate externalsecret $SECRET_NAME -n $NAMESPACE_CERTMANAGER force-sync=\$(date +%s) --overwrite"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
Reference in New Issue
Block a user