Qdrant 向量数据库的部署以及如何在 .NET 中使用 TLS 安全访问

本文介绍如何使用 Docker 部署 Qdrant 向量数据库,以及其相关的安全配置,并演示如何使用 .NET 通过 TLS 安全访问 Qdrant 向量数据库。

文章目录

  • 1. 背景
  • 2. Qdrant 向量数据库的部署
  • 2.1 Qdrant 向量数据库的安全配置
  • 2.2 使用 Docker 部署安全的 Qdrant 向量数据库
  • 2.2.1 准备证书文件
  • 2.2.2 Docker 部署及配置
  • 2.3 管理后台的访问
  • 3. 使用 .NET 通过 TLS 安全访问
  • 3.1 证书验证
  • 3.2 使用 .NET 客户端访问
  • 4. 总结

1. 背景

随着 AIGC 的发展,向量数据库已经成为一个重要的资源,可以高效地存储和检索大量的向量数据。向量数据库在需要相似性搜索的各种应用中起着至关重要的作用,例如:作为推荐系统,基于内容的图像检索和个性化搜索。通过使用向量数据库,我们可以有效地处理大规模的 Embedding 数据,从而支持各种AI和机器学习应用。Qdrant 是一个开源的向量数据库,它提供了高效的向量索引和查询功能,以及便捷的 API 接口和多种语言的客户端库,如 Python、Go、Rust、.NET 和 Java 等。

在实际应用中,我们通常需要保护向量数据库的访问安全,以防止未经授权的访问和数据泄露。为了保护向量数据库的访问安全,我们可以使用 TLS 协议对数据库的访问进行加密。本文将介绍如何使用 Docker 部署 Qdrant 向量数据库,以及其相关的安全配置,并演示如何使用 .NET 通过 TLS 安全访问 Qdrant 向量数据库。

qdrant

Qdrant 开源地址:https://github.com/qdrant/qdrant?wt.mc_id=DT-MVP-5005195

文档和相关介绍:https://qdrant.tech/

2. Qdrant 向量数据库的部署

一般来说,我们可以使用 Docker 部署 Qdrant 向量数据库。首先,我们需要安装 Docker,然后使用以下命令拉取 Qdrant 的镜像并启动容器:

docker pull qdrant/qdrant
docker run -p 6333:6333 qdrant/qdrant

上面的命令将拉取 Qdrant 的镜像并启动容器,容器的 6333 端口将映射到主机的 6333 端口。这样,我们就可以通过主机的 6333 端口访问 Qdrant 向量数据库了。这对于一般的测试和开发环境来说是足够的,对于生产环境如果仅在本机使用,也可以使用这种简单的方式。但是,如果需要在生产环境中使用,我们通常需要对 Qdrant 向量数据库进行一些安全配置。

2.1 Qdrant 向量数据库的安全配置

在 Qdrant 的服务端配置中,已经提供了相关的安全配置。我们可以通过配置文件 config.yaml 来配置 Qdrant 向量数据库的安全选项。下面是安全相关的一些配置选项和建议:

  1. 修改端口:默认情况下,Qdrant 向量数据库的服务端口是 http 6333 和 grpc 6334。我们可以通过配置文件中的 service.http_portservice.grpc_port 选项来修改服务端口。

  2. 启用TLS:配置文件中的 service.enable_tlscluster.p2p.enable_tls 默认为 false,这意味着服务和集群间的通信都是不加密的。可以将两个选项设置为 true,然后提供相应的证书文件路径,以启用安全的 TLS 通信。需要在 tls 部分提供服务器证书(cert)、服务器私钥(key)和证书颁发机构证书(ca_cert)。

  3. 设置API密钥:配置文件中的 service.api_keyservice.read_only_api_key ,启用后可以进行 API 认证。设置一个复杂的 API 密钥,以便只有拥有密钥的客户端才能访问服务。这个密钥分为读写密钥和只读密钥,可以根据需要进行设置。

  4. 验证HTTPS客户端证书:配置文件中的 service.verify_https_client_certificate 也可以启用,服务会验证 HTTPS 客户端的证书。这样可以增加一个额外的安全层,服务端会要求客户端也提供一个有效的证书。

  5. 限制CORS:配置文件中的 service.enable_cors 默认为 true,这可能会导致跨站请求伪造(CSRF)攻击。如果条件允许则应该考虑限制 CORS,允许来自可信来源的请求。

  6. 限制并发更新:配置文件中的 storage.performance.update_rate_limit 默认为 null,服务没有限制并发更新的数量。正式环境应该设置一个合理的限制,以防止拒绝服务(DoS)攻击。

  7. 关闭遥测:配置文件中的 telemetry_disabled 默认为 false,服务会将使用统计信息发送给开发者。出于隐私考虑,可以将此选项设置为 true。

