> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/pam/de/knowledge-base/knowledge-base-articles/external-secrets-operator.md).

# External Secrets Operator

External Secrets Operator lässt sich für die Secret-Verwaltung in [Devolutions Server](file:///) integrieren.

{% hint style="info" %}
Die Werte in dieser Anleitung (z. B. `your-application-id`) sind Platzhalter; ersetzen Sie sie durch die spezifischen Werte Ihrer Umgebung.
{% endhint %}

### Authentifizierung

Die Authentifizierung bei Devolutions Server verwendet die Anmeldeinformationen ***Application ID*** und ***Application secret***.

#### Erstellen einer Anwendungsidentität in Devolutions Server

1. Melden Sie sich an der Weboberfläche Ihres Devolutions Server an.
2. Navigieren Sie zu ***Administration*** – ***Applications identities***.
3. Klicken Sie auf ***Add*** (**+**), um eine neue Anwendung zu erstellen.
4. Konfigurieren Sie die Anwendung mit den Berechtigungen, die für den Zugriff auf die gewünschten Tresore und Einträge erforderlich sind.
5. Speichern Sie die ***Application ID*** und das ***Application secret***.

#### Erstellen des Kubernetes-Secrets

Erstellen Sie mit dem folgenden Skript ein Kubernetes-Secret, das Ihre Devolutions Server-Anmeldeinformationen enthält:

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

#### Erstellen eines SecretStore

```bash
apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
  name: dvls-store
  namespace: default
spec:
  provider:
    dvls:
      serverUrl: 'https://devolutions-server.example.com'
      vault: 'my-vault'
      auth:
        secretRef:
          appId:
            name: dvls-credentials
            key: app-id
          appSecret:
            name: dvls-credentials
            key: app-secret
```

| **Feld**                   | **Beschreibung**                                                                                                                                                                                                               |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `serverUrl`                | Die URL der Devolutions Server-Instanz (z. B. `https://devolutions-server.example.com`)                                                                                                                                        |
| `vault`                    | Der Name oder die UUID des Tresors, aus dem Secrets abgerufen werden sollen. Wird er weggelassen, muss der Tresor im Secret-Schlüssel im veralteten Format `<vault-id>/<entry-id>` angegeben werden. Dieses Feld ist optional. |
| `insecure`                 | Auf `true` setzen, um einfache HTTP-Verbindungen zuzulassen. **Für die Produktion nicht empfohlen**. Dieses Feld ist optional.                                                                                                 |
| `auth.secretRef.appId`     | Verweis auf das Secret, das die ***Application ID*** enthält.                                                                                                                                                                  |
| `auth.secretRef.appSecret` | Verweis auf das Secret, das das ***Application secret*** enthält.                                                                                                                                                              |

{% hint style="info" %}
Stellen Sie bei `ClusterSecretStore` sicher, dass Sie den `namespace` in den Secret-Verweisen angeben.
{% endhint %}

### Auf Secrets verweisen

Auf Einträge kann per UUID oder Name verwiesen werden:

| **Format**                                    | **Beispiel**                              |
| --------------------------------------------- | ----------------------------------------- |
| **Eintrags-UUID**                             | `7c9e6679-7425-40de-944b-e07fc1f90ae7`    |
| **Eintragsname**                              | `db-credentials`                          |
| **Eintragsname mit Ordnerpfad**               | `infrastructure/databases/db-credentials` |
| **Ordnerpfad mit umgekehrten Schrägstrichen** | `infrastructure\databases\db-credentials` |

Der Tresor wird im Feld `vault` des SecretStore konfiguriert (Name oder UUID), sodass der Schlüssel nur den Eintrag identifizieren muss.

#### Ordnerpfade

Wenn sich ein Eintrag in einem Ordner befindet, können Sie den Ordnerpfad vor dem Eintragsnamen angeben. Als Pfadtrennzeichen werden sowohl Schrägstriche (`/`) als auch umgekehrte Schrägstriche (`\`) akzeptiert:

```bash
folder/subfolder/entry-name
folder\subfolder\entry-name
```

{% hint style="warning" %}
Wenn Sie umgekehrte Schrägstriche in YAML verwenden, müssen Sie sie mit einem doppelten umgekehrten Schrägstrich (`\\`) escapen:
{% endhint %}

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

Schrägstriche müssen nicht escaped werden und werden aus Gründen der Einfachheit empfohlen.

{% hint style="warning" %}
Eintragsnamen, die Schrägstriche (`/`) oder umgekehrte Schrägstriche (`</code>) are not supported with name-based lookups, as those characters are interpreted as path separators. Use the entry UUID instead.`
{% endhint %}

Der Ordnerpfad ist optional. Ohne Pfad sucht der Provider in allen Ordnern des Tresors. Wenn mehrere Einträge in verschiedenen Ordnern denselben Namen haben, können Sie entweder den Ordnerpfad angeben oder die Eintrags-UUID zur Eindeutigkeit verwenden.

Namensbasierte Suchen lösen den Namen zur Laufzeit über einen API-Aufruf in eine UUID auf. Wenn mehrere Anmeldeinformations-Einträge übereinstimmen, wird ein Fehler zurückgegeben. Für schreibintensive Szenarien (häufige `PushSecret`-Vorgänge) sind UUID-Verweise vorzuziehen, um die zusätzliche Suche pro Vorgang zu vermeiden.

UUIDs finden Sie in der Weboberfläche von Devolutions Server, indem Sie die Eintragseigenschaften anzeigen.

### Unterstützte Anmeldeinformationstypen

Devolutions Server unterstützt mehrere Anmeldeinformationstypen. Der Provider ordnet jedem Typ bestimmte Eigenschaften zu:

| **Anmeldeinformationstyp**  | Devolutions Server **Eintragstyp** | **Verfügbare Eigenschaften**                                      |
| --------------------------- | ---------------------------------- | ----------------------------------------------------------------- |
| **Standard**                | Credential                         | `username`, `password`, `domain`                                  |
| **Access Code**             | Secret                             | `password`                                                        |
| **API Key**                 | Credential                         | `api-id`, `api-key`, `tenant-id`                                  |
| **Azure Service Principal** | Credential                         | `client-id`, `client-secret`, `tenant-id`                         |
| **Connection String**       | Credential                         | `connection-string`                                               |
| **Private Key**             | Credential                         | `username`, `password`, `private-key`, `public-key`, `passphrase` |

Alle Einträge enthalten außerdem die Metadaten-Eigenschaften `entry-id` und `entry-name`.

{% hint style="warning" %}
Wenn keine `property` angegeben ist, wird standardmäßig das Feld `password` zurückgegeben.

In der Weboberfläche von Devolutions Server erscheinen "Secret"-Einträge als eigener Eintragstyp und werden intern dem Anmeldeinformations-Subtyp Access Code zugeordnet.
{% endhint %}

### Beispiele

#### Einzelne Eigenschaften abrufen

So rufen Sie bestimmte Eigenschaften aus einem Anmeldeinformations-Eintrag ab:

```bash
---
# 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
```

#### dataFrom verwenden, um alle Felder zu extrahieren

Bei Verwendung von `dataFrom.extract` werden alle verfügbaren Eigenschaften des Anmeldeinformations-Eintrags mit dem Kubernetes-Secret synchronisiert.

### Secrets übertragen

Der Devolutions Server-Provider unterstützt das Zurückübertragen von Secrets an Devolutions Server:

```bash
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'
```

**Hinweis:** Push Secret aktualisiert das Passwortfeld eines vorhandenen Eintrags. Der Eintrag muss in Devolutions Server bereits vorhanden sein.

### Einschränkungen

* **GetAllSecrets**: Der `find`-Vorgang zum Auffinden von Secrets wird derzeit nicht unterstützt.
* **Benutzerdefinierte CA-Zertifikate**: Benutzerdefinierte TLS-Zertifikate für selbstsignierte Devolutions Server-Instanzen werden noch nicht unterstützt. Verwenden Sie die Umgebungsvariable `SSL_CERT_FILE` als Problemumgehung.
* **Zertifikatseinträge**: Zertifikats-Eintragstypen (`Document/Certificate`) werden derzeit nicht unterstützt. Es werden nur Credential-Einträge unterstützt.

### Fehlerbehebung

#### Authentifizierungsfehler

Wenn Sie Authentifizierungsfehler erhalten:

1. Überprüfen Sie, ob Application ID und Secret korrekt sind.
2. Stellen Sie sicher, dass die Anwendung über die erforderlichen Berechtigungen in Devolutions Server verfügt.
3. Prüfen Sie, ob die Server-URL von Devolutions Server von Ihrem Kubernetes-Cluster aus erreichbar ist.

#### Eintrag nicht gefunden

Wenn ein Eintrag nicht gefunden werden kann:

1. Überprüfen Sie, ob die Tresor- und Eintragsverweise korrekt sind (UUID oder Name)
2. Stellen Sie sicher, dass die Anwendung mindestens Lesezugriff auf den Tresor hat
3. Prüfen Sie, ob der Eintrag existiert und ein Eintrag des Typs Credential oder Secret ist
4. Stellen Sie sicher, dass die Anwendung mindestens die Berechtigungen Lesen, Passwort anzeigen und Verbinden (Ausführen) für den Eintrag hat

#### Mehrere Einträge gefunden

Wenn Sie bei namensbasierten Verweisen den Fehler "multiple entries found" erhalten, bedeutet dies, dass mehr als ein Anmeldeinformations-Eintrag denselben Namen im Tresor hat. Verwenden Sie die Eintrags-UUID anstelle des Namens, um den richtigen Eintrag anzusprechen.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/pam/de/knowledge-base/knowledge-base-articles/external-secrets-operator.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
