
kviklet v0.8.0
データベースクエリに対するプルリクエスト形式のレビュー/承認フロー。コンプライアンスを確保しつつ、エンジニアがスムーズに本番環境へアクセスできるようにします。
Kviklet
Kviklet.dev | リリースノート | Discord
開発者の生産性を損なうことなく、本番環境への安全なアクセスを実現します。

Kviklet(発音: Quick-let)は四眼原則と高い設定自由度を採用し、個々のSQL文やデータベースセッションに対してプルリクエストのようなレビュー・承認フローを可能にします。これにより、エンジニアリングチームは誰がどのデータにいつアクセスできるかを自律的に管理でき、組織は最新でエンパワリングな真の「DevOps」ワークフローを導入しながら、セキュリティとコンプライアンスを維持できます。
KvikletはセルフホストのDockerコンテナであり、シングルページWebアプリを提供します。ログインしてSQLリクエストを作成したり、他のユーザーのリクエストを承認したりできます。オプションのエンタープライズライセンスにより、SAML認証、ロールベースのレビュー要件、ロール同期、APIキーなどの高度な機能が解放されます。エンタープライズライセンスはkviklet.devでリクエストできます。
現在対応しているのはPostgres、MySQL、MS SQL Server、MongoDBです。
機能
Kvikletには、エンジニアリングチームが本番データベースへのアクセスをシンプルかつ安全に管理するために必要なさまざまな機能が標準搭載されています。
- SSO(OIDC、Google、Keycloakなど): ユーザー名やパスワードを必要とせずにKvikletにログイン。DBアクセスのための共有認証情報が不要になります。
- LDAPサポート: LDAP認証情報を使用してKvikletにログイン。
- SAMLサポート: SAML認証情報を使用してKvikletにログイン。(エンタープライズのみ)
- レビュー/承認フロー: 他の開発者のデータリクエストにコメントや提案を残せます。
- 一時アクセス(1時間): 承認後、1時間だけDB上の任意のステートメントを実行可能。
- 単一クエリ: 単一のステートメントを実行。レビュアーは実行前にクエリを確認できます。
- 監査ログ: 実行されたすべてのステートメントを、作成者、実行理由などとともに一元管理。
- RBAC: チームごとにアクセス可能なデータベース/テーブルを、DBエンジンが許す限り細かい粒度で設定可能。
- Postgresプロキシ: プロキシサーバーを起動して任意のDBクライアントを使用可能。ただし、すべての操作はKviklet監査ログに記録されます。
- Kubernetes Exec: Kubernetesクラスター内のPodに対してステートメントを実行。(現時点では単一コマンドの実行のみ対応、ライブセッションは未対応)
- ロールベースのレビューゲート: 実行前に特定のロールからの承認を必須化。(エンタープライズのみ)
- ロール同期: IDプロバイダーのグループから自動的にユーザーロールを同期。(エンタープライズのみ)
- APIキー: Kviklet APIへのプログラムによるアクセス。(エンタープライズのみ)
データベース/接続タイプ別機能
ほとんどの機能(SSO、LDAP、RBAC、レビュー/承認フロー、監査ログなど)はすべてのデータベースで利用可能です。ただし、一部の機能は、単にまだ実装されていないか、特定の目的に適さないために制限されています。次の表は、どの機能がどのデータベースタイプで利用可能かを示しています。
| データベース | ステートメントレビュー | 一時アクセス | プロキシ(ベータ) | 実行計画 |
|---|---|---|---|---|
| Postgres | ✓ | ✓ | ✓ | ✓ |
| MySQL | ✓ | ✓ | ✗ | ✓ |
| MariaDB | ✓ | ✓ | ✗ | ✓ |
| SQL Server | ✓ | ✓ | ✗ | ✓ |
| MongoDB | ✓ | ✓ | ✗ | ✗ |
| Kubernetes | ✓ | ✗ | ✗ | ✗ |
セットアップ
KvikletはシンプルなDockerコンテナとして提供されます。
利用可能なバージョンはリリースで確認できます。新しい機能を継続的に追加しているため、使用中のバージョンを定期的に更新することをお勧めします。
最新版は現在 ghcr.io/kviklet/kviklet:0.7.0 です。:main を使用することもできますが、バグを含むコードを誤ってマージしてしまうことが時折あります。ただし、そのような事態は避けるよう努めています。
クイックスタート
動作を試してみたいだけの場合は、以下の手順に従ってください。
-
最小限の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.sqlkviklet-postgres: image: postgres:16 restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: kviklet ports: - "5433:5432" volumes: - ./kviklet-postgres-data:/var/lib/postgresql/data
kviklet: image: ghcr.io/kviklet/kviklet:main ports: - "80:8080" environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://kviklet-postgres:5432/kviklet - SPRING_DATASOURCE_USERNAME=postgres - SPRING_DATASOURCE_PASSWORD=postgres - INITIAL_USER_EMAIL=[email protected] - INITIAL_USER_PASSWORD=admin depends_on: - kviklet-postgres
-
docker-compose.ymlをdocker-compose up -dで実行します。Kviklet がポート 80 で起動するので、localhostにアクセスして試してみてください。管理者ログインは [email protected]、パスワードはadminです。 -
docker-compose には、Kviklet で接続を設定できる追加の postgres データベースが含まれています。このデータベースにデータを追加するには、次の行をコメント解除してください。 ``` - ./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>
### DBのセットアップ
Kvikletは、クエリ、接続、承認などに関するメタデータを保存するために、独自のPostgreSQLデータベース(または少なくともスキーマ)を必要とします。
公式イメージはこちらで入手できます:https://hub.docker.com/_/postgres、またはお好みのクラウドプロバイダーが提供するクラウドホスティング版をご利用ください。
kvikletコンテナを起動する際には、以下の3つの環境変数を適切に設定する必要があります。```
SPRING_DATASOURCE_PASSWORD = password
SPRING_DATASOURCE_USERNAME = username
SPRING_DATASOURCE_URL = jdbc:postgresql://[host]:[port]/[database]?currentSchema=[schema]
代替認証方法
- IAM Auth:
データベース接続にAWS IAM認証を使用することが可能です。その場合、パスワードを省略し、ユーザー名のみを設定します。
また、環境変数を設定する必要があります: ```
SPRING_DATASOURCE_IAMAUTH=true
Kvikletは、通常の場所(環境変数、インスタンスロールなど)から認証情報を読み込み、接続用のトークンを生成します。
- 証明書: DB接続に証明書を使用することもできます。例についてはこちらを参照してください。
初期ユーザー
設定目的のために初期管理者ユーザーが必要です。そのために、以下の2つの環境変数を設定してください:
INITIAL_USER_EMAIL and INITIAL_USER_PASSWORD これによりWebインターフェースにログインできます。パスワードは後で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
OIDC / OAuth2 を介した SSO
Kviklet インスタンスに SSO を設定したい場合(そうしないと再度パスワードを管理する必要があるため、非常に理にかなっています)。 以下の 3 つの環境変数を設定する必要があります:``` KVIKLET_IDENTITYPROVIDER_CLIENTID KVIKLET_IDENTITYPROVIDER_CLIENTSECRET KVIKLET_IDENTITYPROVIDER_TYPE=google
GoogleのクライアントIDとシークレットは、以下のGoogleの手順に従って簡単に取得できます:
https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid
有効なリダイレクトURIには、以下を設定する必要があります:https://[kviklet_host]/api/login/oauth2/code/google
許可されたオリジンには、あなたがホストしているkvikletのURLを設定します。
これらの環境変数を設定すると、組織内の全員が「Googleでサインイン」ボタンを使ってログインできるようになります。ただし、デフォルトでは権限が付与されていないため、ユーザーが一度ログインした後にロールを割り当てる必要があります。
#### Keycloak
代わりにKeycloakを使用してSSOを設定したい場合は、以下の4つの環境変数を設定する必要があります:```
KVIKLET_IDENTITYPROVIDER_CLIENTID
KVIKLET_IDENTITYPROVIDER_CLIENTSECRET
KVIKLET_IDENTITYPROVIDER_TYPE=keycloak
KVIKLET_IDENTITYPROVIDER_ISSUERURI=http://[host]:[port]/realms/[realm]
クライアントIDとシークレットは、Keycloakでアプリケーションを作成するときに取得します。 有効なリダイレクトURIには、次のように設定します:https://[kviklet_host]/api/login/oauth2/code/keycloak 許可されたオリジンには、単にホストしているkvikletのURLを設定します。
これらの環境変数を設定すると、ログインページに「Login with Keycloak」ボタンが表示され、Keycloakインスタンスにリダイレクトされます。エンタープライズエディションでは、ロール同期を有効にして、Keycloakインスタンスからkvikletにロールを自動的に同期できます。詳細はRole Syncのセクションを参照してください。
GitHub (Beta)
ベータ: 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
Create a GitHub OAuth App at https://github.com/settings/developers and configure:
- Authorization callback URL: `https://[kviklet_host]/api/login/oauth2/code/github`
- Homepage URL: your hosted Kviklet URL
`KVIKLET_IDENTITYPROVIDER_GITHUB_ALLOWEDORGS` は **必須** です(Kviklet はこれがないと起動しません)。GitHub OAuth Apps は OAuth フローを完了できるユーザーを制限できないため、Kviklet は認証後に `/user/orgs` を呼び出し、許可リストに登録された組織の少なくとも 1 つのメンバーではないユーザーを拒否します(大文字小文字を区別せず、最初の 100 組織がチェックされます)。
組織のチェックでユーザーのメンバーシップを確認するには、ユーザーは OAuth 同意画面で各許可リスト登録組織の横にある **Grant**(または **Request**)をクリックする必要があります。組織で「Restrict third-party OAuth applications」が有効になっている場合、組織の所有者は事前に OAuth アプリを 1 回承認する必要があり、その後でメンバーのメンバーシップが表示されるようになります。
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: LDAP認証を有効にするにはtrueに設定します。LDAP_URL: LDAPサーバーのURL。LDAP_BASE: LDAP検索のベースDN。LDAP_PRINCIPAL: LDAPサーバーにバインドするための管理ユーザーのDN。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(エンタープライズのみ)
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 IDプロバイダのエンティティID
- `SAML_SSOSERVICELOCATION`: IDプロバイダのSSOサービスURL
- `SAML_VERIFICATIONCERTIFICATE`: SAML応答の検証に使用するX.509証明書(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エラーが発生する場合は、Kvikletの許可されたオリジンにIDPのホストを追加できます:``` CORS_ALLOWEDORIGINS=https://[idp_host]
## 設定
### 接続
Kviklet を起動した後、まずデータベース接続を設定する必要があります。Settings → Databases → Add Connection に進んでください。


ここで各接続のレビュー要件と実行制限を設定できます。詳細は [Review Gates](#review-gates) を参照してください。
#### AWS IAM AUTH
Kviklet は Postgres および MySQL データベース接続に IAM Auth をサポートしています。新しい接続を作成する際は IAM Auth を選択してください。


これによりパスワード設定オプションが削除され、代わりに AWS 認証情報を使用してデータベースに接続します。
Kviklet は AWS の `DefaultCredentialsProvider` を使用して認証情報を取得し、接続用のトークンを生成します。つまり、通常の全ての場所(環境変数や関連付けられたインスタンスロール)が機能するはずです。正確な順序はこちら:https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html
さらに、Kviklet が引き受ける AWS ロール ARN を指定することもできます。これにより、その認証情報を使用して一時的な DB トークンを作成します。これは特に、Kviklet と同じ AWS アカウントにないデータベースに接続する場合に便利です。この機能を使用するには、IAM Auth 接続の作成または編集時に、指定されたフィールドにロール ARN を入力するだけです。フィールドを空のままにすると、デフォルトの認証情報プロバイダーが使用されます(ロール引き受けなし)。
トークン生成時に使用する AWS リージョンは、接続 URL から推測されるため、設定オプションはありません。
データベースの IAM Auth を設定する方法については、公式の AWS ドキュメントに従ってください:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
主な2つのポイントは次のとおりです:
- IAM 認証オプションと適切な権限を持つ DB ユーザーを作成する
- AWS エンティティがこのユーザーにトークンを生成できるようにする IAM ポリシーを作成する
### レビューゲート
デフォルトでは、Kviklet はシンプルなレビュー回数設定を許可しています。特定の接続に対して、承認リクエストが何件必要かを設定できます。
リクエストの承認ステータスは、各レビュアーの最新アクションに基づいて計算されます。レビュアーが承認した後、変更をリクエストした場合、変更リクエストのみがカウントされ、以前の承認は削除されます。リクエストを編集すると、常に以前のすべての承認がリセットされ、変更はレビューなしでは実行できなくなります。同様に、実行が失敗した場合(例:SQL 構文エラー)、承認がリセットされるため、新しいリクエストを作成しなくても修正して再承認できます。
また、接続ごとに **最大実行数** の制限を設定し、承認済みリクエストが何回実行できるかを制御できます。デフォルトは1です。0に設定すると無制限になります。失敗した実行はこの制限にカウントされません。
#### ロールベースのレビュー要件(エンタープライズ)
Kviklet エンタープライズライセンスを使用すると、特定のロールを持つユーザーからの承認を必要とするように個々の接続を設定できます。これにより、特定のデータベースを管理するチームの承認を必要としたり、重要な接続を DBA や管理承認の背後にゲートしたりすることができます。
**仕組み:**
各接続には **必要なレビュー総数**(`numTotalRequired`)があり、これは下限として機能します。つまり、ロールに関係なく必要な最小限の承認数です。これに加えて、特定のロールを持つユーザーからの承認数を指定する **ロール要件** を追加できます(例:「DBA から1件、セキュリティから1件」)。
リクエストが承認されるのは、**両方**の条件が満たされた場合のみです:
- 個別の承認の総数が `numTotalRequired` を満たしている
- 各ロール要件が個別に満たされている
ユーザーが複数のロールに属している場合、そのユーザーからの1回の承認は、一致するすべてのロール要件に対してカウントされます。ただし、総数に対しては1件の承認としてのみカウントされます。
**例:** 接続が合計3件の承認を必要とし、そのうち DBA から1件、セキュリティから1件が必要です。DBA とセキュリティの両方のロールを持つユーザーが承認した場合、これは両方のロール要件を満たしますが、必要な合計3件のうち1件としてのみカウントされます。さらに2件の承認(任意のユーザーから)が必要です。
エンタープライズライセンスが期限切れになった場合、既存のロールベースのレビュー要件は引き続き適用されますが、変更できなくなります。削除してシンプルなレビュー総数設定に戻すことのみ可能です。
### ロール
Kviklet にはデフォルト、管理者、開発者の3つのロールが用意されています。
- デフォルトロールは、すべての接続とリクエストへの読み取りアクセスを提供します。このロールは全ユーザーに割り当てられ、削除できません。ただし、権限は自由に変更できます。
- 管理者は、接続の作成と編集、ユーザーの追加と権限設定を行う権限を持ちます。
- 開発者は、リクエストの作成、承認、コメント、および実際のステートメントの実行を行うことができます。
ロールをカスタマイズして、特定の接続や DB 接続グループのみにアクセスを許可することもできます。これは、異なるデータベースを持つ異なるチームがいる場合に、アクセスをよりきめ細かく制御するのに便利です。
#### 新しいロールの作成
新しいロールの作成手順は次のとおりです。Settings → Roles → Add Role に進んでください。


デフォルト設定はほとんどのロールにとってあまり重要ではなく、ユーザーの Read と RoleView アクセスを許可してそのままにしておけば問題ありません。より重要なのは、接続に対する個別の権限を追加することです。ここでは、まずセレクターを追加して特定の接続を選択します。これは特定の ID にするか、ワイルドカード `*` を使用して複数の接続にマッチさせることができます。例えば、すべての開発データベース(もしそれらのアクセスも Kviklet で管理している場合)にアクセスできるロールが必要な場合、`dev-*` のようなセレクターを使用し、接続の ID が正しく設定されていることを確認してください。
もちろん、組織内の異なるチーム向けに独自のルールを作成することもできます。
### ロール同期(エンタープライズ)
アイデンティティプロバイダーのグループからユーザーロールを自動的に同期します。この機能にはエンタープライズライセンスが必要です。
**設定** は Settings > Role Sync で行います:
- **Enable Role Sync**: 同期のオン/オフを切り替えます
- **Sync Mode**:
- **Full Sync** - ユーザーロールは IdP グループマッピングに完全に一致します(デフォルトロールを除く)
- **Additive** - IdP グループはロールを追加しますが、既存のロールは削除しません
- **First Login Only** - ロールは初回ログイン時のみ同期され、その後手動での変更は保持されます
- **Groups Attribute**: グループメンバーシップを含む IdP 属性(デフォルト:`groups`)
- **Role Mappings**: IdP グループ名(例:`engineering`)を Kviklet ロールにマッピングします
#### OIDC 設定
OIDC プロバイダーを設定して、ID トークンに `groups` クレームを含めます:
- **Keycloak**:
Keycloak はデフォルトではグループをトークンに含めないため、クライアントにマッパーを追加する必要があります。
1. 左メニューの **Clients** に移動
2. Kviklet クライアントを選択
3. **Client scopes** タブに移動
4. 専用スコープ(例:`kviklet-dedicated`)をクリック
5. **Mappers** タブに移動
6. **Add mapper** → **By configuration** をクリック
7. **Group Membership** を選択
8. マッパーを設定:
| 設定 | 値 |
|---------|-------|
| Name | `groups` |
| Token Claim Name | `groups` |
| Full group path | **OFF** |
| Add to ID token | **ON** |
| Add to access token | **ON** |
| Add to userinfo | **ON** |
9. **Save** をクリック
> **重要:** 「Token Claim Name」は、Kviklet の Role Sync 設定で構成した「Groups Attribute」(デフォルト:`groups`)と一致する必要があります。
- **その他の OIDC プロバイダー**:ID トークンにユーザーのグループメンバーシップを含めるグループマッパー/クレームを追加します。これは通常、プロバイダーの管理 UI で行います。
問題が発生した場合は、遠慮なく issue を作成してください。まだすべての OIDC プロバイダーを試したわけではなく、実装に若干の違いがあり、Kviklet 側の更新が必要になる可能性があります。
#### LDAP 設定
LDAP ロール同期は `memberOf` 属性を使用します:
1. LDAP サーバーで `memberOf` オーバーレイが有効になっていることを確認します
2. Kviklet の **Groups Attribute** を `memberOf` に設定します
3. グループ名は、ユーザー属性の `memberOf` 属性から抽出されます
#### SAML 設定
SAML IdP を設定して、アサーションにグループを含めます:
1. ユーザーのグループメンバーシップをマッピングする属性ステートメントを追加します
2. Kviklet の **Groups Attribute** を SAML 属性名に一致するように設定します
3. グループ名は、ユーザー属性の SAML 属性から抽出されます
### 通知
Kviklet を設定して、Slack または Teams のチャンネルに通知を送信できます。これは、新しいリクエストがレビューを必要とする場合にチームに通知するのに便利です。設定は Settings → General → Notification Settings で行えます。
#### Slack
Slack 通知を設定するには、Slack アプリを作成し、Webhook を有効にする必要があります。手順はこちら:https://api.slack.com/messaging/webhooks
#### Teams
Teams 通知は Power Automate **ワークフロー** の Webhook を使用します。Kviklet は Adaptive Card を送信し、Webhook テンプレートがチャンネルに投稿します。
**推奨:ワークフローテンプレートの使用**
1. Teams で、通知を表示するチャンネルを開き、チャンネル名の横にある **...** をクリックし、**ワークフロー** を選択します(または **Workflows** アプリを追加します)。
2. **「Send webhook alerts to a channel」** テンプレートを検索して作成します。
3. プロンプトが表示されたらサインインし、対象のチームとチャンネルを選択してワークフローを作成します。
4. トリガーステップを開き、生成された **HTTP POST URL** をコピーします。
5. Kviklet の Settings → General → Notification Settings に URL を貼り付け、保存をクリックします。
**代替:ワークフローを手動で作成する**
自分でフローを構築したい場合(またはテンプレートが利用できない場合):
1. チャンネルの **...** → **ワークフロー** → トリガー **「When a Teams webhook request is received」** でフローを作成します。
2. アクション **Microsoft Teams → 「Post card in a chat or channel」** を追加します。
3. アクションの **Adaptive Card** フィールドを式 `string(triggerBody())` に設定し、Kviklet が送信したカードを投稿するようにします。
4. 対象のチームとチャンネルを選択し、**保存** をクリックしてから、トリガーステップから **HTTP POST URL** をコピーします。
現在、以下の通知があります:
- 承認が必要な新しいリクエスト
- リクエストへの新しい承認
#### Base URL 設定
Kviklet をリバースプロキシや Kubernetes Ingress の背後で実行する場合、通知リンクがパブリックドメインではなく内部 IP アドレスを使用する可能性があります。Kviklet は受信リクエストを調べて正しい URL を追跡しようとしますが、一部のリバースプロキシは Forwarded ヘッダーを正しく設定しません。これを修正するには、Base 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データベースが何らかの形で侵害された場合、これは大きなセキュリティリスクとなります。なぜなら、このデータベースには、潜在的にすべての本番データストアのデータベース認証情報が含まれているからです。そのため、保存時の認証情報の暗号化を有効にすることができます。
これを行うには、単に2つの環境変数を設定してください。```
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キー セクションで作成できます。


次のように使用します:```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を開いてください。
実験的機能
現在、2つの実験的機能があります。これらは主にコミュニティからのフィードバックに基づいて構築されました。ぜひ試してみて、ご意見をお聞かせください。今後さらに発展させ、コアの承認フローとうまく連携できるようにしたいと考えています。
Kubernetes Exec
Kubernetes Exec機能を使用する場合は、別のKubernetes接続を作成する必要があります。KvikletはデプロイされたPodのユーザーを使用してコマンドを実行します。したがって、そのユーザーがアクセスしたいPod上でコマンドを実行するために必要な権限を持っていることを確認してください。
Kvikletはコマンド実行に/bin/shを使用するため、Podにシェルがあるか、少なくとも/bin/shへのシンボリックリンクがあることを確認する必要があります。これが気になる場合は、お気軽にIssueを開いてください。設定可能にするか、別の解決策を見つけることができます。
Kubernetesコマンドは出力に5秒間だけ待機します。コマンドがそれ以上かかる場合、Kvikletはコマンドがタイムアウトするまで最大1時間待機します。これは暫定的な解決策であり、WebSocketを使用して応答性を高め、端末セッションを可能にすることを検討しています。
Proxy (Postgresのみ)
一時的なアクセスのリクエストを作成する場合、Webインターフェースを使用する代わりに、Kviklet管理のプロキシを介してクエリを実行し、お好みのDBクライアントを使用できます。 このため、コンテナはポート5438〜6000を使用するため、それらを公開する必要があります。 ユーザーは一時的なアクセスリクエストを作成し、承認されると「Start Proxy」をクリックします。各リクエストにはポート、ユーザー、および一時的なパスワードが割り当てられます。これにより、データベースに接続できます。Kvikletは一時ユーザーとパスワードを検証し、すべてのリクエストをデータベース上の基礎となるユーザーにプロキシします。実行されたステートメントは、Webインターフェースを介して実行されたかのように監査ログに記録されます。 プロキシ側のメッセージ解析はすべてのクライアントでテストされていないため、例えばステートメントが記録されないなどの問題が発生した場合は、お気軽にIssueを開いてください。

Postgres Proxy - TLS
KvikletはデータベースへのTLS接続を終端します。つまり、デフォルトではプロキシ自体への送受信トラフィックは暗号化されません。
Kvikletにトラフィックを再暗号化させたい場合は、以下の環境変数を設定して、プロキシ用のTLS証明書とキーをKvikletに提供できます。```
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 issue を作成することもできます。
貢献したい場合は、小さな変更であれば気軽にフォークしてPRを作成してください。大きな機能を計画している場合は、事前にGitHub issueまたはDiscordで議論していただけると助かります。
また、[email protected] までご連絡ください。