Voltar às atualizações
New releaseAug 19, 2026

kviklet v0.8.0

Fluxo de Revisão/Aprovação similar a Pull Request para consultas de banco de dados. Para acesso de Engenharia à produção que seja compatível, mas suave.

Compartilhar

Kviklet

Kviklet.dev | Notas de Lançamento | Discord

Acesso seguro a ambientes de produção sem prejudicar a produtividade dos desenvolvedores.

Kviklet Kviklet

Kviklet (pronuncia-se Quick-let) adota o Princípio dos Quatro Olhos e um alto nível de configuribilidade para permitir um fluxo de Revisão e Aprovação semelhante a Pull Requests para instruções SQL individuais ou sessões de banco de dados. Isso permite que equipes de engenharia se autorregulem quanto a quem tem acesso a quais dados e quando, permitindo que as organizações permaneçam seguras e em conformidade enquanto adotam fluxos de trabalho modernos, capacitadores e verdadeiramente "DevOps".

Kviklet é um contêiner Docker auto-hospedado que fornece um aplicativo Web de página única. Faça login para criar solicitações SQL ou aprovar as de outros. Uma licença empresarial opcional desbloqueia recursos avançados como autenticação SAML, requisitos de revisão baseados em função, sincronização de funções e chaves de API. Você pode solicitar uma licença empresarial em kviklet.dev.

Atualmente suportamos Postgres, MySQL, MS SQL Server e MongoDB.

Funcionalidades

Kviklet vem com uma variedade de funcionalidades que uma equipe de engenharia precisa para gerenciar o acesso ao banco de dados de produção de forma simples, mas segura:

  • SSO (OIDC, Google, Keycloak, etc.): Faça login no Kviklet sem a necessidade de nome de usuário ou senha. Chega de credenciais compartilhadas para acesso ao banco de dados.
  • Suporte LDAP: Faça login no Kviklet com suas credenciais LDAP.
  • Suporte SAML: Faça login no Kviklet com suas credenciais SAML. (Apenas Enterprise)
  • Fluxo de Revisão/Aprovação: Deixe comentários e sugestões nas solicitações de dados de outros desenvolvedores.
  • Acesso Temporário (1h): Execute qualquer instrução em um banco de dados por 1 hora após ser aprovado.
  • Consulta Única: Execute uma instrução singular. Permite que o revisor analise sua consulta antes da execução.
  • Registro de Auditoria: Painel único que registra todas as instruções executadas com autor, motivo da execução, etc.
  • RBAC: Configure qual equipe tem acesso a qual banco de dados/tabela com a granularidade que o mecanismo do banco de dados permitir.
  • Proxy Postgres: Inicie um servidor proxy para usar o cliente de banco de dados de sua escolha, mas tudo será armazenado no Registro de Auditoria do Kviklet.
  • Kubernetes Exec: Execute uma instrução em um pod no seu cluster Kubernetes. (Atualmente suporta apenas execução de um único comando, ainda não há sessão ao vivo)
  • Portões de Revisão Baseados em Função: Exija aprovações de funções específicas antes da execução. (Apenas Enterprise)
  • Sincronização de Funções: Sincronize automaticamente as funções dos usuários a partir dos grupos do seu provedor de identidade. (Apenas Enterprise)
  • Chaves de API: Acesso programático à API do Kviklet. (Apenas Enterprise)

Funcionalidades por Tipo de Banco de Dados/Conexão

A maioria das funcionalidades está disponível para todos os bancos de dados (SSO, LDAP, RBAC, Fluxo de Revisão/Aprovação, Registro de Auditoria, etc.). Mas algumas funcionalidades são restritas, seja porque simplesmente ainda não foram implementadas ou porque não fazem sentido para esse propósito específico. A tabela a seguir mostra quais funcionalidades estão disponíveis para cada tipo de banco de dados:

Banco de DadosRevisão de InstruçãoAcesso TemporárioProxy (Beta)Plano de Explicação
Postgres
MySQL
MariaDB
SQL Server
MongoDB
Kubernetes

Configuração

