ClickHouse/docs/ja/guides/sre/user-management/index.md
2024-11-18 11:58:58 +09:00

24 KiB
Raw Blame History

slug sidebar_position sidebar_label title
/ja/operations/access-rights 1 ユーザーとロール アクセス制御とアカウント管理

ClickHouseでのユーザーとロールの作成

ClickHouseはRBACアプローチに基づくアクセス制御管理をサポートしています。

ClickHouseのアクセスエンティティ

アクセスエンティティは以下の方法で設定できます:

  • SQL駆動のワークフロー。

    この機能を有効化する必要があります。

  • サーバーの設定ファイル users.xmlconfig.xml

SQL駆動のワークフローを使用することをお勧めします。両方の設定方法は同時に動作するため、アカウントやアクセス権をサーバー設定ファイルで管理している場合も、スムーズにSQL駆動のワークフローに移行できます。

:::note 同じアクセスエンティティを両方の設定方法で同時に管理することはできません。 :::

:::note ClickHouse Cloud Consoleユーザーの管理については、このページを参照してください。 :::

すべてのユーザー、ロール、プロファイルなどとそのすべての付与を確認するには、SHOW ACCESSステートメントを使用します。

概要

デフォルトでは、ClickHouseサーバーにはSQL駆動のアクセス制御とアカウント管理を使用できないがすべての権限を持つdefaultユーザーアカウントが用意されています。defaultユーザーアカウントは、例えばクライアントからログインするときや分散クエリでユーザー名が定義されていない場合に使用されます。分散クエリ処理では、サーバーやクラスターの設定でuser and passwordプロパティが指定されていない場合、デフォルトのユーザーアカウントが使用されます。

ClickHouseを使い始めたばかりの場合、以下のシナリオを検討してください

  1. defaultユーザーに対してSQL駆動のアクセス制御とアカウント管理を有効化します。
  2. defaultユーザーアカウントにログインし、必要なすべてのユーザーを作成します。管理者アカウントを作成することを忘れずに行ってください(GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION)。
  3. defaultユーザーの権限を制限し、そのSQL駆動のアクセス制御とアカウント管理を無効化します。

現在のソリューションの特性

  • データベースやテーブルが存在しなくても権限を付与することが可能です。
  • テーブルが削除されても、そのテーブルに対応するすべての特権は取り消されません。つまり、後で同じ名前の新しいテーブルを作成しても、特権は有効なままです。削除されたテーブルに対応する特権を取り消すには、例えばREVOKE ALL PRIVILEGES ON db.table FROM ALLクエリを実行する必要があります。
  • 特権に関する有効期限の設定は存在しません。

ユーザーアカウント

ユーザーアカウントは、ClickHouseでの認証を可能にするアクセスエンティティです。ユーザーアカウントには以下が含まれます

  • 識別情報。
  • ユーザーが実行できるクエリの範囲を定義する特権
  • ClickHouseサーバーへの接続が許可されたホスト。
  • 割り当てられた、またはデフォルトのロール。
  • ユーザーのログイン時にデフォルトで適用される制約を持つ設定。
  • 割り当てられた設定プロファイル。

特権はGRANTクエリを用いてユーザーアカウントに付与されるか、ロールを割り当てることによって付与されます。ユーザーから特権を取り消すには、ClickHouseはREVOKEクエリを提供します。ユーザーの特権を一覧表示するには、SHOW GRANTSステートメントを使用します。

管理クエリ:

設定の適用

設定は異なる方法で構成することができます:ユーザーアカウント、デフォルトで割り当てられたロールおよび設定プロファイルにおいて、ログイン時に適用される設定の値と制約は以下の通り(優先順位が高い順)です:

  1. ユーザーアカウントの設定。
  2. ユーザーアカウントのデフォルトロールの設定。ある設定が複数のロールで構成されている場合、その設定の適用順序は未定義です。
  3. ユーザーまたはそのデフォルトロールに割り当てられた設定プロファイルの設定。ある設定が複数のプロファイルで構成されている場合、その設定の適用順序は未定義です。
  4. サーバー全体にデフォルトで適用される設定またはデフォルトプロファイルからの設定。

ロール

ロールは、ユーザーアカウントに付与されるアクセスエンティティのコンテナです。

ロールには以下が含まれます:

  • 特権
  • 設定と制約
  • 割り当てられたロールのリスト

管理クエリ:

特権はGRANTクエリを使用してロールに付与できます。ロールから特権を取り消すには、ClickHouseはREVOKEクエリを提供します。

行ポリシー

行ポリシーは、ユーザーまたはロールに利用可能な行を定義するフィルターです。行ポリシーには特定のテーブル用のフィルターと、その行ポリシーを使用するロールやユーザーのリストが含まれます。

