RBACの有効化
RBACを有効にすることで、特定のMilvusリソース(コレクションやパーティションなど)へのアクセスを制御したり、ユーザの役割や権限に基づいてパーミッションを制御することができます。現在、この機能は Python と Java でのみ利用可能です。
このトピックでは、RBACを有効にし、ユーザとロールを管理する方法について説明します。
このページのコードスニペットでは、新しいMilvusClient(Python)を使用してMilvusと対話します。他の言語用の新しいMilvusClient SDKは今後のアップデートでリリースされる予定です。
1.Milvusクライアントを起動して接続を確立する
ユーザ認証を有効にした後、ユーザ名とパスワードで構成されるtoken
、Milvusインスタンスに接続します。デフォルトでは、Milvus はroot
ユーザとパスワードMilvus
を使用します。
from pymilvus import MilvusClient
client = MilvusClient(
uri='http://localhost:19530', # replace with your own Milvus server address
token='root:Milvus' # replace with your own Milvus server token
)
2.ユーザの作成
パスワードP@ssw0rd
でuser_1
というユーザーを作成します:
client.create_user(
user_name='user_1',
password='P@ssw0rd'
)
ユーザーを作成した後、次のことができます:
- ユーザーパスワードの更新.元のパスワードと新しいパスワードの両方を入力する必要があります。
client.update_password(
user_name='user_1',
old_password='P@ssw0rd',
new_password='P@ssw0rd123'
)
- すべてのユーザをリストアップする。
client.list_users()
# output:
# ['root', 'user_1']
- 特定のユーザーの役割をチェックする。
client.describe_user(user_name='user_1')
# output:
# {'user_name': 'user_1', 'roles': ()}
3.ロールの作成
以下の例では、roleA
という名前のロールを作成しています。
client.create_role(
role_name="roleA",
)
ロールを作成した後、以下のことができます:
- すべてのロールを一覧表示します。
client.list_roles()
# output:
# ['admin', 'public', 'roleA']
4.ロールへの権限の付与
以下の例では、roleA
という名前のロールにすべてのコレクションを検索する権限を付与する方法を示します。
object_type
、オブジェクトタイプを指定します。これはリソースタイプとしても理解できます。現在、有効な値はCollection/User/Globalなどで、Globalは特定のリソースタイプがないことを意味します。object_name
はリソース名です。objecttypeがCollectionの場合、object nameは特定のコレクション名を参照するか、*を使用してすべてのコレクションを指定することができます。objecttypeがGlobalの場合、オブジェクト名は*しか指定できません。付与できる他の種類の権限については、ユーザとロールを参照してください。
ロール権限を管理する前に、ユーザ認証が有効になっていることを確認してください。そうしないと、エラーが発生することがあります。ユーザ認証を有効にする方法については、「ユーザ・アクセスの認証」を参照してください。
# grant privilege to a role
client.grant_privilege(
role_name='roleA',
object_type='User', # value here can be Global, Collection or User, object type also depends on the API defined in privilegeName
object_name='user_1', # value here can be * or a specific user name if object type is 'User'
privilege='SelectUser'
)
ロールに権限を付与すると、以下のことが可能になります:
- ロールに付与された権限を表示する。
client.describe_role(
role_name='roleA'
)
# output:
# {'role': 'roleA',
# 'privileges': [{'object_type': 'User',
# 'object_name': 'user_1',
# 'db_name': 'default',
# 'role_name': 'roleA',
# 'privilege': 'SelectUser',
# 'grantor_name': 'root'}]}
5.ユーザにロールを付与する
ユーザにロールを付与し、このユーザがロールのすべての権限を継承できるようにします。
# grant a role to a user
client.grant_role(
user_name='user_1',
role_name='roleA'
)
ロールを付与した後、ロールが付与されたことを確認します:
client.describe_user(
user_name='user_1'
)
# output:
# {'user_name': 'user_1', 'roles': ('roleA')}
6.権限の取り消し
以下の操作は不可逆であるため、実行時には注意してください。
- ロールから権限を削除する。ロールに付与されていない権限を取り消すと、エラーが発生します。
client.revoke_privilege(
role_name='roleA',
object_type='User', # value here can be Global, Collection or User, object type also depends on the API defined in privilegeName
object_name='user_1', # value here can be * or a specific user name if object type is 'User'
privilege='SelectUser'
)
- ロールからユーザを削除してください。ユーザに付与されていないロールを取り消すと、エラーが発生します。
client.revoke_role(
user_name='user_1',
role_name='roleA'
)
- ロールを削除する。
client.drop_role(role_name='roleA')
- ユーザーを削除します。
client.drop_user(user_name='user_1')