Kviklet é fornecido como um contêiner Docker simples. Você pode encontrar as versões disponíveis em Releases. Recomendamos atualizar regularmente a versão que você está usando, pois continuamos a construir novas funcionalidades.
A última versão atualmente é ghcr.io/kviklet/kviklet:0.7.0, você também pode usar :main, mas pode acontecer de vez em quando de mesclarmos algo com bugs acidentalmente. Embora tentemos evitar isso.

Início Rápido

Se você quiser apenas testar como funciona:

  1. Aqui está um docker-compose.yaml mínimo:

    Clique para expandir o conteúdo do 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. Execute o docker-compose.yml via docker-compose up -d. O Kviklet será iniciado na porta 80, acesse localhost e explore. O login de administrador é [email protected] com a senha admin.

  2. O docker-compose contém um banco de dados postgres extra para o qual você pode configurar uma conexão no Kviklet. Para que este banco de dados contenha alguns dados, descomente esta linha: ``` - ./sample_data.sql:/docker-entrypoint-initdb.d/init.sql

E crie um arquivo sample_data.sql:

Clique para expandir o conteúdo de 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>

### Configuração do BD

Kviklet precisa do seu próprio banco de dados postgres (ou pelo menos esquema) para salvar metadados sobre consultas, conexões, aprovações, etc.
Você pode encontrar a imagem oficial aqui: https://hub.docker.com/_/postgres, ou usar uma versão hospedada na nuvem pelo provedor de nuvem de sua escolha.

Ao iniciar o contêiner kviklet, você precisará definir essas três variáveis de ambiente de acordo:```
SPRING_DATASOURCE_PASSWORD = password
SPRING_DATASOURCE_USERNAME = username
SPRING_DATASOURCE_URL = jdbc:postgresql://[host]:[port]/[database]?currentSchema=[schema]

Métodos de autenticação alternativos

  • IAM Auth: É possível usar AWS IAM Auth para a conexão com o banco de dados, nesse caso você simplesmente omite a senha e define apenas o nome de usuário. Você também precisa definir a variável de ambiente: ``` SPRING_DATASOURCE_IAMAUTH=true

Kviklet carregará as credenciais dos lugares habituais (variáveis de ambiente, funções de instância, etc.) e gerará um token para a conexão.

  • Certificados: Você também pode usar certificados para a conexão com o banco de dados, veja aqui para um exemplo.

Usuário Inicial

Você precisará de um usuário administrador inicial para fins de configuração. Para isso, defina as 2 variáveis de ambiente: INITIAL_USER_EMAIL e INITIAL_USER_PASSWORD para que você possa fazer login na interface web. Você pode alterar a senha posteriormente através da interface do usuário (UI).
Exemplo:``` INITIAL_USER_EMAIL=[email protected] INITIAL_USER_PASSWORD=someverysecurepassword

Publicamos nossos contêineres nos pacotes GitHub por enquanto, então com tudo isso configurado, você pode executar `ghcr.io/kviklet/kviklet:main` não se esqueça de mapear a porta `8080` que é a porta padrão em que o Kviklet é iniciado.

Um exemplo de execução do docker run poderia ser assim:```
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 via OIDC / OAuth2

Google

Se você quiser configurar SSO para sua instância Kviklet (o que faz muito sentido, pois caso contrário você teria que gerenciar senhas novamente). Você precisa configurar essas 3 variáveis de ambiente:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=google

O ID e segredo do cliente Google podem ser facilmente obtidos seguindo as instruções do Google aqui:
https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid

Para URIs de redirecionamento válidos, você deve configurar: https://[kviklet_host]/api/login/oauth2/code/google
Para Origens Permitidas, simplesmente a URL do seu kviklet hospedado.

Após definir essas variáveis de ambiente, todos na sua organização podem fazer login com o botão "Entrar com o Google". Mas eles não terão nenhuma permissão por padrão; você precisará atribuir um papel a eles depois que fizerem login uma vez.

#### Keycloak

Se você quiser configurar SSO com Keycloak, você precisa definir estas 4 variáveis de ambiente:```
KVIKLET_IDENTITYPROVIDER_CLIENTID
KVIKLET_IDENTITYPROVIDER_CLIENTSECRET
KVIKLET_IDENTITYPROVIDER_TYPE=keycloak
KVIKLET_IDENTITYPROVIDER_ISSUERURI=http://[host]:[port]/realms/[realm]

