Zurück zu den Updates
New releaseAug 19, 2026

kviklet v0.8.0

PR-ähnlicher Überprüfungs-/Genehmigungsprozess für Datenbankabfragen. Für konformen, aber reibungslosen Engineering-Zugriff auf die Produktion.

Teilen

Kviklet

Kviklet.dev | Versionshinweise | Discord

Sicherer Zugriff auf Produktionsumgebungen, ohne die Entwicklerproduktivität zu beeinträchtigen.

Kviklet Kviklet

Kviklet (ausgesprochen Quick-let) setzt auf das Vier-Augen-Prinzip und ein hohes Maß an Konfigurierbarkeit, um einen Pull-Request-ähnlichen Review- und Genehmigungsablauf für einzelne SQL-Anweisungen oder Datenbanksitzungen zu ermöglichen. So können Entwicklungsteams selbstregulierend festlegen, wer wann auf welche Daten zugreifen darf. Organisationen bleiben sicher und compliant, während sie moderne, befähigende und wirklich „DevOps“-Workflows nutzen.

Kviklet ist ein selbst gehosteter Docker-Container, der eine Single-Page-Webanwendung bereitstellt. Melde dich an, um SQL-Anfragen zu erstellen oder die von anderen zu genehmigen. Eine optionale Enterprise-Lizenz schaltet erweiterte Funktionen wie SAML-Authentifizierung, rollenbasierte Review-Anforderungen, Rollensynchronisation und API-Schlüssel frei. Du kannst eine Enterprise-Lizenz unter kviklet.dev anfordern.

Wir unterstützen derzeit Postgres, MySQL, MS SQL Server und MongoDB.

Funktionen

Kviklet bietet eine Vielzahl von Funktionen, die ein Entwicklungsteam für die Verwaltung des Produktionsdatenbankzugriffs auf einfache, aber sichere Weise benötigt:

  • SSO (OIDC, Google, Keycloak usw.): Melde dich bei Kviklet an, ohne Benutzername oder Passwort. Keine gemeinsamen Anmeldedaten mehr für den Datenbankzugriff.
  • LDAP-Unterstützung: Melde dich mit deinen LDAP-Anmeldedaten bei Kviklet an.
  • SAML-Unterstützung: Melde dich mit deinen SAML-Anmeldedaten bei Kviklet an. (Nur Enterprise)
  • Review-/Genehmigungsablauf: Hinterlasse Kommentare und Vorschläge zu Datenanfragen anderer Entwickler.
  • Temporärer Zugriff (1h): Führe nach Genehmigung für 1 Stunde beliebige Anweisungen auf einer Datenbank aus.
  • Einzelabfrage: Führe eine einzelne Anweisung aus. Ermöglicht dem Prüfer, die Abfrage vor der Ausführung zu überprüfen.
  • Auditlog: Einheitliche Protokollierung aller ausgeführten Anweisungen mit Autor, Ausführungsgrund usw.
  • RBAC: Konfiguriere, welches Team auf welche Datenbank/Tabelle zugreifen darf, so fein granular wie es die Datenbank-Engine erlaubt.
  • Postgres-Proxy: Starte einen Proxy-Server, um den Datenbank-Client deiner Wahl zu verwenden – alles wird im Kviklet-Auditlog gespeichert.
  • Kubernetes Exec: Führe eine Anweisung auf einem Pod in deinem Kubernetes-Cluster aus. (Unterstützt derzeit nur die Ausführung eines einzelnen Befehls, noch keine Live-Sitzung)
  • Rollenbasierte Prüfgates: Erfordere Genehmigungen von bestimmten Rollen vor der Ausführung. (Nur Enterprise)
  • Rollensynchronisation: Synchronisiere Benutzerrollen automatisch aus den Gruppen deines Identitätsanbieters. (Nur Enterprise)
  • API-Schlüssel: Programmatischer Zugriff auf die Kviklet-API. (Nur Enterprise)

Funktionen nach Datenbank/Verbindungstyp

Die meisten Funktionen sind für alle Datenbanken verfügbar (SSO, LDAP, RBAC, Review-/Genehmigungsablauf, Auditlog usw.). Einige Funktionen sind jedoch eingeschränkt, entweder weil sie noch nicht implementiert wurden oder für diesen speziellen Zweck keinen Sinn ergeben. Die folgende Tabelle zeigt, welche Funktionen für welchen Datenbanktyp verfügbar sind:

DatenbankAnweisungsprüfungTemporärer ZugriffProxy (Beta)Erklärungsplan
Postgres
MySQL
MariaDB
SQL Server
MongoDB
Kubernetes

Setup

Kviklet wird als einfacher Docker-Container ausgeliefert. Die verfügbaren Versionen findest du unter Releases. Wir empfehlen, die verwendete Version regelmäßig zu aktualisieren, da wir kontinuierlich neue Funktionen entwickeln.
Die aktuellste ist derzeit ghcr.io/kviklet/kviklet:0.7.0, du kannst auch :main verwenden, aber es kann hin und wieder vorkommen, dass wir versehentlich etwas Fehlerhaftes zusammenführen. Obwohl wir das zu vermeiden versuchen.

Schnellstart