2.2 使用 Docker 部署安全的 Qdrant 向量数据库

前面一小节介绍了 Qdrant 向量数据库的安全配置,接下来我们将介绍如何使用 Docker 部署安全的 Qdrant 向量数据库。演示中我们将使用 TLS 安全访问 Qdrant 向量数据库,包括服务端和客户端的证书验证。

2.2.1 准备证书文件

首先我们需要准备好证书文件,包括服务器证书(cert)、服务器私钥(key)和证书颁发机构证书(ca_cert)以及客户端证书(client_cert)和客户端私钥(client_key)。这里我们可以使用 OpenSSL 工具生成自签名的证书,这里不再赘述。

演示这里我使用的是自己搭建的私有证书颁发机构,生成的证书。这里我使用了二级证书颁发机构,签发的服务器证书和客户端证书都是由二级证书颁发机构签发的。

证书信息

对于客户端证书,我们需要将客户端证书和客户端私钥放在一个文件中,可以直接生成一个 pfx 文件:

openssl pkcs12 -export -out client.pfx -inkey client.key -in client.cer

根据提示输入密码,生成的 client.pfx 文件就是客户端证书和客户端私钥的合并文件。

2.2.2 Docker 部署及配置

接下来我们需要规划好 Qdrant 的配置文件 production.yaml,并将数据目录、证书文件和配置文件放到 Docker 容器中。首先我们将证书文件放到一个目录中,然后将这个目录挂载到 Docker 容器中。

这里我的配置如下:

log_level: INFO
telemetry_disabled: true
service:host: 0.0.0.0http_port: 6333grpc_port: 6334enable_tls: trueverify_https_client_certificate: truetls:cert: ./tls/server.pemkey: ./tls/server.keyca_cert: ./tls/cacert.pem

配置完成后,我们可以使用以下命令启动 Qdrant 容器:

docker run -p 6333:6333 \-v $(pwd)/path/to/data:/qdrant/storage \-v $(pwd)/path/to/tls:/qdrant/tls \-v $(pwd)/path/to/production.yaml:/qdrant/config/production.yaml \qdrant/qdrant

注意修改 path/to/datapath/to/tlspath/to/production.yaml 为实际的路径。

2.3 管理后台的访问

Qdrant 向量数据库提供了一个简单的管理后台,可以通过浏览器访问。默认情况下,管理后台的端口是 6333,我们可以通过配置文件中的 service.http_port 选项来修改端口。在浏览器中输入 http://localhost:6333/dashboard 即可访问管理后台。

Qdrant 的 Web UI 是一个直观高效的图形界面,可以方便的查看 Qdrant 集合、REST API 和数据点。这里我们启动的服务已经启用了 TLS 安全访问,并要求客户端提供有效的证书,所以我们需要使用 https 协议访问管理后台。

除了安装并信任我们的证书,我们还需要在浏览器中导入客户端证书。如果没有安装客户端证书,则会提示证书错误 ERR_BAD_SSL_CLIENT_AUTH_CERT,无法访问管理后台。

未安装证书

此时我们需要双击打开客户端证书 client.pfx,然后根据提示安装证书,中间需要输入密码,其他一路默认即可:

安装证书

安装完成后,我们直接刷新页面,会提示选择证书:

提示选择证书

选择证书确认后,即可访问管理后台。

