본문으로 건너뛰기
이 페이지는 기계 번역이며 충분한 검토를 거치지 않았습니다. 영어 원문이 기준입니다. 보안, 개인정보 보호, 데이터 처리, 규정 준수 및 라이선스에 관한 설명은 기술 검토가 끝날 때까지 영어로 유지됩니다. 영어 원문 보기

데이터베이스 관리자(DBA)를 위한 설정

적용 지점: SDK 또는 Gateway 지원 모드: Hosted Hybrid Local 플랜: Free Solo Teams

대상 독자​

데이터베이스를 책임지는 분입니다. AI 에이전트가 데이터베이스 도구를 갖게 되면, 필요한 것을 읽을 수는 있되 그 이상은 할 수 없도록 만드는 것이 여러분의 일입니다. 눈에 띄지 않는 UPDATE도, DROP도, 권한 변경도 없어야 합니다.

일반적으로 통제하려는 대상​

  • 읽기는 허용. SELECT, EXPLAIN, SHOW, DESCRIBE, CTE.
  • 쓰기는 불가(또는 승인이 있을 때만). INSERT / UPDATE / DELETE / MERGE.
  • 스키마와 권한 부여는 절대 불가. DROP, ALTER, GRANT, TRUNCATE.

Control Zero는 SQL 방언과 관계없이 쿼리를 database:read, database:write, database:admin 중 하나의 표준 의미 클래스로 분류하므로, 규칙 하나로 모든 표기 방식을 처리할 수 있습니다. SELECT 1; DROP TABLE x처럼 여러 문장을 끼워 넣는 방식은 database:admin으로 분류되므로, 배포된 모든 버전에서 admin 거부 규칙이 이를 잡아냅니다. 허용 전용 형태(명시적인 거부 규칙 없음)에는 controlzero 1.13.13+가 필요합니다. 이전 버전에서는 인수에서 도출한 클래스를 확인하기 전에 호출자가 제공한 method가 허용 규칙을 충족시킬 수 있었습니다.

설치할 적용 지점​

에이전트가 직접 제어하는 코드라면 SDK를 사용하고 각 쿼리 전에 guard()를 호출하세요. 에이전트가 수정할 수 없는 API를 통해 데이터베이스와 통신한다면 그 앞에 Gateway를 두세요.

pip install controlzero

시작용 정책​

읽기 전용 데이터베이스 접근입니다. 읽기는 통과하고 나머지는 모두 거부됩니다. 이 내용을 controlzero.yaml에 넣으세요.

version: '1'
settings:
default_action: deny
default_on_missing: deny
default_on_tamper: quarantine
rules:
- id: allow-db-read
allow: 'database:read'
reason: 'SELECT / EXPLAIN / SHOW / DESCRIBE / CTE are permitted via the canonical read class.'
- id: deny-db-write
deny: 'database:write'
reason: 'No data modification: INSERT / UPDATE / DELETE / MERGE blocked.'
- id: deny-db-admin
deny: 'database:admin'
reason: 'No schema or permission changes: DROP / ALTER / GRANT / TRUNCATE blocked.'

SDK는 전달한 SQL에서 클래스를 도출하므로 규칙은 한 번만 작성하면 됩니다.

from controlzero import Client

cz = Client(policy_file="./controlzero.yaml")

read = cz.guard("database", method="SELECT", args={"sql": "SELECT id FROM orders"})
print(read.decision) # "allow"

drop = cz.guard("database", method="DROP", args={"sql": "DROP TABLE orders"})
print(drop.decision) # "deny"

cz.close()

사람이 승인한 뒤에만 쓰기를 허용하려면 첫 승인 흐름을 참고하세요. 승인 기능은 BETA이며 기본적으로 꺼져 있습니다. 요청 경로는 Hosted(SaaS) 플랜을 포함한 모든 배포 환경에서 동작하지만, 승인자용 수신함은 아직 사용할 수 없습니다. 처리되지 않은 쓰기 요청은 기한이 끝날 때까지 대기하다가 거부 상태로 남으므로, 쓰기는 일어나지 않습니다.

확인할 수 있는 내용​

  • 각 쿼리의 결정이 감사 로그에 database:read / write / admin으로 분류되어, 일치한 규칙, 사유, 이벤트별 적용 범위와 함께 기록됩니다.
  • 거부된 쓰기나 drop은 decision: deny와 이를 막은 규칙을 표시하므로, 우연히 아무것도 찾지 못한 결과가 아니라 쿼리가 실행되지 않았다는 기록을 남길 수 있습니다.

다음 단계​