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

news2024/10/3 0:22:00

本文介绍如何使用 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.0
  http_port: 6333
  grpc_port: 6334
  enable_tls: true
  verify_https_client_certificate: true

tls:
  cert: ./tls/server.pem
  key: ./tls/server.key
  ca_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.coloradmin.cn/o/1505147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulnstack1--红队靶机(第一部分)

环境搭建 Windows7x64 Windows server8&#xff08;域控&#xff09; Windows server3 注意密码是hongrisec2019&#xff0c;需要测试是否连通 Kali配置 Eth1是桥接的ip 流程 主机发现 目标应该是193 端口扫描 服务扫描 漏洞扫描 看一下web Win7的系统 目录爆破 web利用 …

【开源】SpringBoot框架开发教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

gensim 实现 TF-IDF;textRank 关键词提取

目录 TF-IDF 提取关键词 介绍 代码 textRAnk 提取关键词 这里只写了两种简单的提取方法&#xff0c;不需要理解上下文&#xff0c;如果需要基于一些语义提取关键词用 LDA&#xff1a;TF-IDF&#xff0c;textRank&#xff0c;LSI_LDA 关键词提取-CSDN博客 TF-IDF 提取关键词…

JavaEE进阶(15)Spring原理:Bean的作用域、Bean的生命周期、Spring Boot自动配置(加载Bean、SpringBoot原理分析)

接上次博客&#xff1a;JavaEE进阶&#xff08;14&#xff09;Linux基本使用和程序部署&#xff08;博客系统部署&#xff09;-CSDN博客 目录 关于Bean的作用域 概念 Bean的作用域 Bean的生命周期 源码阅读 Spring Boot自动配置 Spring 加载Bean 问题描述 原因分析 …

【stm32】hal库学习笔记--定时器输出PWM波

【stm32】hal库学习笔记–定时器输出PWM波 PWM波原理 输出比较 输入捕获 驱动函数 定时器驱动函数 PWM波驱动函数 定时器基本不使用DMA方式 定时器中断处理通用函数 HAL_TIM_IRQHandler实验一:输出固定占空比PWM波 时钟树配置 PF9 改为tim14CH1 tim14配置 开启tim14全局中…

基础GamePlay知识-矩形碰撞检测

主要介绍AABB碰撞检测下&#xff0c;矩形该如何和矩形进行碰撞检测/和圆形进行碰撞检测。 直接看图&#xff0c;主要是比较两个矩形的边界线的前后关系。 效果 分析什么时候重合 分析什么时候不重合 完整代码 矩形身上挂载 public class Rectangle : MonoBehaviour {public …

MES数据采集设备

在智能制造日益盛行的今天&#xff0c;MES&#xff08;制造执行系统&#xff09;作为连接计划与生产现场的关键环节&#xff0c;其重要性不言而喻。而MES数据采集设备则是MES系统的核心组件&#xff0c;负责实时、准确地获取生产现场的各种数据&#xff0c;为企业的生产决策提供…

内存卡损坏打不开:数据恢复全攻略

在我们的日常生活中&#xff0c;内存卡作为一种常见的存储设备&#xff0c;广泛应用于手机、相机、平板电脑等电子设备中。然而&#xff0c;有时我们会遇到内存卡损坏打不开的问题&#xff0c;导致重要的照片、视频或文件无法读取。面对这种情况&#xff0c;我们该如何应对呢&a…

mac电脑总卡蓝屏是怎么回事,苹果电脑老卡蓝屏怎么办

电脑老卡蓝屏是比较常见的电脑故障之一&#xff0c;导致这一问题的出现很可能是电脑本身的硬件&#xff0c;或电脑上的驱动安装错误&#xff0c;没法运行&#xff0c;当然也不排除其他的一些因素。虽说电脑蓝屏是电脑几乎都会出现的小毛病&#xff0c;不足以致命&#xff0c;但…

短视频文案素材哪里找?推荐几个既好看又好用的素材网站