管理后台

3. 使用 .NET 通过 TLS 安全访问

虽然服务端提供了API密钥的方式,但仍然建议在客户端与服务端之间使用TLS加密。

3.1 证书验证

以下是一些关于如何在.NET中使用TLS加密的建议:

首先,需要从证书文件中加载证书。可以使用 X509Certificate2 类来实现。例如,如果证书和私钥都在一个 PKCS#12 文件(通常扩展名为 .pfx 或 .p12)中,可以这样加载它:

var clientCert = new X509Certificate2("path/to/client.pfx", "password");

除了加载客户端证书,我们还需要对服务器证书进行验证。可以使用 SocketsHttpHandler 类来实现。例如,可以使用以下代码来验证服务器证书:

string CertificateThumbprint = "<certificate-thumbprint>";
var clientCertificate = new X509Certificate2("<path-to-your-certificate.pfx>", "<your-password>");
var channel = GrpcChannel.ForAddress("<your-server-address>", new GrpcChannelOptions
{HttpHandler = new SocketsHttpHandler{SslOptions = new SslClientAuthenticationOptions{RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>{if (sslPolicyErrors == SslPolicyErrors.None){var x509Certificate = certificate as X509Certificate2;if (x509Certificate != null){return x509Certificate.Thumbprint.ToLower() == CertificateThumbprint;}}return false;},ClientCertificates = new X509CertificateCollection { clientCertificate }}}
});

在上面的代码中,我们使用 SocketsHttpHandler 类来实现对服务器证书的验证。我们可以在 RemoteCertificateValidationCallback 回调函数中实现自定义的证书验证逻辑。在这个回调函数中,我们可以验证服务器证书的有效性,例如:验证证书的颁发机构、证书的有效期、证书的主题等。如果服务器证书验证通过,我们可以返回 true,否则返回 false

这里参考了官方的验证方式,使用 Thumbprint 属性来验证服务器证书的指纹。我们可以在 RemoteCertificateValidationCallback 回调函数中将服务器证书的指纹与预期的证书指纹进行比较,如果一致则返回 true,否则返回 false

这里的 x509Certificate.Thumbprint 获取的是证书的 sha1 指纹信息。对于证书的指纹,我们可以使用以下命令来获取:

openssl x509 -fingerprint -sha1 -in server.cer

Edge 浏览器的证书信息界面重新设计了,并且显示的是 sha256 指纹,所以需要注意。不过该指纹信息可以方面我们使用官方下面的案例时直接使用:

var channel = QdrantChannel.ForAddress("https://localhost:6334", new ClientConfiguration
{ApiKey = "<api key>",CertificateThumbprint = "<certificate thumbprint>"
});
var grpcClient = new QdrantGrpcClient(channel);
var client = new QdrantClient(grpcClient);

当然,如果需要获取 sha1 指纹信息也可以下载证书文件,直接在电脑中打开打开,然后在详细信息中查看指纹信息。

3.2 使用 .NET 客户端访问

完成了验证的配置,剩下的就是使用 .NET 客户端访问 Qdrant 向量数据库了。我们直接参考官方的案例即可,以下是一个简单的 .NET 客户端访问 Qdrant 向量数据库创建集合的示例:

var grpcClient = new QdrantGrpcClient(channel);
var client = new QdrantClient(grpcClient);
await client.CreateCollectionAsync("my_collection",new VectorParams { Size = 100, Distance = Distance.Cosine });

4. 总结

本文介绍了如何使用 Docker 部署 Qdrant 向量数据库,以及其相关的安全配置,并演示了如何使用 .NET 通过 TLS 安全访问 Qdrant 向量数据库。通过本文的介绍,我们可以了解到如何在生产环境中安全地部署 Qdrant 向量数据库,并使用 .NET 客户端通过 TLS 安全访问 Qdrant 向量数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/528084.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[QT]自定义的QtabWidget

