
Flux de révision/approbation similaire à une Pull Request pour les requêtes de base de données. Pour un accès Engineering conforme mais fluide à la production.
Kviklet.dev | Notes de version | Discord
Accès sécurisé aux environnements de production sans nuire à la productivité des développeurs.

Kviklet (prononcé Quick-let) adopte le principe des quatre yeux et un haut niveau de configurabilité pour permettre un flux de révision et d'approbation de type Pull Request pour des instructions SQL individuelles ou des sessions de base de données. Cela permet aux équipes d'ingénierie de s'autoréguler sur qui accède à quelles données et quand, permettant aux organisations de rester sécurisées et conformes tout en adoptant des workflows modernes, responsabilisants et véritablement « DevOps ».
Kviklet est un conteneur Docker auto-hébergé qui vous fournit une application Web à page unique. Connectez-vous pour créer des requêtes SQL ou approuver celles des autres. Une licence entreprise optionnelle débloque des fonctionnalités avancées comme l'authentification SAML, des exigences de révision basées sur les rôles, la synchronisation des rôles et les clés API. Vous pouvez demander une licence entreprise sur kviklet.dev.
Nous supportons actuellement Postgres, MySQL, MS SQL Server et MongoDB.
Kviklet est livré avec une variété de fonctionnalités dont une équipe d'ingénierie a besoin pour gérer l'accès à sa base de données de production de manière :
La plupart des fonctionnalités sont disponibles pour toutes les bases de données (SSO, LDAP, RBAC, flux de révision/approbation, journal d'audit, etc.). Mais certaines fonctionnalités sont restreintes, soit parce qu'elles n'ont tout simplement pas encore été construites, soit parce qu'elles n'ont pas de sens pour cet usage spécifique. Le tableau suivant montre quelles fonctionnalités sont disponibles pour quel type de base de données :
| Base de données | Révision des instructions | Accès temporaire | Proxy (Beta) | Plan d'explication |
|---|---|---|---|---|
| Postgres | ✓ | ✓ | ✓ | ✓ |
| MySQL | ✓ | ✓ | ✗ | ✓ |
| MariaDB | ✓ | ✓ | ✗ | ✓ |
| SQL Server | ✓ | ✓ | ✗ | ✓ |
| MongoDB | ✓ | ✓ | ✗ | ✗ |
| Kubernetes | ✓ | ✗ | ✗ | ✗ |
Kviklet est livré sous forme d'un simple conteneur Docker.
Vous pouvez trouver les versions disponibles sous Releases. Nous vous recommandons de mettre à jour régulièrement la version que vous utilisez car nous continuons à ajouter de nouvelles fonctionnalités.
La dernière version actuelle est ghcr.io/kviklet/kviklet:0.7.0, vous pouvez également utiliser :main mais il peut arriver que nous fusionnions accidentellement quelque chose de bogué. Nous essayons d'éviter cela.
Si vous voulez simplement essayer son fonctionnement :
Voici un docker-compose.yaml minimal :
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
Exécutez le docker-compose.yml via docker-compose up -d. Kviklet démarrera sur le port 80, allez sur localhost et explorez. L'identifiant admin est [email protected] avec admin comme mot de passe.
Le docker-compose contient une base de données postgres supplémentaire pour laquelle vous pouvez configurer une connexion dans Kviklet. Pour que cette base de données contienne des données, décommentez cette ligne : ``` - ./sample_data.sql:/docker-entrypoint-initdb.d/init.sql
Et créez un fichier sample_data.sql :
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>
### Configuration de la base de données
Kviklet a besoin de sa propre base de données postgres (ou au moins d'un schéma) pour enregistrer les métadonnées sur les requêtes, les connexions, les approbations, etc.
Vous pouvez trouver leur image officielle ici : https://hub.docker.com/_/postgres, ou utiliser une version hébergée dans le cloud par votre fournisseur de cloud de votre choix.
Lors du démarrage du conteneur kviklet, vous devrez ensuite définir ces trois variables d'environnement en conséquence :```
SPRING_DATASOURCE_PASSWORD = password
SPRING_DATASOURCE_USERNAME = username
SPRING_DATASOURCE_URL = jdbc:postgresql://[host]:[port]/[database]?currentSchema=[schema]
Kviklet chargera les identifiants depuis les endroits habituels (variables d'environnement, rôles d'instance, etc.) et générera un jeton pour la connexion.
Vous aurez besoin d'un utilisateur administrateur initial à des fins de configuration. Pour cela, définissez les 2 variables d'environnement :
INITIAL_USER_EMAIL et INITIAL_USER_PASSWORD afin de pouvoir vous connecter à l'interface web. Vous pouvez changer le mot de passe ultérieurement via l'interface utilisateur.
Exemple :```
INITIAL_USER_EMAIL=[email protected]
INITIAL_USER_PASSWORD=someverysecurepassword
Nous publions nos conteneurs sur GitHub packages pour l'instant, donc avec tout cela configuré, vous pouvez exécuter `ghcr.io/kviklet/kviklet:main` n'oubliez pas de mapper le port `8080` qui est le port par défaut sur lequel Kviklet démarre.
Un exemple d'exécution docker run pourrait ressembler à ceci :```
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
Si vous souhaitez configurer le SSO pour votre instance Kviklet (ce qui est très logique car sinon vous devez gérer à nouveau les mots de passe). Vous devez configurer ces 3 variables d'environnement :``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=google
L'identifiant client et le secret Google peuvent être facilement obtenus en suivant les instructions de Google ici :
https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid
Pour les URIs de redirection valides, vous devez configurer : https://[kviklet_host]/api/login/oauth2/code/google
Pour les origines autorisées, simplement l'URL de votre kviklet hébergé.
Après avoir défini ces variables d'environnement, tous les membres de votre organisation peuvent se connecter avec le bouton « Se connecter avec Google ». Mais ils n'auront aucune permission par défaut, vous devrez leur attribuer un rôle après leur première connexion.
#### Keycloak
Si vous souhaitez plutôt configurer le SSO avec Keycloak, vous devez définir ces 4 variables d'environnement :```
KVIKLET_IDENTITYPROVIDER_CLIENTID
KVIKLET_IDENTITYPROVIDER_CLIENTSECRET
KVIKLET_IDENTITYPROVIDER_TYPE=keycloak
KVIKLET_IDENTITYPROVIDER_ISSUERURI=http://[host]:[port]/realms/[realm]
Vous obtenez l'identifiant client et le secret lorsque vous créez une application dans Keycloak. Pour les URI de redirection valides, vous devez configurer : https://[kviklet_host]/api/login/oauth2/code/keycloak Pour les origines autorisées, mettez simplement l'URL de votre instance kviklet.
Après avoir défini ces variables d'environnement, la page de connexion devrait afficher un bouton Connexion avec Keycloak qui redirige vers votre instance Keycloak. Dans l'édition entreprise, vous pouvez activer la synchronisation des rôles pour synchroniser automatiquement les rôles de votre instance Keycloak vers Kviklet. Consultez la section Synchronisation des rôles pour plus de détails.
Beta : L'authentification GitHub est nouvelle et ne prend pas encore en charge la synchronisation des rôles — chaque nouvel utilisateur arrive avec le rôle par défaut et doit se voir attribuer des rôles manuellement.
GitHub n'est pas conforme à OIDC (c'est un OAuth 2.0 pur), il bénéficie donc d'un support dédié dans Kviklet. Définissez ces variables d'environnement :``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=github KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS=your-org,another-org
Créez une application OAuth GitHub sur https://github.com/settings/developers et configurez :
- URL de rappel d'autorisation : `https://[kviklet_host]/api/login/oauth2/code/github`
- URL de la page d'accueil : l'URL de votre Kviklet hébergé
`KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS` est **obligatoire** (Kviklet refuse de démarrer sans cela). Les applications OAuth GitHub ne peuvent pas restreindre qui termine le flux OAuth, donc Kviklet appelle `/user/orgs` après l'authentification et rejette les utilisateurs qui ne sont pas membres d'au moins une organisation autorisée (insensible à la casse, seules les 100 premières organisations sont vérifiées).
Pour que la vérification d'organisation voie l'appartenance d'un utilisateur, celui-ci doit cliquer sur **Accorder** (ou **Demander**) à côté de chaque organisation autorisée sur l'écran de consentement OAuth. Si l'organisation a activé « Restreindre les applications OAuth tierces », un propriétaire de l'organisation doit également approuver l'application OAuth une fois avant que l'appartenance d'un membre devienne visible.
Kviklet demande les portées `read:user`, `user:email` et `read:org`. Les adresses e-mail sont toujours lues depuis `/user/emails` et seule une entrée `primary && verified` est acceptée, donc les utilisateurs avec des adresses e-mail privées se connectent toujours avec succès.
#### Autres fournisseurs OIDC
D'autres fournisseurs compatibles OIDC (GitLab, Auth0, Okta, etc.) devraient fonctionner de manière similaire à Keycloak. Notez que l'`URL de redirection` changera selon le type que vous choisissez, donc si vous choisissez `gitlab`, ce sera `https://[kviklet_host]/api/login/oauth2/code/gitlab`. Si vous rencontrez des problèmes, n'hésitez pas à créer une issue, nous n'avons pas encore testé tous les fournisseurs OIDC existants et il pourrait y avoir de légères différences dans l'implémentation qui pourraient nécessiter des mises à jour du côté de Kviklet.
### LDAP
Kviklet prend en charge l'authentification LDAP. Pour activer et configurer LDAP, vous pouvez remplacer les variables d'environnement suivantes :```
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
Voici la signification de chaque paramètre :
LDAP_ENABLED : Définir sur true pour activer l'authentification LDAP.LDAP_URL : L'URL de votre serveur LDAP.LDAP_BASE : Le DN de base pour les recherches LDAP.LDAP_PRINCIPAL : Le DN de l'utilisateur admin pour la liaison au serveur LDAP.LDAP_PASSWORD : Le mot de passe de l'utilisateur admin.LDAP_UNIQUE_IDENTIFIER_ATTRIBUTE : L'attribut LDAP utilisé comme identifiant unique pour les utilisateurs (par défaut : "uid").LDAP_EMAIL_ATTRIBUTE : L'attribut LDAP contenant l'adresse e-mail de l'utilisateur (par défaut : "mail").LDAP_FULL_NAME_ATTRIBUTE : L'attribut LDAP contenant le nom complet de l'utilisateur (par défaut : "cn").LDAP_USER_OU : L'unité d'organisation (OU) où les comptes utilisateurs sont stockés (par défaut : "people").LDAP_SEARCH_BASE : Permet de remplacer le DN de base pour les recherches d'utilisateurs (par défaut : "ou=people"). Si vous utilisez FreeIPA, vous devrez peut-être le définir sur, par exemple, . S'il est défini, LDAP_USER_OU est ignoré.Vous pouvez personnaliser ces attributs pour correspondre à votre schéma LDAP. Après avoir configuré LDAP, les utilisateurs pourront se connecter en utilisant leurs informations d'identification LDAP. La première fois qu'un utilisateur LDAP se connecte, un compte utilisateur correspondant sera créé dans Kviklet avec des autorisations par défaut. Un administrateur devra attribuer les rôles appropriés à ces utilisateurs après leur première connexion.
Kviklet prend en charge l'authentification SAML 2.0. Pour activer SAML, définissez les variables d'environnement suivantes :``` 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-----
Détails de configuration :
- `SAML_ENABLED` : Définissez sur `true` pour activer l'authentification SAML
- `SAML_ENTITYID` : L'ID d'entité de votre fournisseur d'identité SAML
- `SAML_SSOSERVICELOCATION` : L'URL du service SSO de votre fournisseur d'identité
- `SAML_VERIFICATIONCERTIFICATE` : Le certificat X.509 utilisé pour vérifier les réponses SAML (incluez les lignes BEGIN/END CERTIFICATE)
Vous pouvez éventuellement personnaliser les correspondances d'attributs SAML :```
SAML_USERATTRIBUTES_EMAILATTRIBUTE=email
SAML_USERATTRIBUTES_NAMEATTRIBUTE=name
SAML_USERATTRIBUTES_IDATTRIBUTE=nameID
Votre fournisseur d'identité doit être configuré avec :
https://[kviklet_host]/api/saml2/service-provider-metadata/samlhttps://[kviklet_host]/api/login/saml2/sso/samlAprès avoir configuré SAML, les utilisateurs peuvent se connecter via le fournisseur d'identité. Lors de la première connexion, un compte utilisateur est créé avec les autorisations par défaut.
Si vous êtes correctement redirigé vers l'IDP mais obtenez une erreur CORS, vous pouvez ajouter l'hôte de votre IDP aux origines autorisées dans Kviklet via :``` CORS_ALLOWEDORIGINS=https://[idp_host]
## Configuration
### Connexions
Après avoir démarré Kviklet, vous devez d'abord configurer une connexion à une base de données. Allez dans Paramètres -> Bases de données -> Ajouter une connexion.


Vous pouvez ici configurer les exigences de révision et les limites d'exécution pour chaque connexion. Voir [Portes de révision](#review-gates) pour plus de détails.
#### AWS IAM AUTH
Kviklet prend en charge l'utilisation de IAM Auth pour les connexions aux bases de données Postgres et MySQL. Pour cela, choisissez IAM Auth lors de la création d'une nouvelle connexion.


Cela supprime l'option de définir un mot de passe et utilise à la place les identifiants AWS pour se connecter à la base de données.
Kviklet utilise `DefaultCredentialsProvider` d'AWS pour trouver les identifiants et générer le jeton pour la connexion. Cela signifie que tous les emplacements typiques devraient fonctionner (variables d'environnement ou rôles d'instance associés) l'ordre exact est documenté ici : https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html
De plus, vous pouvez fournir un ARN de rôle AWS que Kviklet assumera, et utiliser ces identifiants pour créer le jeton DB temporaire. Ceci est particulièrement utile pour se connecter à des bases de données qui ne sont pas dans le même compte AWS que Kviklet. Pour utiliser cette fonctionnalité, saisissez simplement l'ARN du rôle dans le champ désigné lors de la création ou de l'édition d'une connexion IAM Auth. Laisser le champ vide utilisera le fournisseur d'identifiants par défaut (aucune assumption de rôle).
La région AWS à utiliser lors de la génération du jeton est déduite de votre URL de connexion, il n'y a donc pas d'option pour la définir.
Pour apprendre à configurer IAM Auth pour votre base de données, suivez la documentation officielle AWS : https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
Les deux points principaux sont :
- Créer un utilisateur DB avec l'option IAM auth et les permissions correctes
- Créer une politique IAM qui permet à l'entité AWS de générer des jetons pour cet utilisateur
### Portes de révision
Par défaut, Kviklet permet une configuration simple du nombre de révisions. Vous pouvez configurer le nombre d'approbations nécessaires pour une demande sur une connexion spécifique avant qu'elle ne puisse être exécutée.
Le statut d'approbation d'une demande est calculé en fonction de la dernière action de chaque réviseur. Si un réviseur approuve puis demande des modifications, seule la demande de modification compte — son approbation précédente est supprimée. La modification d'une demande réinitialise toujours toutes les approbations antérieures, garantissant qu'aucune modification ne peut être exécutée sans être d'abord révisée. De même, si une exécution échoue (par exemple en raison d'une erreur de syntaxe SQL), les approbations sont réinitialisées afin que la demande puisse être corrigée et ré-approuvée sans avoir à en créer une nouvelle.
Vous pouvez également configurer une limite de **nombre maximal d'exécutions** par connexion pour contrôler la fréquence à laquelle une demande approuvée peut être exécutée. La valeur par défaut est 1. Mettre cette valeur à 0 permet des exécutions illimitées. Les exécutions échouées ne comptent pas dans cette limite.
#### Exigences de révision basées sur les rôles (Entreprise)
Avec une licence Kviklet Enterprise, vous pouvez configurer des connexions individuelles pour exiger des approbations provenant d'utilisateurs avec des rôles spécifiques. Cela vous permet par exemple d'exiger l'approbation de l'équipe qui maintient une base de données donnée ou de verrouiller des connexions sensibles derrière des approbations DBA ou de direction.
**Comment cela fonctionne :**
Chaque connexion a un nombre **total de révisions requises** (`numTotalRequired`) qui agit comme un seuil minimal — le nombre minimum d'approbations distinctes nécessaires, indépendamment des rôles. En plus de cela, vous pouvez ajouter des **exigences de rôle** qui spécifient combien d'approbations doivent provenir d'utilisateurs avec un rôle particulier (par exemple, « 1 du DBA, 1 de la Sécurité »).
Une demande n'est approuvée que lorsque **les deux** conditions sont remplies :
- Le nombre total d'approbations distinctes atteint `numTotalRequired`
- Chaque exigence de rôle est individuellement satisfaite
Si un utilisateur appartient à plusieurs rôles, une seule approbation de cet utilisateur compte pour toutes les exigences de rôle correspondantes. Cependant, elle ne compte toujours que pour une seule approbation dans le total.
**Exemple :** Une connexion nécessite 3 approbations totales, dont 1 d'un DBA et 1 de la Sécurité. Un utilisateur qui a à la fois le rôle DBA et Sécurité approuve — cela satisfait les deux exigences de rôle mais ne compte que pour 1 des 3 approbations totales nécessaires. Deux autres approbations de n'importe quels utilisateurs sont toujours nécessaires.
Si votre licence entreprise expire, les exigences de révision basées sur les rôles existantes restent appliquées mais ne peuvent plus être modifiées. Vous pouvez uniquement les supprimer pour revenir à la simple configuration du nombre total de révisions.
### Rôles
Kviklet est livré avec 3 rôles : Par défaut, Administrateurs et Développeurs.
- Le rôle Par défaut donne un accès en lecture à toutes les connexions et demandes. Ce rôle est attribué à chaque utilisateur et ne peut pas être supprimé. Vous pouvez cependant modifier ses permissions comme vous le souhaitez.
- Les Administrateurs ont la permission de créer et modifier des connexions, ainsi que d'ajouter de nouveaux utilisateurs et de définir leurs permissions.
- Les Développeurs peuvent créer des demandes, les approuver, les commenter et bien sûr exécuter les instructions réelles.
Vous pouvez personnaliser les rôles et, par exemple, donner à un rôle l'accès uniquement à une connexion spécifique ou à un groupe de connexions de base de données.
Ceci est utile par exemple si vous avez différentes équipes avec différentes bases de données et souhaitez contrôler l'accès de manière plus granulaire.
#### Créer un nouveau rôle
La création d'un nouveau rôle se fait comme suit. Allez dans Paramètres -> Rôles -> Ajouter un rôle.


Les paramètres par défaut ne sont pas très pertinents pour la plupart des rôles et vous pouvez simplement donner à l'utilisateur l'accès Lecture et Affichage des rôles et laisser ainsi.
Ce qui est plus intéressant, c'est l'ajout de permissions individuelles pour les connexions. Ici, vous ajoutez d'abord un sélecteur pour sélectionner des connexions spécifiques. Cela peut être un identifiant spécifique ou vous pouvez utiliser des jokers avec `*` pour correspondre à plusieurs connexions. Par exemple, si vous voulez un rôle qui a accès à toutes les bases de données de développement (au cas où vous gérez aussi l'accès à celles-ci avec Kviklet), vous utiliseriez un sélecteur comme `dev-*` et vous assureriez que les identifiants des connexions sont définis correctement.
Vous pouvez bien sûr aussi inventer un système que vous utilisez pour vos différentes équipes au sein de votre organisation.
### Synchronisation des rôles (Entreprise)
Synchronisez automatiquement les rôles des utilisateurs à partir des groupes de votre fournisseur d'identité. Cette fonctionnalité nécessite une licence entreprise.
**La configuration** se fait dans Paramètres > Synchronisation des rôles :
- **Activer la synchronisation des rôles** : Activer/désactiver la synchronisation
- **Mode de synchronisation** :
- **Synchronisation complète** - Les rôles des utilisateurs correspondent exactement à leurs correspondances de groupes IdP (plus le rôle par défaut)
- **Additif** - Les groupes IdP ajoutent des rôles mais ne suppriment pas les existants
- **Première connexion uniquement** - Les rôles ne se synchronisent que lors de la première connexion, les modifications manuelles sont conservées par la suite
- **Attribut de groupes** : L'attribut IdP contenant les appartenances aux groupes (par défaut : `groups`)
- **Correspondances de rôles** : Mappez les noms de groupes IdP (par exemple, `engineering`) aux rôles Kviklet
#### Configuration OIDC
Configurez votre fournisseur OIDC pour inclure une revendication `groups` dans le jeton d'identité :
- **Keycloak** :
Keycloak n'inclut pas les groupes dans les jetons par défaut, vous devrez donc ajouter un mappeur au client.
1. Naviguez vers **Clients** dans le menu de gauche
2. Sélectionnez votre client Kviklet
3. Allez dans l'onglet **Client scopes**
4. Cliquez sur le scope dédié (par exemple, `kviklet-dedicated`)
5. Allez dans l'onglet **Mappers**
6. Cliquez sur **Add mapper** → **By configuration**
7. Sélectionnez **Group Membership**
8. Configurez le mappeur :
| Paramètre | Valeur |
|-----------|--------|
| Nom | `groups` |
| Nom de la revendication du jeton | `groups` |
| Chemin complet du groupe | **OFF** |
| Ajouter au jeton d'identité | **ON** |
| Ajouter au jeton d'accès | **ON** |
| Ajouter à userinfo | **ON** |
9. Cliquez sur **Enregistrer**
> **Important :** Le « Nom de la revendication du jeton » doit correspondre à « l'Attribut de groupes » configuré dans les paramètres de synchronisation des rôles de Kviklet (par défaut : `groups`).
- **Autres fournisseurs OIDC** : Ajoutez un mappeur/revendication de groupes qui inclut les appartenances aux groupes de l'utilisateur dans le jeton d'identité. Cela se fait généralement dans l'interface d'administration du fournisseur.
Si vous rencontrez des problèmes, n'hésitez pas à créer une issue, nous n'avons pas encore testé tous les fournisseurs OIDC existants et il pourrait y avoir de légères différences dans l'implémentation qui pourraient nécessiter des mises à jour du côté de Kviklet.
#### Configuration LDAP
La synchronisation des rôles LDAP utilise l'attribut `memberOf` :
1. Assurez-vous que votre serveur LDAP a le module complémentaire `memberOf` activé
2. Définissez **Attribut de groupes** sur `memberOf` dans Kviklet
3. Les noms de groupes sont ensuite extraits de l'attribut `memberOf` dans les attributs de l'utilisateur.
#### Configuration SAML
Configurez votre IdP SAML pour inclure les groupes dans l'assertion :
1. Ajoutez une instruction d'attribut qui mappe les appartenances aux groupes des utilisateurs
2. Définissez **l'Attribut de groupes** dans Kviklet pour correspondre au nom de votre attribut SAML
3. Les noms de groupes sont ensuite extraits de l'attribut SAML dans les attributs de l'utilisateur.
### Notifications
Vous pouvez configurer Kviklet pour envoyer des notifications à un canal dans Slack ou Teams. Cela est utile pour informer votre équipe des nouvelles demandes qui doivent être révisées. Vous pouvez configurer cela dans Paramètres -> Général -> Paramètres de notification.
#### Slack
Pour configurer les notifications Slack, vous devez créer une application Slack et activer les webhooks pour celle-ci. Vous pouvez suivre les instructions ici : https://api.slack.com/messaging/webhooks
#### Teams
Les notifications Teams utilisent un webhook **Workflow** Power Automate. Kviklet envoie une carte adaptative que le modèle de webhook publie dans votre canal.
**Recommandé : utiliser le modèle de workflow**
1. Dans Teams, ouvrez le canal dans lequel vous voulez recevoir des notifications, cliquez sur les **...** à côté du nom du canal et choisissez **Workflows** (ou ajoutez l'application **Workflows**).
2. Recherchez et créez le modèle **« Send webhook alerts to a channel »**.
3. Connectez-vous lorsque vous y êtes invité, puis sélectionnez l'équipe et le canal cibles et créez le workflow.
4. Ouvrez l'étape déclencheur et copiez l'**URL HTTP POST** générée.
5. Collez l'URL dans Kviklet sous Paramètres -> Général -> Paramètres de notification et cliquez sur enregistrer.
**Alternative : construire le workflow manuellement**
Si vous préférez construire le flux vous-même (ou si le modèle est indisponible) :
1. Canal **...** -> **Workflows** -> créez un flux avec le déclencheur **« When a Teams webhook request is received »**.
2. Ajoutez l'action **Microsoft Teams -> « Post card in a chat or channel »**.
3. Définissez le champ **Carte adaptative** de l'action sur l'expression `string(triggerBody())` pour qu'elle publie la carte que Kviklet envoie.
4. Sélectionnez l'équipe et le canal cibles, **Enregistrez**, puis copiez l'**URL HTTP POST** de l'étape déclencheur.
Actuellement, il y a des notifications pour :
- Nouvelles demandes nécessitant des approbations
- Nouvelles approbations sur des demandes
#### Configuration de l'URL de base
Lorsque Kviklet s'exécute derrière un proxy inverse ou un Ingress Kubernetes, les liens de notification peuvent utiliser l'adresse IP interne au lieu de votre domaine public. Kviklet essaie de suivre l'URL correcte en examinant les requêtes entrantes, mais certains proxys inverses ne définissent pas correctement les en-têtes Forwarded. Pour résoudre ce problème, définissez explicitement l'URL de base :```
KVIKLET_BASE_URL=https://kviklet.example.com
Cela garantit que tous les liens de notification pointent vers la bonne URL publique.
Par défaut, Kviklet écrit des logs lisibles par l'humain (pretty) sur stdout, ce qui est pratique pour les lire directement ou via docker logs.
Si vous envoyez les logs vers un système centralisé (Elasticsearch, Loki, Datadog, CloudWatch, …), vous pouvez passer à des logs JSON structurés, qui sont plus faciles à indexer et à interroger. Définissez le format via une variable d'environnement :```
LOGGING_STRUCTURED_FORMAT_CONSOLE=ecs
## Chiffrement
Si vous ne souhaitez pas que les identifiants soient stockés en clair dans la base de données, il est recommandé d'activer le chiffrement de la base de données sur la base de données PostgreSQL de Kviklet elle-même. Pour la plupart des fournisseurs hébergés, il s'agit d'une simple case à cocher. Néanmoins, si la base de données Kviklet est compromise d'une manière ou d'une autre, cela représente un risque de sécurité important. Car elle contient les identifiants de base de données pour potentiellement tous vos datastores de production. Vous pouvez donc activer le chiffrement des identifiants au repos.
Pour ce faire, définissez simplement les deux variables d'environnement.```
ENCRYPTION_ENABLED=true
ENCRYPTION_KEY_CURRENT=some-secret
Kviklet chiffrera toutes vos informations d'identification existantes au démarrage, et utilisera le secret pour les futures connexions que vous créerez.
ENCRYPTION_KEY_PREVIOUS=some-secret ENCRYPTION_KEY_CURRENT=another-secret
Kviklet rechiffrera toutes les connexions au démarrage, afin que vous puissiez ensuite redémarrer le conteneur sans la clé précédente.
## Clés API
Kviklet prend en charge les clés API pour un accès programmatique au système. Il s'agit d'une fonctionnalité réservée aux entreprises et nécessite une licence valide. Vous pouvez créer des clés API dans la section Paramètres -> Clés API.


