ClickHouse でのユーザーとロールの作成
ClickHouse は、RBAC に基づくアクセス制御をサポートしています。
ClickHouse のアクセスエンティティ:
アクセスエンティティは次の方法で設定できます:
SQL 駆動のワークフローを使用することを推奨します。どちらの設定方法も同時に動作するため、アカウントやアクセス権限の管理にサーバー設定ファイルを使用している場合でも、SQL 駆動のワークフローへスムーズに移行できます。
同じアクセスエンティティを 2 つの設定方法で同時に管理することはできません。
ClickHouse Cloud コンソールユーザーの管理方法を探している場合は、このページを参照してください。
すべてのユーザー、ロール、プロファイルなどと、それらに対するすべての権限付与を確認するには、SHOW ACCESS ステートメントを使用します。
概要
デフォルトでは、ClickHouse サーバーは default ユーザーアカウントを提供します。このアカウントは SQL ベースのアクセス制御およびアカウント管理には利用できませんが、すべての権限を持っています。default ユーザーアカウントは、たとえばクライアントからのログイン時や分散クエリ内など、ユーザー名が定義されていないすべての場合に使用されます。分散クエリ処理においては、サーバーまたはクラスタの設定で user と password プロパティが指定されていない場合、default ユーザーアカウントが使用されます。
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 ステートメントを使用します。
管理クエリ:
設定の適用
設定は、ユーザーアカウント、そのユーザーに付与されたロール、および設定プロファイルでそれぞれ異なる値を構成できます。ユーザーログイン時に、ある設定が複数のアクセスエンティティで構成されている場合、その値と制約は次のように適用されます(優先度の高い順)。
- ユーザーアカウントの設定。
- ユーザーアカウントのデフォルトロールに対する設定。ある設定が複数のロールで構成されている場合、その設定の適用順序は未定義です。
- ユーザーまたはそのデフォルトロールに割り当てられた設定プロファイルからの設定。ある設定が複数のプロファイルで構成されている場合、その設定の適用順序は未定義です。
- サーバー全体にデフォルトで適用される設定、または default profile からの設定。
ロール
ロールは、ユーザーアカウントに付与できるアクセスエンティティのコンテナです。
ロールには次の内容が含まれます。
- 権限
- 設定と制約
- 割り当てられたロールのリスト
管理クエリ:
権限は、GRANT クエリによってロールに付与できます。ロールから権限を取り消すには、ClickHouse は REVOKE クエリを提供します。
行ポリシー
Row policy は、どの行がユーザーまたはロールから利用可能かを定義するフィルターです。Row policy には、特定の 1 つのテーブルに対するフィルターと、この row policy を適用すべきロールやユーザーの一覧が含まれます。
Row policy は、readonly アクセスしか持たないユーザーの場合にのみ意味があります。ユーザーがテーブルを変更したり、テーブル間でパーティションをコピーできる場合、row policy による制限は迂回されてしまいます。
管理クエリ:
Settings profile
Settings profile は、settings の集合です。Settings profile には、設定と制約、およびこのプロファイルが適用されるロールやユーザーの一覧が含まれます。
管理クエリ:
- CREATE SETTINGS PROFILE
- ALTER SETTINGS PROFILE
- DROP SETTINGS PROFILE
- SHOW CREATE SETTINGS PROFILE
- SHOW PROFILES
Quota
Quota はリソース使用量を制限します。Quotas を参照してください。
Quota には、特定の期間に対する一連の制限と、この quota を使用すべきロールやユーザーの一覧が含まれます。
管理クエリ:
SQL ベースのアクセス制御とアカウント管理の有効化
-
設定ストレージ用のディレクトリをセットアップします。
ClickHouse は、access_control_path サーバー設定パラメータで指定されたフォルダにアクセスエンティティの設定を保存します。
-
少なくとも 1 つのユーザーアカウントに対して、SQL ベースのアクセス制御とアカウント管理を有効化します。
既定では、SQL ベースのアクセス制御とアカウント管理はすべてのユーザーで無効になっています。
users.xml設定ファイルで少なくとも 1 つのユーザーを設定し、access_management、named_collection_control、show_named_collections、show_named_collections_secrets設定の値を 1 に設定する必要があります。
SQL ユーザーとロールの定義
ClickHouse Cloud を使用している場合は、Cloud access management を参照してください。
この記事では、SQL ユーザーおよびロールの基本的な定義方法と、それらに付与した権限をデータベース、テーブル、行、列に適用する方法について説明します。
SQL ユーザーモードの有効化
-
users.xmlファイル内の<default>ユーザーの下で SQL ユーザーモードを有効化します:注記defaultユーザーは新規インストール時に作成される唯一のユーザーであり、デフォルトではノード間通信にも使用されます。本番環境では、SQL 管理者ユーザーでノード間通信を構成し、
<secret>、クラスタ認証情報、および/またはノード間 HTTP・トランスポートプロトコルの認証情報を設定した後は、このdefaultユーザーを無効化することが推奨されます。defaultアカウントはノード間通信に使用されるためです。 -
変更を反映するためにノードを再起動します。
-
ClickHouse クライアントを起動します:
ユーザーの定義
- SQL 管理者アカウントを作成します:
- 新しいユーザーに完全な管理権限を付与します:
ALTER 権限
この記事は、権限の定義方法と、特権ユーザーが ALTER ステートメントを使用する際に権限がどのように機能するかについて、よりよく理解できるようにすることを目的としています。
ALTER ステートメントはいくつかのカテゴリーに分かれており、その一部は階層構造を持ちますが、そうでないものは明示的に定義する必要があります。
DB・テーブル・ユーザー設定の例
- 管理者ユーザーとしてサンプルユーザーを作成します
- サンプルデータベースを作成
- サンプルテーブルを作成する
- 権限の付与/取り消しを行うためのサンプル管理ユーザーを作成する
権限を付与または取り消すには、管理ユーザーが WITH GRANT OPTION 権限を持っている必要があります。
例えば、次のようになります。
GRANT または REVOKE で権限を付与・取り消しするには、そのユーザー自身が事前にその権限を保持している必要があります。
権限の付与と取り消し
ALTER の階層:
- ユーザーまたはロールへの
ALTER権限の付与
GRANT ALTER ON *.* TO my_user を実行しても、トップレベルの ALTER TABLE と ALTER VIEW にのみ影響し、その他の ALTER 文には影響しません。その他の ALTER 文については、それぞれ個別に権限を付与または取り消す必要があります。
たとえば、基本的な ALTER 権限を付与する場合:
最終的に付与される権限の一覧:
これは、上記の例において ALTER TABLE および ALTER VIEW 配下のすべての権限を付与しますが、ALTER ROW POLICY のようないくつかの他の ALTER 権限は付与しません(権限の階層を参照すると、ALTER ROW POLICY は ALTER TABLE や ALTER VIEW の子ではないことが分かります)。それらは明示的に付与または取り消す必要があります。
ALTER 権限の一部だけが必要な場合は、それぞれを個別に付与できます。その権限にサブ権限がある場合は、それらも自動的に付与されます。
例えば次のようにします。
権限は次のように付与します:
これにより、以下のサブ権限も与えられます。
- ユーザーおよびロールからの
ALTER権限の取り消し
REVOKE 文は、GRANT 文と同様に動作します。
ユーザーまたはロールにサブ権限が付与されている場合、そのサブ権限を直接取り消すことも、そのサブ権限が継承しているより上位の権限を取り消すこともできます。
たとえば、ユーザーに ALTER ADD COLUMN が付与されている場合
権限は個別に取り消すことができます。
または、いずれかの上位レベルから取り消すこともできます(COLUMN のサブ権限をすべて取り消す):
追加事項
権限を付与するユーザーは、WITH GRANT OPTION を持っているだけでなく、その権限自体も保持している必要があります。
- 管理者ユーザーに権限を付与し、さらに一連の権限を管理できるようにするには 以下はその例です。
これでユーザーは ALTER COLUMN 権限とそのすべてのサブ権限を付与または取り消すことができます。
テスト
SELECT権限を追加する
- ユーザーに ADD COLUMN 権限を付与する
- 権限が制限されたユーザーでログインする
- 列追加をテストする
┌─name────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ │ id │ UInt64 │ │ │ │ │ │ │ column1 │ String │ │ │ │ │ │ │ column2 │ String │ │ │ │ │ │ └─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
- 権限を付与し、ALTER ADMIN ロールをテストする
- alter admin ユーザーとしてログインします
- 下位権限を付与する
- alter 管理ユーザーが保持していない権限を付与しようとした場合、それが admin ユーザーに付与されている権限のサブ権限ではないため付与できないことをテストします。
概要
ALTER の権限は、テーブルおよびビューを対象とする ALTER については階層構造になっていますが、その他の ALTER ステートメントについてはそうではありません。権限は細かな粒度で設定することも、複数の権限をまとめて設定することもでき、取り消しも同様に行えます。権限を付与または取り消すユーザーは、対象ユーザー(自分自身を含む)の権限を設定するために WITH GRANT OPTION を保持している必要があり、かつその権限自体も既に所有していなければなりません。WITH GRANT OPTION を持たないユーザーは、自分自身の権限を取り消すことはできません。