# ロールベースのアクセス制御(RBAC)

NOTE

このガイドは、DBバージョン0.9.6以降にのみ適用されます。

クラスタを作成した後、最も高いアクセス制御権限を持つクラスタ管理者として扱われます。

TIP

クラスタ管理者のユーザ名とパスワードの詳細な検索手順については、接続の詳細を参照してください。

クラスタを他のユーザと共有したり、特定の個人に読み取り専用アクセスを提供するために、MyScaleのロールベースのアクセス制御(RBAC)機能を利用して、複数のユーザ間でのデータ共有を管理することができます。

NOTE

MyScaleのRBAC機能で作成されたユーザは、Webコンソールのユーザとは関連付けられていません。

# MyScale RBAC: なぜ重要なのか?

データベース内のユーザを分離し、各ユーザのデータへのアクセスを制限することは、ベストプラクティスとされており、以下の方法で実現されます。

  • 各ユーザごとに別々のデータベースを作成し、ユーザ名に基づいて名前を付ける
  • 対応するデータベースに対してそのユーザに対するすべての権限を付与する

このアプローチにより、ユーザは自分のデータベースで操作を行うことができます。たとえば、テーブルの作成、データのクエリ、テーブルの削除、テーブル構造の変更などです。他のユーザには影響を与えずに操作を行うことができます。データベース管理者は、単一のデータベース内でテーブルの作成やクエリの実行のために、個々のユーザに対して個別に権限を付与する必要はありません。

これにより、新しいテーブルが作成されるたびにユーザにクエリ権限を割り当てる必要がなくなり、管理オーバーヘッドが削減され、不正なユーザがデータベースにアクセスできないようになります。特定のユーザ間でデータ共有が必要な場合、管理者は特定のデータベースやテーブルに対して他のユーザに読み取り専用の権限を付与することができます。

# MyScale RBACを使用してユーザのアクセス制御を管理する

ユーザのアクセス制御を管理するためにMyScale RBACを使用する方法を説明する前に、次のユースケースを見てみましょう。

ある文書検索会社の部門がMyScaleにデータを格納しているとします。各部門には、部門のデータに対する読み書き権限を持つ複数の管理者がいます。他の部門のユーザは、SQLとベクトル検索クエリを使用して、このデータに対して読み取り専用の権限を持ちます。

TIP

特定の部門のデータを他の部門と共有する必要がある場合もあります。

access_managementの権限を持つクラスタ管理者は、すべてのユーザとロールのロールベースのアクセス権限を管理する責任があります。これには、データベースやデータベーステーブルの作成とアクセスの付与などのタスクが含まれます。

クラスタ管理者がMyScaleでRBAC(ロールベースのアクセス制御)を使用してデータベースへのアクセスを管理する方法を見てみましょう。

# クラスタ管理者としてログインする

最初のステップは、クラスタ管理者としてMyScaleにログインすることです。以下のオプションのいずれかを使用して、クラスタ管理者としてMyScaleにログインします。

  • MyScaleのWebコンソールのSQLワークスペースを使用して、クラスタ管理者としてすべてのクエリを実行することができます。
  • Pythonクライアントなどの開発者ツールを使用し、Pythonコードにクラスタ管理者のユーザ名とパスワードを挿入します。

以下のシナリオでは、クラスタ管理者がMyScale RBACを使用してデータベースへのアクセスを管理する方法を説明します。

# シナリオ1

このシナリオでは、クラスタ管理者が次のタスクを実行します。

  • department_Adepartment_Bの2つのデータベースを作成します。
  • 各部門データベースの管理者ユーザを作成します。
  • 権限を次のように設定します。
    • 各部門の管理者ユーザに、それぞれのデータベースに対する読み書き(またはフル)アクセス権限を付与します。
    • Department A/Bのユーザに、他のデータベースに対するアクセス権限を付与しません。

その後、データベース管理者は各自のデータベースでテーブルを作成することができます。

このプロセスを繰り返すには、次の手順を実行します。

# データベースの作成