Utilisez-la comme suit :```bash
curl --location '[kviklet_host]/api/connections/' \
--header 'Authorization: Bearer your-api-key'
Les clés API héritent des permissions de l'utilisateur qui les crée. Actuellement, seuls les administrateurs peuvent gérer les clés API et toutes les actions effectuées avec une clé API sont attribuées à l'utilisateur qui a créé la clé.
Une documentation API rudimentaire est disponible à l'adresse [kviklet_host]/api/swagger-ui/index.html. Cependant, gardez à l'esprit qu'il s'agit d'un travail en cours et que l'API pourrait changer dans les versions futures.
En fin de compte, la vérité est dans le code, vous pouvez donc toujours consulter le contrôleur pour voir comment l'API est définie. Si vous avez des questions, n'hésitez pas à ouvrir un ticket.
Il existe actuellement deux fonctionnalités expérimentales. Elles ont été construites principalement sur la base des retours de la communauté. N'hésitez pas à les essayer et à donner votre avis. Nous espérons les développer davantage à l'avenir et les faire fonctionner correctement avec le flux d'approbation de base.
Si vous souhaitez utiliser la fonctionnalité Kubernetes Exec, vous devez créer une connexion Kubernetes séparée. Kviklet utilisera l'utilisateur du pod déployé pour exécuter la commande. Assurez-vous donc que l'utilisateur dispose des permissions nécessaires pour exécuter des commandes sur les pods auxquels vous souhaitez accéder.
Kviklet utilise également /bin/sh pour exécuter la commande, vous devrez donc vous assurer que vos pods disposent d'un shell ou au moins d'un lien symbolique vers /bin/sh. Si cela vous gêne, n'hésitez pas à ouvrir un ticket, nous pourrons éventuellement rendre cela configurable ou trouver une autre solution.
Les commandes Kubernetes n'attendent que 5 secondes pour une sortie ; si la commande prend plus de temps, Kviklet attendra jusqu'à une heure avant de la faire expirer. Il s'agit d'une solution provisoire, nous étudions l'utilisation de websockets pour la rendre plus réactive et potentiellement permettre des sessions terminal.
Si vous créez des demandes d'accès temporaire, vous pouvez - au lieu d'utiliser l'interface web - exécuter vos requêtes via un proxy géré par Kviklet et utiliser le client de base de données de votre choix. Pour cela, le conteneur utilise les ports 5438-6000, vous devez donc les exposer. L'utilisateur peut alors créer une demande d'accès temporaire, et cliquer sur "Démarrer le proxy" une fois qu'elle est approuvée. Chaque demande obtiendra un port, un utilisateur et un mot de passe temporaire. Avec cela, ils peuvent se connecter à la base de données. Kviklet valide l'utilisateur temporaire et le mot de passe, et proxyse toutes les requêtes vers l'utilisateur sous-jacent sur la base de données. Toutes les instructions exécutées sont enregistrées dans le journal d'audit comme si elles étaient exécutées via l'interface web. Notez que l'analyse des messages côté proxy n'a pas été testée avec tous les clients ; si vous rencontrez des problèmes, par exemple des instructions non enregistrées, n'hésitez pas à ouvrir un ticket.

Kviklet termine la connexion TLS à la base de données. Cela signifie que par défaut, tout trafic à destination et en provenance du proxy lui-même n'est pas chiffré.
Si vous souhaitez que Kviklet rechiffre le trafic, vous pouvez fournir à Kviklet un certificat TLS et une clé pour le proxy en définissant les variables d'environnement suivantes :```
PROXY_TLS_CERTIFICATE_SOURCE=env
PROXY_TLS_CERTIFICATE_CERT=your-certificate
PROXY_TLS_CERTIFICATE_KEY=your-key
alternativement, vous pouvez utiliser des fichiers :```
PROXY_TLS_CERTIFICATE_SOURCE=file
PROXY_TLS_CERTIFICATE_CERT_FILE=path/to/cert.pem
PROXY_TLS_CERTIFICATE_KEY_FILE=path/to/key.pem
Dans les deux cas, le certificat et la clé doivent être stockés au format PEM.
Si vous avez des questions, souhaitez donner votre avis ou avez besoin d'aide pour l'installation, rejoignez notre communauté Discord. Vous pouvez également créer une issue GitHub pour les rapports de bugs et les demandes de fonctionnalités.
Si vous souhaitez contribuer, n'hésitez pas à forker et à créer des PRs pour les petites choses. Si vous prévoyez des fonctionnalités plus importantes, j'apprécierais une discussion préalable dans une issue GitHub ou sur Discord.
Vous pouvez également me contacter à l'adresse [email protected].
cn=users