当 Qdrant 服务暴露在网络中时,安全防护是不可忽视的环节。无论是内部服务调用还是对外提供 API,都需要建立完善的安全体系来防止未授权访问、数据泄露和恶意攻击。本章将详细介绍 Qdrant 的 API Key 认证、RBAC 权限模型、TLS 加密通信以及生产环境的安全最佳实践。
API Key 是 Qdrant 最基础也是最常用的认证方式,适用于服务间的调用场景。
通过 REST API 创建 API Key:
POST /api-keys { "description": "search-service-key", "expires_at": "2027-01-01T00:00:00Z" }
创建成功后返回完整的 API Key 字符串和 Key 的元信息。注意:完整的 API Key 只在创建时返回一次,后续无法再次查看。请务必在创建时妥善保存。
API Key 支持设置过期时间。对于长期使用的服务,建议设置较长的过期时间或不过期,但配合权限最小化原则使用。对于临时用途(如数据迁移),设置短期过期时间。
在 HTTP 请求中通过 api-key Header 传递:
GET /collections HTTP/1.1 Host: qdrant.example.com api-key: your-secret-api-key-here
Python 客户端中同样支持:
from qdrant_client import QdrantClient client = QdrantClient( host="qdrant.example.com", port=6333, api_key="your-secret-api-key-here" )
Qdrant 提供了完整的 API Key 生命周期管理:
# 列出所有 API Key GET /api-keys # 删除指定 API Key DELETE /api-keys/{api_key}
在生产环境中,建议建立以下管理流程:
Qdrant 从 v1.7 开始支持基于角色的访问控制(Role-Based Access Control),提供了更精细的权限管理能力。
RBAC 模型包含三个核心概念:
角色(Role):定义一组权限的集合。Qdrant 预定义了以下角色:
read_only:只读权限,可以查询集合和搜索向量editor:读写权限,在只读基础上可以创建/更新/删除向量administrator:管理权限,在编辑基础上可以创建/删除集合和管理配置权限(Permission):定义对特定资源的操作权限:
collections/{collection_name}/readcollections/{collection_name}/writecollections/*(通配符匹配所有集合)snapshots/readcluster/readcluster/write主体(Subject):权限的载体,可以是 API Key 或特定访问令牌。
# 创建自定义角色 PUT /roles/{role_name} { "permissions": [ {"collection": "product_vectors", "access": "read"}, {"collection": "user_profiles", "access": "write"}, {"collection": "*", "access": "read"} ] }
这个角色允许:只读访问所有集合、读写访问 product_vectors 集合、读写访问 user_profiles 集合。
创建 API Key 时指定其角色:
POST /api-keys { "description": "search-service", "roles": ["search_only"], "expires_at": null }
也可以为已有 API Key 添加或修改角色:
PUT /api-keys/{api_key}/roles { "roles": ["read_only", "search_only"] }
一个 API Key 可以绑定多个角色,最终的权限是所有角色权限的并集。
场景一:搜索微服务
搜索服务只需要读取特定集合的数据:
角色: search_service 权限: collections/product_vectors/read, collections/user_profiles/read 绑定: 搜索服务的 API Key
场景二:数据导入管道
ETL 管道需要写入数据但不能删除:
角色: data_writer 权限: collections/product_vectors/write 绑定: 数据导入服务的 API Key
场景三:运维管理
运维人员需要完整的管理权限:
角色: ops_admin 权限: collections/*/write, snapshots/read, cluster/read, cluster/write 绑定: 运维团队的 API Key
场景四:多租户隔离
在多租户场景中,每个租户只能访问自己的集合:
角色: tenant_a 权限: collections/tenant_a_*/write 角色: tenant_b 权限: collections/tenant_b_*/write
在生产环境中,Qdrant 的所有 API 通信都应该通过 HTTPS 加密,防止数据在传输过程中被窃听或篡改。
在 Docker 中启用 TLS:
docker run -d \ -p 6333:6333 \ -v ./certs:/qdrant/certs \ qdrant/qdrant \ ./qdrant --tls-cert /qdrant/certs/server.crt --tls-key /qdrant/certs/server.key
配置文件方式:
tls: cert: /etc/ssl/qdrant/server.crt key: /etc/ssl/qdrant/server.key ca_cert: /etc/ssl/qdrant/ca.crt # 用于客户端证书认证(mTLS)
对于安全要求更高的场景,可以启用双向 TLS(mTLS),要求客户端也提供有效证书:
tls: cert: /etc/ssl/qdrant/server.crt key: /etc/ssl/qdrant/server.key client_ca: /etc/ssl/qdrant/client-ca.crt client_cert: /etc/ssl/qdrant/client.crt client_key: /etc/ssl/qdrant/client.key
启用 mTLS 后,只有持有受信任客户端证书的请求才能通过认证。这种方式比 API Key 更安全,因为证书无法在请求中直接传递。
即使启用了应用层认证,网络层防护仍然是重要的防线:
在生产环境中,建议在 Qdrant 前面部署反向代理(如 Nginx、Envoy),提供以下能力:
Nginx 配置示例:
server { listen 443 ssl; server_name qdrant.example.com; ssl_certificate /etc/ssl/qdrant/server.crt; ssl_certificate_key /etc/ssl/qdrant/server.key; # 速率限制 limit_req_zone $binary_remote_addr zone=qdrant:10m rate=100r/s; location / { limit_req zone=qdrant burst=50 nodelay; proxy_pass http://qdrant_backend:6333; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 管理接口限制内网访问 location /api-keys { allow 10.0.0.0/8; deny all; proxy_pass http://qdrant_backend:6333; } }
对于存储在 Qdrant 中的敏感 Payload 数据,建议在写入前由应用层进行加密。Qdrant 本身不提供字段级别的加密功能,但可以在应用层实现:
from cryptography.fernet import Fernet fernet = Fernet(encryption_key) # 写入前加密敏感字段 encrypted_data = fernet.encrypt(sensitive_payload.encode()) client.upsert( collection_name="user_data", points=[{ "id": user_id, "vector": embedding, "payload": { "encrypted_profile": encrypted_data.decode(), "public_name": display_name # 非敏感字段明文存储 } }] ) # 读取后解密 results = client.search(collection_name="user_data", query_vector=...) for result in results: decrypted = fernet.decrypt(result.payload["encrypted_profile"].encode()).decode()
对于日志和监控中可能暴露的数据,需要在应用层进行脱敏处理。避免将原始的向量数据或敏感 Payload 记录到日志中。
启用 Qdrant 的结构化日志,记录所有操作请求。关键审计信息包括:
将审计日志发送到独立的日志系统(如 Splunk、ELK),设置保留策略和合规审查流程。
在部署 Qdrant 到生产环境前,逐项检查以下安全措施:
Qdrant 提供了多层安全防护能力,从 API Key 认证到 RBAC 权限控制,从 TLS 加密到网络层防护。在生产环境中,需要综合运用这些安全机制,建立纵深防御体系。记住:安全不是一次性的配置,而是持续的过程——定期审查权限、轮换密钥、更新证书,才能保障数据的长期安全。