クラスタ管理者アカウントを使用してMyScaleにログインし、次のSQLステートメントで部門Aと部門Bの管理者ユーザを作成します。

TIP

ユーザアカウントを作成する際には、パスワードのセキュリティのためにSHA256_hashメソッドを使用してください。

-- 部門Aのデータベースと対応する管理者ユーザを作成します。
CREATE DATABASE department_A ON CLUSTER '{cluster}';
-- 部門Aの管理者のパスワードは123456@Qwertyです。
CREATE USER department_A_admin ON CLUSTER '{cluster}' IDENTIFIED WITH sha256_hash BY 'eccd885c4d63d89a91ee6f3f8f9f4aa1010c0e1f84b97c9d9954768ba5cc478b' DEFAULT DATABASE department_A;
-- 部門Bのデータベースと対応する管理者ユーザを作成します。
CREATE DATABASE department_B ON CLUSTER '{cluster}';
-- 部門Bの管理者のパスワードは123456#Qwertyです。
CREATE USER department_B_admin ON CLUSTER '{cluster}' IDENTIFIED WITH sha256_hash BY '23f356509386377ebdc7298241fdce8cdef594353cd3ef787802dd86526130c5' DEFAULT DATABASE department_B;
-- 対応する管理者ユーザにすべての権限を付与します。
GRANT ON CLUSTER '{cluster}' ALL ON department_A.* TO department_A_admin;
GRANT ON CLUSTER '{cluster}' ALL ON department_B.* TO department_B_admin;

TIP

管理者権限よりも低い権限を持つユーザは自分自身のパスワードを設定することができないため、ユーザにアカウントを設定する前に、こちらのジェネレータ (opens new window)などのジェネレータを使用してパスワードをハッシュ化するようにユーザに依頼してください。パスワードは、ClickHouseが指定する最小要件を満たす必要があります。詳細はこちら (opens new window)を参照してください。

# 部門Aのテーブルの作成

開発者ツールを使用して、ユーザdepartment_A_adminとしてMyScaleにログインし、department_A.chatPDF_metaテーブルを作成します。

NOTE

部門Aの管理者は、このユーザはMyScale RBACを使用して作成されたため、Webコンソールではなく、開発者ツールを使用してログインする必要があります。

-- テーブルを作成します。
CREATE TABLE department_A.chatPDF_meta (
    `pdf` String, 
    `title` String, 
    `authors` Array(String), 
    `abstract` String, 
    `pub_date` Nullable(Date32), 
    `doi` String, 
    `publisher` String, 
    `article_type` String, 
    `vector` Array(Float32), 
    VECTOR INDEX vec_idx vector TYPE MSTG('metric_type=Cosine'), 
    CONSTRAINT vec_len CHECK length(vector) = 512
  ) ENGINE = ReplacingMergeTree ORDER BY pdf SETTINGS index_granularity = 8192;

NOTE

部門の管理者以外のユーザは、このテーブルのデータを表示または操作することはできません。

# 他のユーザへのアクセス権限の付与

クラスタ管理者としてMyScaleにログインし、次のSQLステートメントを実行して、他のユーザにアクセス権限を付与します。この例では、ユーザU1にSELECT権限を付与します。

-- 部門Aに読み取り専用ユーザU1を追加します。
CREATE USER department_A_U1 ON CLUSTER '{cluster}' IDENTIFIED WITH sha256_hash BY '20388ae66ef3c7e13dc5fe9b3808637c2d89a517d46276a7ba19bbaa488c5e78' DEFAULT DATABASE department_A;
-- ユーザU1にSELECT権限を付与します。
GRANT ON CLUSTER '{cluster}' SELECT ON department_A.chatPDF_meta TO department_A_U1;

NOTE

このSQLステートメントが正常に実行された後、部門AのユーザU1はdepartment_A.chatPDF_metaテーブルのデータを表示および選択する権限を持つようになります。

# シナリオ2

