Skip to main content
Edit this page

一般的なアクセス管理クエリ

セルフマネージド

セルフマネージドのClickHouseを使用している場合は、SQLユーザーとロールをご覧ください。

この記事では、SQLユーザーとロールを定義し、それらの特権と権限をデータベース、テーブル、行、カラムに適用する基本的な方法を示します。

管理ユーザー

ClickHouse Cloudサービスには、サービス作成時に作成されるdefaultという管理ユーザーがいます。パスワードはサービス作成時に提供され、Adminのロールを持つClickHouse Cloudユーザーによってリセットできます。

ClickHouse Cloudサービスに追加のSQLユーザーを追加する場合、そのユーザーにはSQLユーザー名とパスワードが必要です。管理レベルの特権を付与したい場合は、新しいユーザーにdefault_roleロールを割り当ててください。例えば、ユーザーclickhouse_adminを追加します:

CREATE USER IF NOT EXISTS clickhouse_admin
IDENTIFIED WITH sha256_password BY 'P!@ssword42!';
GRANT default_role TO clickhouse_admin;
Note

SQLコンソールを使用する場合、SQLステートメントはdefaultユーザーとして実行されません。代わりに、sql-console:${cloud_login_email}という名前のユーザーとして実行され、cloud_login_emailはクエリを現在実行しているユーザーのメールアドレスです。

これらの自動生成されたSQLコンソールユーザーにはdefaultロールが付与されています。

パスワードなし認証

SQLコンソールには2つのロールが利用可能です: sql_console_admindefault_roleと同じ権限を持ち、sql_console_read_onlyは読み取り専用の権限を持ちます。

管理ユーザーにはデフォルトでsql_console_adminロールが割り当てられているため、何も変更はありません。ただし、sql_console_read_onlyロールを使用すると、管理者でないユーザーでも読み取り専用または完全なアクセス権を任意のインスタンスに割り当てることができます。管理者がこのアクセスを設定する必要があります。これらのロールはGRANTまたはREVOKEコマンドを使用してインスタンス固有の要件に合わせて調整できます。これらのロールに対する変更は永続化されます。

詳細なアクセス制御

このアクセス制御機能は、ユーザーレベルの詳細度で手動で設定することもできます。新しいsql_console_*ロールをユーザーに割り当てる前に、sql-console-role:<email>という名前空間に一致するSQLコンソールユーザー専用のデータベースロールを作成する必要があります。例えば:

CREATE ROLE OR REPLACE sql-console-role:<email>;
GRANT <some grants> TO sql-console-role:<email>;

一致するロールが検出されると、テンプレートロールではなく、そのユーザーに割り当てられます。より複雑なアクセス制御の設定が可能となり、例えばsql_console_sa_rolesql_console_pm_roleのようなロールを作成し、特定のユーザーに付与することができます。例えば:

CREATE ROLE OR REPLACE sql_console_sa_role;
GRANT <whatever level of access> TO sql_console_sa_role;
CREATE ROLE OR REPLACE sql_console_pm_role;
GRANT <whatever level of access> TO sql_console_pm_role;
CREATE ROLE OR REPLACE `sql-console-role:christoph@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:jake@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:zach@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:christoph@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:jake@clickhouse.com`;
GRANT sql_console_pm_role to `sql-console-role:zach@clickhouse.com`;

管理者権限のテスト

ユーザー default からログアウトし、ユーザー clickhouse_admin としてログインし直してください。

これらすべてが成功するはずです:

SHOW GRANTS FOR clickhouse_admin;
CREATE DATABASE db1
CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc');
SELECT * FROM db1.table1;
DROP TABLE db1.table1;
DROP DATABASE db1;

非管理者ユーザー

ユーザーは必要な権限を持ち、全員が管理者であるべきではありません。このドキュメントの残りの部分では、例のシナリオと必要な役割を提供します。

準備

例で使用されるテーブルとユーザーを作成します。