Wenn du es nur einmal ausprobieren möchtest:

  1. Hier ist eine minimale docker-compose.yaml:

    Klicke, um den Compose-Inhalt zu erweitern ``` services: postgres: image: postgres:16 restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres ports: - "5432:5432" volumes: - ./postgres-data:/var/lib/postgresql/data # - ./sample_data.sql:/docker-entrypoint-initdb.d/init.sql

    kviklet-postgres: image: postgres:16 restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: kviklet ports: - "5433:5432" volumes: - ./kviklet-postgres-data:/var/lib/postgresql/data

    kviklet: image: ghcr.io/kviklet/kviklet:main ports: - "80:8080" environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://kviklet-postgres:5432/kviklet - SPRING_DATASOURCE_USERNAME=postgres - SPRING_DATASOURCE_PASSWORD=postgres - INITIAL_USER_EMAIL=[email protected] - INITIAL_USER_PASSWORD=admin depends_on: - kviklet-postgres

  1. Führen Sie die docker-compose.yml via docker-compose up -d aus. Kviklet wird auf Port 80 gestartet, gehen Sie zu localhost und spielen Sie herum. Der Admin-Login ist [email protected] mit admin als Passwort.

  2. Das docker-compose enthält eine zusätzliche postgres Datenbank, für die Sie eine Verbindung in Kviklit einrichten können. Um diese Datenbank mit Daten zu füllen, kommentieren Sie diese Zeile aus: ``` - ./sample_data.sql:/docker-entrypoint-initdb.d/init.sql

Und erstellen Sie eine sample_data.sql-Datei:

Klicken, um den Inhalt von sample_data.sql zu erweitern ```sql CREATE TABLE Locations ( Name VARCHAR(100) NOT NULL, Address VARCHAR(255) NOT NULL, City VARCHAR(100) NOT NULL, Country VARCHAR(100) NOT NULL, PostalCode VARCHAR(20) NOT NULL );

alter table public.Locations owner to postgres;

INSERT INTO public.Locations (Name, Address, City, Country, PostalCode) VALUES ('Central Park', '59th to 110th St', 'New York', 'USA', '10022'), ('Eiffel Tower', 'Champ de Mars, 5 Avenue Anatole', 'Paris', 'France', '75007'), ('Colosseum', 'Piazza del Colosseo, 1', 'Rome', 'Italy', '00184'), ('Sydney Opera House', 'Bennelong Point', 'Sydney', 'Australia', '2000'), ('Great Wall of China', 'Huairou District', 'Beijing', 'China', '101405');

</details>

### DB-Einrichtung

Kviklet benötigt eine eigene postgres-Datenbank (oder zumindest ein Schema), um Metadaten über Abfragen, Verbindungen, Genehmigungen usw. zu speichern.
Das offizielle Image finden Sie hier: https://hub.docker.com/_/postgres, oder nutzen Sie eine von Ihrem Cloud-Anbieter gehostete Version.

Beim Starten des kviklet-Containers müssen Sie dann diese drei Umgebungsvariablen entsprechend setzen:```
SPRING_DATASOURCE_PASSWORD = password
SPRING_DATASOURCE_USERNAME = username
SPRING_DATASOURCE_URL = jdbc:postgresql://[host]:[port]/[database]?currentSchema=[schema]

Alternative Authentifizierungsmethoden

  • IAM Auth: Es ist möglich, AWS IAM Auth für die Datenbankverbindung zu verwenden, wobei Sie einfach das Passwort weglassen und nur den Benutzernamen festlegen. Sie müssen auch die Umgebungsvariable setzen: ``` SPRING_DATASOURCE_IAMAUTH=true

Kviklet lädt Anmeldeinformationen aus den üblichen Quellen (Umgebungsvariablen, Instanzrollen usw.) und generiert ein Token für die Verbindung.

  • Zertifikate: Sie können auch Zertifikate für die Datenbankverbindung verwenden, siehe hier für ein Beispiel.

Initial User

Sie benötigen einen anfänglichen Admin-Benutzer für Konfigurationszwecke. Setzen Sie dazu die beiden Umgebungsvariablen: INITIAL_USER_EMAIL und INITIAL_USER_PASSWORD damit Sie sich in der Weboberfläche anmelden können. Sie können das Passwort später über die Benutzeroberfläche ändern.
Beispiel:``` INITIAL_USER_EMAIL=[email protected] INITIAL_USER_PASSWORD=someverysecurepassword

Wir veröffentlichen unsere Container derzeit auf GitHub Packages. Mit all diesen Einstellungen können Sie `ghcr.io/kviklet/kviklet:main` ausführen. Vergessen Sie nicht, Port `8080` zu mappen, der der Standardport ist, den Kviklet verwendet.

Ein Beispiel für einen Docker-Run könnte so aussehen:```
docker run \
-e SPRING_DATASOURCE_PASSWORD=postgres \
-e SPRING_DATASOURCE_USERNAME=postgres \
-e SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/Kviklet \
-e [email protected] \
-e INITIAL_USER_PASSWORD=someverysecurepassword \
--network host \
ghcr.io/kviklet/kviklet:main

SSO über OIDC / OAuth2

Google

Wenn Sie SSO für Ihre Kviklet-Instanz einrichten möchten (was sehr sinnvoll ist, da Sie sonst wieder Passwörter verwalten müssen). Sie müssen diese 3 Umgebungsvariablen einrichten:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=google

Die Google-Client-ID und das Geheimnis erhalten Sie ganz einfach, indem Sie den Google-Anleitungen hier folgen:
https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid

Für gültige Weiterleitungs-URIs sollten Sie konfigurieren: https://[kviklet_host]/api/login/oauth2/code/google
Für Zulässige Ursprünge (Allowed Origins) einfach Ihre gehostete Kviklet-URL.

Nachdem Sie diese Umgebungsvariablen gesetzt haben, kann sich jeder in Ihrer Organisation mit dem „Anmelden mit Google“-Button anmelden. Standardmäßig haben sie jedoch keine Berechtigungen. Sie müssen ihnen eine Rolle zuweisen, nachdem sie sich einmal angemeldet haben.

#### Keycloak

Wenn Sie stattdessen SSO mit Keycloak einrichten möchten, müssen Sie diese 4 Umgebungsvariablen setzen:```
KVIKLET_IDENTITYPROVIDER_CLIENTID
KVIKLET_IDENTITYPROVIDER_CLIENTSECRET
KVIKLET_IDENTITYPROVIDER_TYPE=keycloak
KVIKLET_IDENTITYPROVIDER_ISSUERURI=http://[host]:[port]/realms/[realm]

