Torna agli aggiornamenti
New releaseAug 19, 2026

kviklet v0.8.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.

Condividi

Kviklet

Kviklet.dev | Note di rilascio | Discord

Accesso sicuro agli ambienti di produzione senza compromettere la produttività degli sviluppatori.

Kviklet Kviklet

Kviklet (pronunciato Quick-let) adotta il Principio dei Quattro Occhi e un alto livello di configurabilità per consentire un flusso di Revisione e Approvazione simile a una Pull Request per singole istruzioni SQL o sessioni di database. Ciò consente ai team di ingegneria di autoregolamentare chi ha accesso a quali dati e quando, permettendo alle organizzazioni di rimanere sicure e conformi, abbracciando flussi di lavoro moderni, responsabilizzanti e realmente "DevOps".

Kviklet è un contenitore Docker self-hosted che fornisce un'applicazione web a pagina singola. Accedi per creare richieste SQL o approvare quelle di altri. Una licenza enterprise opzionale sblocca funzionalità avanzate come autenticazione SAML, requisiti di revisione basati sui ruoli, sincronizzazione dei ruoli e chiavi API. Puoi richiedere una licenza enterprise su kviklet.dev.

Attualmente supportiamo Postgres, MySQL, MS SQL Server e MongoDB.

Funzionalità

Kviklet offre una varietà di funzionalità di cui un team di ingegneria ha bisogno per gestire l'accesso al database di produzione in modo semplice ma sicuro:

  • SSO (OIDC, Google, Keycloak, ecc.): Accedi a Kviklet senza bisogno di nome utente o password. Niente più credenziali condivise per l'accesso al DB.
  • Supporto LDAP: Accedi a Kviklet con le tue credenziali LDAP.
  • Supporto SAML: Accedi a Kviklet con le tue credenziali SAML. (Solo enterprise)
  • Flusso di Revisione/Approvazione: Lascia commenti e suggerimenti sulle richieste di dati di altri sviluppatori.
  • Accesso Temporaneo (1 ora): Esegui qualsiasi istruzione su un database per 1 ora dopo essere stato approvato.
  • Query Singola: Esegui una singola istruzione. Consente al revisore di esaminare la tua query prima dell'esecuzione.
  • Registro di Controllo (Auditlog): Piano singolo che registra tutte le istruzioni eseguite con autore, motivo dell'esecuzione, ecc.
  • RBAC: Configura quale team ha accesso a quale database/tabella, con una granularità quanto consentito dal motore DB.
  • Proxy Postgres: Avvia un server proxy per utilizzare il client DB di tua scelta, ma tutto verrà archiviato nell'Auditlog di Kviklet.
  • Esecuzione Kubernetes (Kubernetes Exec): Esegui un'istruzione su un pod nel tuo cluster Kubernetes. (Attualmente supporta solo l'esecuzione di un singolo comando, non ancora una sessione live.)
  • Gate di Revisione Basati sui Ruoli: Richiedi approvazioni da ruoli specifici prima dell'esecuzione. (Solo enterprise)
  • Sincronizzazione dei Ruoli: Sincronizza automaticamente i ruoli utente dai gruppi del tuo provider di identità. (Solo enterprise)
  • Chiavi API: Accesso programmatico all'API di Kviklet. (Solo enterprise)

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 Controllo, ecc.). Ma alcune funzionalità sono limitate, perché non sono state ancora implementate o perché non hanno senso per quello scopo specifico. La tabella seguente mostra quali funzionalità sono disponibili per ciascun tipo di database:

DatabaseRevisione IstruzioniAccesso TemporaneoProxy (Beta)Piano di Spiegazione
Postgres
MySQL
MariaDB
SQL Server
MongoDB
Kubernetes

Configurazione

Kviklet viene fornito come semplice contenitore Docker. Puoi trovare le versioni disponibili nella sezione Rilasci. Ti consigliamo di aggiornare regolarmente la versione che stai utilizzando, poiché continuiamo ad aggiungere nuove funzionalità.
L'ultima versione attualmente è ghcr.io/kviklet/kviklet:0.7.0. Puoi anche usare :main, ma occasionalmente potremmo unire accidentalmente qualcosa di difettoso. Cerchiamo comunque di evitarlo.

Avvio Rapido

