メインコンテンツへスキップ
メインコンテンツへスキップ

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

自前運用

自前運用の 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 Console を使用する場合、SQL ステートメントは default ユーザーとしては実行されません。代わりに、ステートメントは sql-console:${cloud_login_email} という名前のユーザーとして実行されます。ここで cloud_login_email は、現在クエリを実行しているユーザーのメールアドレスです。

これら自動的に生成される SQL Console ユーザーには、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';

ロールの作成

この一連の例では:

  • 列や行など、異なる権限のためのロールを作成します
  • ロールに権限を付与します
  • 各ロールにユーザーを割り当てます

ロールは、各ユーザーを個別に管理する代わりに、特定の権限に対するユーザーグループを定義するために使用されます。

データベースdb1table1column1のみを参照できるようにこのロールのユーザーを制限するロールを作成:
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;
選択された行のみを参照できるようにこのロールのユーザーを制限するロールを作成。この場合、column1Aを含む行のみ
CREATE ROLE A_rows_users;
row_userA_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
管理者ユーザーでデータベース、テーブル、およびすべての行へのアクセスを確認する
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)
注記

すべての列が指定されており、このユーザーには idcolumn1 にしかアクセス権がないため、アクセスは拒否されます。

許可されている列のみを指定した 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     │
└────┴─────────┴─────────┘
注記

上記の 2 行のみが返されることを確認します。column1B の行は除外されている必要があります。

ユーザーとロールの変更

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

例えば、ある role1column1 に対する SELECT のみを許可し、role2column1column2 に対する SELECT を許可する場合、そのユーザーは両方のカラムにアクセスできます。

管理者アカウントを使用して、新しいユーザーを作成し、デフォルトロールを利用して行レベルおよび列レベルの両方で制限する
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 からのみ SELECT できるようにする
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 │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

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

次のコマンドは以下の目的で使用できます:

  • 権限を削除する
  • ポリシーを削除する
  • ロールからユーザーの割り当てを解除する
  • ユーザーおよびロールを削除する
ヒント

これらのコマンドは管理者ユーザーまたは 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 ユーザーおよびロール作成の基本を説明し、ユーザーおよびロールに対する権限を設定・変更する手順を示しました。各トピックの詳細については、ユーザーガイドおよびリファレンスドキュメントを参照してください。