Назад к обновлениям
New releaseAug 19, 2026

kviklet v0.8.0

Процесс рецензирования/утверждения запросов к базе данных по аналогии с Pull Request. Для соответствующего требованиям, но при этом беспрепятственного доступа инженеров к продакшену.

Поделиться

Kviklet

Kviklet.dev | Release Notes | Discord

Безопасный доступ к производственным средам без ущерба для продуктивности разработчиков.

Kviklet Kviklet

Kviklet (произносится Quick-let) реализует Принцип четырёх глаз и высокую степень конфигурируемости, чтобы обеспечить процесс рецензирования и утверждения, аналогичный Pull Request, для отдельных SQL-запросов или сессий базы данных. Это позволяет командам разработки самостоятельно регулировать, кто и когда получает доступ к каким данным, что даёт организациям возможность оставаться безопасными и соответствовать требованиям, внедряя современные, расширяющие возможности и истинно «DevOps»-процессы.

Kviklet — это самоуправляемый Docker-контейнер, предоставляющий одностраничное веб-приложение. Войдите в систему, чтобы создавать SQL-запросы или утверждать запросы других. Опциональная корпоративная лицензия открывает доступ к расширенным функциям, таким как аутентификация SAML, требования к рецензированию на основе ролей, синхронизация ролей и API-ключи. Вы можете запросить корпоративную лицензию на kviklet.dev.

В настоящее время мы поддерживаем Postgres, MySQL, MS SQL Server и MongoDB.

Возможности

Kviklet поставляется с множеством функций, необходимых команде разработчиков для управления доступом к производственным базам данных простым, но безопасным способом:

  • SSO (OIDC, Google, Keycloak и т.д.): Вход в Kviklet без необходимости ввода имени пользователя или пароля. Больше никаких общих учётных данных для доступа к БД.
  • Поддержка LDAP: Вход в Kviklet с вашими LDAP-учётными данными.
  • Поддержка SAML: Вход в Kviklet с вашими SAML-учётными данными. (Только для Enterprise)
  • Процесс рецензирования/утверждения: Оставляйте комментарии и предложения к запросам данных других разработчиков.
  • Временный доступ (1 час): Выполняйте любые операторы в БД в течение 1 часа после утверждения.
  • Одиночный запрос: Выполнение одного оператора. Позволяет рецензенту проверить ваш запрос перед выполнением.
  • Журнал аудита: Единая плоскость, журналирующая все выполненные операторы с указанием автора, причины выполнения и т.д.
  • RBAC: Настройка того, какая команда имеет доступ к какой базе данных/таблице с точностью, которую допускает СУБД.
  • Прокси Postgres: Запуск прокси-сервера для использования клиента БД по вашему выбору, при этом всё будет сохранено в журнале аудита Kviklet.
  • Kubernetes Exec: Выполнение оператора в поде вашего Kubernetes-кластера. (В настоящее время поддерживается только выполнение одиночной команды, без живой сессии).
  • Шлюзы рецензирования на основе ролей: Требование утверждений от определённых ролей перед выполнением. (Только для Enterprise)
  • Синхронизация ролей: Автоматическая синхронизация ролей пользователей с группами вашего провайдера идентификации. (Только для Enterprise)
  • API-ключи: Программный доступ к API Kviklet. (Только для Enterprise)

Возможности по типу базы данных/подключения

Большинство функций доступны для всех баз данных (SSO, LDAP, RBAC, процесс рецензирования/утверждения, журнал аудита и т.д.). Но некоторые функции ограничены — либо потому, что они ещё не реализованы, либо не имеют смысла для данной цели. В таблице ниже показано, какие функции доступны для каждого типа базы данных:

База данныхРецензирование операторовВременный доступПрокси (бета)Explain Plan
Postgres
MySQL
MariaDB
SQL Server
MongoDB
Kubernetes

Настройка

Kviklet поставляется как простой Docker-контейнер. Доступные версии можно найти в разделе Releases. Мы рекомендуем регулярно обновлять используемую версию, так как мы продолжаем добавлять новые функции.
Последняя на данный момент — ghcr.io/kviklet/kviklet:0.7.0, также можно использовать :main, но время от времени мы можем случайно слить что-то с ошибками. Хотя мы стараемся этого избегать.