Se vuoi solo provare come funziona:

  1. Ecco un docker-compose.yaml minimo:

    Clicca per espandere il contenuto 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.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. Esegui il docker-compose.yml tramite docker-compose up -d. Kviklet si avvierà sulla porta 80, vai su localhost e gioca un po'. L'accesso admin è [email protected] con admin come password.

  2. 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 alcuni 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 database

Kviklet necessita di un proprio database postgres (o almeno uno schema) per salvare i metadati su query, connessioni, approvazioni, ecc.
Puoi trovare la loro immagine ufficiale qui: https://hub.docker.com/_/postgres, o utilizzare una versione ospitata nel cloud dal tuo fornitore di servizi cloud preferito.

Quando avvii il 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, in tal caso è sufficiente omettere la password e impostare solo il nome utente. È anche necessario impostare la variabile d'ambiente: ``` SPRING_DATASOURCE_IAMAUTH=true

Kviklet caricherà le credenziali dai soliti posti (variabili d'ambiente, ruoli di istanza, ecc.) e genererà un token per la connessione.

  • Certificati: Puoi anche utilizzare certificati per la connessione al database, 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 modificare la password successivamente tramite l'interfaccia utente.
Esempio:``` INITIAL_USER_EMAIL=[email protected] INITIAL_USER_PASSWORD=someverysecurepassword

Pubbliciamo i nostri container su GitHub Packages per ora, quindi con tutto ciò impostato 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:```
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

Google

Se desideri configurare SSO per la tua istanza Kviklet (il che ha molto senso, altrimenti dovresti gestire nuovamente le password). Devi impostare queste 3 variabili d'ambiente:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=google

The google client id and secret you can easily get by following google instructions here:
https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid

For valid redirect URIs, you should configure: https://[kviklet_host]/api/login/oauth2/code/google
For Allowed Origins, simply your hosted kviklet url.

After setting those environment variables everyone in your organization can login with the sign in with google button. But they wont have any permissions by default, you will have to assign them a role after they log in once.

#### Keycloak

If you want to setup SSO with Keycloak instead you need to set these 4 environment variables:```
KVIKLET_IDENTITYPROVIDER_CLIENTID
KVIKLET_IDENTITYPROVIDER_CLIENTSECRET
KVIKLET_IDENTITYPROVIDER_TYPE=keycloak
KVIKLET_IDENTITYPROVIDER_ISSUERURI=http://[host]:[port]/realms/[realm]

Ottieni l'ID client e il segreto quando crei un'applicazione in Keycloak. Per gli URI di reindirizzamento validi, dovresti configurare: https://[kviklet_host]/api/login/oauth2/code/keycloak Per gli Origini Consentite, semplicemente l'URL del tuo kviklet hostato.

Dopo aver impostato queste variabili d'ambiente, la pagina di login dovrebbe mostrare un pulsante "Accedi con 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 Sincronizzazione Ruoli 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 i ruoli devono essere assegnati 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 un'app OAuth GitHub su https://github.com/settings/developers e configurala:

- URL di callback di autorizzazione: `https://[kviklet_host]/api/login/oauth2/code/github`
- URL della homepage: l'URL della tua istanza Kviklet

`KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS` è **richiesto** (Kviklet si rifiuta di avviarsi senza di esso). Le app OAuth GitHub 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 un'org consentita (senza distinzione tra maiuscole e minuscole, vengono controllate le prime 100 org).

Affinché il controllo dell'org possa vedere l'appartenenza di un utente, l'utente deve fare clic su **Grant** (o **Request**) accanto a ciascuna org consentita nella schermata di consenso OAuth. Se l'org ha attivato "Restrict third-party OAuth applications", anche un proprietario dell'org deve approvare l'app OAuth una volta prima che l'appartenenza di qualsiasi membro diventi visibile.

Kviklet richiede gli ambiti `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 OIDC (GitLab, Auth0, Okta, ecc.) dovrebbero funzionare in modo simile a Keycloak. Nota che l'`URI di reindirizzamento` cambierà a seconda del tipo scelto, quindi se scegli `gitlab` sarà `https://[kviklet_host]/api/login/oauth2/code/gitlab`.
Se incontri problemi, sentiti libero di creare un issue. Non abbiamo ancora provato ogni singolo provider OIDC là fuori e potrebbero esserci leggere 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 ogni impostazione:

  • LDAP_ENABLED: Imposta a true per 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 bind 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 (default: "uid").
  • LDAP_EMAIL_ATTRIBUTE: L'attributo LDAP che contiene l'indirizzo email dell'utente (default: "mail").
  • LDAP_FULL_NAME_ATTRIBUTE: L'attributo LDAP che contiene il nome completo dell'utente (default: "cn").
  • LDAP_USER_OU: L'Unità Organizzativa (OU) in cui sono memorizzati gli account utente (default: "people").
  • LDAP_SEARCH_BASE: Permette di sovrascrivere il DN di base per le ricerche utente (default: "ou=people"). Se usi FreeIPA potresti dover impostare questo a es. cn=users. Se impostato, LDAP_USER_OU viene ignorato.

Puoi personalizzare questi attributi in base al tuo schema LDAP. Dopo aver configurato LDAP, gli utenti potranno accedere utilizzando le loro credenziali LDAP. La prima volta che un utente LDAP effettua l'accesso, verrà creato un account utente corrispondente in Kviklet con autorizzazioni predefinite. 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, imposta 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`: Imposta su `true` per abilitare l'autenticazione SAML
- `SAML_ENTITYID`: L'ID dell'entità 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)

