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

Kviklet(クイックレットと発音)は、本番データベースアクセスに四眼原則を適用し、個々のSQL文または時間制限付きデータベースセッションに対して、プルリクエストのようなレビューと承認のワークフローを提供します。エンジニアは、すべてのクエリをDBAや運用チーム経由にすることなく、互いのリクエストをレビューして承認できます。
Kvikletはセルフホスト型で、アプリケーション状態用のPostgreSQLデータベースを備えたDockerコンテナとして動作します。Webインターフェースからリクエストの送信、レビュー、実行が可能です。オプションのエンタープライズライセンスにより、SAML認証、ロールベースのレビュー要件、ロール同期、APIキーが利用可能になります。エンタープライズライセンスはkviklet.devでお申し込みください。
対応データベースはPostgres、MySQL、MariaDB、MS SQL Server、MongoDBです。
アクセスモデル
Kvikletを既存のIDプロバイダーに接続することを推奨します。KvikletはOIDC(Google、Keycloakなど)またはSAML(エンタープライズ限定)によるSSO、およびLDAP認証(Active Directoryなど)をサポートしています。
ユーザーは特定のデータベースユーザーにマッピングされた接続に対してリクエストを作成します。これらのリクエストは以下のいずれかです:
- 単一クエリ: レビューのために送信された特定のSQL文。
- 一時アクセス: 複数の文を実行できる時間制限付きセッション。
設定に応じて、Kvikletが実行を許可する前に、リクエストは他のユーザーによってレビューおよび承認されます。
Kvikletはユーザーに代わってデータベースに接続します。接続のデータベースパスワードがユーザーに表示されることはありません。
管理者は、どのロールがどの接続にアクセスできるか、および実行に必要なレビューゲートを設定できます。データベースレベルのアクセスは、基盤となるデータベースのRBACメカニズムを介して管理されます。例えば、読み取り専用接続用に読み取り専用ロールを作成し、書き込み接続よりも少ないレビュー要件を割り当てることが可能です。
Kvikletは実行された文を記録し、ユーザーとアクセスリクエストに関連付けます。手動によるデータベースアクセスを完全にカバーするには、直接接続を制限し、すべての手動アクセスをKviklet経由でルーティングしてください。エンジニアは基盤となるデータベース認証情報を受け取ったり共有したりする必要がありません。
追加のエンタープライズ機能には以下が含まれます:
- SAML: SAML認証のサポート。
- プロキシ(Postgres、MariaDB、MySQL):一時パスワードを使用した承認済みの一時アクセスセッションを通じて、お好みのデータベースクライアントを使用できます。実行された文はKvikletの監査ログに記録されます。
- ロールベースのレビューゲート: 実行前に特定のロールからの承認を要求します。
- ロール同期: IDプロバイダーのグループからユーザーロールを自動的に同期します。
- APIキー: Kviklet APIへのプログラムによるアクセス。
その他のスクリーンショット
リクエスト
すべてのデータリクエストが一箇所に集約されます。本番データベースのオープンPRのように:

ライブセッション
承認された一時アクセスリクエストは、ブラウザ上で直接ライブSQLセッションを開きます:

監査ログ
実行されたすべての文が記録されます — レビュー済みの単一クエリとして実行されたか、ライブセッション内で実行されたか、データベースプロキシ経由で実行されたかに関わらず:

データベース/接続タイプ別の機能
ほとんどの機能はすべてのデータベースで利用可能です(SSO、LDAP、RBAC、レビュー/承認フロー、監査ログなど)。ただし、一部の機能は制限されています。単にまだ実装されていないか、その特定の目的に対して意味をなさないかのいずれかです。以下の表は、どの機能がどのデータベースタイプで利用可能かを示しています:
| Database | Statement Review | Temporary Access | Proxy(Beta) | Explain Plan |
|---|---|---|---|---|
| Postgres | ✓ | ✓ | ✓ | ✓ |
| MySQL | ✓ | ✓ | ✓ | ✓ |
| MariaDB | ✓ | ✓ | ✓ | ✓ |
| SQL Server | ✓ | ✓ | ✗ | ✓ |
| MongoDB | ✓ | ✓ | ✗ | ✗ |
| Kubernetes | ✓ | ✗ | ✗ | ✗ |
セットアップ
KvikletはシンプルなDockerコンテナとして提供されます。
利用可能なバージョンはReleasesで確認できます。新機能を継続的に開発しているため、使用しているバージョンを定期的に更新することを推奨します。
現在の最新版はghcr.io/kviklet/kviklet:0.8.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 up -dでdocker-compose.ymlを実行します。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 はクエリ、接続、承認などに関するメタデータを保存するために、独自の postgres データベース(または少なくともスキーマ)を必要とします。
公式イメージはこちらにあります: 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 認証:
データベース接続に AWS IAM 認証を使用することが可能です。その場合はパスワードを省略し、ユーザー名のみを設定します。
また、以下の環境変数を設定する必要があります: ```
SPRING_DATASOURCE_IAMAUTH=true
Kvikletは通常の場所(環境変数、インスタンスロールなど)から認証情報を読み込み、接続用のトークンを生成します。
- 証明書: DB接続に証明書を使用することもできます。例についてはこちらを参照してください。
初期ユーザー
設定のために初期管理者ユーザーが必要です。そのためには、2つの環境変数INITIAL_USER_EMAILとINITIAL_USER_PASSWORDを設定して、Webインターフェースにログインできるようにします。パスワードは後でUIから変更できます。
例:```
INITIAL_USER_EMAIL=[email protected]
INITIAL_USER_PASSWORD=someverysecurepassword
私たちは現在、コンテナを GitHub packages に公開しているので、これらをすべて設定した上で `ghcr.io/kviklet/kviklet:main` を実行できます。Kviklet が起動するデフォルトポートである `8080` のマッピングを忘れないでください。