一般的なアクセス管理クエリ
セルフマネージドの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_admin
はdefault_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_role
やsql_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;
非管理者ユーザー
ユーザーは必要な権限を持ち、全員が管理者であるべきではありません。このドキュメントの残りの部分では、例のシナリオと必要な役割を提供します。
準備
例で使用されるテーブルとユーザーを作成します。
サンプルデータベース、テーブル、および行の作成
テストデータベースを作成
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.table1Query 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.table1Query 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.table1Query 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.table1Query 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.table1Query 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.table1Query 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.table1Query 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ユーザーと役割の作成の基本を示し、ユーザーおよび役割の権限を設定および変更する手順を提供しました。それぞれの詳細情報については、ユーザーガイドおよびリファレンスドキュメントを参照してください。