Puoi opzionalmente personalizzare i mapping degli attributi SAML:```
SAML_USERATTRIBUTES_EMAILATTRIBUTE=email
SAML_USERATTRIBUTES_NAMEATTRIBUTE=name
SAML_USERATTRIBUTES_IDATTRIBUTE=nameID

Il tuo provider di identità 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 il provider di identità. Al primo accesso, viene creato un account utente con permessi predefiniti.

Se vieni reindirizzato correttamente all'IDP ma ottieni 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.

![Aggiungi connessione](https://assets.kitploit.com/production/public/readmes/7140/3ded2a0b23e5d2f02feb21a854263c91dedea25a789fb75ab8342384c4e39b52.png)
![Aggiungi connessione](https://assets.kitploit.com/production/public/readmes/7140/585238c9eddad8ed4e2440096ce0616445a6696e1042f58676a1d0b038edde7f.png)

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'autenticazione IAM per le connessioni ai database Postgres e MySQL. Per utilizzarla, scegli IAM Auth quando crei una nuova connessione.

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

Questa opzione rimuove la possibilità di impostare una password e utilizza invece le credenziali AWS per connettersi al database.

Kviklet utilizza `DefaultCredentialsProvider` di AWS per trovare le credenziali e generare il token per la connessione. Questo significa che tutti i luoghi tipici funzionano (variabili d'ambiente o ruoli di 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 del ruolo AWS che Kviklet assumerà e utilizzerà le credenziali di quel ruolo per creare il token DB temporaneo. Ciò è particolarmente utile per connettersi a database che non si trovano nello stesso account AWS di Kviklet. Per utilizzare questa funzionalità, inserisci l'ARN del ruolo nel campo designato quando crei o modifichi una connessione IAM Auth. Lasciando il campo vuoto, verrà utilizzato il provider di credenziali predefinito (senza assunzione di ruolo).

La regione AWS da utilizzare durante la generazione del token viene dedotta dall'URL di connessione, quindi non ci sono opzioni 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:

- Creare un utente DB con l'opzione di autenticazione IAM e le autorizzazioni corrette
- Creare una policy IAM che permetta all'entità AWS di generare token per questo utente

### Review Gates

Per impostazione predefinita, Kviklet consente una semplice configurazione del conteggio delle revisioni. Puoi configurare quante approvazioni sono necessarie per una richiesta su una specifica connessione prima che possa essere eseguita.

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. La modifica di una richiesta reimposta sempre tutte le approvazioni precedenti, assicurando che nessuna modifica possa essere eseguita senza essere prima revisionata. Allo stesso modo, se un'esecuzione fallisce (ad esempio a causa di un errore di sintassi SQL), le approvazioni vengono reimpostate in modo che la richiesta possa essere corretta e riapprovata senza doverne creare una nuova.

Puoi anche configurare un limite di **esecuzioni massime** per connessione per controllare quante volte una 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 Enterprise di Kviklet puoi configurare singole connessioni per richiedere approvazioni da utenti con ruoli specifici. Questo ti permette, ad esempio, di richiedere l'approvazione del team che gestisce un determinato database o di vincolare connessioni sensibili all'approvazione di DBA o dirigenti.

**Come funziona:**

Ogni connessione ha un numero totale di revisioni richieste (`numTotalRequired`) che funge da minimo — il numero minimo di approvazioni distinte necessarie indipendentemente dai ruoli. In aggiunta, puoi aggiungere **requisiti di ruolo** che specificano quante approvazioni devono provenire da utenti con un ruolo particolare (ad esempio, "1 da DBA, 1 da Sicurezza").

Una richiesta è approvata solo quando **entrambe** le condizioni sono soddisfatte:
- Il numero totale di approvazioni distinte raggiunge `numTotalRequired`
- Ogni requisito di ruolo è soddisfatto individualmente

Se un utente appartiene a più ruoli, una singola approvazione da quell'utente conta per tutti i requisiti di ruolo corrispondenti. Tuttavia, conta comunque come una sola approvazione verso il conteggio totale.

**Esempio:** Una connessione richiede 3 approvazioni totali, inclusa 1 da un DBA e 1 dalla Sicurezza. Un utente che ha entrambi i ruoli DBA e Sicurezza 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 in vigore ma non possono più essere modificati. Puoi solo rimuoverli per tornare alla semplice configurazione del conteggio totale delle revisioni.

### Ruoli

Kviklet include 3 ruoli: Predefinito, Amministratori e Sviluppatori.

- 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 Amministratori hanno il permesso di creare e modificare connessioni, nonché di aggiungere nuovi Utenti e impostare i loro permessi.
- Gli Sviluppatori possono creare Richieste, approvarle, commentarle e, naturalmente, eseguire le istruzioni effettive.

Puoi personalizzare i Ruoli e, ad esempio, dare a un ruolo l'accesso solo a una connessione specifica o a un gruppo di connessioni DB.
Questo è utile, ad esempio, se hai team diversi con database differenti e desideri controllare l'accesso in modo più granulare.

#### Creazione di un nuovo Ruolo

La creazione di un nuovo ruolo funziona come segue. Vai su Impostazioni -> Ruoli -> Aggiungi ruolo.

![Aggiungi ruolo](https://assets.kitploit.com/production/public/readmes/7140/a91b79287c0b3130b83bdde1c059f49b89c5d43a1c0deae33b211ea427956f8e.png)
![Aggiungi ruolo](https://assets.kitploit.com/production/public/readmes/7140/c535ac152759bb21bea04a0968ce43fa7bf946c7699feca23c71f9eaba41ceaf.png)

Le impostazioni predefinite non sono molto rilevanti per la maggior parte dei ruoli e puoi semplicemente concedere all'Utente l'accesso in lettura e la visualizzazione dei ruoli e lasciare così.
Più interessante è l'aggiunta di permessi individuali per le Connessioni. Qui devi prima aggiungere un selettore per selezionare connessioni specifiche. Può essere un ID specifico oppure usare caratteri jolly con `*` per corrispondere a più connessioni. Ad esempio, se vuoi un ruolo che abbia accesso a tutti i database di sviluppo (nel caso tu gestisca anche l'accesso a questi con Kviklet), useresti un selettore come `dev-*` e assicurati che gli ID delle connessioni siano impostati correttamente.

Puoi naturalmente anche creare un sistema per i diversi team all'interno della tua organizzazione.

### Sincronizzazione ruoli (Enterprise)

Sincronizza automaticamente i ruoli utente dai gruppi del tuo identity provider. Questa funzionalità richiede una licenza enterprise.

**La configurazione** si trova in Impostazioni > Sincronizzazione ruoli:

- **Abilita sincronizzazione ruoli**: Attiva/disattiva la sincronizzazione
- **Modalità di sincronizzazione**:
  - **Sincronizzazione completa** - I ruoli utente corrispondono esattamente alle loro mappature dei gruppi IdP (più il ruolo predefinito)
  - **Aggiuntiva** - I gruppi IdP aggiungono ruoli ma non rimuovono quelli esistenti
  - **Solo al primo accesso** - I ruoli vengono sincronizzati solo al primo accesso, le modifiche manuali vengono preservate successivamente
- **Attributo gruppi**: L'attributo IdP che contiene le appartenenze ai gruppi (predefinito: `groups`)
- **Mappature ruoli**: Mappa i nomi dei gruppi IdP (ad esempio, `engineering`) ai ruoli Kviklet

#### Configurazione OIDC

Configura il tuo provider OIDC per includere un claim `groups` nel token ID:

- **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. Fai clic sullo scope dedicato (ad esempio, `kviklet-dedicated`)
  5. Vai alla scheda **Mappers**
  6. Fai clic su **Add mapper** → **By configuration**
  7. Seleziona **Group Membership**
  8. Configura il mapper:

  | Impostazione | Valore |
  |--------------|--------|
  | Nome | `groups` |
  | Nome claim token | `groups` |
  | Percorso gruppo completo | **DISATTIVATO** |
  | Aggiungi al token ID | **ATTIVATO** |
  | Aggiungi al token di accesso | **ATTIVATO** |
  | Aggiungi a userinfo | **ATTIVATO** |

  9. Fai clic su **Salva**

  > **Importante:** Il "Nome claim token" deve corrispondere all'"Attributo gruppi" configurato nelle impostazioni di sincronizzazione ruoli di Kviklet (predefinito: `groups`).

- **Altri provider OIDC**: Aggiungi un mapper/claim per i gruppi che includa le appartenenze ai gruppi dell'utente nel token ID. Questo viene solitamente fatto nell'interfaccia di amministrazione del provider.

  Se incontri problemi, sentiti libero di creare un issue, non abbiamo testato tutti i provider OIDC (ancora) e potrebbero esserci piccole differenze nell'implementazione che potrebbero richiedere aggiornamenti dal lato di Kviklet.

#### Configurazione LDAP

La sincronizzazione ruoli LDAP utilizza 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 attributo statement che mappi le appartenenze ai gruppi dell'utente
2. Imposta l'**Attributo gruppi** in Kviklet in modo che corrisponda al nome dell'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 Slack o Teams. Questo è utile per avvisare il tuo team riguardo a nuove richieste che necessitano di revisione. Puoi configurare questa opzione in Impostazioni -> Generali -> Impostazioni notifiche.

#### Slack

Per configurare le notifiche Slack, devi creare un'app Slack e abilitare i webhook per essa. Puoi seguire le istruzioni qui: https://api.slack.com/messaging/webhooks

#### Teams

Le notifiche Teams utilizzano un webhook **Workflow** di Power Automate. Kviklet invia una scheda adattiva (Adaptive Card), che il modello del webhook pubblica nel tuo canale.

**Raccomandato: utilizzare il modello di workflow**

1. In Teams, apri il canale in cui desideri ricevere le notifiche, fai clic sui **...** accanto al nome del canale e scegli **Workflows** (o aggiungi l'app **Workflows**).
2. Cerca e crea il modello **"Send webhook alerts to a channel"**.
3. Accedi quando richiesto, quindi seleziona il Team e Canale di destinazione e crea il workflow.
4. Apri il passo del trigger e copia l'**URL HTTP POST** generato.
5. Incolla l'URL in Kviklet sotto Impostazioni -> Generali -> Impostazioni notifiche e fai clic su salva.

**Alternativa: creare il workflow manualmente**

Se preferisci creare il flusso da solo (o il modello non è disponibile):

1. Canale **...** -> **Workflows** -> crea un flusso 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 sull'espressione `string(triggerBody())` in modo che pubblichi la scheda inviata da Kviklet.
4. Seleziona il Team e Canale di destinazione, **Salva**, quindi copia l'**URL HTTP POST** dal passo del trigger.

Attualmente ci sono notifiche per:

- Nuove richieste che necessitano di approvazioni
- Nuove approvazioni sulle richieste

#### Configurazione URL di base

Quando Kviklet è eseguito dietro un proxy inverso o un Ingress Kubernetes, i link delle notifiche potrebbero utilizzare l'indirizzo IP interno invece del tuo dominio pubblico. Kviklet cerca di tracciare l'URL corretto guardando le richieste in arrivo, ma alcuni proxy inversi non impostano correttamente gli header Forwarded. Per risolvere, imposta l'URL di base esplicitamente:```
KVIKLET_BASE_URL=https://kviklet.example.com

