Milvusベクターデータベースはどのようにデータセキュリティを確保しているのか?
カバー画像
Milvus2.1では、データの安全性を考慮し、ユーザー認証とTLS(トランスポートレイヤーセキュリティ)接続が正式に利用できるようになりました。ユーザー認証がない場合、SDKを使えば誰でもベクターデータベースの全てのデータにアクセスすることができます。しかし、Milvus 2.1からは、有効なユーザ名とパスワードを持つ者のみがMilvusベクトルデータベースにアクセスすることができます。また、Milvus 2.1では、データのセキュリティがTLSによってさらに保護され、コンピュータネットワークにおける安全な通信が保証されています。
本稿では、Milvusベクトルデータベースがユーザー認証とTLS接続によってどのようにデータセキュリティを確保しているかを分析し、ベクトルデータベースを使用する際にデータセキュリティを確保したいユーザーとして、この2つの機能をどのように活用できるかを説明することを目的とする。
戻る
データベースのセキュリティとは何ですか?
データベースのセキュリティとは、データベース内のすべてのデータが安全であり、機密が保持されることを保証するために取られる措置のことを指します。Twitter、Marriott、Texas Department of Insuranceなどにおける最近のデータ漏洩事件は、データ・セキュリティの問題に対する私たちの警戒心をより強くしています。これらの事件はすべて、データが十分に保護され、使用しているデータベースが安全でなければ、企業やビジネスが深刻な損失を被る可能性があることを常に私たちに思い起こさせる。
Milvusベクターデータベースはどのようにデータセキュリティを確保しているのでしょうか?
Milvus 2.1では、認証と暗号化によりデータベースの安全性を確保しています。具体的には、アクセスレベルでは、Milvusはデータベースにアクセスできるユーザを制御するための基本的なユーザ認証をサポートしています。一方、データベースレベルでは、Milvusはデータ通信を保護するためにトランスポートレイヤセキュリティ(TLS)暗号化プロトコルを採用しています。
ユーザ認証
Milvusの基本的なユーザ認証機能は、データセキュリティのためにユーザ名とパスワードを使用してベクトルデータベースにアクセスすることをサポートします。つまり、クライアントは認証されたユーザ名とパスワードを提供した場合のみ、Milvusインスタンスにアクセスすることができます。
Milvusベクトルデータベースにおける認証ワークフロー
すべてのgRPCリクエストはMilvusプロキシによって処理されるため、認証はプロキシによって行われます。Milvusインスタンスに接続するための認証情報でログインするワークフローは以下の通りです。
- Milvusインスタンスごとに認証情報を作成し、暗号化したパスワードをetcdに保存する。MilvusはProvosとMazièresの適応型ハッシュアルゴリズムを実装しているため、暗号化にはbcryptを使用する。
- クライアント側では、Milvusサービスに接続する際にSDKが暗号文を送信する。Base64暗号文(
: )はキー authorization
でメタデータに添付される。 - Milvusプロキシはリクエストをインターセプトし、クレデンシャルを検証する。
- 認証情報はプロキシにローカルにキャッシュされる。
authetication_workflow
クレデンシャルが更新されると、Milvus のシステムワークフローは以下のようになる。
- insert、query、deleteのAPIが呼ばれた場合、root coordがクレデンシャルを担当する。
- パスワードを忘れたなどの理由でクレデンシャルを更新すると、新しいパスワードがetcdに永続化される。すると、プロキシのローカルキャッシュにある古い認証情報はすべて無効になる。
- 認証インターセプターは、まずローカルキャッシュからレコードを探します。キャッシュ内の認証情報が正しくない場合、ルートコーデ ィネートから最新のレコードをフェッチするためのRPCコールがトリガされる。そして、ローカルキャッシュのクレデンシャルはそれに応じて更新される。
クレデンシャル更新ワークフロー
Milvusベクターデータベースのユーザー認証の管理方法
認証を有効にするには、まずMilvusの設定ファイルmilvus.yaml
でcommon.security.authorizationEnabled
をtrue
に設定する必要があります。
認証を有効にすると、Milvusインスタンスにrootユーザが作成されます。このrootユーザは、初期パスワードMilvus
、Milvusベクターデータベースに接続することができます。
from pymilvus import connections
connections.connect(
alias='default',
host='localhost',
port='19530',
user='root_user',
password='Milvus',
)
Milvusを初めて起動する際には、rootユーザのパスワードを変更することを強くお勧めします。
その後、rootユーザはさらに新しいユーザを作成するために以下のコマンドを実行することにより、認証されたアクセスのための新しいユーザを作成することができます。
from pymilvus import utility
utility.create_credential('user', 'password', using='default')
新規ユーザを作成する際に覚えておくべきことが2つあります:
新しいユーザー名は32文字以内で、必ず文字で始めること。ユーザー名にはアンダースコア、アルファベット、数字のみを使用できます。例えば、「2abc!
パスワードの長さは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は証明書を使用して、2つ以上の通信当事者間で認証サービスを提供します。
MilvusベクターデータベースでTLSを有効にする方法
MilvusでTLSを有効にするには、まず以下のコマンドを実行し、証明書を生成するための2つのファイルを用意する必要があります。openssl.cnf
という名前のデフォルトのOpenSSL設定ファイルと、関連する証明書を生成するために使用されるgen.sh
という名前のファイルです。
mkdir cert && cd cert
touch openssl.cnf gen.sh
次に、ここで提供する設定を2つのファイルにコピー・アンド・ペーストするだけです。あるいは、私たちの設定をもとに、あなたのアプリケーションにより適した修正を加えることもできます。
2つのファイルの準備ができたら、gen.sh
ファイルを実行して、9つの証明書ファイルを作成できます。同様に、9つの証明書ファイルの設定を必要に応じて変更することもできます。
chmod +x gen.sh
./gen.sh
MilvusサービスにTLSで接続する前に、最後のステップがあります。tlsEnabled
をtrue
に設定し、server.pem
、server.key
、ca.pem
のファイルパスをconfig/milvus.yaml
に設定する必要があります。下記のコードはその一例です。
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 StartedLike the article? Spread the word