サンプルデータベース、テーブル、および行の作成

  1. テストデータベースを作成

    CREATE DATABASE db1;
  2. テーブルを作成

    CREATE TABLE db1.table1 (
    id UInt64,
    column1 String,
    column2 String
    )
    ENGINE MergeTree
    ORDER BY id;
  3. サンプル行でテーブルを埋める

    INSERT INTO db1.table1
    (id, column1, column2)
    VALUES
    (1, 'A', 'abc'),
    (2, 'A', 'def'),
    (3, 'B', 'abc'),
    (4, 'B', 'def');
  4. テーブルを確認する:

    SELECT *
    FROM db1.table1
    Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49

    ┌─id─┬─column1─┬─column2─┐
    │ 1 │ A │ abc │
    │ 2 │ A │ def │
    │ 3 │ B │ abc │
    │ 4 │ B │ def │
    └────┴─────────┴─────────┘
  5. 特定のカラムへのアクセスを制限することを示すために使用される通常のユーザーを作成:

    CREATE USER column_user IDENTIFIED BY 'password';
  6. 特定の値を持つ行へのアクセスを制限することを示すために使用される通常のユーザーを作成:

    CREATE USER row_user IDENTIFIED BY 'password';

役割の作成

この例を使って:

  • カラムや行、異なる権限のための役割を作成します
  • 役割に権限を付与します
  • ユーザーを各役割に割り当てます

役割は、各ユーザーを個別に管理する代わりに、特定の権限を持つユーザーのグループを定義するために使用されます。

  1. db1 データベースおよび table1 において、column1 のみを閲覧できるユーザーの役割を作成:

    CREATE ROLE column1_users;
  2. column1 のみが閲覧可能な権限を設定

    GRANT SELECT(id, column1) ON db1.table1 TO column1_users;
  3. column_user ユーザーを column1_users 役割に追加

    GRANT column1_users TO column_user;
  4. column1A を含む行のみを閲覧できるユーザーの役割を作成

    CREATE ROLE A_rows_users;
  5. row_userA_rows_users 役割に追加

    GRANT A_rows_users TO row_user;
  6. column1A の値を持つ行のみを閲覧可能とするポリシーを作成

    CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;
  7. データベースとテーブルへの権限を設定

    GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;
  8. 他の役割に対してもすべての行にアクセスできるように明示的な権限を付与

    CREATE ROW POLICY allow_other_users_filter 
    ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;
    Note

    テーブルにポリシーをアタッチすると、システムはそのポリシーを適用し、定義されたユーザーと役割のみがそのテーブルでの操作を行うことができます。その他のユーザーは操作を拒否されます。制限された行ポリシーが他のユーザーに適用されないようにするため、他のユーザーと役割が通常または他のタイプのアクセスを持つことを許可する別のポリシーを定義する必要があります。

検証

カラム制限ユーザーでの役割の権限テスト

  1. clickhouse_admin ユーザーでClickHouseクライアントにログイン

    clickhouse-client --user clickhouse_admin --password password
  2. 管理者ユーザーを使用して、データベース、テーブル、およびすべての行のアクセスを確認。

    SELECT *
    FROM db1.table1
    Query id: f5e906ea-10c6-45b0-b649-36334902d31d

    ┌─id─┬─column1─┬─column2─┐
    │ 1 │ A │ abc │
    │ 2 │ A │ def │
    │ 3 │ B │ abc │
    │ 4 │ B │ def │
    └────┴─────────┴─────────┘
  3. column_user ユーザーでClickHouseクライアントにログイン

    clickhouse-client --user column_user --password password
  4. すべてのカラムを使用した SELECT

    SELECT *
    FROM db1.table1
    Query id: 5576f4eb-7450-435c-a2d6-d6b49b7c4a23

    0 rows in set. Elapsed: 0.006 sec.

    Received exception from server (version 22.3.2):
    Code: 497. DB::Exception: Received from localhost:9000.
    DB::Exception: column_user: Not enough privileges.
    To execute this query it's necessary to have grant
    SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
    Note

    すべてのカラムが指定されたためアクセスが拒否されました。ユーザーは idcolumn1 のみへのアクセス権を持っています

  5. 指定されたカラムのみを用いた SELECT クエリを確認:

    SELECT
    id,
    column1
    FROM db1.table1
    Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9

    ┌─id─┬─column1─┐
    │ 1 │ A │
    │ 2 │ A │
    │ 3 │ B │
    │ 4 │ B │
    └────┴─────────┘

