다양한 벤더의 SQL 파싱하는 핵심 기술, QSI(Query Structural Interface)
November 22, 2024
서문
CCPA, GDPR, ISO 27001과 같은 글로벌 컴플라이언스를 준수해야 하는 기업이 전세계적으로 빠르게 증가하고 있습니다. 이러한 비즈니스 환경의 변화로 일관된 데이터 관리와 보안이 기업활동의 필수요소로 부상하고 있는 추세입니다. 실제, 데이터베이스 시스템은 다양한 플랫폼과 쿼리 언어를 통한 접근이 일반적이지만, 데이터베이스마다 문법과 동작이 다르기 때문에 일관된 접근 제어와 모니터링이 여간 까다롭지 문제입니다. 이에, 오늘은 여러 데이터베이스의 쿼리를 하나의 추상 구문으로 통합하고 실시간 분석을 통해 데이터베이스 쿼리 보안의 기반을 제공하는 솔루션을 소개해 보겠습니다.
Step.1 문제의 발견: 다양한 데이터베이스의 문법 차이는 관리 복잡성을 야기한다!
대규모 기업 및 데이터 중심 조직은 MySQL, SQL Server, PostgreSQL, Oracle과 같은 전통적인 SQL 데이터베이스뿐만 아니라 MongoDB 와 같은 NoSQL 데이터베이스도 동시에 사용합니다. 데이터베이스마다 쿼리 문법과 동작이 다르기 때문에 동일한 보안 정책을 일관되게 적용하기가 쉽지 않습니다. 특히 데이터베이스의 확장되고 복잡해짐에 따라 쿼리의 통제와 보안 관리의 난위도는 높아지게 되어 결국, 잠재적인 보안 위협으로 이어질 수 있습니다. 이러한 복잡성은 GDPR이나 CCPA와 같은 개인정보 보호 규제의 요구 사항을 충족하는 데에도 걸림돌이 됩니다.
다음은 데이터베이스별로 행 수를 제한하는 쿼리의 예시입니다:
MySQL
SELECT * FROM {table} LIMIT 10
SQL Server
SELECT TOP 10 * FROM {table}
Oracle
SELECT * FROM {table} FETCH FIRST 10 ROWS ONLY
MongoDB
db.getCollection('{table}').limit(10);
그래서, 데이터베이스 쿼리 제어가 중요하다.
오늘날 데이터 유출 사고의 절반 이상은 내부자나 부적절한 접근 통제에서 기인합니다. 예를 들어, 일부 비인가 사용자가 고도의 권한이 필요한 데이터를 조회하는 경우, 기존의 접근 제어 체계로는 이들을 효과적으로 차단하기 어렵습니다. 쿼리 접근을 제대로 관리하지 않으면 데이터 유출이나 악의적인 사용이 발생할 가능성이 높아집니다. 무엇보다 데이터를 직접 다루는 직원이나 분석가가 민감한 데이터를 포함한 대규모 쿼리를 실행할 경우 그 결과는 예측하기 어렵고, 이는 회사의 주요 자산인 데이터를 높은 손실 위험에 고스란히 노출하는 격이 됩니다.
Step 2. 목표의 설정: 글로벌 컴플라이언스 요구사항을 충족하는 솔루션을 찾아라!
이러한 문제를 해결하기 위해서는 다양한 데이터베이스에 대해 일관된 보안 정책을 적용할 수 있는 기술이 필요합니다. 이는 ISO 27001의 정보 보안 관리 시스템 구현과 GDPR, CCPA에서 요구하는 데이터 보호 및 개인정보 관리의 기반이 됩니다. QueryPie는 이러한 글로벌 컴플라이언스 요구 사항을 충족하기 위한 기반 기술을 고민했습니다.
일관된 보안 정책 적용을 위한 QueryPie 솔루션의 3가지 핵심 접근 방식
다양한 데이터베이스에 일관된 보안 정책을 적용하기 위한 세 가지 핵심 접근 방식을 제안합니다.
- 다양한 데이터베이스 쿼리의 AST 통합: MySQL, SQL Server, Oracle, MongoDB 등 다양한 데이터베이스의 쿼리 문법을 **하나의 추상 구문 트리(Abstract Syntax Tree, AST)**로 통합합니다. 이를 통해 각기 다른 데이터베이스의 쿼리를 일관되게 처리하고 분석할 수 있습니다.
- 실시간 쿼리 분석 및 결과 예측: 실시간으로 AST를 분석하면서 데이터베이스의 스키마 정보를 조회하여 쿼리의 실행 결과를 예측합니다. 이를 통해 사용자나 애플리케이션이 수행하는 쿼리의 영향 범위를 사전에 파악할 수 있습니다.
- 객체 간 관계의 세밀한 분석: 쿼리에 포함된 테이블, 컬럼 등 데이터베이스 객체 간의 관계를 상세히 분석합니다. 이를 통해 데이터 흐름을 추적하고, 민감한 데이터에 대한 접근을 효과적으로 탐지하여 내부자 위협을 방지합니다.
기술적 설명
실행 단계
실행 단계는 다음과 같이 네 가지로 구분됩니다: INPUT
, RAW AST
, QSI AST
, Analysis Result
- 먼저, INPUT 단계에서 쿼리를 받아 RAW AST로 파싱하여 구문 구조를 파악합니다.
- 이어서 QSI AST 단계에서 구문 트리를 의미적 트리로 변환하여, 각 쿼리 요소 간의 논리적 관계를 정의합니다.
- 마지막으로, Analysis Result 단계에서 분석된 정보를 기반으로 최종 결과를 생성하고, 쿼리 결과가 어떻게 구성될지에 대한 모델을 제공합니다.
INPUT
데이터베이스 쿼리가 원문 그대로 입력됩니다.
SELECT * FROM sakila.actor
RAW AST
RAW AST 는 입력된 데이터베이스 쿼리를 파싱하는 원시 파서가 출력하는 결과를 의미합니다.
원시 파서는 ANTLR, YACC, JavaCC 등과 같은 잘 알려진 파서 생성기를 사용하여 구현되며, 이로 인해 데이터베이스마다 구문 구조를 분석한 AST 결과가 상이할 수 있습니다.
동일한 파서 생성기를 사용하더라도 문법이 다르면 MySQL의 SELECT 1
쿼리와 Oracle의 SELECT 1 FROM DUAL
쿼리가 의미적으로 같음을 알 수 없습니다.
데이터베이스별 SELECT * FROM actor
예시입니다.
MySQL (ANTLR4)
Oracle (ANTLR4)
PostgreSQL (YACC)
QSI AST
QSI AST는 데이터베이스 쿼리의 의미적 구조를 표현하는데, 주로 파생(Derivation), 조인(JOIN), 원본(Source)을 통해 데이터의 가공 과정을 나타내고, 다양한 데이터 처리 연산을 구조화합니다.
데이터 참조
실제 데이터가 저장된 테이블이나 원본 데이터의 참조를 나타냅니다.
예를 들어, actor
라는 식별자는 데이터베이스에 저장된 특정 테이블을 참조하여 데이터를 가져오는 연산을 수행합니다.
파생 테이블
특정 테이블에서 파생된 새로운 데이터를 나타냅니다.
예를 들어, SELECT name AS n FROM actor
, 쿼리에서는 actor
테이블의 name
컬럼에 n
이라는 별칭을 부여하여, 이를 새로운 형태로 제공합니다.
조인 테이블
여러 테이블을 결합하여 연관된 데이터를 하나의 결과로 제공하는 구조입니다.
예를 들어, SELECT * FROM address JOIN city USING (city_id)
는 address
와 city
테이블을 city_id
를 기준으로 결합하여, 두 테이블에서 연관된 모든 데이터를 조회합니다.
복합 테이블 결합
이 노드는 여러 결과 집합을 결합하는 연산을 지원합니다.
예를 들어, SELECT 1 UNION ALL SELECT 2
와 같은 쿼리에서는 두 개의 SELECT
결과를 하나의 테이블로 결합하여 반환합니다.
인라인 파생 테이블
특정 값을 테이블 형식으로 직접 제공하는 방식입니다.
예를 들어, VALUES (1,2), (3,4)
는 두 개의 행과 두 개의 열을 가진 작은 테이블을 생성하여 즉시 사용할 수 있습니다.
테이블 함수 호출
특정 함수를 호출하여 테이블 형식의 데이터를 반환하는 구조입니다.
예를 들어, SELECT * FROM table_function()
는 table_function()
이라는 함수가 반환하는 테이블 형식의 데이터를 조회합니다.
Analysis Result
최종 분석 결과로, 입력 쿼리에 따라 반환될 구조화된 데이터 모델을 제공합니다.
SELECT 쿼리와 같이 테이블 형식으로 출력되는 쿼리의 분석 결과는 다음 항목으로 구성됩니다.
- 최종 컬럼 목록
- SELECT 절에 작성되어 테이블의 최종 컬럼 결과를 의미합니다.
- 참조 컬럼 목록
- 서브쿼리 컬럼 목록, 함수에 사용된 컬럼 등 데이터 출처의 모든 컬럼을 의미합니다.
- 참조 테이블 목록
- 데이터가 저장된 원본 테이블, 별칭으로 지정된 테이블, CTE 등 결과가 테이블 형태인것을 의미합니다.
- 간접 컬럼 목록
- 컬럼 결과에 영향을 주지 않는 WHERE, HAVING 등에 사용된 컬럼을 의미합니다.
예시 입력 쿼리
SELECT a.address || ', ' || c.city AS addr,
a.phone AS phone
FROM address AS a, city AS c
WHERE a.city_id = c.city_id
분석 결과
View
쿼리에 작성된 테이블이 View와 같이 데이터를 참조하는 경우 View 정의를 조회하고 분석하여 데이터가 저장된 원본 테이블을 끝까지 추적합니다.
View 정의
CREATE VIEW sakila.actor_view (
id,
full_name,
update_at
) AS
SELECT actor_id,
first_name || last_name,
last_update
FROM actor
입력 쿼리
SELECT * FROM actor_view
분석 결과
Use Case로 깐깐하게 살펴보기: 모범 사례
QueryPie 는 이 솔루션으로 어떻게 데이터 보안을 강화하고 글로벌 컴플라이언스를 준수했을까요?
데이터 접근 제어
- 세분화된 권한 설정: 테이블 및 컬럼 수준에서 접근 권한을 세밀하게 설정하여 최소 권한 원칙을 준수합니다.
데이터 마스킹
- 동적 데이터 마스킹: 실시간으로 데이터 조회 시 사용자 권한에 따라 민감한 정보가 마스킹되도록 설정합니다.
- 마스킹 정책 관리: 마스킹 규칙을 중앙에서 관리하여 일관성을 유지합니다.
민감 데이터 모니터링
- 접근 알림 및 경보 시스템: 민감한 데이터에 접근이 발생하면 실시간으로 관리자에게 알림을 전송합니다.
- 로그 및 감사 추적: 모든 데이터 접근 활동을 상세히 기록하여 추후 감사나 분석에 활용합니다.
- 이상 행동 탐지: 머신 러닝 등을 활용하여 비정상적인 데이터 접근 패턴을 식별하고 대응합니다.
원장 테이블 보호
- 접근 제한 및 모니터링: 재무나 회계 관련 원장 테이블에 대한 접근을 엄격히 제한하고, 접근 시 모니터링을 강화합니다.
- 데이터 무결성 유지: 원장 데이터의 변경이 필요한 경우 승인 절차를 거치도록 워크플로우를 구성합니다.
QSI: 데이터 보안의 혁신, 신뢰와 경쟁력을 높이는 비결!
현대 기업은 다양한 데이터베이스 환경과 복잡한 글로벌 컴플라이언스 요구 사항 속에서 데이터 보안을 유지해야 하는 도전에 직면해 있습니다. 이 글에서 소개한 QSI 는 이러한 도전을 극복하기 위한 기반 기술을 제공합니다.
다양한 벤더의 쿼리 파싱을 통합하고 실시간으로 쿼리를 분석함으로써, 기업은 일관된 보안 정책을 적용하고 데이터 유출 위험을 최소화할 수 있습니다. 또한, 모범 사례를 적용하여 데이터 접근 제어, 데이터 마스킹, 민감 데이터 모니터링, 원장 테이블 보호 등을 강화함으로써 ISO 27001, GDPR, CCPA와 같은 글로벌 컴플라이언스 요구 사항을 효과적으로 준수할 수 있습니다.
데이터 보안은 단순히 위험을 회피하는 것을 넘어 기업의 신뢰성과 경쟁력을 높이는 핵심 요소입니다. 이제 기업은 QSI를 통해 복잡한 데이터베이스 환경에서도 안정적으로 데이터를 관리함으로써, 규제 준수에 따른 법적 위험을 최소화하여 비즈니스 목표 달성에 더욱 매진할 수 있습니다.
무엇이 있을까요?
지금 바로 확인해보세요!
아래 양식을 작성하시면 특별한 콘텐츠가 열려요!