
kviklet v0.9.0
Flusso di revisione/approvazione simile a una Pull Request per le query del database. Per un accesso conforme ma fluido dell'ingegneria alla produzione.
Kviklet
Kviklet.dev | Note di rilascio | Discord
Accesso sicuro agli ambienti di produzione senza compromettere la produttività degli sviluppatori.

Kviklet (pronunciato Quick-let) applica il Principio dei Quattro Occhi all'accesso ai database di produzione, con un flusso di revisione e approvazione simile a una pull request per singole istruzioni SQL o sessioni di database a tempo limitato. Gli ingegneri possono revisionare e approvare reciprocamente le richieste senza instradare ogni query attraverso un DBA o un team operativo.
Kviklet è self-hosted e viene eseguito come container Docker con un database PostgreSQL per lo stato dell'applicazione. La sua interfaccia web consente di inviare, revisionare ed eseguire richieste. Una licenza enterprise opzionale sblocca l'autenticazione SAML, i requisiti di revisione basati sui ruoli, la sincronizzazione dei ruoli e le chiavi API. Richiedi una licenza enterprise su kviklet.dev.
I database supportati sono Postgres, MySQL, MariaDB, MS SQL Server e MongoDB.
Modello di accesso
Consigliamo di collegare Kviklet al tuo identity provider esistente. Kviklet supporta l'SSO tramite OIDC (Google, Keycloak, ecc.) o SAML (solo enterprise), nonché l'autenticazione LDAP (Active Directory, ecc.).
Gli utenti creano quindi richieste per connessioni che corrispondono a uno specifico utente del database. Queste richieste sono:
- Query singola: una specifica istruzione SQL inviata per la revisione.
- Accesso temporaneo: una sessione a tempo limitato in cui è possibile eseguire più istruzioni.
A seconda della configurazione, le richieste vengono revisionate e approvate da altri utenti prima che Kviklet ne consenta l'esecuzione.
Kviklet si connette al database per conto dell'utente. La password del database della connessione non viene mai mostrata all'utente.
Un amministratore può configurare quale ruolo ha accesso a quale connessione e quali gate di revisione sono richiesti per l'esecuzione. L'accesso a livello di database è gestito tramite i meccanismi RBAC del database sottostante. Ad esempio, è possibile creare un ruolo di sola lettura per una connessione di sola lettura e assegnare a questa meno requisiti di revisione rispetto a una connessione di scrittura.
Kviklet registra le istruzioni eseguite e le associa all'utente e alla richiesta di accesso. Per una copertura completa dell'accesso manuale al database, limita le connessioni dirette e instrada qualsiasi accesso manuale attraverso Kviklet. Gli ingegneri non hanno bisogno di ricevere o condividere le credenziali del database sottostante.
Ulteriori funzionalità Enterprise includono:
- SAML: Supporto per l'autenticazione SAML.
- Proxy (Postgres, MariaDB, MySQL): Usa il tuo client di database preferito attraverso una sessione di accesso temporaneo approvata con una password temporanea. Le istruzioni eseguite vengono registrate nel registro di audit di Kviklet.
- Gate di revisione basati sui ruoli: Richiedi approvazioni da ruoli specifici prima dell'esecuzione.
- Sincronizzazione dei ruoli: Sincronizza automaticamente i ruoli utente dai gruppi del tuo identity provider.
- Chiavi API: Accesso programmatico all'API di Kviklet.
Altri screenshot
Richieste
Tutte le richieste di dati risiedono in un unico posto. Come PR aperte per i tuoi database di produzione:

Sessioni live
Una richiesta di accesso temporaneo approvata apre una sessione SQL live direttamente nel browser:

Registro di audit
Ogni istruzione eseguita viene registrata — che sia stata eseguita come query singola revisionata, in una sessione live o attraverso il proxy del database:

