DuckDB의 저장 데이터 암호화 기능

2 weeks ago 8

  • DuckDB 1.4 버전부터 저장 데이터 암호화(Data-at-Rest Encryption) 기능이 추가되어, 데이터베이스 파일 전체를 AES 기반 표준 암호화로 보호 가능
  • 지원 알고리듬은 AES-GCM-256AES-CTR-256, 이 중 GCM은 데이터 무결성 검증을 위한 인증 태그(tag) 를 포함
  • 암호화는 데이터베이스 파일, WAL(Write-Ahead Log), 임시 파일 모두에 적용되며, 키 관리와 메모리 보호를 위한 보안 캐시 구조를 포함
  • OpenSSLMbed TLS 두 가지 구현이 제공되며, OpenSSL 사용 시 하드웨어 가속으로 성능 저하가 거의 없음
  • 암호화된 DuckDB 파일은 보안성과 이식성을 동시에 확보하며, 클라우드나 CDN 환경에서도 안전한 데이터 배포 가능

암호화 개요

  • DuckDB 1.4부터 데이터베이스 파일 전체를 투명하게 암호화(Transparent Encryption) 가능
    • 저장 시 AES-GCM-256 또는 AES-CTR-256 암호화 사용
    • AES-GCM은 무결성 검증을 위한 태그를 계산하며, AES-CTR은 더 빠르지만 인증 기능이 없음
  • AES는 대칭키 암호화 알고리듬으로, 동일한 키로 암호화와 복호화를 수행
  • IV(Initialization Vector)와 nonce를 사용해 동일 평문이 다른 암호문으로 변환되도록 보장
  • NIST 표준 요건은 아직 완전히 충족하지 않음

DuckDB 내부 구현 구조

  • 데이터베이스 파일의 메인 헤더는 평문으로 유지되며, 암호화 여부를 나타내는 플래그와 암호화 메타데이터 저장
    • 메타데이터에는 데이터베이스 식별자(salt), 암호화 알고리듬 정보, 암호화된 canary 포함
  • 키 파생 함수(KDF) 를 통해 사용자 입력 키를 32바이트 보안 키로 변환
    • 파생된 키는 보안 캐시에 저장되어 디스크로 스왑되지 않음
    • 원본 키는 메모리에서 즉시 삭제
  • 데이터 블록은 기본 256KB 단위로 저장되며, 암호화 시 블록 헤더에 nonce/IV태그가 추가되어 40바이트로 확장
    • 체크섬은 암호화되어 저장

WAL(Write-Ahead Log) 암호화

  • WAL은 트랜잭션 복구용 로그 파일로, DuckDB에서는 항목 단위로 암호화 수행
    • 각 항목에 nonce와 태그를 추가하여 AES-GCM 방식으로 보호
    • 암호화된 WAL 항목은 길이(평문) → nonce → 암호화된 체크섬 및 데이터 → 태그 순으로 구성
  • 암호화 키가 지정된 데이터베이스에서는 WAL 암호화가 자동 활성화

임시 파일 암호화

  • 정렬, 조인, 윈도 함수 등 대용량 연산 시 생성되는 임시 파일도 자동 암호화
    • 암호화된 데이터베이스를 연결하거나 SET temp_file_encryption = true 설정 시 활성화
    • DuckDB가 내부적으로 임시 키를 생성하며, 충돌 시 복호화 불가
  • 임시 파일은 .tmp 또는 .block 확장자를 가지며, 크기 정보가 헤더에 포함
    • 체크섬은 계산 비용 절감을 위해 생략

암호화 사용 방법

  • 세 가지 방식 지원:
    1. 기존 데이터베이스 암호화
    2. 새 암호화 데이터베이스 생성
    3. 기존 암호화 데이터베이스 재암호화
  • 예시 명령: ATTACH 'encrypted.duckdb' AS encrypted (ENCRYPTION_KEY 'asdf'); COPY FROM DATABASE unencrypted TO encrypted;
  • 암호화 여부는 FROM duckdb_databases(); 명령으로 확인 가능
  • 기본 암호화 알고리듬은 AES-GCM, 필요 시 AES-CTR로 지정 가능
  • 암호화된 데이터는 엔트로피(Entropy) 가 높아 무작위 데이터처럼 보임

구현 및 성능

  • DuckDB는 외부 의존성을 최소화하기 위해 Mbed TLSOpenSSL 두 가지 암호화 구현을 포함
    • Mbed TLS는 하드웨어 가속 비활성화로 성능이 낮고, 난수 생성기 취약점 발견으로 쓰기 기능 비활성화(1.4.1 이후)
    • OpenSSL은 하드웨어 가속 및 안전한 난수 생성기를 사용, httpfs 확장 로드 시 자동 전환
  • 성능 테스트 결과:
    • 비암호화 SUMMARIZE 쿼리: 5.4초
    • Mbed TLS 암호화: 6.2초
    • OpenSSL 암호화: 5.4초 (성능 저하 없음)
  • TPC-H Power/Throughput 테스트에서도 암호화 사용 시 성능 차이 미미
    • Power@Size: 624,296 → 571,985
    • Throughput@Size: 450,409 → 145,353 (디스크 I/O 증가 시 약간 감소)

결론

  • DuckDB의 저장 데이터 암호화 기능으로 데이터베이스 파일 전체를 안전하게 보호 가능
  • WAL과 임시 파일까지 암호화되어 클라우드 환경에서도 데이터 유출 위험 감소
  • OpenSSL 기반 구현 시 성능 손실 거의 없음, 실무 환경에서도 효율적 사용 가능
  • 암호화된 DuckDB 파일은 CDN 등 외부 배포에도 적합하며, 다중 테이블 저장 등 기존 기능 유지
  • DuckDB 팀은 향후 사용자 피드백을 통해 기능 개선 예정

Read Entire Article