Query Rules
Overview
Query Rule은 QueryPie를 경유하는 SQL 쿼리에 대해 허용, 차단, 감사 제외 등의 필터링 규칙을 설정할 수 있는 기능입니다.
예를 들어, Connection Pool이 주기적으로 실행하는 heartbeat 쿼리를 Audit 로그에서 제외(SKIP)하거나, DROP TABLE과 같은 위험한 DDL 쿼리를 차단(DENY)하거나, SQL 파싱에 실패한 쿼리를 임시로 허용(ALLOW)하는 등 다양한 운영 시나리오에 활용할 수 있습니다.
여러 규칙이 등록된 경우 Priority(우선순위) 순서로 평가되며, 가장 먼저 매칭되는 규칙이 적용됩니다.
본 기능은 11.6.x 버전 이상에서 제공됩니다.
( 11.6.0 ~ 11.6.4까지 Beta, 11.6.5에서 정식 기능으로 제공)
MongoDB / DocumentDB는 Query Rule이 적용되지 않습니다.
Query Rule 생성하기
새로운 Query Rule을 생성합니다.

Admin > Databases > Policies > Query Rules메뉴로 이동합니다.- 우측 상단의
+ Add Query Rule버튼을 클릭합니다. - Query Rule 생성을 위한 정보를 입력합니다.
- Basic Settings
- Enabled : 규칙의 활성화 여부를 설정합니다. 토글을 통해 활성화/비활성화할 수 있습니다.
- Priority : 규칙 우선순위를 숫자로 지정합니다. 낮은 숫자가 높은 우선순위를 가집니다. 기본값은 100입니다.
- Target Settings
- Target Type : 규칙의 적용 대상 범위를 선택합니다.
- All : 전체 커넥션에 적용합니다.
- Connection : 특정 커넥션에만 적용합니다.
- Vendor : 특정 DB 종류(예: MySQL, PostgreSQL)에만 적용합니다.
- Input Mode : Target Type이 Connection 또는 Vendor인 경우, 대상 지정 방식을 선택합니다.
- Select : 목록에서 대상을 직접 선택합니다.
- RegExp Pattern : 정규표현식으로 대상을 지정합니다. Connection의 경우 Name 또는 UUID로 매칭됩니다.
- Target Value : 적용 대상을 지정합니다. 여러 개의 대상을 선택할 수 있습니다.
- Target Type : 규칙의 적용 대상 범위를 선택합니다.
- Pattern Settings
- Match Type : 쿼리 매칭 방식을 선택합니다.
- Exact : 쿼리 문자열이 정확히 일치할 때 매칭합니다 (대소문자 무시, 앞뒤 공백 제거).
- Regexp : 정규표현식 패턴으로 매칭합니다. 대소문자 무시(
(?i))와 DOTALL 모드((?s),.이 줄바꿈도 매칭)가 기본 적용됩니다. - Normalized : SQL을 정규화(주석 제거, 공백 정규화, 대소문자 무시)한 후 플레이스홀더로 매칭합니다.
?는 단일 값(숫자, 문자열, NULL, 함수 호출)을,?...는 1개 이상의 값(IN 절 등)을 매칭합니다.
- Pattern : 매칭할 SQL 패턴을 입력합니다.
- Test Pattern : 입력한 Pattern에 대해 SQL 매칭 여부를 테스트할 수 있습니다. SQL을 입력하고
Test버튼을 클릭합니다. - Origins : 규칙이 적용되는 쿼리 출처를 선택합니다. 기본값은 All입니다.
- All : 모든 출처의 쿼리에 적용합니다.
- Proxy : 프록시를 통한 쿼리에만 적용합니다.
- SQL Editor : SQL Editor에서 실행된 쿼리에만 적용합니다.
- Match Type : 쿼리 매칭 방식을 선택합니다.
- Action Settings
Skip Action은 Proxy 전용입니다. Skip 선택 시 Origin이 자동으로 Proxy로 설정되며, SQL Editor에서는 지원되지 않습니다. Audit에 기록되지 않으므로 민감한 쿼리에는 사용하지 마세요.- Action : 규칙에 매칭되는 쿼리에 적용할 동작을 선택합니다.
- Allow : 정책(Privilege, Data Masking 등)을 무시하고 쿼리를 실행합니다. Audit 로그에는 기록됩니다.
- Deny : 쿼리 실행을 거부합니다. Audit 로그에 Prevented 상태로 기록됩니다.
- Skip : Audit 기록 없이 쿼리를 실행합니다. 모든 정책이 스킵됩니다.
- Error Message : Action이 Deny인 경우, 사용자에게 표시할 오류 메시지를 입력합니다.
- Allow Reason : Action이 Allow인 경우, 허용 사유를 기록합니다. Audit 로그의 action_comment에 저장됩니다.
- Action : 규칙에 매칭되는 쿼리에 적용할 동작을 선택합니다.
- Additional Information
- Max SQL Length : 규칙이 적용되는 SQL의 최대 길이를 지정합니다. 기본값은 16,384자입니다. SQL 길이가 이 값을 초과하면 해당 규칙만 스킵하고 다음 규칙으로 진행합니다.
- Comment : 규칙에 대한 설명을 입력합니다.
- Basic Settings
Create버튼을 클릭하여 저장합니다.
규칙 변경은 이벤트 기반으로 대부분 즉시 적용됩니다. 다중 인스턴스 환경에서는 다른 인스턴스에 최대 10분까지 소요될 수 있습니다.
Query Rule 테스트하기
등록된 규칙이 특정 SQL에 올바르게 매칭되는지 미리 테스트할 수 있습니다.
Admin > Databases > Policies > Query Rules메뉴로 이동합니다.- 우측 상단의
Test버튼을 클릭합니다. - 테스트할 SQL을 입력하고, 필요에 따라 Origin과 Target Type을 선택합니다.
- Target Type이
Connection인 경우 Connection을,Vendor인 경우 Vendor를 선택합니다. Test with Cache또는Test without Cache버튼을 클릭하면 매칭된 규칙 목록과 최종 적용될 규칙이 표시됩니다.
규칙 변경 직후에는 Test without Cache 버튼을 사용하면 DB에서 최신 규칙을 직접 조회하여 확인할 수 있습니다.
Query Rule 조회하기
등록된 Query Rule 목록을 확인합니다.
Admin > Databases > Policies > Query Rules메뉴로 이동합니다.- 등록된 Query Rule 목록이 표시됩니다.
- ID : Query Rule의 고유 식별자입니다.
- Priority : 규칙 우선순위입니다.
- Enabled : 규칙의 활성화 여부입니다.
- Target Type : 적용 대상 범위입니다.
- Pattern : 매칭 패턴입니다.
- Action : 매칭 시 적용되는 동작입니다 (Allow / Deny / Skip).
- Comment : 규칙에 대한 설명입니다.
Query Rule 수정하기
기존 Query Rule의 설정을 변경합니다.
Admin > Databases > Policies > Query Rules메뉴로 이동합니다.- Query Rule 목록에서 수정할 항목을 클릭합니다.
- 상세 화면에서 변경할 정보를 수정합니다.
Save버튼을 클릭하여 저장합니다.
Query Rule 삭제하기
등록된 Query Rule을 삭제합니다.
Admin > Databases > Policies > Query Rules메뉴로 이동합니다.- Query Rule 목록에서 삭제할 항목의 체크박스를 선택합니다. 여러 개를 동시에 선택할 수 있습니다.
- 상단에 나타나는
Delete버튼을 클릭합니다. - 확인 팝업에서
OK를 클릭합니다.
사용 예시
예시 1: Heartbeat 쿼리 Audit 제외 (SKIP)
Connection Pool이 주기적으로 실행하는 SELECT 1 쿼리가 Audit 로그에 불필요하게 쌓이는 경우 제외할 수 있습니다.
| 설정 항목 | 값 |
|---|---|
| Priority | 10 |
| Target Type | All |
| Match Type | Exact |
| Pattern | SELECT 1 |
| Origins | Proxy |
| Action | Skip |
Skip Action은 Proxy 전용입니다.
SQL Editor에서 실행된 SELECT 1에는 이 규칙이 적용되지 않습니다.
예시 2: 위험한 DDL 쿼리 차단 (DENY)
DROP DATABASE, DROP TABLE 등 데이터 손실을 유발할 수 있는 쿼리를 전체 차단합니다.
| 설정항목 | 값 |
|---|---|
| Priority | 20 |
| Target Type | All |
| Match Type | RegExp |
| Pattern | `DROP\s+(DATABASE |
| Origins | All |
| Action | Deny |
| Erro Message | 보안 정책에 의해 차단된 쿼리입니다. 관리자에게 문의하세요. |
Regexp 매칭은 대소문자 무시가 기본 적용되므로 drop database 등 소문자로 입력된 쿼리도 차단됩니다.
예시 3: SQL 파싱 실패 쿼리 임시 허용 (ALLOW)
특정 쿼리가 SQL 파싱 실패로 차단될 때 임시로 허용 처리합니다. Audit 로그는 정상 기록됩니다.
| 설정 항목 | 값 |
|---|---|
| Priority | 30 |
| Target Type | Connection |
| Input Mode | Select |
| Target Value | (허용할 특정 Connection 선택) |
| Match Type | Normalized |
| Pattern | SELECT * FROM users WHERE id = ? |
| Origins | All |
| Action | Allow |
| Allow Reason | 파싱 실패 임시 허용 - QPD-1234 |
예시 4: 특정 DB Vendor에 대한 설정 쿼리 제외 (SKIP)
MySQL Connection Pool이 자동으로 실행하는 인코딩 설정 쿼리를 Audit에서 제외합니다.
| 설정 항목 | 값 |
|---|---|
| Priority | 10 |
| Target Type | Vendor |
| Input Mode | Select |
| Target Value | MySQL |
| Match Type | Exact |
| Pattern | SET NAMES utf8mb4 |
| Origins | Proxy |
| Action | Skip |
예시 5: Priority 활용 - 예외 허용 후 전체 차단
특정 Connection은 허용하고 나머지는 전체 차단하는 경우, Priority를 활용합니다.
규칙 1 - 예외 허용 (Priority: 10)
| 설정 항목 | 값 |
|---|---|
| Priority | 10 |
| Target Type | Connection |
| Target Value | dev-db-001 |
| Match Type | Regexp |
| Pattern | DROP\s+TABLE |
| Action | Allow |
규칙 2 - 전체 차단 (Priority: 20)
| 설정 항목 | 값 |
|---|---|
| Priority | 20 |
| Target Type | All |
| Match Type | Regexp |
| Pattern | DROP\s+TABLE |
| Action | Deny |
Priority가 낮은 규칙 1이 먼저 평가되어 dev-db-001에서의 DROP TABLE은 허용되고, 그 외 Connection에서는 규칙 2에 의해 차단됩니다.