Funzionalità per tipo di database/connessione
La maggior parte delle funzionalità è disponibile per tutti i database (SSO, LDAP, RBAC, flusso di revisione/approvazione, registro di audit, ecc.). Ma alcune funzionalità sono limitate, o perché semplicemente non sono ancora state sviluppate o perché non hanno senso per quello specifico scopo. La tabella seguente mostra quali funzionalità sono disponibili per quale tipo di database:
| Database | Revisione istruzioni | Accesso temporaneo | Proxy(Beta) | Explain Plan |
|---|---|---|---|---|
| Postgres | ✓ | ✓ | ✓ | ✓ |
| MySQL | ✓ | ✓ | ✓ | ✓ |
| MariaDB | ✓ | ✓ | ✓ | ✓ |
| SQL Server | ✓ | ✓ | ✗ | ✓ |
| MongoDB | ✓ | ✓ | ✗ | ✗ |
| Kubernetes | ✓ | ✗ | ✗ | ✗ |
Configurazione
Kviklet viene distribuito come un semplice container docker.
Puoi trovare le versioni disponibili in Releases. Consigliamo di aggiornare regolarmente la versione che stai utilizzando poiché continuiamo a sviluppare nuove funzionalità.
L'ultima attualmente è ghcr.io/kviklet/kviklet:0.8.0, puoi anche usare :main ma potrebbe capitare ogni tanto che uniamo accidentalmente qualcosa di buggato. Anche se cerchiamo di evitarlo.
Avvio rapido
Se vuoi solo provare come funziona:
-
Ecco un docker-compose.yaml minimale:
Clicca per espandere il contenuto del compose
``` 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.sqlkviklet-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
-
Esegui il file
docker-compose.ymltramitedocker-compose up -d. Kviklet si avvierà sulla porta 80, vai sulocalhoste prova. Il login admin è [email protected] conadmincome password. -
Il docker-compose contiene un database postgres aggiuntivo per il quale puoi configurare una connessione in Kviklet. Per fare in modo che questo database contenga dei dati, decommenta questa riga: ``` - ./sample_data.sql:/docker-entrypoint-initdb.d/init.sql
E crea un file sample_data.sql:
Clicca per espandere il contenuto di sample_data.sql
```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>
### Configurazione del DB
Kviklet necessita di un proprio database postgres (o almeno di uno schema) per salvare i metadati relativi a query, connessioni, approvazioni, ecc.
Puoi trovare la loro immagine ufficiale qui: https://hub.docker.com/_/postgres, oppure utilizzare una versione ospitata nel cloud dal provider cloud di tua scelta.
All'avvio del container kviklet dovrai quindi impostare queste tre variabili d'ambiente di conseguenza:```
SPRING_DATASOURCE_PASSWORD = password
SPRING_DATASOURCE_USERNAME = username
SPRING_DATASOURCE_URL = jdbc:postgresql://[host]:[port]/[database]?currentSchema=[schema]
Metodi di autenticazione alternativi
- IAM Auth:
È possibile utilizzare AWS IAM Auth per la connessione al database, nel qual caso è sufficiente omettere la password e impostare solo il nome utente.
È inoltre necessario impostare la variabile d'ambiente: ```
SPRING_DATASOURCE_IAMAUTH=true
Kviklet caricherà le credenziali dai soliti posti (variabili d'ambiente, ruoli dell'istanza, ecc.) e genererà un token per la connessione.
- Certificati: Puoi anche utilizzare i certificati per la connessione al db, vedi qui per un esempio.
Utente iniziale
Avrai bisogno di un utente amministratore iniziale per scopi di configurazione. Per questo imposta le 2 variabili d'ambiente:
INITIAL_USER_EMAIL e INITIAL_USER_PASSWORD in modo da poter accedere all'interfaccia web. Puoi cambiare la password in seguito tramite l'interfaccia utente.
Esempio:```
INITIAL_USER_EMAIL=[email protected]
INITIAL_USER_PASSWORD=someverysecurepassword
Pubblichiamo i nostri container su GitHub packages per ora, quindi con tutto questo configurato puoi eseguire `ghcr.io/kviklet/kviklet:main` non dimenticare di mappare la porta `8080` che è la porta predefinita su cui Kviklet si avvia.
Un esempio di docker run potrebbe essere questo:```
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 tramite OIDC / OAuth2
Se vuoi configurare l'SSO per la tua istanza Kviklet (cosa che ha molto senso, dato che altrimenti dovresti gestire di nuovo le password). Devi configurare queste 3 variabili d'ambiente:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=google
Il client id e il secret di Google puoi ottenerli facilmente seguendo le istruzioni di Google qui:
https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid
Per gli URI di reindirizzamento validi, dovresti configurare: https://[kviklet_host]/api/login/oauth2/code/google
Per le Origini consentite, semplicemente il tuo URL kviklet ospitato.
Dopo aver impostato queste variabili d'ambiente, tutti nella tua organizzazione potranno accedere con il pulsante sign in with google. Ma non avranno alcun permesso per impostazione predefinita, dovrai assegnare loro un ruolo dopo che hanno effettuato l'accesso una volta.
#### Keycloak
Se vuoi configurare l'SSO con Keycloak invece, devi impostare queste 4 variabili d'ambiente:```
KVIKLET_IDENTITYPROVIDER_CLIENTID
KVIKLET_IDENTITYPROVIDER_CLIENTSECRET
KVIKLET_IDENTITYPROVIDER_TYPE=keycloak
KVIKLET_IDENTITYPROVIDER_ISSUERURI=http://[host]:[port]/realms/[realm]
Ottieni il client id e il secret quando crei un'applicazione in Keycloak. Per gli URI di reindirizzamento validi, dovresti configurare: https://[kviklet_host]/api/login/oauth2/code/keycloak Per le Origini Consentite, semplicemente il tuo URL kviklet ospitato.
Dopo aver impostato queste variabili d'ambiente, la pagina di login dovrebbe mostrare un pulsante Login with Keycloak che reindirizza alla tua istanza keycloak. Nell'edizione enterprise puoi abilitare la sincronizzazione dei ruoli per sincronizzare automaticamente i ruoli dalla tua istanza keycloak a kviklet. Vedi la sezione Role Sync per maggiori dettagli.
GitHub (Beta)
Beta: L'autenticazione GitHub è nuova e non supporta ancora la sincronizzazione dei ruoli — ogni nuovo utente arriva con il ruolo predefinito e deve ricevere i ruoli manualmente.
GitHub non è conforme a OIDC (è puro OAuth 2.0), quindi ha un supporto dedicato in Kviklet. Imposta queste variabili d'ambiente:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=github KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS=your-org,another-org
Crea una GitHub OAuth App su https://github.com/settings/developers e configura:
- Authorization callback URL: `https://[kviklet_host]/api/login/oauth2/code/github`
- Homepage URL: il tuo URL Kviklet ospitato
`KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS` è **obbligatorio** (Kviklet rifiuta di avviarsi senza di esso). Le GitHub OAuth App non possono limitare chi completa il flusso OAuth, quindi Kviklet chiama `/user/orgs` dopo l'autenticazione e rifiuta gli utenti che non sono membri di almeno una delle organizzazioni in allowlist (senza distinzione tra maiuscole e minuscole, vengono controllate le prime 100 organizzazioni).
Affinché il controllo dell'organizzazione possa vedere l'appartenenza di un utente, l'utente deve fare clic su **Grant** (o **Request**) accanto a ciascuna organizzazione in allowlist nella schermata di consenso OAuth. Se l'organizzazione ha abilitato "Restrict third-party OAuth applications", anche un proprietario dell'organizzazione deve approvare l'app OAuth una volta prima che l'appartenenza di qualsiasi membro diventi visibile.
Kviklet richiede gli scope `read:user`, `user:email` e `read:org`. Le email vengono sempre lette da `/user/emails` e viene accettata solo una voce `primary && verified`, quindi gli utenti con indirizzi email privati riescono comunque ad accedere.
#### Altri provider OIDC
Altri provider conformi a OIDC (GitLab, Auth0, Okta, ecc.) dovrebbero funzionare in modo simile a Keycloak. Tieni presente che il `redirect URI` cambierà a seconda del tipo scelto, quindi se scegli `gitlab` sarà `https://[kviklet_host]/api/login/oauth2/code/gitlab`.
Se riscontri problemi, sentiti libero di aprire una issue, non abbiamo ancora provato tutti i provider OIDC esistenti (per ora) e potrebbero esserci lievi differenze nell'implementazione che potrebbero richiedere aggiornamenti da parte di Kviklet.
### LDAP
Kviklet supporta l'autenticazione LDAP. Per abilitare e configurare LDAP, puoi sovrascrivere le seguenti variabili d'ambiente:```
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
Ecco cosa significa ciascuna impostazione:
LDAP_ENABLED: Impostare sutrueper abilitare l'autenticazione LDAP.LDAP_URL: L'URL del tuo server LDAP.LDAP_BASE: Il DN di base per le ricerche LDAP.LDAP_PRINCIPAL: Il DN dell'utente amministratore per il binding al server LDAP.LDAP_PASSWORD: La password per l'utente amministratore.LDAP_UNIQUE_IDENTIFIER_ATTRIBUTE: L'attributo LDAP utilizzato come identificatore univoco per gli utenti (predefinito: "uid").LDAP_EMAIL_ATTRIBUTE: L'attributo LDAP che contiene l'indirizzo email dell'utente (predefinito: "mail").LDAP_FULL_NAME_ATTRIBUTE: L'attributo LDAP che contiene il nome completo dell'utente (predefinito: "cn").LDAP_USER_OU: L'Organizational Unit (OU) in cui sono memorizzati gli account utente (predefinito: "people").LDAP_SEARCH_BASE: Consente di sovrascrivere il DN di base per le ricerche degli utenti (predefinito: "ou=people"). Se utilizzi FreeIPA potresti dover impostare questo valore su ad esempiocn=users. Se impostato, LDAP_USER_OU viene ignorato.
Puoi personalizzare questi attributi per adattarli al tuo schema LDAP. Dopo aver configurato LDAP, gli utenti potranno accedere utilizzando le proprie credenziali LDAP. La prima volta che un utente LDAP effettua l'accesso, verrà creato un account utente corrispondente in Kviklet con i permessi predefiniti. Un amministratore dovrà assegnare i ruoli appropriati a questi utenti dopo il loro primo accesso.
SAML (solo Enterprise)
Kviklet supporta l'autenticazione SAML 2.0. Per abilitare SAML, impostare le seguenti variabili d'ambiente:``` 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-----
Dettagli di configurazione:
- `SAML_ENABLED`: Impostare su `true` per abilitare l'autenticazione SAML
- `SAML_ENTITYID`: L'entity ID del tuo provider di identità SAML
- `SAML_SSOSERVICELOCATION`: L'URL del servizio SSO del tuo provider di identità
- `SAML_VERIFICATIONCERTIFICATE`: Il certificato X.509 utilizzato per verificare le risposte SAML (includere le righe BEGIN/END CERTIFICATE)
È possibile personalizzare opzionalmente le mappature degli attributi SAML:```
SAML_USERATTRIBUTES_EMAILATTRIBUTE=email
SAML_USERATTRIBUTES_NAMEATTRIBUTE=name
SAML_USERATTRIBUTES_IDATTRIBUTE=nameID
Il tuo identity provider dovrebbe essere configurato con:
- Entity ID:
https://[kviklet_host]/api/saml2/service-provider-metadata/saml - Redirect Uri:
https://[kviklet_host]/api/login/saml2/sso/saml
Dopo aver configurato SAML, gli utenti possono accedere tramite l'identity provider. Al primo accesso, viene creato un account utente con i permessi predefiniti.
Se vieni reindirizzato correttamente all'IDP ma poi ricevi un errore CORS, puoi aggiungere l'host del tuo IDP alle origini consentite in Kviklet tramite:``` CORS_ALLOWEDORIGINS=https://[idp_host]
## Configurazione
### Connessioni
Dopo aver avviato Kviklet devi prima configurare una connessione al database. Vai su Impostazioni -> Database -> Aggiungi connessione.


