セルフマネージド
セルフマネージドの 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:[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 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;
非管理者ユーザー
ユーザーは必要な権限を持っているべきであり、全員が管理者ユーザーであってはいけません。この文書の残りの部分では、例示的なシナリオと必要な役割を提供します。
例で使用するために、これらのテーブルとユーザーを作成します。
サンプルデータベース、テーブル、行の作成
テーブルの作成
テーブルの作成 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');
テーブルを検証する
テーブルを検証する 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';
役割の作成
この例に基づいて:
カラムや行に対するさまざまな権限のための役割が作成されます
権限が役割に付与されます
ユーザーが各役割に割り当てられます
役割は、各ユーザーを個別に管理するのではなく、特定の権限のためにユーザーのグループを定義するために使用されます。
データベース 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;
注記
テーブルにポリシーを添付すると、システムはそのポリシーを適用し、定義されたユーザーと役割のみがテーブルで操作を行うことができます。他のユーザーはすべての操作を拒否されます。他のユーザーや役割に通常または他の種類のアクセスを許可するためには、別のポリシーを定義する必要があります。
カラム制限ユーザーでの役割権限のテスト
clickhouse_admin
ユーザーを使用して ClickHouse クライアントにログインします
clickhouse-client --user clickhouse_admin --password password
管理者ユーザーでデータベース、テーブル、すべての行へのアクセスを確認します。
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
をテストします
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)
注記
すべてのカラムが指定されたため、アクセスが拒否され、ユーザーは 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
利用可能な行を表示します
Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb
┌─id─┬─column1─┬─column2─┐
│ 1 │ A │ abc │
│ 2 │ A │ def │
└────┴─────────┴─────────┘
注記
上記の2行のみが返されることを確認します。column1
に値 B
の行は除外されるべきです。
ユーザーと役割の修正
ユーザーには必要な権限の組み合わせのために複数の役割を割り当てることができます。複数の役割を使用する場合、システムは役割を組み合わせて権限を決定します。その結果、役割の権限は累積されます。
たとえば、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;
すべてのカラムでテストします:
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 の役割を一覧表示
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a
┌─name────────────┐
│ A_rows_users │
│ column1_users │
└─────────────────┘
ポリシーを表示する
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;
役割を削除する
ユーザーを削除する
まとめ
この記事では、SQL ユーザーと役割を作成する基本を示し、ユーザーと役割の権限を設定および修正する手順を提供しました。各項目についての詳細情報は、ユーザーガイドとリファレンスドキュメントを参照してください。