
kviklet v0.8.0
데이터베이스 쿼리에 대한 Pull Request 방식의 검토/승인 흐름. 규정을 준수하면서도 원활한 엔지니어의 프로덕션 접근을 위해.
Kviklet
Kviklet.dev | 릴리스 노트 | Discord
개발자 생산성을 저하시키지 않으면서 프로덕션 환경에 안전하게 접근하세요.

Kviklet(Quick-let으로 발음)은 프로덕션 데이터베이스 접근에 사안(四眼) 원칙을 적용하여, 개별 SQL 문 또는 시간 제한이 있는 데이터베이스 세션에 대해 풀 리퀘스트와 유사한 검토 및 승인 워크플로를 제공합니다. 엔지니어는 모든 쿼리를 DBA나 운영 팀을 거치지 않고도 서로의 요청을 검토하고 승인할 수 있습니다.
Kviklet은 자체 호스팅되며 애플리케이션 상태를 위한 PostgreSQL 데이터베이스와 함께 Docker 컨테이너로 실행됩니다. 웹 인터페이스를 통해 요청을 제출, 검토, 실행할 수 있습니다. 선택적 엔터프라이즈 라이선스는 SAML 인증, 역할 기반 검토 요구 사항, 역할 동기화, API 키를 활성화합니다. 엔터프라이즈 라이선스는 kviklet.dev에서 요청하세요.
지원되는 데이터베이스는 Postgres, MySQL, MariaDB, MS SQL Server, MongoDB입니다.
접근 모델
Kviklet을 기존 아이덴티티 공급자에 연결하는 것을 권장합니다. Kviklet은 OIDC(Google, Keycloak 등) 또는 SAML(엔터프라이즈 전용)을 통한 SSO와 LDAP 인증(Active Directory 등)을 지원합니다.
그런 다음 사용자는 특정 데이터베이스 사용자에 매핑되는 연결에 대한 요청을 생성합니다. 이러한 요청은 다음 중 하나입니다:
- 단일 쿼리: 검토를 위해 제출된 특정 SQL 문.
- 임시 접근: 여러 문을 실행할 수 있는 시간 제한 세션.
구성에 따라 Kviklet이 실행을 허용하기 전에 다른 사용자가 요청을 검토하고 승인합니다.
Kviklet은 사용자를 대신하여 데이터베이스에 연결합니다. 연결의 데이터베이스 비밀번호는 사용자에게 절대 표시되지 않습니다.
관리자는 어떤 역할이 어떤 연결에 접근할 수 있는지, 실행에 어떤 검토 게이트가 필요한지 구성할 수 있습니다. 데이터베이스 수준 접근은 기본 데이터베이스의 RBAC 메커니즘을 통해 관리됩니다. 예를 들어 읽기 전용 연결에 대해 읽기 전용 역할을 생성하고 쓰기 연결보다 더 적은 검토 요구 사항을 할당할 수 있습니다.
Kviklet은 실행된 문을 기록하고 이를 사용자 및 접근 요청과 연결합니다. 수동 데이터베이스 접근을 완전히 포괄하려면 직접 연결을 제한하고 모든 수동 접근을 Kviklet을 통해 라우팅하세요. 엔지니어는 기본 데이터베이스 자격 증명을 받거나 공유할 필요가 없습니다.
추가 엔터프라이즈 기능은 다음과 같습니다:
- SAML: SAML 인증 지원.
- 프록시 (Postgres, MariaDB, MySQL): 임시 비밀번호를 사용하여 승인된 임시 접근 세션을 통해 선호하는 데이터베이스 클라이언트를 사용하세요. 실행된 문은 Kviklet의 감사 로그에 기록됩니다.
- 역할 기반 검토 게이트: 실행 전에 특정 역할의 승인을 요구합니다.
- 역할 동기화: 아이덴티티 공급자 그룹에서 사용자 역할을 자동으로 동기화합니다.
- 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 컨테이너를 시작할 때 다음 세 가지 환경 변수를 그에 맞게 설정해야 합니다:```
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는 일반적인 위치(환경 변수, 인스턴스 역할 등)에서 자격 증명을 로드하고 연결을 위한 토큰을 생성합니다.
- 인증서: 데이터베이스 연결에 인증서를 사용할 수도 있습니다. 예시는 여기를 참조하세요.
초기 사용자
구성 목적으로 초기 관리자 사용자가 필요합니다. 이를 위해 2개의 환경 변수를 설정하세요:
INITIAL_USER_EMAIL 및 INITIAL_USER_PASSWORD를 설정하면 웹 인터페이스에 로그인할 수 있습니다. 이후 UI를 통해 비밀번호를 변경할 수 있습니다.
예시:```
INITIAL_USER_EMAIL=[email protected]
INITIAL_USER_PASSWORD=someverysecurepassword
현재로서는 컨테이너를 GitHub 패키지에 게시하고 있으므로, 이 모든 설정이 완료되면 `ghcr.io/kviklet/kviklet:main`을 실행할 수 있습니다. Kviklet이 기본적으로 사용하는 포트인 `8080`을 매핑하는 것을 잊지 마세요.