メインコンテンツまでスキップ
メインコンテンツまでスキップ

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

セルフマネージド

セルフマネージドの 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;
注記

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:[email protected]`;
CREATE ROLE OR REPLACE `sql-console-role:[email protected]`;
CREATE ROLE OR REPLACE `sql-console-role:[email protected]`;
GRANT sql_console_sa_role to `sql-console-role:[email protected]`;
GRANT sql_console_sa_role to `sql-console-role:[email protected]`;
GRANT sql_console_pm_role to `sql-console-role:[email protected]`;

テスト管理者権限

ユーザー 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;

非管理者ユーザー

ユーザーは必要な権限を持っているべきであり、全員が管理者ユーザーであってはいけません。この文書の残りの部分では、例示的なシナリオと必要な役割を提供します。

準備

例で使用するために、これらのテーブルとユーザーを作成します。

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

テストデータベースの作成
CREATE DATABASE db1;
テーブルの作成
CREATE TABLE db1.table1 (
   id UInt64,
   column1 String,
   column2 String
)
ENGINE MergeTree
ORDER BY id;
サンプル行を使ってテーブルをポピュレートする
INSERT INTO db1.table1
   (id, column1, column2)
VALUES
   (1, 'A', 'abc'),
   (2, 'A', 'def'),
   (3, 'B', 'abc'),
   (4, 'B', 'def');
テーブルを検証する
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     │
└────┴─────────┴─────────┘
column_user を作成する

特定のカラムへのアクセスを制限するために使われる通常のユーザーを作成します:

CREATE USER column_user IDENTIFIED BY 'password';
row_user を作成する

特定の値を持つ行へのアクセスを制限するために使われる通常のユーザーを作成します:

CREATE USER row_user IDENTIFIED BY 'password';

役割の作成

この例に基づいて:

  • カラムや行に対するさまざまな権限のための役割が作成されます
  • 権限が役割に付与されます
  • ユーザーが各役割に割り当てられます

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

  1. データベース db1 のテーブル table1column1 のみを表示できるようにこの役割のユーザーを制限する役割を作成します:
CREATE ROLE column1_users;
  1. column1 の表示を許可する権限を設定します
GRANT SELECT(id, column1) ON db1.table1 TO column1_users;
  1. column_user ユーザーを column1_users 役割に追加します
GRANT column1_users TO column_user;
  1. この役割のユーザーを選択された行、つまり column1'A' を含む行のみを見ることができるように制限する役割を作成します
CREATE ROLE A_rows_users;
  1. row_userA_rows_users 役割に追加します
GRANT A_rows_users TO row_user;
  1. column1A の値を持っている場所のみを表示するポリシーを作成します
CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;
  1. データベースとテーブルに対する権限を設定します
GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;
  1. 他の役割がすべての行にアクセスできるように明示的な権限を付与します
CREATE ROW POLICY allow_other_users_filter 
ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;
注記

テーブルにポリシーを添付すると、システムはそのポリシーを適用し、定義されたユーザーと役割のみがテーブルで操作を行うことができます。他のユーザーはすべての操作を拒否されます。他のユーザーや役割に通常または他の種類のアクセスを許可するためには、別のポリシーを定義する必要があります。

検証

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

  1. clickhouse_admin ユーザーを使用して ClickHouse クライアントにログインします
clickhouse-client --user clickhouse_admin --password password
  1. 管理者ユーザーでデータベース、テーブル、すべての行へのアクセスを確認します。
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     │
└────┴─────────┴─────────┘
  1. column_user ユーザーを使用して ClickHouse クライアントにログインします
clickhouse-client --user column_user --password password
  1. すべてのカラムを使用した 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)
注記

すべてのカラムが指定されたため、アクセスが拒否され、ユーザーは idcolumn1 のみにアクセスできます。

  1. 指定されたカラムのみを使用した 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
  1. 利用可能な行を表示します
SELECT *
FROM db1.table1
Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb

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

上記の2行のみが返されることを確認します。column1 に値 B の行は除外されるべきです。

ユーザーと役割の修正

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

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

  1. 管理者アカウントを使用して、デフォルトの役割で行とカラムの両方で制限された新しいユーザーを作成します
CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
  1. A_rows_users 役割の以前の権限を削除します
REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
  1. A_row_users 役割が column1 からのみ選択できるようにします
GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
  1. row_and_column_user を使用して ClickHouse クライアントにログインします
clickhouse-client --user row_and_column_user --password password;
  1. すべてのカラムでテストします:
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)
  1. 限定された許可されたカラムでテストします:
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 │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

役割、ポリシー、ユーザーを管理するための例コマンド

以下のコマンドを使用できます:

  • 権限を削除する
  • ポリシーを削除する
  • ユーザーを役割から割り当て解除する
  • ユーザーと役割を削除する
ヒント

これらのコマンドは管理者ユーザーまたは 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 ユーザーと役割を作成する基本を示し、ユーザーと役割の権限を設定および修正する手順を提供しました。各項目についての詳細情報は、ユーザーガイドとリファレンスドキュメントを参照してください。