Быстрый старт

Если вы просто хотите попробовать, как это работает:

  1. Вот минимальный файл docker-compose.yaml:

    Нажмите, чтобы развернуть содержимое 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. Запустите docker-compose.yml с помощью docker-compose up -d. Kviklet запустится на порту 80, перейдите на localhost и поиграйтесь. Логин администратора: [email protected], пароль: admin.

  2. Файл docker-compose содержит дополнительную базу данных PostgreSQL, для которой вы можете настроить подключение в Kviklet. Чтобы эта база данных содержала некоторые данные, раскомментируйте эту строку: ``` - ./sample_data.sql:/docker-entrypoint-initdb.d/init.sql

И создайте файл sample_data.sql:

Нажмите, чтобы развернуть содержимое 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>

### Настройка БД

Kviklet требуется собственная база данных postgres (или хотя бы схема) для сохранения метаданных о запросах, подключениях, утверждениях и т.д.
Вы можете найти их официальный образ здесь: https://hub.docker.com/_/postgres, или использовать облачную версию от вашего облачного провайдера по выбору.

При запуске контейнера kviklet вам нужно будет установить эти три переменные окружения соответствующим образом:```
SPRING_DATASOURCE_PASSWORD = password
SPRING_DATASOURCE_USERNAME = username
SPRING_DATASOURCE_URL = jdbc:postgresql://[host]:[port]/[database]?currentSchema=[schema]

Альтернативные методы аутентификации

  • IAM Auth: Возможно использовать AWS IAM Auth для подключения к базе данных, в этом случае вы просто опускаете пароль и устанавливаете только имя пользователя. Также необходимо установить переменную окружения: ``` SPRING_DATASOURCE_IAMAUTH=true

Kviklet будет загружать учетные данные из обычных мест (переменные окружения, роли экземпляров и т.д.) и генерировать токен для подключения.

  • Сертификаты: Вы также можете использовать сертификаты для подключения к базе данных, см. здесь пример.

Начальный пользователь

Вам понадобится начальный администратор для настройки. Для этого установите 2 переменные окружения: INITIAL_USER_EMAIL и INITIAL_USER_PASSWORD, чтобы войти в веб-интерфейс. После этого вы сможете изменить пароль через UI.
Пример:``` INITIAL_USER_EMAIL=[email protected] INITIAL_USER_PASSWORD=someverysecurepassword

Мы публикуем наши контейнеры в GitHub packages на данный момент, поэтому, когда все это настроено, вы можете запустить `ghcr.io/kviklet/kviklet:main` не забудьте пробросить порт `8080`, который является портом по умолчанию, на котором работает Kviklet.

Пример docker run может выглядеть так:```
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 через OIDC / OAuth2

Google

Если вы хотите настроить SSO для вашего экземпляра Kviklet (что очень разумно, иначе вам придётся снова управлять паролями). Вам нужно настроить эти 3 переменные окружения:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=google

Идентификатор клиента Google и секрет можно легко получить, следуя инструкциям Google здесь:
https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid

Для действительных URI перенаправления вы должны настроить: https://[kviklet_host]/api/login/oauth2/code/google
Для разрешенных источников просто укажите URL вашего размещенного kviklet.

После установки этих переменных окружения каждый в вашей организации сможет войти, используя кнопку входа через Google. Но по умолчанию у них не будет никаких разрешений; вам нужно будет назначить им роль после того, как они войдут хотя бы один раз.

#### Keycloak

Если вы хотите вместо этого настроить SSO с Keycloak, вам нужно установить следующие 4 переменные окружения:```
KVIKLET_IDENTITYPROVIDER_CLIENTID
KVIKLET_IDENTITYPROVIDER_CLIENTSECRET
KVIKLET_IDENTITYPROVIDER_TYPE=keycloak
KVIKLET_IDENTITYPROVIDER_ISSUERURI=http://[host]:[port]/realms/[realm]

Идентификатор клиента и секрет вы получаете при создании приложения в Keycloak. Для корректных URI перенаправления настройте: https://[kviklet_host]/api/login/oauth2/code/keycloak В качестве разрешённых источников (Allowed Origins) просто укажите URL вашего размещённого Kviklet.

