涛声依旧在 发表于 2024-7-22 04:06:27

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

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


1. 背景

随着 AIGC 的发展,向量数据库已经成为一个重要的资源,可以高效地存储和检索大量的向量数据。向量数据库在必要相似性搜刮的各种应用中起着至关重要的作用,比方:作为推荐体系,基于内容的图像检索和个性化搜刮。通过使用向量数据库,我们可以有效地处理大规模的 Embedding 数据,从而支持各种AI和呆板学习应用。Qdrant 是一个开源的向量数据库,它提供了高效的向量索引和查询功能,以及便捷的 API 接口和多种语言的客户端库,如 Python、Go、Rust、.NET 和 Java 等。
在实际应用中,我们通常必要掩护向量数据库的访问安全,以防止未经授权的访问和数据泄漏。为了掩护向量数据库的访问安全,我们可以使用 TLS 协议对数据库的访问进行加密。本文将先容如何使用 Docker 摆设 Qdrant 向量数据库,以及其相关的安全配置,并演示如何使用 .NET 通过 TLS 安全访问 Qdrant 向量数据库。
https://img-blog.csdnimg.cn/direct/b049cf3d6e0f4a3aa0aa5cf10217f02d.png
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 向量数据库的安全选项。下面是安全相关的一些配置选项和发起:

[*] 修改端口:默认环境下,Qdrant 向量数据库的服务端口是 http 6333 和 grpc 6334。我们可以通过配置文件中的 service.http_port 和 service.grpc_port 选项来修改服务端口。
[*] 启用TLS:配置文件中的 service.enable_tls 和 cluster.p2p.enable_tls 默认为 false,这意味着服务和集群间的通信都是不加密的。可以将两个选项设置为 true,然后提供相应的证书文件路径,以启用安全的 TLS 通信。必要在 tls 部门提供服务器证书(cert)、服务器私钥(key)和证书颁发机构证书(ca_cert)。
[*] 设置API密钥:配置文件中的 service.api_key 和 service.read_only_api_key ,启用后可以进行 API 认证。设置一个复杂的 API 密钥,以便只有拥有密钥的客户端才能访问服务。这个密钥分为读写密钥和只读密钥,可以根据必要进行设置。
[*] 验证HTTPS客户端证书:配置文件中的 service.verify_https_client_certificate 也可以启用,服务会验证 HTTPS 客户端的证书。如许可以增加一个额外的安全层,服务端会要求客户端也提供一个有效的证书。
[*] 限定CORS:配置文件中的 service.enable_cors 默认为 true,这可能会导致跨站请求伪造(CSRF)攻击。如果条件允许则应该思量限定 CORS,允许来自可信泉源的请求。
[*] 限定并发更新:配置文件中的 storage.performance.update_rate_limit 默认为 null,服务没有限定并发更新的数量。正式环境应该设置一个合理的限定,以防止拒绝服务(DoS)攻击。
[*] 关闭遥测:配置文件中的 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 工具生成自署名的证书,这里不再赘述。
演示这里我使用的是自己搭建的私有证书颁发机构,生成的证书。这里我使用了二级证书颁发机构,签发的服务器证书和客户端证书都是由二级证书颁发机构签发的。
https://img-blog.csdnimg.cn/direct/16e22af150af4eeb8da6c43ddfffd2d1.png
对于客户端证书,我们必要将客户端证书和客户端私钥放在一个文件中,可以直接生成一个 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/data、path/to/tls 和 path/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,无法访问管理后台。
https://img-blog.csdnimg.cn/direct/b403e6363c7146b9967071d717b9fe70.png
此时我们必要双击打开客户端证书 client.pfx,然后根据提示安装证书,中间必要输入暗码,其他一起默认即可:
https://img-blog.csdnimg.cn/direct/6c67a356db074f0bb90a7d2c4eebcd39.png
安装完成后,我们直接刷新页面,会提示选择证书:
https://img-blog.csdnimg.cn/direct/c35e784353694d61a79c98cf46cee54e.png
选择证书确认后,即可访问管理后台。
https://img-blog.csdnimg.cn/direct/5f7713ddefb64c75ab923c85a54e9250.png
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 向量数据库。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Qdrant 向量数据库的摆设以及如何在 .NET 中使用 TLS 安全访问