Qdrant 1.20.0 미만 버전은 분산 배포에서 내부 gRPC 포트 6335에 기본 인증을 적용하지 않아, 네트워크로 포트에 접근할 수 있는 비인가 사용자가 클러스터 상태를 바꾸거나 저장 데이터에 접근하고 메모리를 소진시킬 수 있다. Qdrant는 1.20.0에서 내부 인증을 기본 활성화했지만, 이를 적용하려면 API 키를 설정해야 한다.
취약점은 분산 배포에서 발생한다. 내부 API는 기본적으로 공개 API와 같은 주소에 바인딩되므로, 네트워크가 차단하지 않으면 공개 API에 접근할 수 있는 곳에서 포트 6335에도 접근할 수 있다. 공격자는 클러스터 피어로 자신을 추가해 복제 샤드를 통해 저장 데이터에 접근하거나, 발신자 검증 없이 처리되는 Raft 메시지로 컬렉션·샤드 배치·피어 구성을 변경할 수 있다. 크기 제한 없는 메시지를 보내 노드의 메모리를 소진시킬 수도 있다. 단일 노드 배포에서는 내부 포트가 열리지 않는다.
영향받는 버전은 1.20.0 미만이며, 수정 버전은 1.20.0이다. 1.20.0부터 service.enforce_internal_auth가 기본 활성화되고 내부 API는 api_key와 alt_api_key만 허용한다. 다만 API 키를 설정하지 않은 분산 배포에서는 내부 포트가 여전히 인증되지 않는다. 1.19.2부터는 이런 상태일 때 시작 로그에 경고가 기록된다. 1.20.0은 내부 포트의 메시지 크기 제한을 추가하지 않았으며, 인증을 적용하면 내부 포트에 접근할 때 관리자 API 키가 필요하다.
업그레이드 전에는 방화벽, 보안 그룹 또는 NetworkPolicy로 포트 6335 접근을 같은 클러스터 노드로 제한해야 한다. 인터넷에서만 접근할 수 없게 하는 것으로는 충분하지 않다. 애플리케이션 계층이 공개 API 포트 6333에 접근할 수 있다면, 내부 포트 6335에는 접근할 수 없는지도 확인해야 한다.
1.18.0 이상에서는 모든 피어에 같은 API 키를 설정한 뒤 service.enforce_internal_auth: true를 적용하고, 피어를 한 번에 하나씩 재시작하는 방법도 있다. 내부 통신에서 키가 평문으로 전송되지 않도록 cluster.p2p.enable_tls: true도 설정해야 한다. 1.19.2 이상에서는 cluster.p2p.host를 내부 IP 주소로 지정해 내부 포트가 공개 API 인터페이스에 바인딩되지 않도록 할 수 있다. 이때 노드의 피어 URI(--uri)도 같은 주소를 가리켜야 한다.
1.20.0으로 롤링 업그레이드할 때는 일반적인 한 번에 마이너 버전 하나씩 올리는 규칙을 따르면 된다. 1.19.x 피어는 이미 내부 요청에 API 키를 포함하므로 1.19와 1.20이 섞인 클러스터도 업그레이드 중 계속 작동한다.
Qdrant Cloud의 관리형 클러스터는 Calico가 적용하는 NetworkPolicy로 포트 6335의 인바운드 연결을 같은 클러스터의 파드로 제한해 실질적인 영향을 받지 않는다. Hybrid Cloud와 Private Cloud도 운영자가 같은 정책을 설정하지만, 실제 적용 여부는 고객의 CNI에 달려 있다.
내부 통신 인증 설정 문서와 관련 보안 권고를 참고할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요