После установки этих переменных окружения на странице входа появится кнопка «Войти через Keycloak», которая перенаправит на ваш экземпляр Keycloak. В корпоративной версии вы можете включить синхронизацию ролей, чтобы автоматически синхронизировать роли из вашего экземпляра Keycloak в Kviklet. Подробнее см. в разделе Синхронизация ролей.

GitHub (Бета)

Бета: Аутентификация через GitHub является новой и пока не поддерживает синхронизацию ролей — каждый новый пользователь получает роль по умолчанию, и роли необходимо назначать вручную.

GitHub не соответствует OIDC (это чистый OAuth 2.0), поэтому в Kviklet для него реализована отдельная поддержка. Установите следующие переменные окружения:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=github KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS=your-org,another-org

Создайте приложение GitHub OAuth на https://github.com/settings/developers и настройте:

- URL обратного вызова авторизации: `https://[kviklet_host]/api/login/oauth2/code/github`
- URL домашней страницы: URL вашего размещенного Kviklet

`KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS` является **обязательным** (Kviklet отказывается запускаться без него). Приложения GitHub OAuth не могут ограничить, кто завершает поток OAuth, поэтому Kviklet вызывает `/user/orgs` после аутентификации и отклоняет пользователей, которые не являются членами хотя бы одной разрешенной организации (без учета регистра, проверяются первые 100 организаций).

Чтобы проверка организации видела членство пользователя, пользователь должен нажать **Grant** (или **Request**) рядом с каждой разрешенной организацией на экране согласия OAuth. Если в организации включена опция «Ограничить сторонние приложения OAuth», владелец организации также должен один раз одобрить приложение OAuth, прежде чем членство любого участника станет видимым.

Kviklet запрашивает области `read:user`, `user:email` и `read:org`. Адреса электронной почты всегда читаются из `/user/emails`, и принимается только запись `primary && verified`, поэтому пользователи с частными адресами электронной почты все равно успешно входят в систему.

#### Другие OIDC-провайдеры

Другие провайдеры, совместимые с OIDC (GitLab, Auth0, Okta и т.д.), должны работать аналогично Keycloak. Обратите внимание, что `redirect URI` изменится в зависимости от выбранного типа, поэтому если вы выберете `gitlab`, он будет `https://[kviklet_host]/api/login/oauth2/code/gitlab`.
Если у вас возникнут проблемы, не стесняйтесь создать issue, мы пока не пробовали каждого OIDC-провайдера и могут быть небольшие различия в реализации, которые могут потребовать обновлений со стороны Kviklet.

### LDAP

Kviklet поддерживает аутентификацию LDAP. Чтобы включить и настроить LDAP, вы можете переопределить следующие переменные окружения:```
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

Вот что означает каждый параметр:

  • LDAP_ENABLED: Установите true, чтобы включить аутентификацию через LDAP.
  • LDAP_URL: URL вашего LDAP-сервера.
  • LDAP_BASE: Базовый DN для поиска в LDAP.
  • LDAP_PRINCIPAL: DN администратора для привязки к LDAP-серверу.
  • LDAP_PASSWORD: Пароль администратора.
  • LDAP_UNIQUE_IDENTIFIER_ATTRIBUTE: Атрибут LDAP, используемый в качестве уникального идентификатора пользователя (по умолчанию: "uid").
  • LDAP_EMAIL_ATTRIBUTE: Атрибут LDAP, содержащий адрес электронной почты пользователя (по умолчанию: "mail").
  • LDAP_FULL_NAME_ATTRIBUTE: Атрибут LDAP, содержащий полное имя пользователя (по умолчанию: "cn").
  • LDAP_USER_OU: Организационная единица (OU), где хранятся учетные записи пользователей (по умолчанию: "people").
  • LDAP_SEARCH_BASE: Позволяет переопределить базовый DN для поиска пользователей (по умолчанию: "ou=people"). Если вы используете FreeIPA, возможно, потребуется установить его, например, на cn=users. Если установлен, LDAP_USER_OU игнорируется.

Вы можете настроить эти атрибуты в соответствии со своей схемой LDAP. После настройки LDAP пользователи смогут входить в систему, используя свои учетные данные LDAP. При первом входе пользователя LDAP в Kviklet будет создана соответствующая учетная запись с правами по умолчанию. Администратору необходимо будет назначить соответствующие роли этим пользователям после их первого входа.

SAML (только Enterprise)

Kviklet поддерживает аутентификацию SAML 2.0. Чтобы включить SAML, задайте следующие переменные окружения:``` 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-----