:::note 行ポリシーは読み取り専用アクセスのユーザーに対してのみ意味を持ちます。ユーザーがテーブルを変更したり、テーブル間でパーティションをコピーできる場合、行ポリシーの制限は効果が薄れます。 :::

管理クエリ:

設定プロファイル

設定プロファイルは、設定のコレクションです。設定プロファイルには、設定と制約、そしてこのプロファイルが適用されるロールやユーザーのリストが含まれます。

管理クエリ:

クォータ

クォータはリソースの使用を制限します。詳しくはクォータを参照してください。

クォータは、一定期間に関する制限のセットと、このクォータを使用する必要があるロールやユーザーのリストを含みます。

管理クエリ:

SQL駆動のアクセス制御とアカウント管理の有効化

  • 設定の保存用ディレクトリを設定します。

    ClickHouseは、アクセスエンティティの設定をaccess_control_pathサーバー設定パラメータで設定されたフォルダに保存します。

  • 少なくとも1つのユーザーアカウントに対してSQL駆動のアクセス制御とアカウント管理を有効化します。

    デフォルトでは、SQL駆動のアクセス制御とアカウント管理はすべてのユーザーに対して無効になっています。少なくとも1人のユーザーをusers.xml設定ファイルに設定し、access_managementnamed_collection_controlshow_named_collectionsshow_named_collections_secrets設定の値を1に設定する必要があります。

SQLユーザーとロールの定義

:::tip ClickHouse Cloudで作業する場合は、クラウドアクセス管理を参照してください。 :::

この記事では、SQLユーザーとロールの基本的な定義方法と、それらの特権と権限をデータベース、テーブル、行、カラムに適用する方法を示します。

SQLユーザーモードの有効化

  1. 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およびトランスポートプロトコルの認証情報で設定されている場合には、このユーザーを無効にすることを推奨します。 :::

  2. ノードを再起動して、変更を適用します。

  3. ClickHouseクライアントを起動します

    clickhouse-client --user default --password <password>
    

ユーザーの定義

  1. SQL管理者アカウントを作成します
    CREATE USER clickhouse_admin IDENTIFIED BY 'password';
    
  2. 新しいユーザーに完全な管理権限を付与します:
    GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION;
    

ALTER権限

この記事は、特権をどのように定義し、特権ユーザーに対してALTERステートメントを使用する場合の権限がどのように機能するかをよりよく理解するためのものです。

ALTERステートメントは、いくつかのカテゴリーに分かれています。その中には階層的なものと、明示的に定義されるべきものが存在します。

DB、テーブル、ユーザーの構成例

  1. 管理者ユーザーでサンプルユーザーを作成します:
CREATE USER my_user IDENTIFIED BY 'password';
  1. サンプルデータベースを作成します:
CREATE DATABASE my_db;
  1. サンプルテーブルを作成します:
CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
  1. 権限の付与/取消しを行うサンプル管理者ユーザーを作成します:
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
  1. ユーザーまたはロールにALTER権限を付与する

GRANT ALTER on *.* TO my_userを使用すると、トップレベルのALTER TABLEALTER 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 TABLEALTER VIEWの下にあるすべての権限が付与されますが、ALTER ROW POLICYなどの他のALTER権限は付与されません(階層図に戻ると、ALTER ROW POLICYALTER 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
  1. ユーザーおよびロールから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を持つユーザーによって付与される必要があり、さらにそのユーザー自身がその権限を持っている必要があります。

  1. 管理者ユーザーに権限を付与し、特権のセットを管理することを許可する場合 例:
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;

このユーザーは、ALTER COLUMNおよびすべてのサブ特権を付与または取り消すことができます。

テスト

  1. SELECT権限を追加します:
 GRANT SELECT ON my_db.my_table TO my_user;
  1. ユーザーにカラム追加権限を与える:
GRANT ADD COLUMN ON my_db.my_table TO my_user;
  1. 制限付きユーザーでログインする:
clickhouse-client --user my_user --password password --port 9000 --host <your_clickhouse_host>
  1. カラムを追加してみる:
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 │              │                    │         │                  │                │
└─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
  1. カラムを削除してみる:
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)
  1. alter管理者を利用して権限を付与するテスト
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
  1. alter管理者ユーザーでログイン
clickhouse-client --user my_alter_admin --password password --port 9000 --host <my_clickhouse_host>
  1. サブ特権を付与する:
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.
  1. 権限を持たない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を持っている必要があり、設定するユーザー自身を含む、その権限を既に持っている必要があります。操作を行うユーザーは、もし付与オプション権限を自分でも持っていない場合、自分自身の特権を取り消すことはできません。