확장 보안
확장 보안 (Securing Extensions)
DuckDB는 강력한 확장(extension) 메커니즘을 갖고 있어요. 그런데 확장은 DuckDB(부모) 프로세스를 실행하는 사용자와 동일한 권한으로 동작해요. 이 말은 보안 고려 사항이 따라온다는 뜻이에요. 그래서 이 페이지에 정리한 설정 옵션을 검토하고, 자신의 위협 모델에 맞게 구성할 것을 권장해요.
출처: 공식문서
DuckDB 시그니처 검사 (Signature Checks)
DuckDB 확장은 로드할 때마다 바이너리 시그니처로 검사돼요. 확장은 현재 세 가지 범주로 나뉘어요.
core키로 서명: DuckDB 핵심 팀이 검증한 확장만 이 키로 서명돼요.community키로 서명: DuckDB 커뮤니티 확장 저장소를 통해 배포되는 오픈소스 확장이에요.- 무서명(unsigned).
확장 보안 레벨 개요
DuckDB는 확장에 대해 다음과 같은 보안 레벨을 제공해요.
| 사용 가능한 확장 | 설명 | 설정 |
|---|---|---|
core |
core 키로 서명된 확장만 로드할 수 있어요. |
SET allow_community_extensions = false |
core 및 community |
core 또는 community 키로 서명된 확장만 로드할 수 있어요. |
기본 보안 레벨이에요. |
| 무서명 포함 모든 확장 | 모든 확장을 로드할 수 있어요. | SET allow_unsigned_extensions = true |
보안 관련 설정은 스스로 잠기는(lock) 특성이 있어요. 즉 현재 프로세스에서 능력을 제한하는 방향으로만 변경할 수 있어요.
예를 들어 다음처럼 설정을 바꾸려고 하면 오류가 나요.
SET allow_community_extensions = false;
SET allow_community_extensions = true;
Invalid Input Error:
Cannot upgrade allow_community_extensions setting while database is running
커뮤니티 확장 (Community Extensions)
DuckDB에는 커뮤니티 확장 저장소가 있어서 서드파티 확장을 편리하게 설치할 수 있어요. pip이나 npm 같은 커뮤니티 저장소는 설계상 사실상 원격 코드 실행을 가능하게 해요. 이게 겁날 만한 말이지만 실제로는 그렇게 비극적이지 않아요. 우리는 이미 웹에서 임의의 스크립트를 셸로 파이프하는 데 익숙하고, 수많은 전이 의존성을 망설임 없이 설치하니까요. CRAN 같은 일부 저장소는 어떤 지점에서 인간 검토를 강제하지만, 그 역시 완전한 보장은 아니에요.
DuckDB는 커뮤니티 확장 저장소에 대해 여러 접근을 연구한 끝에 합리적이라고 생각하는 방식을 골랐어요. 제출물을 검토하지 않고, 대신 확장의 소스 코드가 공개돼 있기를 요구하는 방식이에요. 빌드·서명·배포 과정은 DuckDB가 전부 맡아요. pip이나 npm(임의 바이너리 업로드 허용)보다는 한 단계 나아간 셈이고, 모든 것을 수동 검토하는 것보다는 한 단계 아래예요. 사용자는 악성 확장을 신고할 수 있고, GitHub 스타 수·다운로드 수 같은 채택 통계도 볼 수 있어요. 저장소를 DuckDB가 관리하므로 문제 있는 확장은 유통에서 빠르게 제거할 수 있어요.
그렇지만 커뮤니티 확장 저장소에서 확장을 설치·로드하는 것은 어쨌든 서드파티 개발자가 작성한 코드를 실행하는 일이라 위험할 수 있어요. 악성 개발자가 암호화폐를 훔쳐 가는 무해해 보이는 DuckDB 확장을 만들어 등록할 수도 있어요. 사용자가 신뢰할 수 없는 SQL을 DuckDB로 실행하는 웹 서비스를 운영한다면, 커뮤니티 확장을 비활성화하는 걸 권장해요.
SET allow_community_extensions = false;
알려진 확장의 자동 설치·자동 로드 비활성화
기본적으로 DuckDB는 알려진 확장을 자동 설치·자동 로드해요. 알려진 확장의 자동 설치는 이렇게 끄고,
SET autoinstall_known_extensions = false;
자동 로드는 이렇게 꺼요.
SET autoload_known_extensions = false;
이 설정을 잠그려면 lock_configuration 옵션을 사용해요.
SET lock_configuration = true;
항상 서명된 확장 요구하기
기본적으로 DuckDB는 확장이 core 확장(DuckDB 개발자가 만든 것) 또는 community 확장(서드파티가 만들었지만 DuckDB 개발자가 배포한 것)으로 서명돼 있어야 한다고 요구해요. 무서명 확장을 로드하려면 시작 시 allow_unsigned_extensions 설정을 켤 수 있어요. 이 설정은 확장 개발에는 유용하지만, 켜면 DuckDB가 모든 확장을 로드하게 되므로 악성 확장이 로드되지 않도록 각별히 주의해야 해요.
더 알아보기 (Learn more)
- DuckDB 보안 전반은 Securing DuckDB 개요에서 확인하세요.