Sie erhalten die Client-ID und das Geheimnis, wenn Sie eine Anwendung in Keycloak erstellen. Für gültige Weiterleitungs-URIs sollten Sie konfigurieren: https://[kviklet_host]/api/login/oauth2/code/keycloak Für Erlaubte Ursprünge geben Sie einfach die URL Ihrer gehosteten Kviklet-Instanz an.

Nachdem Sie diese Umgebungsvariablen gesetzt haben, sollte die Anmeldeseite einen Button „Login with Keycloak“ anzeigen, der zu Ihrer Keycloak-Instanz weiterleitet. In der Enterprise-Edition können Sie die Rollensynchronisation aktivieren, um Rollen automatisch von Ihrer Keycloak-Instanz zu Kviklet zu synchronisieren. Weitere Details finden Sie im Abschnitt Rollen-Synchronisation (Enterprise).

GitHub (Beta)

Beta: Die GitHub-Authentifizierung ist neu und unterstützt Rollen-Synchronisation (Enterprise) noch nicht — jeder neue Benutzer landet mit der Standardrolle und muss manuell Rollen zugewiesen bekommen.

GitHub ist nicht OIDC-konform (es ist reines OAuth 2.0), daher hat es dedizierte Unterstützung in Kviklet. Setzen Sie diese Umgebungsvariablen:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=github KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS=your-org,another-org

Erstellen Sie eine GitHub OAuth-App unter https://github.com/settings/developers und konfigurieren Sie:

- Autorisierungs-Callback-URL: `https://[kviklet_host]/api/login/oauth2/code/github`
- Homepage-URL: Ihre gehostete Kviklet-URL

`KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS` ist **erforderlich** (Kviklet weigert sich zu starten, ohne dies). GitHub OAuth-Apps können nicht einschränken, wer den OAuth-Fluss durchführt, also ruft Kviklet nach der Authentifizierung `/user/orgs` auf und lehnt Benutzer ab, die kein Mitglied mindestens einer zugelassenen Organisation sind (Groß-/Kleinschreibung egal, die ersten 100 Organisationen werden überprüft).

Damit die Organisationsprüfung die Mitgliedschaft eines Benutzers sieht, muss der Benutzer auf dem OAuth-Zustimmungsbildschirm neben jeder zugelassenen Organisation auf **Erteilen** (oder **Anfordern**) klicken. Wenn die Organisation die Option „Drittanbieter-OAuth-Anwendungen einschränken“ aktiviert hat, muss ein Organisationsbesitzer die OAuth-App einmal genehmigen, bevor die Mitgliedschaft eines Mitglieds sichtbar wird.

Kviklet fordert die Bereiche `read:user`, `user:email` und `read:org` an. E-Mails werden immer von `/user/emails` gelesen und nur ein `primary && verified`-Eintrag wird akzeptiert, sodass sich Benutzer mit privaten E-Mail-Adressen trotzdem erfolgreich anmelden können.

#### Andere OIDC-Anbieter

Andere OIDC-konforme Anbieter (GitLab, Auth0, Okta, usw.) sollten ähnlich wie Keycloak funktionieren. Beachten Sie, dass sich die `redirect URI` je nach gewähltem Typ ändert. Wenn Sie also `gitlab` wählen, lautet sie `https://[kviklet_host]/api/login/oauth2/code/gitlab`. Wenn Sie auf Probleme stoßen, erstellen Sie gerne ein Issue. Wir haben noch nicht jeden einzelnen OIDC-Anbieter getestet und es könnte geringfügige Unterschiede in der Implementierung geben, die Aktualisierungen auf Seiten von Kviklet erfordern könnten.

### LDAP

Kviklet unterstützt LDAP-Authentifizierung. Um LDAP zu aktivieren und zu konfigurieren, können Sie die folgenden Umgebungsvariablen überschreiben:```
LDAP_ENABLED=true
LDAP_URL=ldap://your-ldap-server:389
LDAP_BASE=dc=your,dc=domain,dc=com
LDAP_PRINCIPAL=cn=admin,dc=your,dc=domain,dc=com
LDAP_PASSWORD=your-admin-password
LDAP_UNIQUE_IDENTIFIER_ATTRIBUTE=uid
LDAP_EMAIL_ATTRIBUTE=mail
LDAP_FULL_NAME_ATTRIBUTE=cn
LDAP_USER_OU=people
LDAP_SEARCH_BASE=ou=people

Hier ist, was jede Einstellung bedeutet:

  • LDAP_ENABLED: Auf true setzen, um LDAP-Authentifizierung zu aktivieren.
  • LDAP_URL: Die URL Ihres LDAP-Servers.
  • LDAP_BASE: Der Basis-DN für LDAP-Suchen.
  • LDAP_PRINCIPAL: Der DN des Admin-Benutzers zum Binden an den LDAP-Server.
  • LDAP_PASSWORD: Das Passwort für den Admin-Benutzer.
  • LDAP_UNIQUE_IDENTIFIER_ATTRIBUTE: Das LDAP-Attribut, das als eindeutige Kennung für Benutzer verwendet wird (Standard: "uid").
  • LDAP_EMAIL_ATTRIBUTE: Das LDAP-Attribut, das die E-Mail-Adresse des Benutzers enthält (Standard: "mail").
  • LDAP_FULL_NAME_ATTRIBUTE: Das LDAP-Attribut, das den vollständigen Namen des Benutzers enthält (Standard: "cn").
  • LDAP_USER_OU: Die Organisationseinheit (OU), in der Benutzerkonten gespeichert werden (Standard: "people").
  • LDAP_SEARCH_BASE: Ermöglicht das Überschreiben des Basis-DN für Benutzersuchen (Standard: "ou=people"). Wenn Sie FreeIPA verwenden, müssen Sie dies möglicherweise auf z.B. cn=users setzen. Falls gesetzt, wird LDAP_USER_OU ignoriert.

Sie können diese Attribute an Ihr LDAP-Schema anpassen. Nach der Konfiguration von LDAP können sich Benutzer mit ihren LDAP-Anmeldedaten anmelden. Beim ersten Login eines LDAP-Benutzers wird ein entsprechendes Benutzerkonto in Kviklet mit Standardberechtigungen erstellt. Ein Administrator muss diesen Benutzern nach ihrem ersten Login geeignete Rollen zuweisen.

SAML (nur Enterprise)

Kviklet unterstützt SAML 2.0-Authentifizierung. Um SAML zu aktivieren, setzen Sie die folgenden Umgebungsvariablen:``` SAML_ENABLED=true SAML_ENTITYID=https://your-identity-provider.com SAML_SSOSERVICELOCATION=https://your-identity-provider.com/sso SAML_VERIFICATIONCERTIFICATE=-----BEGIN CERTIFICATE-----\nMIICmzCCAYMCBgF4...\n-----END CERTIFICATE-----

