08 / 10

Why should TLS be enabled for Qdrant's REST/gRPC endpoints even inside a private VPC?

Defense in depth against internal network compromise

TLS inside a private VPC is a defense-in-depth control. The argument against it is usually 'the network is private, so no one can sniff the traffic.' That argument has three weaknesses. First, it assumes the network is actually private - VPCs are shared by many services, some of which may be compromised, misconfigured, or operated by a different team with different security standards. A compromised service in the same VPC can potentially capture traffic to other services. Second, it assumes that no attacker ever gets a foothold inside the network. If an attacker compromises any workload in the VPC, they can potentially sniff unencrypted traffic. TLS means that even if they capture the traffic, they cannot read the API keys or the data. Third, it assumes that the Qdrant port is never accidentally exposed - a misconfigured security group or a Kubernetes service exposure can make an internal port reachable from a broader network. TLS is the control that protects the data and the credentials even if the network perimeter fails.

The specific risk that TLS mitigates is the exposure of the API key and the query data. Qdrant API keys are sent in the api-key header, and without TLS they travel in plaintext over the network. Anyone who can capture a single request captures the API key, and with that key they can access the instance. The official documentation explicitly warns: 'Never send API keys over unencrypted connections. Always enable TLS when using API key authentication in production'[reference:39]. The same applies to the query vectors and payloads - if they are unencrypted, a network observer can read them. Inside a VPC, the observer might be a compromised service, a malicious insider, or an attacker who has gained a foothold. TLS does not prevent the compromise, but it limits the damage by ensuring that captured traffic is not readable. This is the essence of defense in depth: you do not rely on a single control (the network perimeter) to protect you, you layer controls so that a failure of one does not lead to a total compromise.

  1. 1

    API key exposure: without TLS, the api-key header is sent in plaintext and can be captured.

  2. 2

    Data exposure: query vectors and payloads are readable by anyone who can capture traffic.

  3. 3

    Internal threat model: VPCs are shared; a compromised service can potentially sniff traffic.

  4. 4

    Accidental exposure: misconfigured security groups or Kubernetes services can make internal ports reachable.

  5. 5

    Defense in depth: TLS is a control that holds even if the network perimeter fails.

  6. 6

    Qdrant supports TLS for both REST (port 6333) and gRPC (port 6334).

  7. 7

    TLS requires Qdrant 1.2 or later.

The trade-off is a small amount of operational complexity and a small latency overhead. TLS adds certificate management - generating, distributing, and rotating certificates - and the handshake adds a small amount of latency to each connection (though connection reuse amortizes this). The certificate management is the main operational cost, and it is well-understood. The common mistake is treating the VPC as a security boundary and assuming that everything inside it is trusted. This is the 'crunchy outside, soft inside' model, and it fails when any service in the VPC is compromised. The second mistake is enabling TLS for external traffic but not internal traffic, which leaves the internal path unprotected. The third mistake is using self-signed certificates without proper validation, which can enable man-in-the-middle attacks. The alternative to TLS is a service mesh that provides mutual TLS (mTLS) automatically, which is a valid pattern for large deployments but adds significant infrastructure complexity. Version note: TLS support has been available since Qdrant 1.2 and the configuration format has been stable, but the certificate options (CA certificates, client certificates) have expanded in recent releases.

javascript
javascript

Version-dependent: TLS support requires Qdrant 1.2 or later. The configuration fields (enable_tls, cert, key) have been stable, but the ability to configure a CA certificate for mutual TLS and the exact certificate validation behavior have evolved. If you are using a service mesh for mTLS, you may not need Qdrant's built-in TLS, but you still need to ensure that the mesh actually provides mTLS and that no plaintext path exists.

Difficulty: 4/10
Topics: TLS, Network Security, Defense in Depth

Scenario Questions

0-2 years experience
  1. 1

    Your Qdrant instance is inside a private VPC and a teammate says TLS is unnecessary. Explain the risk and why you would enable it anyway.

  2. 2

    You enable TLS on Qdrant and the client fails to connect. Walk through the likely causes and how you would diagnose them.

2-5 years experience
  1. 1

    You are deploying Qdrant on Kubernetes with a service mesh. Explain whether you still need Qdrant's built-in TLS and how you would decide.

  2. 2

    You need to rotate TLS certificates across a Qdrant cluster with zero downtime. Describe the rotation strategy.

5-8 years experience
  1. 1

    Design a TLS architecture for a multi-region Qdrant deployment with cross-region replication. Specify the certificates, the validation, and how you handle failover.

  2. 2

    You are using a private CA for internal services. Describe how you distribute the CA bundle to all Qdrant clients and how you rotate it.

8+ years experience
  1. 1

    You are designing a zero-trust network architecture for a Qdrant deployment. Describe the controls you would put in place beyond TLS, including mutual authentication, authorization, and micro-segmentation.

  2. 2

    An attacker compromises a service in the same VPC as your Qdrant cluster. Describe what they can and cannot do if TLS is enabled versus disabled, and how you would detect the compromise.

Follow-up Questions

  • How would you handle certificate rotation for a Qdrant cluster without downtime?
  • What is the difference between TLS and mTLS, and when would you use mTLS for a Qdrant deployment?