行制限ユーザーでの役割の権限テスト

  1. row_user でClickHouseクライアントにログイン

    clickhouse-client --user row_user --password password
  2. 利用可能な行を表示

    SELECT *
    FROM db1.table1
    Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb

    ┌─id─┬─column1─┬─column2─┐
    │ 1 │ A │ abc │
    │ 2 │ A │ def │
    └────┴─────────┴─────────┘
    Note

    上記の2行のみが返されることを確認し、column1B の値を持つ行は除外されるべきです。

ユーザーと役割の変更

ユーザーは必要な権限の組み合わせに対して複数の役割を割り当てることができます。複数の役割を使用する場合、システムは役割を組み合わせて権限を決定し、その結果、役割の権限が累積されます。

例えば、1つの role1column1 のみの選択を許可し、role2column1column2 の選択を許可する場合、ユーザーは両方のカラムにアクセスできます。

  1. 管理者アカウントを使用して、デフォルトの役割で行とカラムの両方を制限する新しいユーザーを作成

    CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
  2. A_rows_users 役割に対する以前の権限を削除

    REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
  3. A_row_users 役割に column1 のみの選択を許可

    GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
  4. row_and_column_user でClickHouseクライアントにログイン

    clickhouse-client --user row_and_column_user --password password;
  5. すべてのカラムでテスト:

    SELECT *
    FROM db1.table1
    Query id: 8cdf0ff5-e711-4cbe-bd28-3c02e52e8bc4

    0 rows in set. Elapsed: 0.005 sec.

    Received exception from server (version 22.3.2):
    Code: 497. DB::Exception: Received from localhost:9000.
    DB::Exception: row_and_column_user: Not enough privileges.
    To execute this query it's necessary to have grant
    SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
  6. 制限されたカラムでテスト:

    SELECT
    id,
    column1
    FROM db1.table1
    Query id: 5e30b490-507a-49e9-9778-8159799a6ed0

    ┌─id─┬─column1─┐
    │ 1 │ A │
    │ 2 │ A │
    └────┴─────────┘

トラブルシューティング

権限が交差または結合して予期しない結果を生む場合があります。次のコマンドを使用して管理者アカウントを使用して問題を絞り込むことができます。

ユーザーの権限と役割のリスト

SHOW GRANTS FOR row_and_column_user
Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b

┌─GRANTS FOR row_and_column_user───────────────────────────┐
│ GRANT A_rows_users, column1_users TO row_and_column_user │
└──────────────────────────────────────────────────────────┘

ClickHouse の役割のリスト

SHOW ROLES
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a

┌─name────────────┐
│ A_rows_users │
│ column1_users │
└─────────────────┘

ポリシーの表示

SHOW ROW POLICIES
Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc

┌─name───────────────────────────────────┐
│ A_row_filter ON db1.table1 │
│ allow_other_users_filter ON db1.table1 │
└────────────────────────────────────────┘

ポリシーがどのように定義されているかと現在の権限を表示

SHOW CREATE ROW POLICY A_row_filter ON db1.table1
Query id: 0d3b5846-95c7-4e62-9cdd-91d82b14b80b

┌─CREATE ROW POLICY A_row_filter ON db1.table1────────────────────────────────────────────────┐
│ CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

ロール、ポリシー、およびユーザーを管理するためのコマンドの例

次のコマンドを使用して:

  • 権限の削除
  • ポリシーの削除
  • ユーザーを役割から解除
  • ユーザーと役割の削除
Tip

これらのコマンドは管理者ユーザーまたは default ユーザーとして実行してください

役割からの権限を削除

REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users;

ポリシーを削除

DROP ROW POLICY A_row_filter ON db1.table1;

ユーザーを役割から解除

REVOKE A_rows_users FROM row_user;

役割を削除

DROP ROLE A_rows_users;

ユーザーを削除

DROP USER row_user;

要約

このドキュメントでは、SQLユーザーと役割の作成の基本を示し、ユーザーおよび役割の権限を設定および変更する手順を提供しました。それぞれの詳細情報については、ユーザーガイドおよびリファレンスドキュメントを参照してください。