セルフマネージド
セルフマネージドの 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]`;
Test admin privileges
ユーザー 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;
Non-admin users
ユーザーは必要な権限を持っている必要があり、すべてが管理者ユーザーである必要はありません。この文書の残りの部分では、例となるシナリオと必要な役割が提供されます。
Preparation
例で使用するために、これらのテーブルとユーザーを作成します。
Creating a sample database, table, and rows
-
テストデータベースを作成します
-
テーブルを作成します
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 │
└────┴─────────┴─────────┘
-
特定のカラムへのアクセス制限をデモするために使用される通常のユーザーを作成します:
CREATE USER column_user IDENTIFIED BY 'password';
-
特定の値を持つ行へのアクセス制限をデモするために使用される通常のユーザーを作成します:
CREATE USER row_user IDENTIFIED BY 'password';
Creating roles
以下の例セットで:
- カラムや行に対するさまざまな権限のためのロールが作成されます
- 権限がロールに付与されます
- 各ロールにユーザーが割り当てられます
ロールは、各ユーザーを個別に管理する代わりに、特定の権限のためのユーザーグループを定義するために使用されます。
-
このロールのユーザーがデータベース 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;
注記
テーブルにポリシーを添付すると、システムはそのポリシーを適用し、定義されたユーザーおよびロールのみがテーブルで操作を行うことができるようになり、それ以外はすべての操作が拒否されます。他のユーザーに制限を適用しないためには、通常のアクセスや他のタイプのアクセスを許可する別のポリシーを定義する必要があります。
Verification
Testing role privileges with column restricted user
-
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 │
└────┴─────────┘
Testing role privileges with row restricted user
-
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
の値を持つ行は除外されるべきです。
Modifying Users and Roles
ユーザーには必要な権限の組み合わせのために複数のロールが割り当てられることがあります。複数のロールを使用する場合、システムは権限を決定するためにロールを組み合わせ、ロールの権限は累積的な効果を持つことになります。
たとえば、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_rows_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 │
└────┴─────────┘
Troubleshooting
権限が交差または組み合わさることで予期しない結果が生じることがあります。以下のコマンドを使用して、管理者アカウントを使用して問題を特定できます。
Listing the grants and roles for a user
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 │
└──────────────────────────────────────────────────────────┘
List roles in ClickHouse
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a
┌─name────────────┐
│ A_rows_users │
│ column1_users │
└─────────────────┘
Display the policies
Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc
┌─name───────────────────────────────────┐
│ A_row_filter ON db1.table1 │
│ allow_other_users_filter ON db1.table1 │
└────────────────────────────────────────┘
View how a policy was defined and current privileges
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 │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
Example commands to manage roles, policies, and users
以下のコマンドを使用して:
- 権限を削除する
- ポリシーを削除する
- ユーザーをロールから外す
- ユーザーとロールを削除する
ヒント
これらのコマンドは管理者ユーザーまたは default
ユーザーとして実行してください。
Remove privilege from a role
REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users;
Delete a policy
DROP ROW POLICY A_row_filter ON db1.table1;
Unassign a user from a role
REVOKE A_rows_users FROM row_user;
Delete a role
Delete a user
Summary
この記事では、SQLユーザーとロールの基本的な作成方法を示し、ユーザーとロールの権限を設定および変更する手順を提供しました。各詳細については、ユーザーガイドおよびリファレンス文書を参照してください。