我们在做短视频的同时&#xff0c;一般需要一些视频&#xff0c;文案&#xff0c;图片&#xff0c;音频&#xff0c;来添加短视频的突出点&#xff0c;那么这些短视频文案去哪里找呢? 蛙学网 想要做出容易上热门的短视频文案&#xff0c;你一定要找到合适的短视频素材&#…

【个人开发】llama2部署实践(三)——python部署llama服务(基于GPU加速)

1.python环境准备 注&#xff1a;llama-cpp-python安装一定要带上前面的参数安装&#xff0c;如果仅用pip install装&#xff0c;启动服务时并没将模型加载到GPU里面。 # CMAKE_ARGS"-DLLAMA_METALon" FORCE_CMAKE1 pip install llama-cpp-python CMAKE_ARGS"…

【C语言】深入理解指针(进阶篇)

一、数组名的理解 数组名就是地址&#xff0c;而且是数组首元素的地址。 任务&#xff1a;运行以下代码&#xff0c;看数组名是否是地址。 #include <stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8,9,0 };printf("&arr[0] %p\n", &arr[0]);pri…

PMP-项目管理十大知识领域学习和理解

项目管理十大知识领域&#xff1a; 整合、范围、进度、成本、 质量、资源、沟通、风险、采购、干系人 十大知识领域的理解 十大知识领域裁剪情况&#xff1a; 十大知识领域: 硬技能和软技能

flink 总结

flink 流式api checkpoint state 状态分类 Managed State 和 Raw State Managed State Flink 自己管理&#xff0c;支持多种数据结构 Raw State 用户自己管理&#xff0c; 只支持byte Managed Staste 分为 Keyed State 和 operator State Managed State 只能在Keyed Str…

沁恒CH32V307VCT6开发板记录---kalrry

沁恒CH32V307VCT6开发板记录---kalrry 一、官网申请开发板二、环境准备图一 一、官网申请开发板 1.沁恒官网 二、环境准备 1.数据手册&#xff1a;CH32V307DS0.PDF&#xff0c;CH32FV2x_V3xRM.PDF 2.CH32V307评估板说明及参考应用例程&#xff1a;CH32V307EVT_ZIP 3.集成开…

Ubuntu18.04 下使用 Pybind11实现 C++ 调用 Python 函数和类的示例

Pybind11 是一个轻量级的库&#xff0c;它提供了在 C 中无缝集成 Python 代码的能力。使用 Pybind11&#xff0c;你可以很容易地从 C 调用 Python 代码&#xff0c;反之亦然。下面我将通过一个简单的例子来展示如何在 Ubuntu 系统上使用 Pybind11 从 C 调用 Python 接口。 安装…

上位机图像处理和嵌入式模块部署(qmacvisual二维码识别)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果说条形码在商品上使用比较多的话&#xff0c;那么二维码识别是一个更加使用频繁的场合。为什么使用这样频繁&#xff0c;我想很多一部分原因来…

Java开发:对象间复制属性,方法归纳

在Java开发中&#xff0c;对象间复制属性是一项常见的任务&#xff0c;特别是在处理层&#xff08;如控制器层&#xff09;与服务层或数据传输对象&#xff08;DTOs&#xff09;之间的数据转换时。有多种方法可以实现User对象到UserDTO对象的属性复制&#xff0c;下面列举了几种…

Ubuntu 安装谷歌拼音输入法

一、Fcitx 安装 在Ubuntu 下&#xff0c;谷歌拼音输入法是基于Fcitx输入法的。所以&#xff0c;首先需要安装Fcitx。一般来说&#xff0c;Ubuntu最新版中都默认安装了Fcitx&#xff0c;但是为了确保一下&#xff0c;我们可以在系统终端中运行如下命令&#xff1a; sudo apt ins…

Matlab|【EI复现】电动汽车集群并网的分布式鲁棒优化调度模型

目录 1 内容简介 2 关键知识点 2.1 三类电动汽车模型 3 程序结果 4 下载链接 1 内容简介 电动汽车的数据模型种类繁多&#xff0c;但是用到比较高阶数学方法的并不多&#xff0c;本次分享的程序是下图所示的文章。 采用分布鲁棒优化模型&#xff0c;用到鲁棒对等转换&…