This ensures all notification links point to the correct public URL.

Logging

Di default Kviklet scrive log human-readable (pretty) su stdout, il che è comodo quando li si leggono direttamente o tramite docker logs.

Se invii i log a un sistema centralizzato (Elasticsearch, Loki, Datadog, CloudWatch, …) puoi passare invece a log JSON strutturati, che sono più facili da indicizzare e interrogare. Imposta 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 PostgreSQL di Kviklet stesso. Per la maggior parte dei provider ospitati, è sufficiente selezionare una casella.
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 archivi di dati di produzione. È quindi possibile abilitare la crittografia delle credenziali a riposo.

Per farlo, basta impostare le due variabili d'ambiente.```
ENCRYPTION_ENABLED=true
ENCRYPTION_KEY_CURRENT=some-secret

Kviklet crittograferà tutte le tue credenziali esistenti all'avvio e utilizzerà il segreto per le connessioni future che creerai.

Rotazione delle Chiavi

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-cifrerà tutte le connessioni all'avvio, in modo da poter riavviare il contenitore con la chiave precedente rimossa.

## Chiavi API

Kviklet supporta le chiavi API per l'accesso programmatico al sistema. Questa è una funzionalità solo per enterprise e richiede una licenza valida. Puoi creare chiavi API nella sezione Settings -> API Keys.

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