需求 最近有一个需求就是一个QTabWidget要求有四个tab页在左侧用于显示主页面&#xff0c;在右侧有一个关于按钮&#xff0c;点击后用于弹出窗口显示一些程序相关信息。主要是怎么实现右侧按钮 相关代码 #ifndef MYTABWIDGET_H #define MYTABWIDGET_H#include <QWidget&g…

【联邦学习综述:概念、技术】

出自——联邦学习综述&#xff1a;概念、技术、应用与挑战。梁天恺 1*&#xff0c;曾 碧 2&#xff0c;陈 光 1 从两个方面保护隐私数据 硬件层面 可 信 执 行 环 境 &#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;边 缘 计 算&#xff08;Edge Com…

宝塔一键迁移报错创建失败问题完美解决

很多站长朋友在使用宝塔面板迁移的时候总是出错&#xff0c;如图&#xff1a; 遇到这样的问题不要慌&#xff0c;我们已经完美处理&#xff0c;详细解决教程&#xff1a;宝塔一键迁移报错问题完美解决教程

Golang-channel合集——源码阅读、工作流程、实现原理、已关闭channel收发操作、优雅的关闭等面试常见问题。

前言 面试被问到好几次“channel是如何实现的”&#xff0c;我只会说“啊&#xff0c;就一块内存空间传递数据呗”…所以这篇文章来深入学习一下Channel相关。从源码开始学习其组成、工作流程及一些常见考点。 NO&#xff01;共享内存 Golang的并发哲学是“要通过共享内存的…

【UVM_phase objection_2024.03.08

phase 棕色&#xff1a;function phase 不消耗仿真时间 绿色&#xff1a;task phase 消耗仿真时间 run_phase与右边的phase并行执行&#xff0c;右边的phase&#xff08;run_time phase&#xff09;依次执行&#xff1a; List itemreset_phase对DUT进行复位&#xff0c;初始…

Java 虚拟线程截止 2024-3-10 在 OpenJDK 还没有解决消息的问题

之前的文章《虚拟线程目前不推荐上生产的个人思考》&#xff0c;总结了几个目前的问题&#xff1a; 1. synchronized 的 pin 线程引发的问题比预期严重&#xff0c;或者等到 OpenJDK 修复&#xff0c;或者很多 Java 库要改&#xff08;尤其是 JDBC 驱动这种&#xff09;。目前…

RN开发搬砖经验之-如何处理FlashList组件加载后调用scrollToIndex没有滚动指定位置

前言 如题&#xff0c;这里只能说是处理&#xff0c;起正向作用的临时方案&#xff0c;因为我也着实没搞懂这个BUG的具体原因&#xff0c;看github上有提相关的issuesFor long lists with different item types scrollToIndex does not work reliable&#xff0c;但看官方没有…

JDBC的学习记录

JDBC就是使用java语言操作关系型数据库的一套API。 JDBC&#xff08;Java Database Connectivity&#xff09;是Java语言中用于连接和操作数据库的一种标准接口。它提供了一组方法和类&#xff0c;使Java程序能够与各种不同类型的关系型数据库进行交互。 JDBC的主要功能包括建…

解锁网络数据:入门级IP代理使用教程

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

力扣难题:重排链表

首先通过快慢指针找到中间节点&#xff0c;然后将中间节点之后和之前的部分分为两个链表&#xff0c;然后翻转后面的链表&#xff0c;注意方法&#xff0c;然后将两个链表交替链接。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode…

通过Forms+Automate+Lists+审批,实现用车申请流程

因为Sham公司目前用的用车申请流程是使用的K2系统&#xff0c;用户申请后&#xff0c;我们还需要单独另行输入Excel来汇总申请记录&#xff0c;当然K2也能导出&#xff0c;但是需要每次导出也是很麻烦的&#xff0c;而且不灵活。 刚好最近发现Forms与Automate能联通&#xff0…

检测虚拟机环境的常见技术

下面列出检测 VMware 虚拟机的常见技术&#xff1a; #include <iostream> #include <windows.h> #include <sysinfoapi.h> #include <comdef.h> #include <Wbemidl.h> #include <ShlObj.h> #include <LM.h> #include <TlHelp32.…