部門AのユーザU1は、chatPDF_metaテーブルに対して読み取り専用の権限しか持っていません。しかし、ユーザU1がこのテーブルのデータを更新する必要がある場合、このユーザに読み書き権限を付与することができます。

NOTE

この時点では、データの誤って削除を防ぐために、ユーザU1はdepartment_A.chatPDF_metaテーブルからデータを削除することはできません。

# ALTER TABLE権限の付与

クラスタ管理者としてMyScaleにログインし、ユーザU1にALTER TABLE権限を付与します。

-- ユーザU1にALTER TABLE権限を付与します。
GRANT ON CLUSTER '{cluster}' ALTER TABLE ON department_A.chatPDF_meta TO department_A_U1;

これで、ユーザU1はchatPDF_metaテーブルでALTER操作を実行することができます。

これらの権限を取り消すには、クラスタ管理者としてMyScaleに再度ログインし、次のSQLステートメントを実行します。

REVOKE ON CLUSTER '{cluster}' ALTER TABLE ON department_A.chatPDF_meta FROM department_A_U1;

# シナリオ3

最初に、部門Aの管理者は、データテーブルchatPDF_userを作成し、部門内のユーザや外部のユーザにアクセス権限を付与しませんでした。その結果、これらのユーザはこのテーブルのデータに対して何のCRUD操作も行うことができません。

たとえば:

  • 部門AのユーザU1は、chatPDF_userテーブルのデータを表示したり、操作したりすることはできません。

    department_A_U1 :) SHOW TABLES FROM department_A;
    ┌─name─────────┐
    │ chatPDF_meta │
    └──────────────┘
    
  • 部門Bの管理者は、chatPDF_userテーブルのデータを表示したり、操作したりすることはできません。

    department_B_admin :) SHOW TABLES FROM department_A;
    Ok.
    0 rows in set. Elapsed: 0.002 sec.
    

# シナリオ4

部門または部門の複数のユーザが、テーブル/データベース内のデータにアクセスする必要がある場合、個々のユーザに対して個別にアクセス権限を付与する必要はありません。異なる操作権限をグループ化し、それらをロールを使用して管理することが一般的です。最初のステップは、これらのユーザロールを作成することです。ユーザロールが作成されたら、次のステップは、ユーザをグループ化し、対応するロールに追加することです。

# ロールの作成

クラスタ管理者としてMyScaleにログインし、次のSQLステートメントに従って必要なロールを作成し、各ロールに対して権限を付与します。

-- 部門A内の異なるロールを作成します。
CREATE ROLE department_A_role_1 ON CLUSTER '{cluster}';
CREATE ROLE department_A_role_2 ON CLUSTER '{cluster}';
-- 要件に基づいて、異なるロールに対して対応する権限を付与します。
GRANT ON CLUSTER '{cluster}' SELECT ON department_A.chatPDF_meta TO department_A_role_1;
GRANT ON CLUSTER '{cluster}' SELECT, INSERT ON department_A.chatPDF_meta TO department_A_role_2;
GRANT ON CLUSTER '{cluster}' SELECT, INSERT, ALTER TABLE ON department_A.chatPDF_user TO department_A_role_2;

# ユーザをロールに追加する

部門Aに新しいユーザU2を追加する場合、ユーザにchatPDF_userおよびchatPDF_metaテーブルに対する読み書き権限を付与するために、ロールをユーザに付与します。

たとえば:

-- 単にU2をdepartment_A_role_2ロールに追加します。
GRANT ON CLUSTER '{cluster}' department_A_role_2 TO department_A_U2;

# シナリオ5

QUOTA機能を使用して、ユーザのクォータとリソース利用を制限することができます。たとえば、特定のロールに対して最大実行時間や最大クエリ数の制限を設定することができます。

クラスタ管理者としてMyScaleにログインし、クォータを作成し、ロールにクォータを付与します。

CREATE QUOTA department_A_quota_role1 ON CLUSTER '{cluster}' FOR INTERVAL 30 minute MAX execution_time = 0.5, FOR INTERVAL 5 quarter MAX queries = 321 TO department_A_role_1;