Configuration details:

- `SAML_ENABLED`: Auf `true` setzen, um die SAML-Authentifizierung zu aktivieren
- `SAML_ENTITYID`: Die Entitäts-ID Ihres SAML-Identitätsanbieters
- `SAML_SSOSERVICELOCATION`: Die SSO-Dienst-URL Ihres Identitätsanbieters
- `SAML_VERIFICATIONCERTIFICATE`: Das X.509-Zertifikat, das zur Überprüfung von SAML-Antworten verwendet wird (schließen Sie die BEGIN/END CERTIFICATE-Zeilen ein)

Sie können optional die SAML-Attributzuordnungen anpassen:```
SAML_USERATTRIBUTES_EMAILATTRIBUTE=email
SAML_USERATTRIBUTES_NAMEATTRIBUTE=name
SAML_USERATTRIBUTES_IDATTRIBUTE=nameID

Ihr Identitätsanbieter sollte wie folgt konfiguriert sein:

  • Entity ID: https://[kviklet_host]/api/saml2/service-provider-metadata/saml
  • Redirect Uri: https://[kviklet_host]/api/login/saml2/sso/saml

Nach der Konfiguration von SAML können sich Benutzer über den Identitätsanbieter anmelden. Beim ersten Login wird ein Benutzerkonto mit Standardberechtigungen erstellt.

Wenn Sie korrekt zum IDP weitergeleitet werden, aber dann einen CORS-Fehler erhalten, können Sie den Host Ihres IDP zu den erlaubten Ursprüngen in Kviklet hinzufügen, indem Sie:``` CORS_ALLOWEDORIGINS=https://[idp_host]

## Konfiguration

### Verbindungen

Nach dem Start von Kviklet müssen Sie zunächst eine Datenbankverbindung konfigurieren. Gehen Sie zu Einstellungen -> Datenbanken -> Verbindung hinzufügen.