Usalo come segue:```bash
curl --location '[kviklet_host]/api/connections/' \
--header 'Authorization: Bearer your-api-key'

Le chiavi API ereditano le autorizzazioni 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.

Alcune documentazioni API rudimentali si trovano su [kviklet_host]/api/swagger-ui/index.html. Ma tieni presente che è un lavoro in corso e l'API potrebbe cambiare nelle versioni future.

In fondo la verità sta nel codice, quindi puoi sempre guardare il controller per vedere come è definita l'API. Se hai domande, sentiti libero di aprire un issue.

Funzionalità Sperimentali

Attualmente ci sono due funzionalità sperimentali. Sono state costruite principalmente in base ai feedback della community. Sentiti libero di provarle e lasciare qualsiasi feedback tu possa avere. Speriamo di svilupparle ulteriormente in futuro e 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 collegamento simbolico in /bin/sh. Se questo ti crea problemi, sentiti libero di aprire un issue; possiamo potenzialmente renderlo configurabile o trovare un'altra soluzione.

I comandi Kubernetes aspettano solo 5 secondi per l'output; se il comando impiega più tempo, Kviklet aspetterà fino a un'ora prima di timeout del comando. Questa è una soluzione provvisoria; stiamo valutando i websocket per renderlo più reattivo e potenzialmente abilitare sessioni terminali.

Proxy, solo Postgres

Se crei richieste per accesso temporaneo, puoi - invece di usare l'interfaccia web - eseguire le tue query attraverso un proxy gestito da kviklet e utilizzare il client DB di tua scelta. Per questo il container utilizza le porte 5438-6000, quindi devi esporle. L'utente può quindi creare una richiesta di accesso temporaneo e cliccare su "Avvia Proxy" una volta che è stata approvata. Ogni richiesta riceverà una porta, un utente e una password temporanea. Con questo possono connettersi al database. Kviklet convalida l'utente temporaneo e la password e proxy tutte le richieste all'utente sottostante nel database. Qualsiasi istruzione eseguita viene registrata nell'auditlog come se fosse stata eseguita tramite l'interfaccia web. Nota che l'analisi dei messaggi sul lato proxy non è stata testata con tutti i client, quindi se incontri problemi, ad esempio con istruzioni non registrate, sentiti libero di aprire un issue.

Postgres Proxy Postgres Proxy

Proxy Postgres - TLS

Kviklet termina la connessione TLS al 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 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 conservati in formato pem.

Domande? Contributi?

Se hai domande, vuoi fornire feedback o hai bisogno di aiuto nella configurazione, unisciti alla nostra comunità su Discord. Puoi anche creare un issue su GitHub per segnalare bug e richiedere funzionalità.

Se desideri contribuire, sentiti libero di fare un fork e creare PR per piccole cose. Se hai in mente funzionalità più grandi, apprezzerei una discussione preliminare in un issue su GitHub o su Discord.

Puoi anche contattarmi a [email protected].

Categorie