🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI
  • Home
  • Blog
  • Milvus 向量数据库如何确保数据安全?

Milvus 向量数据库如何确保数据安全?

  • Engineering
September 05, 2022
Angela Ni

Cover image 封面图片

为充分考虑您的数据安全,用户认证和传输层安全(TLS)连接现已在 Milvus 2.1 中正式提供。如果没有用户身份验证,任何人都可以通过 SDK 访问向量数据库中的所有数据。不过,从 Milvus 2.1 开始,只有拥有有效用户名和密码的人才能访问 Milvus 向量数据库。此外,Milvus 2.1 还通过 TLS 进一步保护数据安全,确保计算机网络中的通信安全。

本文旨在分析 Milvus 向量数据库如何通过用户身份验证和 TLS 连接来确保数据安全,并说明作为用户在使用向量数据库时如何利用这两项功能来确保数据安全。

跳转到

什么是数据库安全?

数据库安全是指为确保数据库中所有数据的安全和保密而采取的措施。最近Twitter、万豪酒店和德克萨斯州保险部等发生的数据泄露事件让我们对数据安全问题更加警惕。所有这些案例不断提醒我们,如果数据没有得到很好的保护,如果使用的数据库不安全,公司和企业就会遭受严重损失。

Milvus 向量数据库如何确保数据安全?

在当前发布的 2.1 版中,Milvus 向量数据库试图通过身份验证和加密来确保数据库安全。更具体地说,在访问层面,Milvus 支持基本的用户身份验证,以控制谁可以访问数据库。同时,在数据库层面,Milvus 采用传输层安全(TLS)加密协议来保护数据通信。

用户身份验证

出于数据安全的考虑,Milvus 的基本用户认证功能支持使用用户名和密码访问向量数据库。这意味着客户只有在提供经过验证的用户名和密码后才能访问 Milvus 实例。

Milvus 向量数据库的验证工作流程

所有 gRPC 请求都由 Milvus 代理处理,因此身份验证由代理完成。使用凭据登录以连接 Milvus 实例的工作流程如下。

  1. 为每个 Milvus 实例创建凭据,加密后的密码存储在 etcd 中。Milvus 使用bcrypt进行加密,因为它实现了 Provos 和 Mazières 的自适应散列算法
  2. 在客户端,SDK 会在连接 Milvus 服务时发送密码文本。base64 密文(: )以密钥authorization 附加到元数据中。
  3. Milvus 代理拦截请求并验证凭据。
  4. 凭证缓存在代理服务器本地。

authetication_workflow 自动验证工作流程

更新证书时,Milvus 的系统工作流程如下

  1. 当调用插入、查询、删除 API 时,根协调员负责凭证。
  2. 当你因为忘记密码等原因更新证书时,新密码会被持久化到 etcd 中。然后,代理本地缓存中的所有旧凭证都会失效。
  3. 身份验证拦截器会首先从本地缓存中查找记录。如果缓存中的凭据不正确,就会触发 RPC 调用,从根协调器中获取最新记录。本地缓存中的凭据也会相应更新。

credential_update_workflow 凭证更新工作流程

如何在 Milvus 向量数据库中管理用户身份验证

要启用身份验证,首先需要在milvus.yaml 文件中配置 Milvus 时将common.security.authorizationEnabled 设置为true

启用后,将为 Milvus 实例创建一个根用户。这个根用户可以使用Milvus 的初始密码连接到 Milvus 向量数据库。

from pymilvus import connections
connections.connect(
    alias='default',
    host='localhost',
    port='19530',
    user='root_user',
    password='Milvus',
)

我们强烈建议在首次启动 Milvus 时更改根用户的密码。

然后,root 用户可以进一步创建更多新用户,通过运行以下命令创建新用户来进行身份验证访问。

from pymilvus import utility
utility.create_credential('user', 'password', using='default') 

创建新用户时要注意两点:

  1. 新用户名长度不能超过 32 个字符,必须以字母开头。用户名中只能包含下划线、字母或数字。例如,不接受 "2abc!"这样的用户名。

  2. 至于密码,长度应为 6-256 个字符。

设置好新凭证后,新用户就可以用用户名和密码连接到 Milvus 实例。

from pymilvus import connections
connections.connect(
    alias='default',
    host='localhost',
    port='19530',
    user='user',
    password='password',
)

与所有身份验证过程一样,您不必担心忘记密码。可以使用以下命令重置现有用户的密码。

from pymilvus import utility
utility.reset_password('user', 'new_password', using='default')

阅读Milvus 文档,了解有关用户身份验证的更多信息。

TLS 连接

传输层安全(TLS)是一种身份验证协议,为计算机网络提供通信安全。TLS 使用证书在两个或多个通信方之间提供身份验证服务。

如何在 Milvus 向量数据库中启用 TLS

要在 Milvus 中启用 TLS,首先需要运行以下命令来准备两个用于生成证书的文件:一个名为openssl.cnf 的默认 OpenSSL 配置文件和一个用于生成相关证书的名为gen.sh 的文件。

mkdir cert && cd cert
touch openssl.cnf gen.sh

然后,只需将我们提供的配置复制并粘贴到两个文件中即可。或者,你也可以根据我们的配置进行修改,以更好地适应你的应用。

两个文件准备就绪后,就可以运行gen.sh 文件来创建九个证书文件了。同样,你也可以根据自己的需要修改九个证书文件中的配置。

chmod +x gen.sh
./gen.sh

在使用 TLS 连接 Milvus 服务之前,还有最后一步。您必须将tlsEnabled 设置为true ,并在config/milvus.yaml 中为服务器配置server.pemserver.keyca.pem 的文件路径。下面的代码是一个示例。

tls:
  serverPemPath: configs/cert/server.pem
  serverKeyPath: configs/cert/server.key
  caPemPath: configs/cert/ca.pem

common:
  security:
    tlsEnabled: true

然后,只要在使用 Milvus 连接 SDK 时为客户端指定client.pem,client.key, 和ca.pem 的文件路径,就可以使用 TLS 连接 Milvus 服务了。下面的代码也是一个示例。

from pymilvus import connections

_HOST = '127.0.0.1'
_PORT = '19530'

print(f"\nCreate connection...")
connections.connect(host=_HOST, port=_PORT, secure=True, client_pem_path="cert/client.pem",
                        client_key_path="cert/client.key",
                        ca_pem_path="cert/ca.pem", server_name="localhost")
print(f"\nList connections:")
print(connections.list_connections())

下一步计划

随着 Milvus 2.1 的正式发布,我们准备了一系列介绍新功能的博客。请阅读本系列博客中的更多内容:

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

扩展阅读