External Secrets Operator

External Secrets Operator s'intègre à Devolutions Server pour la gestion des secrets.

Les valeurs de ce guide (par exemple, your-application-id) sont des exemples, remplacer par les valeurs spécifiques à votre environnement.

Authentification

L’authentification Devolutions Server utilise les identifiants ID d’application et secret d’application.

Créer une identité d'application dans Devolutions Server

  1. Se connecter à l'interface Web de votre Devolutions Server.

  2. Se rendre dans AdministrationIdentités d'applications.

  3. Cliquer sur Ajouter (+) pour créer une nouvelle application.

  4. Configurer l'application avec les permissions requises pour accéder aux coffres et entrées souhaités.

  5. Enregistrer l’ID d’application et le secret d’application.

Créer le secret Kubernetes

Créer un secret Kubernetes contenant vos identifiants Devolutions Server en utilisant le script suivant :

kubectl create secret generic dvls-credentials \
  --from-literal=app-id="your-application-id" \
  --from-literal=app-secret="your-application-secret"

Créer un SecretStore

apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
  name: dvls-store
  namespace: default
spec:
  provider:
    dvls:
      serverUrl: 'https://dvls.example.com'
      vault: 'my-vault'
      auth:
        secretRef:
          appId:
            name: dvls-credentials
            key: app-id
          appSecret:
            name: dvls-credentials
            key: app-secret
