Aller au contenu principal
Sommaire de la formation

Providers HashiCorp Vault

coolibra120 vues

Providers

  • HashiCorp Vault

External Secrets Operator s'intègre à HashiCorp Vault comme backend et source de vérité. L'engine secrets KV est le seul pris en charge par ce provider. Pour les autres engines de secrets, veuillez consulter le générateur de coffres-forts .

  • Pour connecter ESO à vault, il faut créer un SecretStore ou ClusterSecretStore
    • Exemple SecretStore avec token auth
      • Ce SecretStore a un accès complet à vault en ReadWrite
    • secret-store-token.yaml
apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
  name: vault-backend
  namespace: app-ns
spec:
  provider:
    vault:
      server: "http://vault-dev.techledger.io"
      path: "kv-lab-devops"
      # Version is the Vault KV secret engine version.
      # This can be either "v1" or "v2", defaults to "v2"
      version: "v2"
      auth:
        # points to a secret that contains a vault token
        # https://www.vaultproject.io/docs/auth/token
        tokenSecretRef:
          name: "vault-token"
          key: "token"
---
apiVersion: v1
kind: Secret
metadata:
  name: vault-token
  namespace: app-ns
data:
  token: cm9vdA== # "root"

 

kubectl create ns app-ns
kubectl apply -f secret-store-token.yaml
kubectl get secretstore,secret -n app-ns

 

 

    • Test avec un ExternalSecret
      • Ce ExternalSecret va créer un secret k8s avec le nom grafana-admin-credentials. Les datas sont récuperées depuis vault dans le kv path:  kv-lab-devops/monitoring/grafana/admin
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: vault-grafana-crd
  namespace: app-ns
spec:
  refreshInterval: "15s" # intervalle de temps pour rafraîchir le secret, ici toutes les 15 secondes
  secretStoreRef:
    name: vault-backend
    kind: SecretStore
  target:
    name: grafana-admin-credentials  # nom du secret kubernetes qui sera créé
    creationPolicy: Owner # si le secret existe déjà, il sera mis à jour avec les nouvelles données
    template:
      type: Opaque # type du secret kubernetes créé
      metadata: 
        labels:
          techledger.io: grafana
  dataFrom:
    - extract:
        conversionStrategy: Default
        decodingStrategy: None
        key: monitoring/grafana/admin # chemin dans vault où se trouve le secret à extraire
        metadataPolicy: None

 

    • secret-test.yaml
kubectl apply -f secret-test.yaml
kubectl get ExternalSecret,secret -n app-ns

 

 

  • Exemple ClusterSecretStore avec un userpass auth
    • Ce ClusterSecretStore a un accès complet à vault en ReadWrite
      • Exemple ClusterSecretStore avec ClusterExternalSecret qui propage l'image pull secret harbor-regcredentials dans tous les namespaces avec le label: eso=enabled
apiVersion: external-secrets.io/v1
kind: ClusterSecretStore
metadata:
  name: vault-backend
spec:
  provider:
    vault:
      server: "https://vault-dev.techledger.io"
      path: "kv-lab-devops"
      # Version is the Vault KV secret engine version.
      # This can be either "v1" or "v2", defaults to "v2"
      version: "v2"
      auth:
        # VaultUserPass authenticates with Vault using the UserPass auth mechanism
        # https://www.vaultproject.io/docs/auth/userpass
        userPass:
          # Path where the UserPass authentication backend is mounted
          path: "userpass"
          username: "get-secret"
          secretRef:
            name: "vault-userpass"
            key: "password"
            namespace: app-ns
---
apiVersion: v1
kind: Secret
metadata:
  name: vault-userpass
  namespace: app-ns
stringData:
  password: Jffdfdd2np184n
---
apiVersion: external-secrets.io/v1
kind: ClusterExternalSecret
metadata:
  name: harbor-regcredentials-crd
spec:
  # Choisis comment cibler les namespaces:
  # Option A (recommandé): par label (ex: label sur les namespaces: techledger.io/harbor-regcredentials=true)
  namespaceSelectors:
  - matchLabels:
      eso: enabled

  refreshTime: "15s"
  # Nom de l'ExternalSecret qui sera créé dans chaque namespace cible
  externalSecretName: harbor-regcredentials-crd

  # Spécification de l'ExternalSecret répliqué
  externalSecretSpec:
    refreshInterval: "15s"
    refreshPolicy: Periodic
    secretStoreRef:
      name: vault-backend
      kind: ClusterSecretStore

    target:
      name: harbor-regcredentials
      creationPolicy: Owner
      template:
        type: kubernetes.io/dockerconfigjson
        data:
          .dockerconfigjson: "{{ .harborcred }}" # pour helm template "{{ `{{ .mysecret }}` }}"
        metadata:
          labels:
            techledger.io: harbor-regcredentials

    data:
      - secretKey: harborcred
        remoteRef:
          conversionStrategy: Default
          decodingStrategy: None
          metadataPolicy: None
          key: harbor/regcred
          property: harbor-dev-cred

 

 

Commentaires

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.