ロールへの特権または特権グループの付与
ロールを作成すると、そのロールに特権を付与することができます。このガイドでは、ロールに特権または特権グループを付与する方法を紹介します。
ロールへの特権または特権グループの付与
Milvus 2.5では、付与操作を効率化する新しいバージョンのAPIが導入されました。ロールに権限を付与する際に、オブジェクトタイプを調べる必要がなくなりました。以下にパラメータとその説明を示します。
role_name:特権または特権グループを付与する対象となるロールの名前です。
リソース:特定のインスタンス、データベース、コレクションを指定することができます。
以下の表では、client.grantV2() メソッドでリソースを指定する方法を説明します。
レベル |
リソース |
付与方法 |
注意事項 |
|---|---|---|---|
コレクション |
特定のコレクション |
|
対象となるコレクションの名前と、対象となるコレクションが属するデータベースの名前を入力します。 |
特定のデータベース下のすべてのコレクション |
|
対象のデータベース名と、コレクション名としてワイルドカード |
|
データベース |
特定のデータベース |
|
対象のデータベース名と、コレクション名としてワイルドカード |
現在のインスタンス配下のすべてのデータベース |
|
データベース名として |
|
インスタンス |
現在のインスタンス |
|
データベース名として |
特権:ロールに付与する必要のある特定の権限または権限グループ。現在、Milvusでは56種類の権限を付与することができます。下の表はMilvusの権限の一覧です。
下表のタイプ列は権限の検索を容易にするためのものであり、分類の目的のみに使用されます。権限を付与する際、タイプを理解する必要はありません。対応する権限を入力するだけです。
タイプ
権限
説明
クライアント側の関連APIの説明
データベース権限
データベースの一覧表示
現在のインスタンスのすべてのデータベースを表示する
データベースの詳細を表示する
データベースの詳細を表示する
データベースの作成
データベースを作成する
データベースの削除
データベースを削除する
データベースの変更
データベースのプロパティを変更する
コレクション権限
GetFlushState
コレクションのフラッシュ操作のステータスを確認する
GetLoadState
コレクションのロード状態を確認する
GetLoadingProgress
コレクションのロード進行状況を確認する
コレクションの表示
コレクション権限ですべてのコレクションを表示する
エイリアス一覧
コレクションのエイリアスをすべて表示する
コレクションの説明
コレクションの詳細を表示
エイリアスの一覧
エイリアスの詳細を表示
GetStatistics
コレクションの統計情報を取得します (例:コレクション内のエンティティ数)。
CreateCollection
コレクションを作成する
コレクションの削除
コレクションを削除する
ロード
コレクションをロードする
解放
コレクションを解放する
フラッシュ
コレクション内のすべてのエンティティを密封されたセグメントに永続化する。フラッシュ操作の後に挿入されたエンティティは、新しいセグメントに格納されます。
コンパクション
手動でコンパクションをトリガする
コレクションの名前の変更
コレクション名の変更
エイリアスの作成
コレクションのエイリアスを作成する
エイリアスの削除
コレクションのエイリアスを削除する
FlushAll
データベース内のすべてのコレクションをフラッシュします
パーティション特権
HasPartition
パーティションが存在するかチェックする
パーティションの表示
コレクション内のすべてのパーティションを表示する
パーティションの作成
パーティションを作成する
パーティションの削除
パーティションを削除する
インデックスの権限
インデックスの詳細
インデックスの詳細を表示する
インデックスの作成
インデックスの作成
インデックスの削除
インデックスの削除
リソース管理権限
ロードバランス
ロードバランスを実現する
リソースグループの作成
リソースグループの作成
リソースグループの削除
リソースグループの削除
リソースグループの更新
リソースグループの更新
リソースグループの詳細表示
リソースグループの詳細を表示する
リソースグループの一覧
現在のインスタンスの全てのリソースグループを表示
転送ノード
リソースグループ間のノード転送
トランスファーレプリカ
リソースグループ間でレプリカを転送
バックアップRBAC
現在のインスタンスのすべてのRBAC関連操作のバックアップを作成する
バックアップRBAC
リストアRBAC
現在のインスタンスのすべてのRBAC関連操作のバックアップをリストアする
リストアRBAC
エンティティ権限
クエリ
クエリを実行する
検索
検索を行う
挿入
エンティティの挿入
削除
エンティティの削除
アップサート
エンティティのアップサート
インポート
エンティティの一括挿入またはインポート
RBAC権限
オーナーシップの作成
ユーザーまたはロールの作成
ユーザの更新
ユーザーのパスワードを更新する
所有権の削除
ユーザのパスワードまたはロールを削除する
オーナーシップの選択
特定のロールが付与されているすべてのユーザーを表示
オーナーシップの管理
ユーザーまたはロールの管理、またはユーザーへのロールの付与
ユーザ選択
ユーザーに付与されたすべてのロールを表示
特権グループの作成
特権グループの作成
特権グループの削除
特権グループの削除
特権グループの一覧表示
現在のインスタンスのすべての特権グループを表示
特権グループの操作
特権グループへの特権の追加または特権グループからの特権の削除
以下の例では、default データベース下のcollection_01 で特権PrivilegeSearch を付与する方法と、privilege_group_1 という特権グループをrole_a というロールに付与する方法を示します。
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.grant_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("Search")
.collectionName("collection_01")
.dbName("default")
.build());
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("privilege_group_1")
.collectionName("collection_01")
.dbName("default")
.build());
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("ClusterReadOnly")
.collectionName("*")
.dbName("*")
.build());
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: "localhost:19530",
APIKey: "root:Milvus",
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
defer client.Close(ctx)
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "Search", "default", "collection_01"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "privilege_group_1", "default", "collection_01"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "ClusterReadOnly", "*", "*"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "Search"
collection_name: 'collection_01'
db_name: 'default',
});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "privilege_group_1"
collection_name: 'collection_01'
db_name: 'default',
});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "ClusterReadOnly"
collection_name: '*'
db_name: '*',
});
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "privilege_group_1",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'
ロールの記述
次の例では、describe_role メソッドを使用して、ロールrole_a に付与された権限を表示する方法を示します。
from pymilvus import MilvusClient
client.describe_role(role_name="role_a")
import io.milvus.v2.service.rbac.response.DescribeRoleResp;
import io.milvus.v2.service.rbac.request.DescribeRoleReq
DescribeRoleReq describeRoleReq = DescribeRoleReq.builder()
.roleName("role_a")
.build();
DescribeRoleResp resp = client.describeRole(describeRoleReq);
List<DescribeRoleResp.GrantInfo> infos = resp.getGrantInfos();
import "github.com/milvus-io/milvus/client/v2/milvusclient"
role, err := client.DescribeRole(ctx, milvusclient.NewDescribeRoleOption("role_a"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
await client.describeRole({roleName: 'role_a'});
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a"
}'
以下は出力例です。
{
"role": "role_a",
"privileges": [
{
"collection_name": "collection_01",
"db_name": "default",
"role_name": "role_a",
"privilege": "Search",
"grantor_name": "root"
},
"privilege_group_1"
]
}
ロールから権限または権限グループを取り消す
次の例は、default データベース下のcollection_01 の特権PrivilegeSearch と、role_a ロールに付与された特権グループprivilege_group_1 を取り消す方法を示しています。
client.revoke_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("Search")
.collectionName("collection_01")
.dbName("default")
.build());
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("privilege_group_1")
.collectionName("collection_01")
.dbName("default")
.build());
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("ClusterReadOnly")
.collectionName("*")
.dbName("*")
.build());
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "Search", "collection_01").
WithDbName("default"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "privilege_group_1", "collection_01").
WithDbName("default"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "ClusterReadOnly", "*").
WithDbName("*"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
await client.revokePrivilegeV2({
role: 'role_a',
privilege: 'Search',
collection_name: 'collection_01',
db_name: 'default'
});
await client.revokePrivilegeV2({
role: 'role_a',
collection_name: 'collection_01',
privilege: 'Search',
db_name: 'default'
});
await client.revokePrivilegeV2({
role: 'role_a',
collection_name: '*',
privilege: 'ClusterReadOnly',
db_name: '*'
});
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'