Você obtém o client id e o secret ao criar uma aplicação no Keycloak. Para URIs de redirecionamento válidas, você deve configurar: https://[kviklet_host]/api/login/oauth2/code/keycloak Para Origens Permitidas, simplesmente sua URL hospedada do Kviklet.

Após definir essas variáveis de ambiente, a página de login deve mostrar um botão "Login com Keycloak" que redireciona para sua instância do Keycloak. Na edição empresarial, você pode ativar a sincronização de papéis para sincronizar automaticamente os papéis da sua instância do Keycloak para o Kviklet. Consulte a seção Sincronização de Papéis para mais detalhes.

GitHub (Beta)

Beta: a autenticação do GitHub é nova e não suporta sincronização de papéis ainda — todo novo usuário chega com o papel padrão e precisa ter papéis atribuídos manualmente.

O GitHub não é compatível com OIDC (é OAuth 2.0 puro), portanto, tem suporte dedicado no Kviklet. Defina estas variáveis de ambiente:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=github KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS=your-org,another-org

Crie um aplicativo OAuth do GitHub em https://github.com/settings/developers e configure:

- Authorization callback URL: `https://[kviklet_host]/api/login/oauth2/code/github`
- Homepage URL: a URL do seu Kviklet hospedado

`KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS` é **obrigatório** (o Kviklet se recusa a iniciar sem ele). Os aplicativos OAuth do GitHub não podem restringir quem completa o fluxo OAuth, então o Kviklet chama `/user/orgs` após a autenticação e rejeita usuários que não são membros de pelo menos uma organização na lista de permissões (sem distinção entre maiúsculas e minúsculas, primeiras 100 organizações verificadas).

Para que a verificação da organização veja a associação de um usuário, o usuário deve clicar em **Grant** (ou **Request**) ao lado de cada organização na lista de permissões na tela de consentimento OAuth. Se a organização tiver "Restrict third-party OAuth applications" ativado, o proprietário da organização também precisa aprovar o aplicativo OAuth uma vez antes que a associação de qualquer membro se torne visível.

O Kviklet solicita os escopos `read:user`, `user:email` e `read:org`. Os e-mails são sempre lidos de `/user/emails` e apenas uma entrada `primary && verified` é aceita, para que usuários com endereços de e-mail privados ainda façam login com sucesso.

#### Outros provedores OIDC

Outros provedores compatíveis com OIDC (GitLab, Auth0, Okta, etc.) devem funcionar de forma semelhante ao Keycloak. Observe que a `redirect URI` mudará dependendo do tipo que você escolher, então se você escolher `gitlab`, será `https://[kviklet_host]/api/login/oauth2/code/gitlab`.
Se você encontrar problemas, sinta-se à vontade para criar um issue, ainda não testamos todos os provedores OIDC existentes (ainda) e pode haver pequenas diferenças na implementação que podem exigir atualizações do lado do Kviklet.

### LDAP

O Kviklet suporta autenticação LDAP. Para habilitar e configurar o LDAP, você pode substituir as seguintes variáveis de 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

Aqui está o que cada configuração significa:

  • LDAP_ENABLED: Defina como true para ativar a autenticação LDAP.
  • LDAP_URL: A URL do seu servidor LDAP.
  • LDAP_BASE: O DN base para pesquisas LDAP.
  • LDAP_PRINCIPAL: O DN do usuário administrador para vinculação ao servidor LDAP.
  • LDAP_PASSWORD: A senha do usuário administrador.
  • LDAP_UNIQUE_IDENTIFIER_ATTRIBUTE: O atributo LDAP usado como identificador único para usuários (padrão: "uid").
  • LDAP_EMAIL_ATTRIBUTE: O atributo LDAP que contém o endereço de e-mail do usuário (padrão: "mail").
  • LDAP_FULL_NAME_ATTRIBUTE: O atributo LDAP que contém o nome completo do usuário (padrão: "cn").
  • LDAP_USER_OU: A Unidade Organizacional (OU) onde as contas de usuário são armazenadas (padrão: "people").
  • LDAP_SEARCH_BASE: Permite substituir o DN base para pesquisas de usuário (padrão: "ou=people"). Se você usa FreeIPA, talvez precise definir isso como, por exemplo, cn=users. Se definido, LDAP_USER_OU é ignorado.