Champ Description
serverUrl L’URL de l’instance Devolutions Server (p. ex. : https://dvls.example.com)
vault Le nom ou l'UUID du coffre depuis lequel extraire les secrets. Si omis, le coffre doit être spécifié dans la clé du secret à l'aide de l'ancien format /. Ce champ est facultatif.
insecure Définir à true pour autoriser les connexions HTTP non sécurisées. Non recommandé en production. Ce champ est optionnel.
auth.secretRef.appId Référence au secret contenant l'ID d'application.
auth.secretRef.appSecret Référence vers le secret contenant le secret d’application.

Pour ClusterSecretStore, s'assurer d'indiquer le namespace dans les références du secret.

Référencer des secrets

Faire référence aux entrées par UUID ou nom :

Format Exemple
UUID de l’entrée 7c9e6679-7425-40de-944b-e07fc1f90ae7
Nom de l’entrée db-credentials
Nom de l’entrée avec chemin du dossier infrastructure/databases/db-credentials
Chemin de dossier avec barres obliques inverses infrastructure\databases\db-credentials

Le coffre est configuré dans le champ vault du SecretStore (nom ou UUID), donc la clé doit simplement identifier l'entrée.

Chemins de dossiers

Si une entrée se trouve dans un dossier, il est possible d’inclure le chemin du dossier avant le nom de l’entrée. Les barres obliques (/) et les antislash (\) sont acceptés comme séparateurs de chemin :

folder/subfolder/entry-name
folder\subfolder\entry-name

Lors de l'utilisation de barres obliques inverses dans YAML, les échapper avec une double barre oblique inverse (\\) :

key: "folder\\subfolder\\entry-name"

Les barres obliques n’ont pas besoin d’être échappées et sont recommandées pour plus de simplicité.

Les noms d’entrée contenant des barres obliques (/) ou des antislash (\) ne sont pas pris en charge avec les recherches basées sur le nom, puisque ces caractères sont interprétés comme des séparateurs de chemin. Utiliser plutôt l’UUID de l’entrée.

Le chemin du dossier est optionnel. Sans chemin, le fournisseur cherche dans tous les dossiers du coffre. Si plusieurs entrées portent le même nom dans différents dossiers, il est possible de préciser le chemin du dossier ou d’utiliser l’UUID de l’entrée pour lever l’ambiguïté.

Les recherches basées sur le nom résolvent le nom en un UUID à l'exécution via un appel d'API. Si plusieurs entrées d'identifiants correspondent, une erreur est renvoyée. Pour les scénarios fréquemment en écriture (opérations PushSecret fréquentes), préférer les références UUID pour éviter la recherche supplémentaire par opération.

Il est possible de trouver les UUID dans l'interface Web de Devolutions Server en consultant les propriétés de l'entrée.

Types d’identifiants pris en charge

Devolutions Server prend en charge plusieurs types d'identifiants. Le fournisseur associe chaque type à des propriétés spécifiques :

Type d’identifiant Type d’entrée Devolutions Server Propriétés disponibles
Par défaut Identifiant username, password, domain
Code d'accès Secret password
Clé API Identifiant api-id, api-key, tenant-id
Principal de service Azure Identifiant client-id, client-secret, tenant-id
Chaîne de connexion Identifiant connection-string
Clé privée Identifiant username, password, private-key, public-key, passphrase

Toutes les entrées incluent également les propriétés de métadonnées entry-id et entry-name.

Lorsqu’aucun property n’est spécifié, le champ password est retourné par défaut.

Dans l’interface Web de Devolutions Server, les entrées « Secret » apparaissent comme un type d’entrée distinct et sont associées en interne au sous-type d'identifiant Code d'accès.

Exemples

Obtenir des propriétés individuelles

Pour obtenir des propriétés spécifiques d'une entrée d'identifiants :

---
# Fetch a single property from a credential entry by name
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: database-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    kind: SecretStore
    name: dvls-store
  target:
    name: database-secret
    creationPolicy: Owner
  data:
    - secretKey: username
      remoteRef:
        key: 'db-credentials'
        property: username
    - secretKey: password
      remoteRef:
        key: 'db-credentials'
        property: password
---
# Fetch all fields from a credential entry with folder path
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: api-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    kind: SecretStore
    name: dvls-store
  target:
    name: api-secret
    creationPolicy: Owner
  dataFrom:
    - extract:
        key: 'infrastructure/apis/my-api-key'
---
# Fetch a Secret entry (Access Code type) by UUID
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: app-secret
spec:
  refreshInterval: 1h
  secretStoreRef:
    kind: SecretStore
    name: dvls-store
  target:
    name: app-secret
    creationPolicy: Owner
  data:
    - secretKey: secret
      remoteRef:
        key: '<entry-uuid>'
        property: password

Utiliser dataFrom pour extraire tous les champs

Lors de l’utilisation de dataFrom.extract, toutes les propriétés disponibles de l’entrée d’identifiants seront synchronisées dans le secret Kubernetes.

Pousser des secrets

Le fournisseur Devolutions Server permet de pousser des secrets vers Devolutions Server :

apiVersion: external-secrets.io/v1alpha1
kind: PushSecret
metadata:
  name: push-to-dvls
spec:
  refreshInterval: 1h
  secretStoreRefs:
    - name: dvls-store
      kind: SecretStore
  selector:
    secret:
      name: my-k8s-secret
  data:
    - match:
        secretKey: password
        remoteRef:
          # When vault is set in the SecretStore, remoteKey is the entry name
          # (or path/name). Without vault, use the legacy 'vault-uuid/entry-uuid' format.
          remoteKey: 'db-credentials'

Remarque : La mise à jour d’un secret remplace le champ mot de passe de l’entrée existante. L'entrée doit déjà exister dans Devolutions Server.

Limitations

  • GetAllSecrets : L’opération find pour la détection de secrets n’est pas prise en charge actuellement.

  • Certificats CA personnalisés : les certificats TLS personnalisés pour les instances Devolutions Server auto-signées ne sont pas encore pris en charge. Utiliser la variable d'environnement SSL_CERT_FILE comme solution de contournement.

  • Entrées certificat : les types d'entrées de certificat (Document/Certificate) ne sont pas actuellement pris en charge. Seules les entrées Identifiant sont prises en charge.

Résolution de problèmes

Erreurs d’authentification

Si recevoir des erreurs d'authentification:

  1. Vérifier que l’ID d’application et le secret sont corrects.

  2. Vérifier que l’application dispose des permissions nécessaires dans Devolutions Server.

  3. Vérifier que l’URL du serveur Devolutions Server est accessible depuis votre cluster Kubernetes.

Entrée non trouvée

Si une entrée ne peut pas être trouvée :

  1. Vérifier que les références au coffre et à l'entrée sont correctes (UUID ou nom)

  2. S’assurer que l’application dispose d’au moins un droit de lecture sur le coffre

  3. Vérifier que l'entrée existe et qu'il s'agit d'une entrée Identifiant ou Secret

  4. S'assurer que l'application dispose au minimum de l'autorisation de lecture, de l'affichage du mot de passe et de la permission de connexion (exécuter) sur l'entrée

Plusieurs entrées trouvées

Si un message d’erreur « plusieurs entrées trouvées » apparaît lors de l’utilisation des références par nom, cela signifie que plusieurs entrées d’identifiants partagent le même nom dans le coffre. Utiliser l’UUID de l’entrée au lieu du nom pour cibler la bonne entrée.

Devolutions Forum logo Partagez vos commentaires