12 KiB
管理者権限のテスト
ユーザー 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 │ └────┴─────────┴─────────┘
-
特定のカラムへのアクセスを制限することを示すために使用される通常のユーザーを作成:
CREATE USER column_user IDENTIFIED BY 'password';
-
特定の値を持つ行へのアクセスを制限することを示すために使用される通常のユーザーを作成:
CREATE USER row_user IDENTIFIED BY 'password';
役割の作成
この例を使って:
- カラムや行、異なる権限のための役割を作成します
- 役割に権限を付与します
- ユーザーを各役割に割り当てます
役割は、各ユーザーを個別に管理する代わりに、特定の権限を持つユーザーのグループを定義するために使用されます。
-
db1
データベースおよびtable1
において、column1
のみを閲覧できるユーザーの役割を作成:CREATE ROLE column1_users;
-
column1
のみが閲覧可能な権限を設定GRANT SELECT(id, column1) ON db1.table1 TO column1_users;
-
column_user
ユーザーをcolumn1_users
役割に追加GRANT column1_users TO column_user;
-
column1
にA
を含む行のみを閲覧できるユーザーの役割を作成CREATE ROLE A_rows_users;
-
row_user
をA_rows_users
役割に追加GRANT A_rows_users TO row_user;
-
column1
がA
の値を持つ行のみを閲覧可能とするポリシーを作成CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;
-
データベースとテーブルへの権限を設定
GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;
-
他の役割に対してもすべての行にアクセスできるように明示的な権限を付与
CREATE ROW POLICY allow_other_users_filter ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;
:::note テーブルにポリシーをアタッチすると、システムはそのポリシーを適用し、定義されたユーザーと役割のみがそのテーブルでの操作を行うことができます。その他のユーザーは操作を拒否されます。制限された行ポリシーが他のユーザーに適用されないようにするため、他のユーザーと役割が通常または他のタイプのアクセスを持つことを許可する別のポリシーを定義する必要があります。 :::
検証
カラム制限ユーザーでの役割の権限テスト
-
clickhouse_admin
ユーザーでClickHouseクライアントにログインclickhouse-client --user clickhouse_admin --password password
-
管理者ユーザーを使用して、データベース、テーブル、およびすべての行のアクセスを確認。
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 │ └────┴─────────┴─────────┘
-
column_user
ユーザーでClickHouseクライアントにログインclickhouse-client --user column_user --password password
-
すべてのカラムを使用した
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 すべてのカラムが指定されたためアクセスが拒否されました。ユーザーは
id
とcolumn1
のみへのアクセス権を持っています ::: -
指定されたカラムのみを用いた
SELECT
クエリを確認:SELECT id, column1 FROM db1.table1
Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9 ┌─id─┬─column1─┐ │ 1 │ A │ │ 2 │ A │ │ 3 │ B │ │ 4 │ B │ └────┴─────────┘
行制限ユーザーでの役割の権限テスト
-
row_user
でClickHouseクライアントにログインclickhouse-client --user row_user --password password
-
利用可能な行を表示
SELECT * FROM db1.table1
Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb ┌─id─┬─column1─┬─column2─┐ │ 1 │ A │ abc │ │ 2 │ A │ def │ └────┴─────────┴─────────┘
:::note 上記の2行のみが返されることを確認し、
column1
にB
の値を持つ行は除外されるべきです。 :::
ユーザーと役割の変更
ユーザーは必要な権限の組み合わせに対して複数の役割を割り当てることができます。複数の役割を使用する場合、システムは役割を組み合わせて権限を決定し、その結果、役割の権限が累積されます。
例えば、1つの role1
が column1
のみの選択を許可し、role2
が column1
と column2
の選択を許可する場合、ユーザーは両方のカラムにアクセスできます。
-
管理者アカウントを使用して、デフォルトの役割で行とカラムの両方を制限する新しいユーザーを作成
CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
-
A_rows_users
役割に対する以前の権限を削除REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
-
A_row_users
役割にcolumn1
のみの選択を許可GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
-
row_and_column_user
でClickHouseクライアントにログインclickhouse-client --user row_and_column_user --password password;
-
すべてのカラムでテスト:
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)
-
制限されたカラムでテスト:
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ユーザーと役割の作成の基本を示し、ユーザーおよび役割の権限を設定および変更する手順を提供しました。それぞれの詳細情報については、ユーザーガイドおよびリファレンスドキュメントを参照してください。