24 KiB
slug | sidebar_position | sidebar_label | title |
---|---|---|---|
/ja/operations/access-rights | 1 | ユーザーとロール | アクセス制御とアカウント管理 |
ClickHouseでのユーザーとロールの作成
ClickHouseはRBACアプローチに基づくアクセス制御管理をサポートしています。
ClickHouseのアクセスエンティティ:
アクセスエンティティは以下の方法で設定できます:
SQL駆動のワークフローを使用することをお勧めします。両方の設定方法は同時に動作するため、アカウントやアクセス権をサーバー設定ファイルで管理している場合も、スムーズにSQL駆動のワークフローに移行できます。
:::note 同じアクセスエンティティを両方の設定方法で同時に管理することはできません。 :::
:::note ClickHouse Cloud Consoleユーザーの管理については、このページを参照してください。 :::
すべてのユーザー、ロール、プロファイルなどとそのすべての付与を確認するには、SHOW ACCESSステートメントを使用します。
概要
デフォルトでは、ClickHouseサーバーにはSQL駆動のアクセス制御とアカウント管理を使用できないがすべての権限を持つdefault
ユーザーアカウントが用意されています。default
ユーザーアカウントは、例えばクライアントからログインするときや分散クエリでユーザー名が定義されていない場合に使用されます。分散クエリ処理では、サーバーやクラスターの設定でuser and passwordプロパティが指定されていない場合、デフォルトのユーザーアカウントが使用されます。
ClickHouseを使い始めたばかりの場合、以下のシナリオを検討してください:
default
ユーザーに対してSQL駆動のアクセス制御とアカウント管理を有効化します。default
ユーザーアカウントにログインし、必要なすべてのユーザーを作成します。管理者アカウントを作成することを忘れずに行ってください(GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION
)。default
ユーザーの権限を制限し、そのSQL駆動のアクセス制御とアカウント管理を無効化します。
現在のソリューションの特性
- データベースやテーブルが存在しなくても権限を付与することが可能です。
- テーブルが削除されても、そのテーブルに対応するすべての特権は取り消されません。つまり、後で同じ名前の新しいテーブルを作成しても、特権は有効なままです。削除されたテーブルに対応する特権を取り消すには、例えば
REVOKE ALL PRIVILEGES ON db.table FROM ALL
クエリを実行する必要があります。 - 特権に関する有効期限の設定は存在しません。
ユーザーアカウント
ユーザーアカウントは、ClickHouseでの認証を可能にするアクセスエンティティです。ユーザーアカウントには以下が含まれます:
- 識別情報。
- ユーザーが実行できるクエリの範囲を定義する特権。
- ClickHouseサーバーへの接続が許可されたホスト。
- 割り当てられた、またはデフォルトのロール。
- ユーザーのログイン時にデフォルトで適用される制約を持つ設定。
- 割り当てられた設定プロファイル。
特権はGRANTクエリを用いてユーザーアカウントに付与されるか、ロールを割り当てることによって付与されます。ユーザーから特権を取り消すには、ClickHouseはREVOKEクエリを提供します。ユーザーの特権を一覧表示するには、SHOW GRANTSステートメントを使用します。
管理クエリ:
設定の適用
設定は異なる方法で構成することができます:ユーザーアカウント、デフォルトで割り当てられたロールおよび設定プロファイルにおいて、ログイン時に適用される設定の値と制約は以下の通り(優先順位が高い順)です:
- ユーザーアカウントの設定。
- ユーザーアカウントのデフォルトロールの設定。ある設定が複数のロールで構成されている場合、その設定の適用順序は未定義です。
- ユーザーまたはそのデフォルトロールに割り当てられた設定プロファイルの設定。ある設定が複数のプロファイルで構成されている場合、その設定の適用順序は未定義です。
- サーバー全体にデフォルトで適用される設定またはデフォルトプロファイルからの設定。
ロール
ロールは、ユーザーアカウントに付与されるアクセスエンティティのコンテナです。
ロールには以下が含まれます:
- 特権
- 設定と制約
- 割り当てられたロールのリスト
管理クエリ:
特権はGRANTクエリを使用してロールに付与できます。ロールから特権を取り消すには、ClickHouseはREVOKEクエリを提供します。
行ポリシー
行ポリシーは、ユーザーまたはロールに利用可能な行を定義するフィルターです。行ポリシーには特定のテーブル用のフィルターと、その行ポリシーを使用するロールやユーザーのリストが含まれます。
:::note 行ポリシーは読み取り専用アクセスのユーザーに対してのみ意味を持ちます。ユーザーがテーブルを変更したり、テーブル間でパーティションをコピーできる場合、行ポリシーの制限は効果が薄れます。 :::
管理クエリ:
設定プロファイル
設定プロファイルは、設定のコレクションです。設定プロファイルには、設定と制約、そしてこのプロファイルが適用されるロールやユーザーのリストが含まれます。
管理クエリ:
- CREATE SETTINGS PROFILE
- ALTER SETTINGS PROFILE
- DROP SETTINGS PROFILE
- SHOW CREATE SETTINGS PROFILE
- SHOW PROFILES
クォータ
クォータはリソースの使用を制限します。詳しくはクォータを参照してください。
クォータは、一定期間に関する制限のセットと、このクォータを使用する必要があるロールやユーザーのリストを含みます。
管理クエリ:
SQL駆動のアクセス制御とアカウント管理の有効化
-
設定の保存用ディレクトリを設定します。
ClickHouseは、アクセスエンティティの設定をaccess_control_pathサーバー設定パラメータで設定されたフォルダに保存します。
-
少なくとも1つのユーザーアカウントに対してSQL駆動のアクセス制御とアカウント管理を有効化します。
デフォルトでは、SQL駆動のアクセス制御とアカウント管理はすべてのユーザーに対して無効になっています。少なくとも1人のユーザーを
users.xml
設定ファイルに設定し、access_management
、named_collection_control
、show_named_collections
、show_named_collections_secrets
設定の値を1に設定する必要があります。
SQLユーザーとロールの定義
:::tip ClickHouse Cloudで作業する場合は、クラウドアクセス管理を参照してください。 :::
この記事では、SQLユーザーとロールの基本的な定義方法と、それらの特権と権限をデータベース、テーブル、行、カラムに適用する方法を示します。
SQLユーザーモードの有効化
-
users.xml
ファイルの<default>
ユーザーの下にSQLユーザーモードを有効にします:<access_management>1</access_management> <named_collection_control>1</named_collection_control> <show_named_collections>1</show_named_collections> <show_named_collections_secrets>1</show_named_collections_secrets>
:::note
default
ユーザーは、新しくインストールした際に作成される唯一のユーザーであり、デフォルトではノード間の通信に使用されるアカウントでもあります。本番環境では、ノード間通信がSQL管理者ユーザーで設定されている場合や、
<secret>
、クラスターの認証情報、および/またはノード間HTTPおよびトランスポートプロトコルの認証情報で設定されている場合には、このユーザーを無効にすることを推奨します。 ::: -
ノードを再起動して、変更を適用します。
-
ClickHouseクライアントを起動します:
clickhouse-client --user default --password <password>
ユーザーの定義
- SQL管理者アカウントを作成します:
CREATE USER clickhouse_admin IDENTIFIED BY 'password';
- 新しいユーザーに完全な管理権限を付与します:
GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION;
ALTER権限
この記事は、特権をどのように定義し、特権ユーザーに対してALTER
ステートメントを使用する場合の権限がどのように機能するかをよりよく理解するためのものです。
ALTER
ステートメントは、いくつかのカテゴリーに分かれています。その中には階層的なものと、明示的に定義されるべきものが存在します。
DB、テーブル、ユーザーの構成例
- 管理者ユーザーでサンプルユーザーを作成します:
CREATE USER my_user IDENTIFIED BY 'password';
- サンプルデータベースを作成します:
CREATE DATABASE my_db;
- サンプルテーブルを作成します:
CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
- 権限の付与/取消しを行うサンプル管理者ユーザーを作成します:
CREATE USER my_alter_admin IDENTIFIED BY 'password';
:::note
権限を付与または取消するには、管理者ユーザーがWITH GRANT OPTION
特権を持っている必要があります。
例えば:
GRANT ALTER ON my_db.* WITH GRANT OPTION
ユーザーに権限を付与または取り消すためには、まずそのユーザー自身がこれらの権限を持っている必要があります。 :::
権限の付与または取消し
ALTER
の階層:
.
├── ALTER (テーブルとビューのみ)/
│ ├── ALTER TABLE/
│ │ ├── ALTER UPDATE
│ │ ├── ALTER DELETE
│ │ ├── ALTER COLUMN/
│ │ │ ├── ALTER ADD COLUMN
│ │ │ ├── ALTER DROP COLUMN
│ │ │ ├── ALTER MODIFY COLUMN
│ │ │ ├── ALTER COMMENT COLUMN
│ │ │ ├── ALTER CLEAR COLUMN
│ │ │ └── ALTER RENAME COLUMN
│ │ ├── ALTER INDEX/
│ │ │ ├── ALTER ORDER BY
│ │ │ ├── ALTER SAMPLE BY
│ │ │ ├── ALTER ADD INDEX
│ │ │ ├── ALTER DROP INDEX
│ │ │ ├── ALTER MATERIALIZE INDEX
│ │ │ └── ALTER CLEAR INDEX
│ │ ├── ALTER CONSTRAINT/
│ │ │ ├── ALTER ADD CONSTRAINT
│ │ │ └── ALTER DROP CONSTRAINT
│ │ ├── ALTER TTL/
│ │ │ └── ALTER MATERIALIZE TTL
│ │ ├── ALTER SETTINGS
│ │ ├── ALTER MOVE PARTITION
│ │ ├── ALTER FETCH PARTITION
│ │ └── ALTER FREEZE PARTITION
│ └── ALTER LIVE VIEW/
│ ├── ALTER LIVE VIEW REFRESH
│ └── ALTER LIVE VIEW MODIFY QUERY
├── ALTER DATABASE
├── ALTER USER
├── ALTER ROLE
├── ALTER QUOTA
├── ALTER [ROW] POLICY
└── ALTER [SETTINGS] PROFILE
- ユーザーまたはロールに
ALTER
権限を付与する
GRANT ALTER on *.* TO my_user
を使用すると、トップレベルのALTER TABLE
とALTER VIEW
にのみ影響し、その他のALTER
ステートメントは個別に付与または取り消す必要があります。
例えば、基本的なALTER
特権を付与する:
GRANT ALTER ON my_db.my_table TO my_user;
結果として付与される特権のセット:
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 706befbc-525e-4ec1-a1a2-ba2508cc09e3
┌─GRANTS FOR my_user───────────────────────────────────────────┐
│ GRANT ALTER TABLE, ALTER VIEW ON my_db.my_table TO my_user │
└──────────────────────────────────────────────────────────────┘
これにより、上記の例からALTER TABLE
とALTER VIEW
の下にあるすべての権限が付与されますが、ALTER ROW POLICY
などの他のALTER
権限は付与されません(階層図に戻ると、ALTER ROW POLICY
がALTER TABLE
またはALTER VIEW
の子でないことがわかります)。これらは明示的に付与または取り消す必要があります。
例えば、次のように一部のALTER
特権が必要な場合、それぞれを別々に付与できます。副権限がある場合、それらも自動的に付与されます。
例:
GRANT ALTER COLUMN ON my_db.my_table TO my_user;
付与されたものは次のようになります:
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 47b3d03f-46ac-4385-91ec-41119010e4e2
┌─GRANTS FOR my_user────────────────────────────────┐
│ GRANT ALTER COLUMN ON default.my_table TO my_user │
└───────────────────────────────────────────────────┘
1 row in set. Elapsed: 0.004 sec.
これにより、次のような副権限も与えられます:
ALTER ADD COLUMN
ALTER DROP COLUMN
ALTER MODIFY COLUMN
ALTER COMMENT COLUMN
ALTER CLEAR COLUMN
ALTER RENAME COLUMN
- ユーザーおよびロールから
ALTER
権限を取り消す
REVOKE
ステートメントは、GRANT
ステートメントと同様に機能します。
ユーザーまたはロールに副権限が付与された場合、その副権限を直接取り消すか、次の上位レベルの権限を取り消すことができます。
例:ユーザーにALTER ADD COLUMN
が付与された場合
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user
Query id: 61fe0fdc-1442-4cd6-b2f3-e8f2a853c739
Ok.
0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 27791226-a18f-46c8-b2b4-a9e64baeb683
┌─GRANTS FOR my_user──────────────────────────────────┐
│ GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user │
└─────────────────────────────────────────────────────┘
権限を個別に取り消すこともできます:
REVOKE ALTER ADD COLUMN ON my_db.my_table FROM my_user;
あるいは、どの上位レベルからでも取り消すことができます(すべてのCOLUMN副権限を取り消します):
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user;
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user
Query id: b882ba1b-90fb-45b9-b10f-3cda251e2ccc
Ok.
0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: e7d341de-de65-490b-852c-fa8bb8991174
Ok.
0 rows in set. Elapsed: 0.003 sec.
補足
権限は、WITH GRANT OPTION
を持つユーザーによって付与される必要があり、さらにそのユーザー自身がその権限を持っている必要があります。
- 管理者ユーザーに権限を付与し、特権のセットを管理することを許可する場合 例:
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
このユーザーは、ALTER COLUMN
およびすべてのサブ特権を付与または取り消すことができます。
テスト
SELECT
権限を追加します:
GRANT SELECT ON my_db.my_table TO my_user;
- ユーザーにカラム追加権限を与える:
GRANT ADD COLUMN ON my_db.my_table TO my_user;
- 制限付きユーザーでログインする:
clickhouse-client --user my_user --password password --port 9000 --host <your_clickhouse_host>
- カラムを追加してみる:
ALTER TABLE my_db.my_table ADD COLUMN column2 String;
ALTER TABLE my_db.my_table
ADD COLUMN `column2` String
Query id: d5d6bfa1-b80c-4d9f-8dcd-d13e7bd401a5
Ok.
0 rows in set. Elapsed: 0.010 sec.
DESCRIBE my_db.my_table;
DESCRIBE TABLE my_db.my_table
Query id: ab9cb2d0-5b1a-42e1-bc9c-c7ff351cb272
┌─name────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id │ UInt64 │ │ │ │ │ │
│ column1 │ String │ │ │ │ │ │
│ column2 │ String │ │ │ │ │ │
└─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
- カラムを削除してみる:
ALTER TABLE my_db.my_table DROP COLUMN column2;
ALTER TABLE my_db.my_table
DROP COLUMN column2
Query id: 50ad5f6b-f64b-4c96-8f5f-ace87cea6c47
0 rows in set. Elapsed: 0.004 sec.
Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_user: Not enough privileges. To execute this query it's necessary to have grant ALTER DROP COLUMN(column2) ON my_db.my_table. (ACCESS_DENIED)
- alter管理者を利用して権限を付与するテスト
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
- alter管理者ユーザーでログイン:
clickhouse-client --user my_alter_admin --password password --port 9000 --host <my_clickhouse_host>
- サブ特権を付与する:
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user
Query id: 1c7622fa-9df1-4c54-9fc3-f984c716aeba
Ok.
- 権限を持たないalter管理者ユーザーが持っていないサブ特権を持たない特権を付与しようとするテスト。
GRANT ALTER UPDATE ON my_db.my_table TO my_user;
GRANT ALTER UPDATE ON my_db.my_table TO my_user
Query id: 191690dc-55a6-4625-8fee-abc3d14a5545
0 rows in set. Elapsed: 0.004 sec.
Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_alter_admin: Not enough privileges. To execute this query it's necessary to have grant ALTER UPDATE ON my_db.my_table WITH GRANT OPTION. (ACCESS_DENIED)
まとめ
ALTER
特権はテーブルおよびビューに対するALTER
に対して階層的ですが、他のALTER
ステートメントには適用されません。特権は細かいレベルや特権のグループに設定でき、同様に取り消すこともできます。権限を設定するユーザーは、WITH GRANT OPTION
を持っている必要があり、設定するユーザー自身を含む、その権限を既に持っている必要があります。操作を行うユーザーは、もし付与オプション権限を自分でも持っていない場合、自分自身の特権を取り消すことはできません。