Qui puoi configurare i requisiti di revisione e i limiti di esecuzione per ogni connessione. Vedi [Review Gates](#review-gates) per i dettagli.
#### AWS IAM AUTH
Kviklet supporta l'uso di IAM Auth per le connessioni ai database Postgres, MySQL e MariaDB; per farlo scegli IAM Auth quando crei una nuova connessione.


Questo rimuoverà l'opzione per impostare una password e userà invece le credenziali AWS per connettersi al database.
Kviklet usa il `DefaultCredentialsProvider` di AWS per trovare le credenziali e generare il token per la connessione. Questo significa che tutti i posti tipici dovrebbero funzionare (variabili d'ambiente o ruoli istanza associati); l'ordine esatto è documentato qui: https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html
Inoltre, puoi fornire un ARN di un ruolo AWS che Kviklet assumerà, e usare quelle credenziali per creare il token temporaneo del DB. Questo è particolarmente utile per connettersi a database che non si trovano nello stesso account AWS di Kviklet. Per usare questa funzionalità, inserisci semplicemente l'ARN del ruolo nel campo designato quando crei o modifichi una connessione IAM Auth. Lasciare il campo vuoto userà il provider di credenziali predefinito (nessuna assunzione di ruolo).
La regione AWS da usare durante la generazione del token viene dedotta dall'URL della tua connessione, quindi non c'è un'opzione per impostarla.
Per imparare come configurare IAM Auth per il tuo database segui la documentazione ufficiale AWS: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
I due punti principali sono:
- Crea un utente DB con l'opzione IAM auth e i permessi corretti
- Crea una policy IAM che consenta all'entità AWS di generare token per questo utente
### Review Gates
Per impostazione predefinita Kviklet consente una semplice configurazione del numero di revisioni. Puoi configurare quante approvazioni richiedono le richieste su una specifica connessione prima di poter essere eseguite.
Lo stato di approvazione di una richiesta viene calcolato in base all'ultima azione di ciascun revisore. Se un revisore approva e successivamente richiede modifiche, conta solo la richiesta di modifica — la sua approvazione precedente viene rimossa. Modificare una richiesta azzera sempre tutte le approvazioni precedenti, assicurando che nessuna modifica possa essere eseguita senza essere prima revisionata. Allo stesso modo, se un'esecuzione fallisce (ad es. a causa di un errore di sintassi SQL), le approvazioni vengono azzerate così la richiesta può essere corretta e ri-approvata senza doverne creare una nuova.
Puoi anche configurare un limite di **esecuzioni massime** per connessione per controllare quante volte una singola richiesta approvata può essere eseguita. Il valore predefinito è 1. Impostandolo a 0 si consentono esecuzioni illimitate. Le esecuzioni fallite non contano ai fini di questo limite.
#### Requisiti di revisione basati sui ruoli (Enterprise)
Con una licenza Kviklet Enterprise puoi configurare singole connessioni per richiedere approvazioni da utenti con ruoli specifici. Questo ti permette ad es. di richiedere l'approvazione del team che mantiene un dato database o di vincolare connessioni sensibili ad approvazioni DBA o manageriali.
**Come funziona:**
Ogni connessione ha un conteggio **totale revisioni richieste** (`numTotalRequired`) che funge da soglia minima — il numero minimo di approvazioni distinte necessarie indipendentemente dai ruoli. Oltre a questo puoi aggiungere **requisiti di ruolo** che specificano quante approvazioni devono provenire da utenti con un particolare ruolo (ad es. "1 da DBA, 1 da Security").
Una richiesta viene approvata solo quando **entrambe** le condizioni sono soddisfatte:
- Il numero totale di approvazioni distinte raggiunge `numTotalRequired`
- Ogni requisito di ruolo è individualmente soddisfatto
Se un utente appartiene a più ruoli, una singola approvazione da quell'utente conta per tutti i requisiti di ruolo corrispondenti. Tuttavia, conta comunque solo come una approvazione ai fini del conteggio totale.
**Esempio:** Una connessione richiede 3 approvazioni totali incluse 1 da un DBA e 1 da Security. Un utente che ha sia il ruolo DBA che Security approva — questo soddisfa entrambi i requisiti di ruolo ma conta solo come 1 delle 3 approvazioni totali necessarie. Sono ancora necessarie altre due approvazioni da qualsiasi utente.
Se la tua licenza enterprise scade, i requisiti di revisione basati sui ruoli esistenti rimangono applicati ma non possono più essere modificati. Puoi solo rimuoverli per tornare alla semplice configurazione del totale revisioni.
### Ruoli
Kviklet viene fornito con 3 ruoli: Default, Admins e Developers.
- Il ruolo predefinito fornisce accesso in lettura a tutte le connessioni e alle Richieste. Questo ruolo è assegnato a ogni utente e non può essere rimosso. Puoi comunque modificare i permessi di questo ruolo come preferisci.
- Gli Admins hanno il permesso di creare e modificare connessioni, oltre ad aggiungere nuovi Utenti e impostare i loro permessi.
- Gli Developers possono creare Richieste, approvarle e commentarle e naturalmente eseguire le istruzioni effettive.
Puoi personalizzare i Ruoli e ad es. dare a un ruolo accesso solo a una specifica connessione o a un gruppo di connessioni DB.
Questo è utile ad es. se hai team diversi con database diversi e vuoi controllare l'accesso a questi in modo più granulare.
#### Creare un nuovo Ruolo
Creare un nuovo ruolo funziona come segue. Vai su Impostazioni -> Ruoli -> Aggiungi Ruolo.


Le impostazioni predefinite non sono rilevanti per la maggior parte dei ruoli e puoi semplicemente dare all'utente accesso Read e RoleView e lasciare così.
Più interessante è l'aggiunta di permessi individuali per le Connessioni. Qui aggiungi prima un selettore per selezionare connessioni specifiche. Questo può essere un id specifico oppure puoi usare wildcard con `*` per corrispondere a più connessioni. Ad es. se vuoi avere un ruolo che ha accesso a tutti i database di sviluppo (nel caso in cui gestisci anche l'accesso a quelli con kviklet) useresti un selettore come `dev-*` e ti assicureresti che gli id delle connessioni siano impostati correttamente.
Puoi naturalmente anche inventare un sistema che usi per i tuoi diversi team all'interno della tua organizzazione.
### Sincronizzazione dei ruoli (Enterprise)
Sincronizza automaticamente i ruoli utente dai gruppi del tuo identity provider. Questa funzionalità richiede una licenza enterprise.
**La configurazione** si effettua in Impostazioni > Sincronizzazione Ruoli:
- **Abilita Sincronizzazione Ruoli**: Attiva/disattiva la sincronizzazione
- **Modalità di sincronizzazione**:
- **Full Sync** - I ruoli utente corrispondono esattamente alle loro mappature dei gruppi IdP (più il ruolo predefinito)
- **Additive** - I gruppi IdP aggiungono ruoli ma non rimuovono quelli esistenti
- **First Login Only** - I ruoli si sincronizzano solo al primo login, le modifiche manuali vengono preservate in seguito
- **Attributo Gruppi**: L'attributo IdP contenente le appartenenze ai gruppi (predefinito: `groups`)
- **Mappature Ruoli**: Mappa i nomi dei gruppi IdP (ad es. `engineering`) ai ruoli Kviklet
#### Configurazione OIDC
Configura il tuo provider OIDC per includere un claim `groups` nell'ID token:
- **Keycloak**:
Keycloak non include i gruppi nei token per impostazione predefinita, quindi dovrai aggiungere un mapper al client.
1. Vai su **Clients** nel menu a sinistra
2. Seleziona il tuo client Kviklet
3. Vai alla scheda **Client scopes**
4. Clicca sullo scope dedicato (ad es. `kviklet-dedicated`)
5. Vai alla scheda **Mappers**
6. Clicca **Add mapper** → **By configuration**
7. Seleziona **Group Membership**
8. Configura il mapper:
| Impostazione | Valore |
| ------------------- | -------- |
| Name | `groups` |
| Token Claim Name | `groups` |
| Full group path | **OFF** |
| Add to ID token | **ON** |
| Add to access token | **ON** |
| Add to userinfo | **ON** |
9. Clicca **Save**
> **Importante:** Il "Token Claim Name" deve corrispondere all'"Attributo Gruppi" configurato nelle impostazioni di Sincronizzazione Ruoli di Kviklet (predefinito: `groups`).
- **Altri provider OIDC**: Aggiungi un mapper/claim dei gruppi che includa le appartenenze ai gruppi dell'utente nell'ID token. Questo viene tipicamente fatto nell'interfaccia di amministrazione del provider.
Se riscontri problemi sentiti libero di creare una issue, non abbiamo provato ogni singolo provider OIDC esistente (ancora) e potrebbero esserci lievi differenze nell'implementazione che potrebbero richiedere aggiornamenti da parte di Kviklet.
#### Configurazione LDAP
La sincronizzazione dei ruoli LDAP usa l'attributo `memberOf`:
1. Assicurati che il tuo server LDAP abbia l'overlay `memberOf` abilitato
2. Imposta **Attributo Gruppi** su `memberOf` in Kviklet
3. I nomi dei gruppi vengono quindi estratti dall'attributo `memberOf` negli attributi dell'utente.
#### Configurazione SAML
Configura il tuo IdP SAML per includere i gruppi nell'asserzione:
1. Aggiungi un attribute statement che mappa le appartenenze ai gruppi dell'utente
2. Imposta l'**Attributo Gruppi** in Kviklet per corrispondere al nome del tuo attributo SAML
3. I nomi dei gruppi vengono quindi estratti dall'attributo SAML negli attributi dell'utente.
### Notifiche
Puoi configurare Kviklet per inviare notifiche a un canale in Slack o Teams. Questo è utile per notificare al tuo team le nuove richieste che necessitano di revisione. Puoi configurarlo in Impostazioni -> Generali -> Impostazioni Notifiche.
#### Slack
Per configurare le notifiche Slack devi creare una Slack App e abilitare i webhook per essa. Puoi seguire le istruzioni qui: https://api.slack.com/messaging/webhooks
#### Teams
Le notifiche Teams usano un webhook **Workflow** di Power Automate. Kviklet invia una Adaptive Card, che il template del webhook pubblica nel tuo canale.
**Consigliato: usa il template del workflow**
1. In Teams, apri il canale in cui vuoi le notifiche, clicca sui **...** accanto al nome del canale e scegli **Workflows** (oppure aggiungi l'app **Workflows**).
2. Cerca e crea il template **"Send webhook alerts to a channel"**.
3. Accedi quando richiesto, poi seleziona il Team e il Canale di destinazione e crea il workflow.
4. Apri lo step del trigger e copia l'**HTTP POST URL** generato.
5. Incolla l'URL in Kviklet sotto Impostazioni -> Generali -> Impostazioni Notifiche e clicca salva.
**Alternativa: costruisci il workflow manualmente**
Se preferisci costruire il flow da solo (o il template non è disponibile):
1. Canale **...** -> **Workflows** -> crea un flow con il trigger **"When a Teams webhook request is received"**.
2. Aggiungi l'azione **Microsoft Teams -> "Post card in a chat or channel"**.
3. Imposta il campo **Adaptive Card** dell'azione all'espressione `string(triggerBody())` così pubblica la card che Kviklet invia.
4. Seleziona il Team e il Canale di destinazione, **Salva**, poi copia l'**HTTP POST URL** dallo step del trigger.
Attualmente ci sono notifiche per:
- Nuove Richieste, che necessitano di approvazioni
- Nuove approvazioni sulle richieste
#### Configurazione Base URL
Quando esegui Kviklet dietro un reverse proxy o un Kubernetes Ingress, i link delle notifiche potrebbero usare l'indirizzo IP interno invece del tuo dominio pubblico. Kviklet cerca di tracciare l'URL corretto osservando le richieste in arrivo ma alcuni reverse proxy non impostano correttamente gli header Forwarded. Per risolvere questo, imposta esplicitamente il base URL:```
KVIKLET_BASE_URL=https://kviklet.example.com
Questo garantisce che tutti i link di notifica puntino all'URL pubblico corretto.
Telemetria
Kviklet invia statistiche di utilizzo anonime per aiutarci a capire quali funzionalità vengono utilizzate e dove si verificano errori. Per disattivarle, impostare:``` KVIKLET_TELEMETRY_ENABLED=false
Kviklet registra una riga all'avvio che indica se la telemetria è attiva.
**Cosa viene inviato.** Ogni evento porta un id di istanza casuale (generato una volta e memorizzato nel
database di Kviklet), l'URL di base su cui Kviklet è raggiungibile (vedi sopra; spesso un hostname interno) e la versione
di Kviklet. Gli utenti sono identificati solo da un id opaco con ambito limitato all'istanza, così gli utenti unici possono essere
contati, ma nessun indirizzo email o nome viene mai inviato. Gli eventi esatti e le loro proprietà sono
definiti in `backend/src/main/kotlin/dev/kviklet/kviklet/telemetry/TelemetryEvent.kt`.
**Cosa non viene mai inviato.** Query, statement, risultati, output dei comandi, messaggi di errore, nomi delle
connessioni, hostname, credenziali, titoli o descrizioni delle richieste, commenti e nomi di utenti o ruoli.
### Logging
Per impostazione predefinita Kviklet scrive log leggibili dall'uomo (pretty) su stdout, il che è comodo
quando li si legge direttamente o tramite `docker logs`.
Se si inviano i log a un sistema centralizzato (Elasticsearch, Loki, Datadog, CloudWatch, …) è possibile
passare invece a **log JSON** strutturati, che sono più facili da indicizzare e interrogare. Impostare
il formato tramite una variabile d'ambiente:```
# One of: ecs (Elastic Common Schema), logstash, gelf (Graylog)
LOGGING_STRUCTURED_FORMAT_CONSOLE=ecs
Crittografia
Se non vuoi che le credenziali vengano memorizzate in chiaro nel DB, è consigliabile abilitare la crittografia del database sul DB postgres di Kviklet stesso. Per la maggior parte dei provider ospitati si tratta di una semplice casella da selezionare. Tuttavia, se il database di Kviklet viene in qualche modo compromesso, si tratta di un enorme rischio per la sicurezza. Poiché contiene le credenziali del database per potenzialmente tutti i tuoi datastore di produzione. Quindi puoi abilitare la crittografia delle credenziali a riposo.
Per fare ciò è sufficiente impostare le due variabili d'ambiente.``` ENCRYPTION_ENABLED=true ENCRYPTION_KEY_CURRENT=some-secret
Kviklet cifrerà tutte le credenziali esistenti all'avvio e utilizzerà il segreto per le connessioni future che crei.
### Rotazione della chiave
Se desideri ruotare la chiave, puoi semplicemente aggiungere un'altra variabile per la chiave precedente e modificare quella corrente:```
ENCRYPTION_KEY_PREVIOUS=some-secret
ENCRYPTION_KEY_CURRENT=another-secret
Kviklet ri-crittograferà tutte le connessioni all'avvio, in modo da poter riavviare il container con la chiave precedente rimossa.
Chiavi API
Kviklet supporta le chiavi API per l'accesso programmatico al sistema. Questa è una funzionalità esclusiva della versione enterprise e richiede una licenza valida. Puoi creare chiavi API nella sezione Impostazioni -> Chiavi API.

Usale in questo modo:```bash
curl --location '[kviklet_host]/api/connections/'
--header 'Authorization: Bearer your-api-key'
Le chiavi API ereditano i permessi dell'utente che le crea. Attualmente solo gli amministratori possono gestire le chiavi API e tutte le azioni eseguite con una chiave API sono attribuite all'utente che ha creato la chiave.
Una documentazione API rudimentale è disponibile all'indirizzo `[kviklet_host]/api/swagger-ui/index.html`. Tieni però presente che si tratta di un lavoro in corso e che l'API potrebbe cambiare nelle versioni future.
Alla fine la verità è nel codice, quindi puoi sempre consultare il controller per vedere come è definita l'API. Se hai domande, sentiti libero di aprire una issue.
## Funzionalità sperimentali
Attualmente ci sono due funzionalità sperimentali. Sono state sviluppate principalmente in base al feedback della community. Sentiti libero di provarle e di lasciare qualsiasi suggerimento tu abbia. Speriamo di svilupparle ulteriormente in futuro e di farle funzionare bene con il flusso di approvazione principale.
### Kubernetes Exec
Se vuoi utilizzare la funzionalità Kubernetes Exec devi creare una connessione Kubernetes separata. Kviklet utilizzerà l'utente del pod distribuito per eseguire il comando. Quindi assicurati che l'utente abbia i permessi necessari per eseguire comandi sui pod a cui vuoi accedere.
Kviklet utilizza anche /bin/sh per eseguire il comando, quindi dovrai assicurarti che i tuoi pod abbiano una shell o almeno un symlink in /bin/sh. Se questo ti crea problemi, sentiti libero di aprire una issue, potremmo potenzialmente rendere questo configurabile o trovare un'altra soluzione.
I comandi Kubernetes attendono l'output solo per 5 secondi; se il comando impiega più tempo, Kviklet attenderà fino a un'ora prima di andare in timeout. Questa è una soluzione provvisoria, stiamo valutando l'uso dei websocket per rendere il tutto più reattivo e potenzialmente abilitare sessioni terminale.
### Proxy - Postgres, MariaDB, MySQL (Enterprise)
Se crei richieste per l'accesso temporaneo, puoi - invece di usare l'interfaccia web - eseguire le tue query attraverso un proxy gestito da kviklet e utilizzare il client DB che preferisci.
Il proxy è una funzionalità enterprise: richiede una licenza valida e un amministratore deve inoltre attivarlo in Impostazioni -> Generale -> Database Proxy.
Per questo il container ascolta su porte stabili (5432 e 3306 per impostazione predefinita, configurabili tramite `kviklet.proxy.postgres.port` e `kviklet.proxy.mysql.port`), quindi devi esporre quelle porte.
Gli utenti possono quindi creare una richiesta di accesso temporaneo e cliccare "Start Proxy" una volta che è stata approvata. Ogni richiesta ottiene un nome utente e una password temporanei; Kviklet instrada ogni connessione alla sua richiesta tramite il nome utente. Con questi possono connettersi al database. Kviklet convalida l'utente temporaneo e la password e inoltra tutte le richieste all'utente sottostante sul database. Qualsiasi istruzione eseguita viene registrata nel registro di audit come se fosse stata eseguita tramite l'interfaccia web.
Nota: il proxy attualmente non supporta il tracciamento dei risultati. Quindi le istruzioni eseguite vengono registrate ma non i risultati né se un'istruzione ha successo o fallisce.


#### Proxy - TLS
Kviklet termina la connessione TLS verso il database. Ciò significa che per impostazione predefinita qualsiasi traffico da e verso il proxy stesso non è crittografato.
Se vuoi che kviklet ricrittografi il traffico puoi fornire a Kviklet un certificato TLS e una chiave per il proxy impostando le seguenti variabili d'ambiente:```
PROXY_TLS_CERTIFICATE_SOURCE=env
PROXY_TLS_CERTIFICATE_CERT=your-certificate
PROXY_TLS_CERTIFICATE_KEY=your-key
in alternativa puoi usare i file:``` PROXY_TLS_CERTIFICATE_SOURCE=file PROXY_TLS_CERTIFICATE_CERT_FILE=path/to/cert.pem PROXY_TLS_CERTIFICATE_KEY_FILE=path/to/key.pem
In ogni caso, il certificato e la chiave devono essere memorizzati in [formato pem](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail).
## Domande? Contributi?
Se hai domande, vuoi fornire un feedback o hai bisogno di aiuto con la configurazione, unisciti alla nostra [community Discord](https://discord.gg/7SmPJfeP6e). Puoi anche creare una [issue su GitHub](https://github.com/kviklet/kviklet/issues) per segnalazioni di bug e richieste di funzionalità.
Se vuoi contribuire, sentiti libero di fare un fork e creare PR per piccole cose. Se pianifichi funzionalità più grandi, apprezzerei una discussione preliminare in una issue su GitHub o su Discord.
Puoi anche contattarmi all'indirizzo [email protected].