Você pode personalizar esses atributos para corresponder ao seu esquema LDAP. Após configurar o LDAP, os usuários poderão fazer login usando suas credenciais LDAP. Na primeira vez que um usuário LDAP fizer login, uma conta de usuário correspondente será criada no Kviklet com permissões padrão. Um administrador precisará atribuir funções apropriadas a esses usuários após o primeiro login.

SAML (apenas Enterprise)

Kviklet suporta autenticação SAML 2.0. Para ativar o SAML, defina as seguintes variáveis de 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-----

Detalhes de configuração:

- `SAML_ENABLED`: Defina como `true` para ativar a autenticação SAML
- `SAML_ENTITYID`: O ID de entidade do seu provedor de identidade SAML
- `SAML_SSOSERVICELOCATION`: A URL do serviço SSO do seu provedor de identidade
- `SAML_VERIFICATIONCERTIFICATE`: O certificado X.509 usado para verificar respostas SAML (inclua as linhas BEGIN/END CERTIFICATE)

Opcionalmente, você pode personalizar os mapeamentos de atributos SAML:```
SAML_USERATTRIBUTES_EMAILATTRIBUTE=email
SAML_USERATTRIBUTES_NAMEATTRIBUTE=name
SAML_USERATTRIBUTES_IDATTRIBUTE=nameID

Seu provedor de identidade deve ser configurado com:

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

Após configurar o SAML, os usuários podem fazer login através do provedor de identidade. No primeiro login, uma conta de usuário é criada com permissões padrão.

Se você for redirecionado corretamente para o IDP mas obtiver um erro de CORS, você pode adicionar o host do seu IDP às origens permitidas no Kviklet através de:``` CORS_ALLOWEDORIGINS=https://[idp_host]

## Configuração

### Conexões

Após iniciar o Kviklet, você primeiro precisa configurar uma conexão de banco de dados. Vá para Configurações -> Bancos de Dados -> Adicionar Conexão.