Детали конфигурации:

- `SAML_ENABLED`: Установите `true` для включения аутентификации SAML
- `SAML_ENTITYID`: Идентификатор вашего поставщика удостоверений SAML
- `SAML_SSOSERVICELOCATION`: URL службы единого входа вашего поставщика удостоверений
- `SAML_VERIFICATIONCERTIFICATE`: Сертификат X.509, используемый для проверки ответов SAML (включите строки BEGIN/END CERTIFICATE)

Вы можете дополнительно настроить сопоставления атрибутов SAML:```
SAML_USERATTRIBUTES_EMAILATTRIBUTE=email
SAML_USERATTRIBUTES_NAMEATTRIBUTE=name
SAML_USERATTRIBUTES_IDATTRIBUTE=nameID

Ваш поставщик удостоверений должен быть настроен с:

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

После настройки SAML пользователи могут входить через поставщика удостоверений. При первом входе создается учетная запись пользователя с правами по умолчанию.

Если вас правильно перенаправляет к IDP, но возникает ошибка CORS, вы можете добавить хост вашего IDP в разрешенные источники в Kviklet через:

export KVIKLET_ALLOWED_ORIGINS=http://localhost:3000``` CORS_ALLOWEDORIGINS=https://[idp_host]

## Конфигурация

### Подключения

После запуска Kviklet необходимо сначала настроить подключение к базе данных. Перейдите в Настройки -> Базы данных -> Добавить подключение.

