ClickHouse Cloud SQL Console で SET ROLE を実行すると、1 つのクエリではロールが変更されたように見えても、次のクエリでは元に戻ることがあります。クエリやセッションをまたいで権限を維持する必要がある場合は、ユーザーごとの SQL Console ロールを使用してください。
症状
次の現象が1つ以上発生する場合があります。
SET ROLE sql_console_developerを実行しても、その後のクエリが引き続きsql_console_read_onlyで実行される。currentRoles、enabledRoles、defaultRolesの結果がクエリごとに異なる。SET ROLEと別のクエリをまとめて実行した場合、選択したロールが常に維持されるとは限らない。SHOW GRANTSには想定どおりのロールが表示されるが、その権限は有効になっていない。
現在のユーザーとロールは、次の方法で確認できます。
SELECT
currentUser(),
currentRoles(),
enabledRoles(),
defaultRoles();この現象が発生する理由
SQL Console は、複数のレプリカを持つ ClickHouse Cloud サービスに対し、ステートレスな HTTP 接続を介してクエリを送信します。連続するクエリで同じ接続またはレプリカが使用されるとは限りません。
SET ROLE は、現在のセッションで有効なロールを変更します。ただし、このセッション状態は後続の SQL Console リクエストには保持されません。そのため、後続のクエリは、以前のリクエストで有効にしたロールなしで実行される可能性があります。
このため、SQL Console では SET ROLE を永続的なアクセス制御の仕組みとして使用しないでください。
SQL Console のユーザーロールの仕組み
ユーザーが SQL Console を開くと、ClickHouse Cloud は次の命名規則に従ってデータベースユーザーを作成します。
sql-console:user@example.comClickHouse Cloud は、名前が次の命名規則に従うデータベースロールも確認します。
sql-console-role:user@example.comそのロールが存在する場合、ClickHouse Cloud は対応する SQL Console ユーザーにそのロールを割り当てます。これは、個々の SQL Console ユーザーに永続的なカスタム権限を付与するためにサポートされている方法です。
| エンティティ | 目的 | 永続的 |
|---|---|---|
sql-console:<email> |
ユーザーが SQL Console を開いた際にプロビジョニングされるデータベースユーザー | はい、ClickHouse Cloud により管理 |
sql_console_admin and sql_console_read_only |
組み込みの SQL Console ロール | はい、ClickHouse Cloud により管理 |
sql-console-role:<email> |
管理者が作成するユーザーごとのカスタムロール | はい、ユーザーのサインイン時に適用される |
永続的な権限を設定する
sql_console_admin ロールを持つ SQL Console ユーザーや、ACCESS MANAGEMENT 権限を持つ別のユーザーなど、サービスに対する管理権限を持つユーザーとして、以下のステートメントを実行します。
カスタムロールを作成する
次の例では、カスタムロール sql_console_developer を作成し、my_database に対する権限を付与します。
CREATE ROLE IF NOT EXISTS sql_console_developer;
GRANT SELECT, INSERT, CREATE TABLE
ON my_database.*
TO sql_console_developer;sql_console_developer は組み込みの ClickHouse Cloud ロールではなく、あくまで例です。代わりに、ユーザーに必要な権限を持つ既存のカスタムロールを使用できます。
ユーザーごとの SQL Console ロールを作成する
名前にユーザーのメールアドレスを完全な形で含むロールを作成します。
CREATE ROLE IF NOT EXISTS `sql-console-role:user@example.com`;ロール名には特殊文字が含まれるため、バッククォートが必要です。
カスタムロールを付与する
必要なロールをユーザーごとの SQL Console ロールに付与します。
GRANT sql_console_developer
TO `sql-console-role:user@example.com`;必要に応じて、複数のロールを付与できます。
GRANT sql_console_developer, sql_console_read_only
TO `sql-console-role:user@example.com`;新しい SQL Console セッションを開始する
ユーザーに SQL Console からサインアウトして再度サインインするか、ブラウザーのタブを再読み込みするよう依頼します。新しいセッションでは、ClickHouse Cloud が sql-console-role:user@example.com を sql-console:user@example.com に適用するため、SET ROLE ステートメントは必要ありません。
有効なロールを確認します。
SELECT
currentUser(),
currentRoles(),
enabledRoles(),
defaultRoles();結果には、sql-console-role:user@example.com を通じて付与された権限が含まれているはずです。
管理対象ロールを変更しない
カスタム権限を付与するために、sql_console_admin や sql_console_read_only を変更しないでください。これらの組み込みロールは ClickHouse Cloud によって管理されています。ユーザーごとの権限には、代わりに sql-console-role:<email> を使用してください。
ロール管理の一般的な例については、一般的なアクセス管理クエリを参照してください。