![Adicionar Conexão](https://assets.kitploit.com/production/public/readmes/7140/3ded2a0b23e5d2f02feb21a854263c91dedea25a789fb75ab8342384c4e39b52.png)
![Adicionar Conexão](https://assets.kitploit.com/production/public/readmes/7140/585238c9eddad8ed4e2440096ce0616445a6696e1042f58676a1d0b038edde7f.png)

Aqui você pode configurar requisitos de revisão e limites de execução para cada conexão. Consulte [Gates de Revisão](#review-gates) para detalhes.

#### AWS IAM AUTH

O Kviklet suporta o uso de IAM Auth para conexões de banco de dados Postgres e MySQL. Para isso, escolha IAM Auth ao criar uma nova conexão.

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

Isso removerá a opção de definir uma senha e usará as credenciais da AWS para se conectar ao banco de dados.

O Kviklet usa o `DefaultCredentialsProvider` da AWS para encontrar credenciais e gerar o token para a conexão. Isso significa que todos os locais típicos devem funcionar (variáveis de ambiente ou funções de instância associadas); a ordem exata está documentada aqui: https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html

Além disso, você pode fornecer um ARN de função da AWS que o Kviklet assumirá e usar essas credenciais para criar o token temporário do banco de dados. Isso é particularmente útil para conectar-se a bancos de dados que não estão na mesma conta AWS que o Kviklet. Para usar esse recurso, basta inserir o ARN da função no campo designado ao criar ou editar uma conexão IAM Auth. Deixar o campo vazio usará o provedor de credenciais padrão (sem assunção de função).

A região da AWS a ser usada durante a geração do token é inferida a partir da URL da sua conexão, portanto, não há opções para defini-la.

Para aprender como configurar o IAM Auth para seu banco de dados, siga a documentação oficial da AWS: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
Os dois pontos principais são:

- Criar um usuário de banco de dados com a opção de autenticação IAM e permissões corretas
- Criar uma política IAM que permita à entidade AWS gerar tokens para este usuário

### Gates de Revisão

Por padrão, o Kviklet permite uma configuração simples de contagem de revisões. Você pode configurar quantas aprovações as solicitações em uma conexão específica precisam antes de serem executadas.

O status de aprovação de uma solicitação é calculado com base na ação mais recente de cada revisor. Se um revisor aprova e depois solicita alterações, apenas a solicitação de alteração conta — a aprovação anterior é removida. Editar uma solicitação sempre redefine todas as aprovações anteriores, garantindo que nenhuma alteração possa ser executada sem ser revisada primeiro. Da mesma forma, se uma execução falhar (por exemplo, devido a um erro de sintaxe SQL), as aprovações são redefinidas para que a solicitação possa ser corrigida e re-aprovada sem precisar criar uma nova.

Você também pode configurar um limite de **execuções máximas** por conexão para controlar quantas vezes uma única solicitação aprovada pode ser executada. O padrão é 1. Definir isso como 0 permite execuções ilimitadas. Execuções com falha não contam para esse limite.

#### Requisitos de Revisão Baseados em Funções (Enterprise)

Com uma Licença Enterprise do Kviklet, você pode configurar conexões individuais para exigir aprovações de usuários com funções específicas. Isso permite que você, por exemplo, exija aprovação da equipe que mantém um determinado banco de dados ou restrinja conexões sensíveis a aprovações de DBA ou gerência.

**Como funciona:**

Cada conexão tem uma contagem de **total de revisões necessárias** (`numTotalRequired`) que atua como um piso — o número mínimo de aprovações distintas necessárias independentemente das funções. Além disso, você pode adicionar **requisitos de função** que especificam quantas aprovações devem vir de usuários com uma função específica (por exemplo, "1 do DBA, 1 da Segurança").

Uma solicitação é aprovada somente quando **ambas** as condições são atendidas:
- O número total de aprovações distintas atende a `numTotalRequired`
- Cada requisito de função é satisfeito individualmente

Se um usuário pertencer a várias funções, uma única aprovação desse usuário conta para todos os requisitos de função correspondentes. No entanto, ainda conta apenas como uma aprovação para a contagem total.

**Exemplo:** Uma conexão requer 3 aprovações totais, incluindo 1 de um DBA e 1 da Segurança. Um usuário que tem ambas as funções de DBA e Segurança aprova — isso satisfaz ambos os requisitos de função, mas conta apenas como 1 das 3 aprovações totais necessárias. Ainda são necessárias mais duas aprovações de quaisquer usuários.

Se sua licença enterprise expirar, os requisitos de revisão baseados em funções existentes permanecem em vigor, mas não podem mais ser modificados. Você só pode removê-los para voltar à configuração simples de total de revisões.

### Funções

O Kviklet vem com 3 funções: Padrão, Administradores e Desenvolvedores.

- A função padrão fornece acesso de leitura a todas as conexões e Solicitações. Esta função é atribuída a todos os usuários e não pode ser removida. No entanto, você pode alterar as permissões desta função como desejar.
- Os administradores têm permissão para criar e editar conexões, bem como adicionar novos Usuários e definir suas permissões.
- Os desenvolvedores podem criar Solicitações, bem como aprová-las e comentar sobre elas e, claro, executar as instruções reais.

Você pode personalizar as Funções e, por exemplo, dar a uma função acesso apenas a uma conexão específica ou a um grupo de conexões de banco de dados.
Isso é útil, por exemplo, se você tiver equipes diferentes com bancos de dados diferentes e quiser controlar o acesso a eles de forma mais granular.

#### Criando uma nova Função

Criar uma nova função funciona da seguinte forma. Vá para Configurações -> Funções -> Adicionar Função.

![Adicionar Função](https://assets.kitploit.com/production/public/readmes/7140/a91b79287c0b3130b83bdde1c059f49b89c5d43a1c0deae33b211ea427956f8e.png)
![Adicionar Função](https://assets.kitploit.com/production/public/readmes/7140/c535ac152759bb21bea04a0968ce43fa7bf946c7699feca23c71f9eaba41ceaf.png)

As configurações padrão não são tão relevantes para a maioria das funções e você pode simplesmente dar ao usuário acesso de Leitura e Visualização de Função e deixar assim.
Mais interessante é a adição de permissões individuais para Conexões. Aqui você primeiro adiciona um seletor para selecionar conexões específicas. Pode ser um id específico ou você pode usar curingas com `*` para corresponder a várias conexões. Por exemplo, se você quiser ter uma função que tenha acesso a todos os bancos de dados de desenvolvimento (caso você também gerencie o acesso a eles com o Kviklet), você usaria um seletor como `dev-*` e garantiria que os ids das conexões estejam definidos corretamente.

Você pode, é claro, criar também um sistema que use para suas diferentes equipes dentro da sua organização.

### Sincronização de Funções (Enterprise)

Sincronize automaticamente as funções dos usuários a partir dos grupos do seu provedor de identidade. Este recurso requer uma licença enterprise.

**Configuração** é feita em Configurações > Sincronização de Funções:

- **Ativar Sincronização de Funções**: Ativar/desativar a sincronização
- **Modo de Sincronização**:
  - **Sincronização Completa** - As funções do usuário correspondem exatamente aos mapeamentos de grupo do IdP (mais a função padrão)
  - **Aditiva** - Os grupos do IdP adicionam funções, mas não removem as existentes
  - **Apenas no Primeiro Login** - As funções são sincronizadas apenas no primeiro login, as alterações manuais são preservadas posteriormente
- **Atributo de Grupos**: O atributo do IdP que contém as associações de grupo (padrão: `groups`)
- **Mapeamentos de Funções**: Mapeie nomes de grupos do IdP (ex.: `engineering`) para funções do Kviklet

#### Configuração OIDC

Configure seu provedor OIDC para incluir uma declaração `groups` no token de ID:

- **Keycloak**:

  O Keycloak não inclui grupos em tokens por padrão, então você precisará adicionar um mapeador ao cliente.

  1. Navegue até **Clientes** no menu esquerdo
  2. Selecione seu cliente Kviklet
  3. Vá para a guia **Escopos do Cliente**
  4. Clique no escopo dedicado (ex.: `kviklet-dedicated`)
  5. Vá para a guia **Mapeadores**
  6. Clique em **Adicionar mapeador** → **Por configuração**
  7. Selecione **Associação de Grupo**
  8. Configure o mapeador:

  | Configuração | Valor |
  |---|---|
  | Nome | `groups` |
  | Nome da Declaração do Token | `groups` |
  | Caminho completo do grupo | **DESLIGADO** |
  | Adicionar ao token de ID | **LIGADO** |
  | Adicionar ao token de acesso | **LIGADO** |
  | Adicionar ao userinfo | **LIGADO** |

  9. Clique em **Salvar**

  > **Importante:** O "Nome da Declaração do Token" deve corresponder ao "Atributo de Grupos" configurado nas configurações de Sincronização de Funções do Kviklet (padrão: `groups`).

- **Outros provedores OIDC**: Adicione um mapeador/declaração de grupos que inclua as associações de grupo do usuário no token de ID. Isso geralmente é feito na interface de administração do provedor.

  Se você encontrar problemas, fique à vontade para criar um issue; ainda não testamos todos os provedores OIDC existentes (ainda) e pode haver pequenas diferenças na implementação que podem exigir atualizações no lado do Kviklet.

#### Configuração LDAP

A sincronização de funções LDAP usa o atributo `memberOf`:

1. Certifique-se de que seu servidor LDAP tenha a sobreposição `memberOf` ativada
2. Defina **Atributo de Grupos** como `memberOf` no Kviklet
3. Os nomes dos grupos são então extraídos do atributo `memberOf` nos atributos dos usuários.

#### Configuração SAML

Configure seu IdP SAML para incluir grupos na declaração:

1. Adicione uma declaração de atributo que mapeie as associações de grupo do usuário
2. Defina o **Atributo de Grupos** no Kviklet para corresponder ao nome do atributo SAML
3. Os nomes dos grupos são então extraídos do atributo SAML nos atributos dos usuários.

### Notificações

Você pode configurar o Kviklet para enviar notificações para um canal no Slack ou Teams. Isso é útil para notificar sua equipe sobre novas solicitações que precisam ser revisadas. Você pode configurar isso em Configurações -> Geral -> Configurações de Notificação.

#### Slack

Para configurar notificações do Slack, você precisa criar um Aplicativo Slack e habilitar webhooks para ele. Você pode seguir as instruções aqui: https://api.slack.com/messaging/webhooks

#### Teams

As notificações do Teams usam um webhook **Workflow** do Power Automate. O Kviklet envia um Adaptive Card, que o modelo do webhook publica no seu canal.

**Recomendado: use o modelo de workflow**

1. No Teams, abra o canal onde você deseja receber notificações, clique nos **...** ao lado do nome do canal e escolha **Workflows** (ou adicione o aplicativo **Workflows**).
2. Pesquise e crie o modelo **"Enviar alertas de webhook para um canal"**.
3. Faça login quando solicitado, selecione a Equipe e o Canal de destino e crie o workflow.
4. Abra a etapa de gatilho e copie a **URL HTTP POST** gerada.
5. Cole a URL no Kviklet em Configurações -> Geral -> Configurações de Notificação e clique em salvar.

**Alternativa: crie o workflow manualmente**

Se você preferir criar o fluxo manualmente (ou o modelo não estiver disponível):

1. Canal **...** -> **Workflows** -> crie um fluxo com o gatilho **"Quando uma solicitação de webhook do Teams for recebida"**.
2. Adicione a ação **Microsoft Teams -> "Postar cartão em um chat ou canal"**.
3. Defina o campo **Adaptive Card** da ação para a expressão `string(triggerBody())` para que ele poste o cartão que o Kviklet envia.
4. Selecione a Equipe e o Canal de destino, **Salve**, depois copie a **URL HTTP POST** da etapa de gatilho.

Atualmente existem notificações para:

- Novas Solicitações, que precisam de aprovações
- Novas aprovações em solicitações

#### Configuração de URL Base

Ao executar o Kviklet atrás de um proxy reverso ou Ingress do Kubernetes, os links de notificação podem usar o endereço IP interno em vez do seu domínio público. O Kviklet tenta rastrear a URL correta analisando as requisições recebidas, mas alguns proxies reversos não definem os cabeçalhos Forwarded corretamente. Para corrigir isso, defina a URL base explicitamente:```
KVIKLET_BASE_URL=https://kviklet.example.com

Isto garante que todos os links de notificação apontem para a URL pública correta.

Registro

Por padrão, o Kviklet escreve logs legíveis por humanos (pretty) para o stdout, o que é conveniente ao lê-los diretamente ou via docker logs.

Se você enviar logs para um sistema central (Elasticsearch, Loki, Datadog, CloudWatch, …) você pode alternar para logs JSON estruturados, que são mais fáceis de indexar e consultar. Defina o formato por meio de uma variável de ambiente:```

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

LOGGING_STRUCTURED_FORMAT_CONSOLE=ecs

## Criptografia

Se você não quiser que as credenciais sejam armazenadas em texto claro no banco de dados, é recomendável que você ative a criptografia do banco de dados no próprio banco de dados Postgres do Kviklet. Para a maioria dos provedores hospedados, isso é uma simples caixa de seleção para marcar.
No entanto, se o banco de dados do Kviklet for comprometido de alguma forma, isso representa um enorme risco de segurança. Pois ele contém as credenciais do banco de dados para potencialmente todos os seus armazenamentos de dados de produção. Então você pode ativar a criptografia das credenciais em repouso.

Para fazer isso, basta definir as duas variáveis de ambiente.```
ENCRYPTION_ENABLED=true
ENCRYPTION_KEY_CURRENT=some-secret

Kviklet criptografará todas as suas credenciais existentes na inicialização e usará o segredo para futuras conexões que você criar.

Rotação de Chave

Se você quiser rotacionar a chave, basta adicionar outra variável para a chave anterior e alterar a atual:``` ENCRYPTION_KEY_PREVIOUS=some-secret ENCRYPTION_KEY_CURRENT=another-secret

Kviklet irá reencriptar todas as conexões na inicialização, de modo que você possa então reiniciar o contêiner com a chave anterior removida.

## Chaves de API

O Kviklet suporta chaves de API para acesso programático ao sistema. Este é um recurso apenas para empresas e requer uma licença válida. Você pode criar chaves de API na seção Configurações -> Chaves de API.

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

Use da seguinte forma:```bash
curl --location '[kviklet_host]/api/connections/' \
--header 'Authorization: Bearer your-api-key'

As chaves de API herdam as permissões do usuário que as cria. Atualmente, apenas administradores podem gerenciar chaves de API e todas as ações realizadas com uma chave de API são atribuídas ao usuário que criou a chave.

Algumas documentações rudimentares da API podem ser encontradas em [kviklet_host]/api/swagger-ui/index.html. Mas lembre-se de que isso é um trabalho em andamento e a API pode mudar em versões futuras.

No final, a verdade está no código, então você sempre pode olhar para o controlador para ver como a API está definida. Se tiver alguma dúvida, sinta-se à vontade para abrir uma issue.

Recursos Experimentais

Atualmente, existem dois recursos experimentais. Eles foram construídos principalmente com base no feedback da comunidade. Sinta-se à vontade para testá-los e deixar qualquer contribuição que você possa ter. Esperamos desenvolver isso ainda mais no futuro e fazer com que funcione bem com o fluxo de aprovação principal.

Execução no Kubernetes

Se você deseja usar o recurso de execução no Kubernetes, precisa criar uma conexão separada com o Kubernetes. O Kviklet usará o usuário do pod implantado para executar o comando. Portanto, certifique-se de que o usuário tenha as permissões necessárias para executar comandos nos pods que você deseja acessar.

O Kviklet também usa /bin/sh para executar o comando, então você precisará garantir que seus pods tenham um shell ou pelo menos um symlink em /bin/sh. Se isso te incomodar, sinta-se à vontade para abrir uma issue; podemos potencialmente tornar isso configurável ou encontrar outra solução.

Os comandos do Kubernetes aguardam apenas 5 segundos para saída; se o comando demorar mais que isso, o Kviklet aguardará até uma hora antes de encerrar o comando. Esta é uma solução provisória; estamos analisando websockets para tornar isso mais responsivo e potencialmente permitir sessões de terminal.

Proxy, apenas Postgres

Se você criar solicitações de acesso temporário, você pode - em vez de usar a interface web - executar suas consultas através de um proxy gerenciado pelo Kviklet e usar o cliente de banco de dados de sua escolha. Para isso, o contêiner usa as portas 5438-6000, então você precisa expô-las. O usuário pode então criar uma solicitação de acesso temporário e clicar em "Iniciar Proxy" assim que for aprovada. Cada solicitação receberá uma porta, um usuário e uma senha temporária. Com isso, eles podem se conectar ao banco de dados. O Kviklet valida o usuário e a senha temporários e faz proxy de todas as solicitações para o usuário subjacente no banco de dados. Quaisquer instruções executadas são registradas no log de auditoria como se fossem executadas através da interface web. Observe que a análise de mensagens no lado do proxy não foi testada com todos os clientes, portanto, se você encontrar problemas, por exemplo, com instruções não sendo registradas, sinta-se à vontade para abrir uma issue.

Postgres Proxy Postgres Proxy

Proxy Postgres - TLS

O Kviklet encerra a conexão TLS com o banco de dados. Isso significa que, por padrão, qualquer tráfego de e para o proxy em si não é criptografado.
Se você deseja que o Kviklet re-criptografe o tráfego, pode fornecer ao Kviklet um certificado TLS e uma chave para o proxy definindo as seguintes variáveis de ambiente:``` PROXY_TLS_CERTIFICATE_SOURCE=env PROXY_TLS_CERTIFICATE_CERT=your-certificate PROXY_TLS_CERTIFICATE_KEY=your-key

alternativamente você pode usar arquivos:```
PROXY_TLS_CERTIFICATE_SOURCE=file
PROXY_TLS_CERTIFICATE_CERT_FILE=path/to/cert.pem
PROXY_TLS_CERTIFICATE_KEY_FILE=path/to/key.pem

De qualquer forma o certificado e a chave devem ser armazenados em pem format.

Perguntas? Contribuições?

Se você tiver alguma dúvida, quiser fornecer feedback ou precisar de ajuda com a configuração, junte-se à nossa comunidade no Discord. Você também pode criar uma issue no GitHub para relatar bugs e solicitar funcionalidades.

Se você quiser contribuir, sinta-se à vontade para fazer fork e criar PRs para pequenas coisas. Se você planeja funcionalidades maiores, agradeceria uma discussão prévia em uma issue do GitHub ou no Discord.

Você também pode entrar em contato comigo pelo e-mail [email protected].

Categorias