![Добавить подключение](https://assets.kitploit.com/production/public/readmes/7140/3ded2a0b23e5d2f02feb21a854263c91dedea25a789fb75ab8342384c4e39b52.png)
![Добавить подключение](https://assets.kitploit.com/production/public/readmes/7140/585238c9eddad8ed4e2440096ce0616445a6696e1042f58676a1d0b038edde7f.png)

Здесь можно настроить требования к рецензированию и ограничения на выполнение для каждого подключения. Подробнее см. [Шлюзы рецензирования](#review-gates).

#### AWS IAM AUTH

Kviklet поддерживает использование IAM Auth для подключений к базам данных Postgres и MySQL. Для этого выберите IAM Auth при создании нового подключения.

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

Это уберет возможность установки пароля и вместо этого будет использовать учётные данные AWS для подключения к базе данных.

Kviklet использует `DefaultCredentialsProvider` от AWS для поиска учётных данных и генерации токена для подключения. Это означает, что все типичные места должны работать (переменные окружения или привязанные роли экземпляров). Точный порядок задокументирован здесь: https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html

Кроме того, вы можете указать ARN роли AWS, которую Kviklet примет, и использовать эти учётные данные для создания временного токена БД. Это особенно полезно для подключения к базам данных, находящимся не в том же аккаунте AWS, что и Kviklet. Чтобы использовать эту функцию, просто введите ARN роли в соответствующее поле при создании или редактировании подключения с IAM Auth. Если оставить поле пустым, будет использоваться поставщик учётных данных по умолчанию (без принятия роли).

Регион AWS, используемый при генерации токена, определяется из URL вашего подключения, поэтому опции для его установки нет.

Чтобы узнать, как настроить IAM Auth для вашей базы данных, следуйте официальной документации AWS: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
Основные моменты:

- Создайте пользователя БД с опцией IAM Auth и правильными разрешениями.
- Создайте политику IAM, которая позволяет субъекту AWS генерировать токены для этого пользователя.

### Шлюзы рецензирования

По умолчанию Kviklet позволяет простую настройку количества рецензий. Вы можете настроить, сколько одобрений должны получить запросы на конкретном подключении, прежде чем они смогут быть выполнены.

Статус одобрения запроса рассчитывается на основе последнего действия каждого рецензента. Если рецензент одобрил, а затем запросил изменения, учитывается только запрос изменений — его предыдущее одобрение отменяется. Редактирование запроса всегда сбрасывает все предыдущие одобрения, гарантируя, что никакие изменения не могут быть выполнены без предварительного рецензирования. Аналогично, если выполнение завершилось неудачей (например, из-за синтаксической ошибки SQL), одобрения сбрасываются, чтобы запрос можно было исправить и снова одобрить без создания нового.

Вы также можете настроить лимит **максимального количества выполнений** для каждого подключения, чтобы контролировать, сколько раз может быть выполнен один одобренный запрос. По умолчанию — 1. Установка значения 0 разрешает неограниченное количество выполнений. Неудачные выполнения не засчитываются в этот лимит.

#### Ролевые требования к рецензированию (Enterprise)

С лицензией Kviklet Enterprise вы можете настроить отдельные подключения так, чтобы для одобрения требовались пользователи с определёнными ролями. Это позволяет, например, требовать одобрения от команды, обслуживающей данную базу данных, или ограничить доступ к критически важным подключениям одобрением администраторов БД или руководства.

**Как это работает:**

Для каждого подключения задаётся **общее количество требуемых рецензий** (`numTotalRequired`), которое действует как нижняя граница — минимальное количество различных одобрений, необходимое независимо от ролей. Поверх этого можно добавить **ролевые требования**, которые указывают, сколько одобрений должно поступать от пользователей с определённой ролью (например, "1 от администратора БД, 1 от отдела безопасности").

Запрос считается одобренным только тогда, когда **оба** условия выполнены:
- Общее количество различных одобрений достигает `numTotalRequired`
- Каждое ролевое требование удовлетворено индивидуально

Если пользователь принадлежит к нескольким ролям, одно его одобрение засчитывается во все соответствующие ролевые требования. Однако оно по-прежнему считается только одним одобрением в общем количестве.

**Пример:** Подключение требует 3 общих одобрений, включая 1 от администратора БД и 1 от отдела безопасности. Пользователь, имеющий обе роли (администратор БД и безопасность), одобряет — это удовлетворяет обоим ролевым требованиям, но считается только как 1 из 3 необходимых общих одобрений. Требуется ещё два одобрения от любых пользователей.

Если срок действия вашей корпоративной лицензии истечёт, существующие ролевые требования к рецензированию останутся в силе, но их нельзя будет изменить. Вы можете только удалить их, чтобы вернуться к простой конфигурации общего количества рецензий.

### Роли

Kviklet поставляется с тремя ролями: Default, Admins и Developers.

- Роль Default предоставляет доступ на чтение ко всем подключениям и запросам. Эта роль назначается каждому пользователю и не может быть удалена. Однако вы можете изменять разрешения этой роли по своему усмотрению.
- Admins имеют разрешение на создание и редактирование подключений, а также на добавление новых пользователей и настройку их разрешений.
- Developers могут создавать запросы, а также одобрять их, комментировать и, конечно, выполнять сами операторы.

Вы можете настраивать роли и, например, дать роли доступ только к определённому подключению или группе подключений к БД.
Это полезно, например, если у вас разные команды с разными базами данных и вы хотите более детально контролировать доступ к ним.

#### Создание новой роли

Создание новой роли происходит следующим образом. Перейдите в Настройки -> Роли -> Добавить роль.

![Добавить роль](https://assets.kitploit.com/production/public/readmes/7140/a91b79287c0b3130b83bdde1c059f49b89c5d43a1c0deae33b211ea427956f8e.png)
![Добавить роль](https://assets.kitploit.com/production/public/readmes/7140/c535ac152759bb21bea04a0968ce43fa7bf946c7699feca23c71f9eaba41ceaf.png)

Настройки по умолчанию не очень важны для большинства ролей, вы можете просто дать пользователю доступ на чтение и просмотр ролей и оставить как есть.
Более интересным является добавление индивидуальных разрешений для подключений. Здесь вы сначала добавляете селектор для выбора конкретных подключений. Это может быть либо конкретный id, либо вы можете использовать подстановочные знаки с `*` для сопоставления нескольких подключений. Например, если вы хотите создать роль, имеющую доступ ко всем базам данных dev (если вы также управляете доступом к ним с помощью Kviklet), вы можете использовать селектор типа `dev-*` и убедиться, что id подключений установлены правильно.

Конечно, вы также можете придумать систему, которую используете для разных команд внутри вашей организации.

### Синхронизация ролей (Enterprise)

Автоматическая синхронизация ролей пользователей из групп вашего поставщика удостоверений. Эта функция требует корпоративной лицензии.

**Настройка** производится в меню Настройки > Синхронизация ролей:

- **Включить синхронизацию ролей**: Включить/выключить синхронизацию
- **Режим синхронизации**:
  - **Полная синхронизация** — Роли пользователей точно соответствуют сопоставлениям групп IdP (плюс роль по умолчанию)
  - **Аддитивная** — Группы IdP добавляют роли, но не удаляют существующие
  - **Только при первом входе** — Роли синхронизируются только при первом входе, ручные изменения сохраняются в дальнейшем
- **Атрибут групп**: Атрибут IdP, содержащий членство в группах (по умолчанию: `groups`)
- **Сопоставления ролей**: Сопоставьте имена групп IdP (например, `engineering`) с ролями Kviklet

#### Настройка OIDC

Настройте своего OIDC-провайдера на включение утверждения `groups` в ID-токен:

- **Keycloak**:

  Keycloak по умолчанию не включает группы в токены, поэтому вам нужно добавить маппер для клиента.

  1. Перейдите в **Clients** в левом меню
  2. Выберите ваш клиент Kviklet
  3. Перейдите на вкладку **Client scopes**
  4. Нажмите на выделенный scope (например, `kviklet-dedicated`)
  5. Перейдите на вкладку **Mappers**
  6. Нажмите **Add mapper** → **By configuration**
  7. Выберите **Group Membership**
  8. Настройте маппер:

  | Параметр | Значение |
  |----------|----------|
  | Name | `groups` |
  | Token Claim Name | `groups` |
  | Full group path | **ВЫКЛ** |
  | Add to ID token | **ВКЛ** |
  | Add to access token | **ВКЛ** |
  | Add to userinfo | **ВКЛ** |

  9. Нажмите **Save**

  > **Важно:** "Token Claim Name" должно совпадать с "Groups Attribute", настроенным в параметрах синхронизации ролей Kviklet (по умолчанию: `groups`).

- **Другие OIDC-провайдеры**: Добавьте маппер/утверждение групп, которое включает членство пользователя в группах в ID-токен. Обычно это делается в административном интерфейсе провайдера.

  Если у вас возникнут проблемы, смело создавайте issue. Мы пока не тестировали каждый OIDC-провайдер, и могут быть небольшие различия в реализации, которые потребуют обновлений со стороны Kviklet.

#### Настройка LDAP

Синхронизация ролей LDAP использует атрибут `memberOf`:

1. Убедитесь, что на вашем LDAP-сервере включено overlay `memberOf`
2. Установите **Groups Attribute** в `memberOf` в Kviklet
3. Имена групп извлекаются из атрибута `memberOf` в атрибутах пользователя.

#### Настройка SAML

Настройте вашего SAML-IdP на включение групп в утверждение:

1. Добавьте атрибутное утверждение, которое отображает членство пользователя в группах
2. Установите **Groups Attribute** в Kviklet так, чтобы оно соответствовало имени атрибута SAML
3. Имена групп извлекаются из атрибута SAML в атрибутах пользователя.

### Уведомления

Вы можете настроить Kviklet для отправки уведомлений в канал Slack или Teams. Это полезно для оповещения вашей команды о новых запросах, требующих рецензирования. Вы можете настроить это в Настройки -> Общие -> Настройки уведомлений.

#### Slack

Для настройки уведомлений Slack вам нужно создать приложение Slack и включить для него вебхуки. Следуйте инструкциям здесь: https://api.slack.com/messaging/webhooks

#### Teams

Уведомления Teams используют вебхук **Workflow** от Power Automate. Kviklet отправляет адаптивную карточку, которую шаблон вебхука публикует в вашем канале.

**Рекомендуется: использовать шаблон workflow**

1. В Teams откройте канал, в который хотите получать уведомления, нажмите **...** рядом с именем канала и выберите **Workflows** (или добавьте приложение **Workflows**).
2. Найдите и создайте шаблон **"Send webhook alerts to a channel"**.
3. При появлении запроса выполните вход, затем выберите целевую команду и канал и создайте workflow.
4. Откройте шаг триггера и скопируйте сгенерированный **HTTP POST URL**.
5. Вставьте URL в Kviklet в разделе Настройки -> Общие -> Настройки уведомлений и нажмите сохранить.

**Альтернатива: создать workflow вручную**

Если вы предпочитаете создать процесс самостоятельно (или шаблон недоступен):

1. В канале **...** -> **Workflows** -> создайте процесс с триггером **"When a Teams webhook request is received"**.
2. Добавьте действие **Microsoft Teams -> "Post card in a chat or channel"**.
3. В поле **Adaptive Card** действия установите выражение `string(triggerBody())`, чтобы оно публиковало карточку, отправленную Kviklet.
4. Выберите целевую команду и канал, нажмите **Save**, затем скопируйте **HTTP POST URL** из шага триггера.

В настоящее время доступны уведомления для:

- Новых запросов, требующих одобрения
- Новых одобрений на запросы

#### Настройка базового URL

При запуске Kviklet за обратным прокси или Kubernetes Ingress ссылки в уведомлениях могут содержать внутренний IP-адрес вместо вашего публичного домена. Kviklet пытается отследить правильный URL, анализируя входящие запросы, но некоторые обратные прокси не устанавливают корректные заголовки Forwarded. Чтобы исправить это, явно укажите базовый URL:```
KVIKLET_BASE_URL=https://kviklet.example.com

Это гарантирует, что все ссылки на уведомления указывают на правильный публичный URL.

Логирование

По умолчанию Kviklet записывает человекочитаемые (красивые) логи в stdout, что удобно при прямом чтении или через docker logs.

Если вы отправляете логи в центральную систему (Elasticsearch, Loki, Datadog, CloudWatch, …), вы можете переключиться на структурированные логи JSON, которые легче индексировать и запрашивать. Установите формат через переменную окружения:```

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

LOGGING_STRUCTURED_FORMAT_CONSOLE=ecs

## Шифрование

Если вы не хотите, чтобы учетные данные хранились в открытом виде в базе данных, рекомендуется включить шифрование базы данных на самой БД Kviklet Postgres. Для большинства хостинг-провайдеров это просто флажок для установки. Тем не менее, если база данных Kviklet будет каким-либо образом скомпрометирована, это представляет огромный риск для безопасности. Поскольку она содержит учетные данные базы данных для потенциально всех ваших рабочих хранилищ данных. Поэтому вы можете включить шифрование учетных данных в состоянии покоя.

Для этого просто установите две переменные окружения.```
ENCRYPTION_ENABLED=true
ENCRYPTION_KEY_CURRENT=some-secret

Kviklet зашифрует все ваши существующие учетные данные при запуске и будет использовать секрет для будущих подключений, которые вы создаете.

Ротация ключей

Если вы хотите выполнить ротацию ключа, вы можете просто добавить другую переменную для предыдущего ключа и изменить текущий:``` ENCRYPTION_KEY_PREVIOUS=some-secret ENCRYPTION_KEY_CURRENT=another-secret

Kviklet перешифрует все соединения при запуске, чтобы вы могли затем перезапустить контейнер после удаления предыдущего ключа.

## Ключи API

Kviklet поддерживает ключи API для программного доступа к системе. Это функция, доступная только в корпоративной версии, и требует действующей лицензии. Вы можете создавать ключи API в разделе Настройки -> Ключи API.

![Ключи API](https://assets.kitploit.com/production/public/readmes/7140/a11d80c93ef29ead3b8b3bf3b435a782208d10bd2978d80cd2c4edc1fc7bc506.png)
![Ключи API](https://assets.kitploit.com/production/public/readmes/7140/21948bc6a43dbdd88be563befbfc9052a1dd4a99735817c2ff99680c9c32cbd0.png)

Используйте это следующим образом:```bash
curl --location '[kviklet_host]/api/connections/' \
--header 'Authorization: Bearer your-api-key'

Ключи API наследуют разрешения пользователя, который их создаёт. В настоящее время только администраторы могут управлять ключами API, и все действия, выполняемые с помощью ключа API, приписываются пользователю, создавшему этот ключ.

Некоторую базовую документацию по API можно найти по адресу [kviklet_host]/api/swagger-ui/index.html. Однако имейте в виду, что это работа в процессе, и API может измениться в будущих версиях.

В конечном счёте истина в коде, поэтому вы всегда можете посмотреть на контроллер, чтобы узнать, как определён API. Если у вас есть вопросы, не стесняйтесь открывать issue.

Экспериментальные функции

В настоящее есть две экспериментальные функции. Они были созданы в основном на основе отзывов сообщества. Смело пробуйте их и оставляйте любые замечания, которые у вас могут возникнуть. Мы надеемся в будущем развить их дальше и сделать так, чтобы они хорошо работали с основным процессом утверждения.

Kubernetes Exec

Если вы хотите использовать функцию Kubernetes Exec, вам необходимо создать отдельное подключение к Kubernetes. Kviklet будет использовать пользователя развёрнутого пода для выполнения команды. Поэтому убедитесь, что у пользователя есть необходимые разрешения для выполнения команд на подах, к которым вы хотите получить доступ.

Kviklet также использует /bin/sh для выполнения команды, поэтому вам необходимо убедиться, что в ваших подах есть оболочка или хотя бы символическая ссылка на /bin/sh. Если это вас беспокоит, не стесняйтесь открыть issue; мы потенциально можем сделать это настраиваемым или найти другое решение.

Команды Kubernetes ожидают вывода только 5 секунд; если команда выполняется дольше, Kviklet будет ждать до часа, прежде чем завершить команду по тайм-ауту. Это временное решение; мы рассматриваем использование веб-сокетов, чтобы сделать процесс более отзывчивым и, возможно, включить терминальные сессии.

Прокси, только Postgres

Если вы создаёте запросы на временный доступ, вы можете – вместо использования веб-интерфейса – выполнять свои запросы через управляемый Kviklet прокси и использовать любой DB-клиент по вашему выбору. Для этого контейнер использует порты 5438–6000, поэтому вам нужно их открыть. Пользователь может затем создать запрос на временный доступ и нажать «Start Proxy» после его утверждения. Каждый запрос получит порт, пользователя и временный пароль. С их помощью можно подключиться к базе данных. Kviklet проверяет временного пользователя и пароль и проксирует все запросы к исходному пользователю в базе данных. Все выполненные операторы регистрируются в журнале аудита, как если бы они были запущены через веб-интерфейс. Обратите внимание, что разбор сообщений на стороне прокси не тестировался со всеми клиентами, поэтому, если у вас возникнут проблемы, например, с нерегистрируемыми операторами, не стесняйтесь открыть issue.

Postgres Proxy Postgres Proxy

Postgres Proxy – TLS

Kviklet завершает TLS-соединение с базой данных. Это означает, что по умолчанию любой трафик к самому прокси и от него не шифруется.
Если вы хотите, чтобы Kviklet повторно зашифровывал трафик, вы можете передать Kviklet TLS-сертификат и ключ для прокси, задав следующие переменные окружения:``` PROXY_TLS_CERTIFICATE_SOURCE=env PROXY_TLS_CERTIFICATE_CERT=your-certificate PROXY_TLS_CERTIFICATE_KEY=your-key

альтернативно вы можете использовать файлы:```
PROXY_TLS_CERTIFICATE_SOURCE=file
PROXY_TLS_CERTIFICATE_CERT_FILE=path/to/cert.pem
PROXY_TLS_CERTIFICATE_KEY_FILE=path/to/key.pem

В любом случае сертификат и ключ должны храниться в формате pem.

Вопросы? Вклад?

Если у вас есть вопросы, вы хотите оставить отзыв или нуждаетесь в помощи с настройкой, присоединяйтесь к нашему сообществу Discord. Вы также можете создать запрос на GitHub для сообщений об ошибках и запросов функций.

Если вы хотите внести свой вклад, не стесняйтесь форкать и создавать PR для небольших изменений. Если вы планируете более крупные функции, я буду признателен за предварительное обсуждение в виде issue на GitHub или в Discord.

Вы также можете связаться со мной по адресу [email protected].

Категории