![Verbindung hinzufügen](https://assets.kitploit.com/production/public/readmes/7140/3ded2a0b23e5d2f02feb21a854263c91dedea25a789fb75ab8342384c4e39b52.png)
![Verbindung hinzufügen](https://assets.kitploit.com/production/public/readmes/7140/585238c9eddad8ed4e2440096ce0616445a6696e1042f58676a1d0b038edde7f.png)

Hier können Sie Review-Anforderungen und Ausführungslimits für jede Verbindung konfigurieren. Siehe [Review Gates](#review-gates) für Details.

#### AWS IAM AUTH

Kviklet unterstützt die Verwendung von IAM Auth für Postgres- und MySQL-Datenbankverbindungen. Wählen Sie dafür IAM Auth beim Erstellen einer neuen Verbindung.

![IAM Auth](https://assets.kitploit.com/production/public/readmes/7140/14ed42bd639eb9b0ba81b22850e277703f2da9495dd101f68066f95fc51f291c.png)
![IAM Auth](https://assets.kitploit.com/production/public/readmes/7140/5a60a3a9ae527e11679f3c33c787caba4c80b379ddc463db1f871288408517e1.png)

Dadurch wird die Option zum Festlegen eines Passworts entfernt und stattdessen werden AWS-Anmeldeinformationen verwendet, um eine Verbindung zur Datenbank herzustellen.

Kviklet verwendet den `DefaultCredentialsProvider` von AWS, um Anmeldeinformationen zu finden und das Token für die Verbindung zu generieren. Das bedeutet, dass alle üblichen Stellen funktionieren sollten (Umgebungsvariablen oder zugehörige Instanzrollen). Die genaue Reihenfolge ist hier dokumentiert: https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html

Zusätzlich können Sie eine AWS-Rollen-ARN angeben, die Kviklet übernimmt, und diese Anmeldeinformationen verwenden, um das temporäre DB-Token zu erstellen. Dies ist besonders nützlich, um eine Verbindung zu Datenbanken herzustellen, die sich nicht im selben AWS-Konto wie Kviklet befinden. Um diese Funktion zu nutzen, geben Sie einfach die Rollen-ARN in das dafür vorgesehene Feld ein, wenn Sie eine IAM-Auth-Verbindung erstellen oder bearbeiten. Wenn Sie das Feld leer lassen, wird der Standard-Anmeldeinformationsanbieter verwendet (keine Rollenübernahme).

Die während der Token-Generierung zu verwendende AWS-Region wird aus Ihrer Verbindungs-URL abgeleitet, daher gibt es keine Optionen, um sie festzulegen.

Um zu erfahren, wie Sie IAM Auth für Ihre Datenbank einrichten, folgen Sie der offiziellen AWS-Dokumentation: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
Die beiden Hauptpunkte sind:

- Erstellen Sie einen DB-Benutzer mit der IAM-Auth-Option und den richtigen Berechtigungen
- Erstellen Sie eine IAM-Richtlinie, die es der AWS-Entität erlaubt, Token für diesen Benutzer zu generieren

### Review Gates

Standardmäßig erlaubt Kviklet eine einfache Konfiguration der Anzahl der Überprüfungen. Sie können konfigurieren, wie viele Genehmigungen Anfragen für eine bestimmte Verbindung benötigen, bevor sie ausgeführt werden können.

Der Genehmigungsstatus einer Anfrage wird basierend auf der letzten Aktion jedes Prüfers berechnet. Wenn ein Prüfer genehmigt und später Änderungen anfordert, zählt nur die Änderungsanforderung – seine vorherige Genehmigung wird entfernt. Das Bearbeiten einer Anfrage setzt immer alle vorherigen Genehmigungen zurück, um sicherzustellen, dass keine Änderungen ausgeführt werden können, ohne zuerst überprüft zu werden. Ebenso werden bei einem Fehlschlagen der Ausführung (z. B. aufgrund eines SQL-Syntaxfehlers) die Genehmigungen zurückgesetzt, sodass die Anfrage korrigiert und erneut genehmigt werden kann, ohne eine neue erstellen zu müssen.

Sie können auch ein Limit für die **maximale Anzahl an Ausführungen** pro Verbindung konfigurieren, um zu steuern, wie oft eine einzelne genehmigte Anfrage ausgeführt werden kann. Der Standardwert ist 1. Wenn Sie dies auf 0 setzen, sind unbegrenzte Ausführungen möglich. Fehlgeschlagene Ausführungen zählen nicht zu diesem Limit.

#### Rollenbasierte Überprüfungsanforderungen (Enterprise)

Mit einer Kviklet Enterprise-Lizenz können Sie einzelne Verbindungen so konfigurieren, dass Genehmigungen von Benutzern mit bestimmten Rollen erforderlich sind. Dadurch können Sie z. B. die Genehmigung des Teams, das eine bestimmte Datenbank verwaltet, oder die Absicherung sensibler Verbindungen hinter DBA- oder Management-Genehmigungen erfordern.

**So funktioniert es:**

Jede Verbindung hat eine Anzahl **erforderlicher Gesamtüberprüfungen** (`numTotalRequired`), die als Mindestanzahl fungiert – die minimale Anzahl unterschiedlicher Genehmigungen, die unabhängig von Rollen erforderlich sind. Darüber hinaus können Sie **Rollenanforderungen** hinzufügen, die festlegen, wie viele Genehmigungen von Benutzern mit einer bestimmten Rolle stammen müssen (z. B. „1 von DBA, 1 von Sicherheit“).

Eine Anfrage wird nur genehmigt, wenn **beide** Bedingungen erfüllt sind:
- Die Gesamtzahl der unterschiedlichen Genehmigungen erreicht `numTotalRequired`
- Jede Rollenanforderung ist einzeln erfüllt

Wenn ein Benutzer mehreren Rollen angehört, zählt eine einzelne Genehmigung dieses Benutzers für alle übereinstimmenden Rollenanforderungen. Sie zählt jedoch weiterhin nur als eine Genehmigung für die Gesamtzahl.

**Beispiel:** Eine Verbindung erfordert 3 Gesamtgenehmigungen, darunter 1 von einem DBA und 1 von der Sicherheit. Ein Benutzer, der sowohl die DBA- als auch die Sicherheitsrolle besitzt, genehmigt – dies erfüllt beide Rollenanforderungen, zählt aber nur als 1 der 3 erforderlichen Gesamtgenehmigungen. Es sind noch zwei weitere Genehmigungen von beliebigen Benutzern erforderlich.

Wenn Ihre Enterprise-Lizenz abläuft, bleiben bestehende rollenbasierte Überprüfungsanforderungen bestehen, können aber nicht mehr geändert werden. Sie können sie nur entfernen, um auf die einfache Gesamtüberprüfungskonfiguration zurückzufallen.

### Rollen

Kviklet wird mit 3 Rollen ausgeliefert: Standard, Administratoren und Entwickler.

- Die Standardrolle gewährt Lesezugriff auf alle Verbindungen und Anfragen. Diese Rolle wird jedem Benutzer zugewiesen und kann nicht entfernt werden. Sie können die Berechtigungen dieser Rolle jedoch nach Belieben ändern.
- Administratoren haben die Berechtigung, Verbindungen zu erstellen und zu bearbeiten sowie neue Benutzer hinzuzufügen und deren Berechtigungen festzulegen.
- Entwickler können Anfragen erstellen sowie genehmigen, kommentieren und natürlich die eigentlichen Anweisungen ausführen.

Sie können Rollen anpassen und z. B. einer Rolle nur Zugriff auf eine bestimmte Verbindung oder eine Gruppe von DB-Verbindungen geben. Dies ist nützlich, wenn Sie verschiedene Teams mit unterschiedlichen Datenbanken haben und den Zugriff granularer steuern möchten.

#### Erstellen einer neuen Rolle

Das Erstellen einer neuen Rolle funktioniert wie folgt. Gehen Sie zu Einstellungen -> Rollen -> Rolle hinzufügen.

![Rolle hinzufügen](https://assets.kitploit.com/production/public/readmes/7140/a91b79287c0b3130b83bdde1c059f49b89c5d43a1c0deae33b211ea427956f8e.png)
![Rolle hinzufügen](https://assets.kitploit.com/production/public/readmes/7140/c535ac152759bb21bea04a0968ce43fa7bf946c7699feca23c71f9eaba41ceaf.png)

Die Standardeinstellungen sind für die meisten Rollen nicht so relevant und Sie können einfach Benutzer-Lese- und Rollenansichtszugriff gewähren und es dabei belassen. Interessanter ist das Hinzufügen einzelner Berechtigungen für Verbindungen. Hier fügen Sie zunächst einen Selektor hinzu, um bestimmte Verbindungen auszuwählen. Dies kann entweder eine bestimmte ID sein oder Sie verwenden Platzhalter mit `*`, um mehrere Verbindungen abzugleichen. Wenn Sie z. B. eine Rolle haben möchten, die Zugriff auf alle Dev-Datenbanken hat (falls Sie auch den Zugriff darauf mit Kviklet verwalten), würden Sie einen Selektor wie `dev-*` verwenden und sicherstellen, dass die IDs der Verbindungen korrekt eingestellt sind.

Sie können natürlich auch ein System erstellen, das Sie für Ihre verschiedenen Teams innerhalb Ihrer Organisation verwenden.

### Rollensynchronisation (Enterprise)

Synchronisieren Sie Benutzerrollen automatisch aus Ihren Identity-Provider-Gruppen. Diese Funktion erfordert eine Enterprise-Lizenz.

**Konfiguration** erfolgt unter Einstellungen > Rollensynchronisation:

- **Rollensynchronisation aktivieren**: Synchronisation ein-/ausschalten
- **Synchronisationsmodus**:
  - **Vollsynchronisation** – Benutzerrollen stimmen genau mit ihren IdP-Gruppenzuordnungen überein (plus der Standardrolle)
  - **Additiv** – IdP-Gruppen fügen Rollen hinzu, entfernen jedoch keine vorhandenen
  - **Nur erster Login** – Rollen werden nur beim ersten Login synchronisiert, manuelle Änderungen bleiben danach erhalten
- **Gruppenattribut**: Das IdP-Attribut, das Gruppenmitgliedschaften enthält (Standard: `groups`)
- **Rollenmappings**: Ordnen Sie IdP-Gruppennamen (z. B. `engineering`) Kviklet-Rollen zu

#### OIDC-Einrichtung

Konfigurieren Sie Ihren OIDC-Anbieter so, dass ein `groups`-Anspruch im ID-Token enthalten ist:

- **Keycloak**:

  Keycloak enthält standardmäßig keine Gruppen in Token, daher müssen Sie dem Client einen Mapper hinzufügen.

  1. Navigieren Sie im linken Menü zu **Clients**
  2. Wählen Sie Ihren Kviklet-Client aus
  3. Gehen Sie zum Tab **Client Scopes**
  4. Klicken Sie auf den dedizierten Scope (z. B. `kviklet-dedicated`)
  5. Gehen Sie zum Tab **Mappers**
  6. Klicken Sie auf **Mapper hinzufügen** → **Nach Konfiguration**
  7. Wählen Sie **Gruppenmitgliedschaft**
  8. Konfigurieren Sie den Mapper:

  | Einstellung | Wert |
  |---------|-------|
  | Name | `groups` |
  | Token Claim Name | `groups` |
  | Vollständiger Gruppenpfad | **OFF** |
  | Zum ID-Token hinzufügen | **ON** |
  | Zum Zugriffstoken hinzufügen | **ON** |
  | Zu userinfo hinzufügen | **ON** |

  9. Klicken Sie auf **Speichern**

  > **Wichtig:** Der „Token Claim Name“ muss mit dem „Gruppenattribut“ übereinstimmen, das in den Rollensynchronisationseinstellungen von Kviklet konfiguriert ist (Standard: `groups`).

- **Andere OIDC-Anbieter**: Fügen Sie einen Gruppen-Mapper/-Anspruch hinzu, der die Gruppenmitgliedschaften des Benutzers im ID-Token enthält. Dies erfolgt normalerweise in der Admin-Oberfläche des Anbieters.

  Wenn Sie auf Probleme stoßen, erstellen Sie bitte ein Issue. Wir haben noch nicht jeden einzelnen OIDC-Anbieter getestet und es könnte geringfügige Unterschiede in der Implementierung geben, die Aktualisierungen auf Kviklets Seite erfordern.

#### LDAP-Einrichtung

Die LDAP-Rollensynchronisation verwendet das `memberOf`-Attribut:

1. Stellen Sie sicher, dass auf Ihrem LDAP-Server das `memberOf`-Overlay aktiviert ist
2. Setzen Sie das **Gruppenattribut** in Kviklet auf `memberOf`
3. Die Gruppennamen werden dann aus dem `memberOf`-Attribut in den Benutzerattributen extrahiert.

#### SAML-Einrichtung

Konfigurieren Sie Ihren SAML-IdP so, dass er Gruppen in der Assertion enthält:

1. Fügen Sie eine Attribut-Anweisung hinzu, die Benutzergruppenmitgliedschaften abbildet
2. Setzen Sie das **Gruppenattribut** in Kviklet so, dass es mit Ihrem SAML-Attributnamen übereinstimmt
3. Die Gruppennamen werden dann aus dem SAML-Attribut in den Benutzerattributen extrahiert.

### Benachrichtigungen

Sie können Kviklet so konfigurieren, dass Benachrichtigungen an einen Kanal in Slack oder Teams gesendet werden. Dies ist nützlich, um Ihr Team über neue Anfragen zu informieren, die überprüft werden müssen. Sie können dies unter Einstellungen -> Allgemein -> Benachrichtigungseinstellungen konfigurieren.

#### Slack

Um Slack-Benachrichtigungen zu konfigurieren, müssen Sie eine Slack-App erstellen und Webhooks dafür aktivieren. Sie können die Anweisungen hier befolgen: https://api.slack.com/messaging/webhooks

#### Teams

Teams-Benachrichtigungen verwenden einen Power Automate **Workflow**-Webhook. Kviklet sendet eine Adaptive Card, die die Webhook-Vorlage in Ihren Kanal postet.

**Empfohlen: Verwenden Sie die Workflow-Vorlage**

1. Öffnen Sie in Teams den Kanal, in dem Sie Benachrichtigungen erhalten möchten, klicken Sie auf die **...** neben dem Kanalnamen und wählen Sie **Workflows** (oder fügen Sie die **Workflows**-App hinzu).
2. Suchen Sie nach der Vorlage **"Webhook-Benachrichtigungen an einen Kanal senden"** und erstellen Sie diese.
3. Melden Sie sich an, wenn Sie dazu aufgefordert werden, wählen Sie das Zielteam und den Zielkanal aus und erstellen Sie den Workflow.
4. Öffnen Sie den Triggerschritt und kopieren Sie die generierte **HTTP-POST-URL**.
5. Fügen Sie die URL in Kviklet unter Einstellungen -> Allgemein -> Benachrichtigungseinstellungen ein und klicken Sie auf Speichern.

**Alternative: Workflow manuell erstellen**

Wenn Sie den Flow lieber selbst erstellen möchten (oder die Vorlage nicht verfügbar ist):

1. Kanal **...** -> **Workflows** -> Erstellen Sie einen Flow mit dem Trigger **"Wenn eine Teams-Webhook-Anfrage empfangen wird"**.
2. Fügen Sie die Aktion **Microsoft Teams -> "Karte in einem Chat oder Kanal posten"** hinzu.
3. Setzen Sie das Feld **Adaptive Card** der Aktion auf den Ausdruck `string(triggerBody())`, damit die von Kviklet gesendete Karte gepostet wird.
4. Wählen Sie das Zielteam und den Zielkanal aus, **speichern** Sie, und kopieren Sie dann die **HTTP-POST-URL** aus dem Triggerschritt.

Derzeit gibt es Benachrichtigungen für:

- Neue Anfragen, die Genehmigungen benötigen
- Neue Genehmigungen für Anfragen

#### Basis-URL-Konfiguration

Wenn Kviklet hinter einem Reverse-Proxy oder Kubernetes-Ingress ausgeführt wird, können Benachrichtigungslinks die interne IP-Adresse anstelle Ihrer öffentlichen Domain verwenden. Kviklet versucht, die korrekte URL zu verfolgen, indem es eingehende Anfragen prüft, aber einige Reverse-Proxys setzen die Forwarded-Header nicht korrekt. Um dies zu beheben, legen Sie die Basis-URL explizit fest:```
KVIKLET_BASE_URL=https://kviklet.example.com

Dies stellt sicher, dass alle Benachrichtigungslinks auf die korrekte öffentliche URL verweisen.

Protokollierung

Standardmäßig schreibt Kviklet menschenlesbare (aufbereitete) Logs in stdout, was praktisch ist, wenn man sie direkt oder über docker logs liest.

Wenn Sie Logs an ein zentrales System (Elasticsearch, Loki, Datadog, CloudWatch, …) senden, können Sie stattdessen auf strukturierte JSON-Logs umschalten, die einfacher zu indizieren und abzufragen sind. Stellen Sie das Format über eine Umgebungsvariable ein:```

One of: ecs (Elastic Common Schema), logstash, gelf (Graylog)

LOGGING_STRUCTURED_FORMAT_CONSOLE=ecs

## Verschlüsselung

Wenn Sie nicht möchten, dass die Anmeldeinformationen im Klartext in der Datenbank gespeichert werden, wird empfohlen, die Datenbankverschlüsselung für die Kviklet-Postgres-DB selbst zu aktivieren. Bei den meisten Hosting-Anbietern ist dies ein einfaches Ankreuzfeld.
Wenn die Kviklet-Datenbank dennoch kompromittiert wird, stellt dies ein enormes Sicherheitsrisiko dar, da sie die Datenbank-Anmeldeinformationen für potenziell alle Ihre Produktionsdatenspeicher enthält. Daher können Sie die Verschlüsselung der ruhenden Anmeldeinformationen aktivieren.

Setzen Sie dazu einfach die beiden Umgebungsvariablen.```
ENCRYPTION_ENABLED=true
ENCRYPTION_KEY_CURRENT=some-secret

Kviklet verschlüsselt beim Start alle Ihre vorhandenen Anmeldedaten und verwendet das Secret für zukünftige Verbindungen, die Sie erstellen.

Schlüsselrotation

Wenn Sie den Schlüssel rotieren möchten, können Sie einfach eine weitere Variable für den vorherigen Schlüssel hinzufügen und den aktuellen ändern:``` ENCRYPTION_KEY_PREVIOUS=some-secret ENCRYPTION_KEY_CURRENT=another-secret

Kviklet wird beim Start alle Verbindungen neu verschlüsseln, sodass Sie den Container anschließend ohne den vorherigen Schlüssel neu starten können.

## API-Schlüssel

Kviklet unterstützt API-Schlüssel für den programmatischen Zugriff auf das System. Dies ist eine reine Enterprise-Funktion und erfordert eine gültige Lizenz. Sie können API-Schlüssel im Bereich Einstellungen -> API-Schlüssel erstellen.

![API-Schlüssel](https://assets.kitploit.com/production/public/readmes/7140/a11d80c93ef29ead3b8b3bf3b435a782208d10bd2978d80cd2c4edc1fc7bc506.png)
![API-Schlüssel](https://assets.kitploit.com/production/public/readmes/7140/21948bc6a43dbdd88be563befbfc9052a1dd4a99735817c2ff99680c9c32cbd0.png)

Verwenden Sie es wie folgt:```bash
curl --location '[kviklet_host]/api/connections/' \
--header 'Authorization: Bearer your-api-key'

API-Schlüssel erben die Berechtigungen des Benutzers, der sie erstellt. Derzeit können nur Administratoren API-Schlüssel verwalten, und alle mit einem API-Schlüssel durchgeführten Aktionen werden dem Benutzer zugeschrieben, der den Schlüssel erstellt hat.

Einige rudimentäre API-Dokumentationen finden Sie unter [kviklet_host]/api/swagger-ui/index.html. Beachten Sie jedoch, dass dies eine Arbeit in Arbeit ist und sich die API in zukünftigen Versionen ändern kann.

Letztendlich liegt die Wahrheit im Code, sodass Sie jederzeit einen Blick auf den Controller werfen können, um zu sehen, wie die API definiert ist. Wenn Sie Fragen haben, können Sie gerne ein Issue eröffnen.

Experimental Features

Derzeit gibt es zwei experimentelle Features. Diese wurden hauptsächlich auf Basis von Community-Feedback entwickelt. Sie können diese gerne ausprobieren und uns Ihr Feedback mitteilen. Wir hoffen, dies in Zukunft weiterzuentwickeln und gut in den Kern-Genehmigungsprozess zu integrieren.

Kubernetes Exec

Wenn Sie die Kubernetes Exec-Funktion nutzen möchten, müssen Sie eine separate Kubernetes-Verbindung erstellen. Kviklet verwendet den Benutzer des bereitgestellten Pods, um den Befehl auszuführen. Stellen Sie daher sicher, dass der Benutzer über die erforderlichen Berechtigungen verfügt, um Befehle auf den Pods auszuführen, auf die Sie zugreifen möchten.

Kviklet verwendet außerdem /bin/sh, um den Befehl auszuführen. Sie müssen also sicherstellen, dass Ihre Pods eine Shell oder zumindest einen Symlink in /bin/sh haben. Wenn Sie dies stört, können Sie gerne ein Issue eröffnen; möglicherweise können wir dies konfigurierbar machen oder eine andere Lösung finden.

Kubernetes-Befehle warten nur 5 Sekunden auf eine Ausgabe. Wenn der Befehl länger dauert, wartet Kviklet bis zu einer Stunde, bevor der Befehl abbricht. Dies ist eine vorläufige Lösung, wir arbeiten an WebSockets, um dies reaktionsschneller zu machen und möglicherweise Terminalsitzungen zu ermöglichen.

Proxy, Postgres only

Wenn Sie Anfragen für temporären Zugriff erstellen, können Sie – anstatt die Weboberfläche zu verwenden – Ihre Abfragen über einen von Kviklet verwalteten Proxy ausführen und den DB-Client Ihrer Wahl verwenden. Hierfür verwendet der Container die Ports 5438–6000, daher müssen Sie diese freigeben. Der Benutzer kann dann einen temporären Zugriffsantrag erstellen und auf "Start Proxy" klicken, sobald dieser genehmigt wurde. Jeder Antrag erhält einen Port und einen Benutzer sowie ein temporäres Passwort. Damit können sie sich mit der Datenbank verbinden. Kviklet validiert den temporären Benutzer und das Passwort und leitet alle Anfragen an den zugrunde liegenden Benutzer in der Datenbank weiter. Alle ausgeführten Anweisungen werden im Auditlog protokolliert, als ob sie über die Weboberfläche ausgeführt worden wären. Beachten Sie, dass die Nachrichtenanalyse auf der Proxy-Seite nicht mit allen Clients getestet wurde. Wenn Sie also auf Probleme stoßen, z. B. dass Anweisungen nicht protokolliert werden, können Sie gerne ein Issue eröffnen.

Postgres Proxy Postgres Proxy

Postgres Proxy - TLS

Kviklet beendet die TLS-Verbindung zur Datenbank. Das bedeutet, dass standardmäßig der gesamte Verkehr zum und vom Proxy selbst nicht verschlüsselt ist.
Wenn Sie möchten, dass Kviklet den Verkehr erneut verschlüsselt, können Sie Kviklet ein TLS-Zertifikat und einen Schlüssel für den Proxy bereitstellen, indem Sie die folgenden Umgebungsvariablen setzen:``` PROXY_TLS_CERTIFICATE_SOURCE=env PROXY_TLS_CERTIFICATE_CERT=your-certificate PROXY_TLS_CERTIFICATE_KEY=your-key

Alternativ können Sie Dateien verwenden:```
PROXY_TLS_CERTIFICATE_SOURCE=file
PROXY_TLS_CERTIFICATE_CERT_FILE=path/to/cert.pem
PROXY_TLS_CERTIFICATE_KEY_FILE=path/to/key.pem

Entweder müssen das Zertifikat und der Schlüssel im PEM-Format gespeichert werden.

Fragen? Beiträge?

Wenn du Fragen hast, Feedback geben möchtest oder Hilfe bei der Einrichtung benötigst, tritt unserer Discord-Community bei. Du kannst auch ein GitHub-Issue für Fehlermeldungen und Funktionsanfragen erstellen.

Wenn du einen Beitrag leisten möchtest, kannst du gerne forken und Pull Requests für kleinere Dinge erstellen. Wenn du größere Funktionen planst, würde ich eine vorherige Diskussion in einem GitHub-Issue oder auf Discord schätzen.

Du kannst mich auch unter [email protected] erreichen.

Kategorien