データベース サービスアカウントの管理
データベース サービスアカウントは、認証用に別のパスワードまたは証明書を持つユーザーとしてシンプルに運用することもできます。より高度な運用では、SET ROLE を使用して権限のスコープを動的に変更できるアカウントをセットアップし、ログアウトやページの再読み込みを行わずにプロファイルをすばやく切り替えられるようにすることもできます。
概要
SET ROLE を使用すると、セッション中のサービスアカウントの権限範囲を動的に絞り込めます。これは、有効な権限を、アクティブ化したロールによって付与されたもののみに制限することで実現されます。この方法には、次のような利点があります。
- サービスアカウントには複数のロールを割り当てられますが、特定のクエリに必要なロールだけを有効化できます。
- サービスアカウントが侵害された場合でも、攻撃者が利用できるのはアクティブなロールの権限だけです。
- タスクごとに別々の認証情報を用意しなくても、1 つのアカウントでロールを切り替えながらさまざまなタスクを実行できます。
- 個々のユーザーを更新する代わりに 1 つのロールを変更するだけで、同種のサービスアカウント全体の権限を更新できます。
- ログで、クエリ実行時にどのロールがアクティブだったかを追跡できるため、セキュリティ監査の文脈をより明確に把握できます。
実際には、次のようにします。
- 許可する範囲を表すロールを設計します (read_only、メンテナンス など)
- それらをサービスアカウントに付与します
- 接続時に、
SET ROLE(または role パラメータ) でアクティブなロールを選択し、そのセッションで実行可能な操作を制限します
サービスロールをセットアップする
SET ROLE を使用してセッションの権限範囲を定義する
セッションの開始時に、サービスアカウントは有効にするロールを選択します。
または:
SET ROLE は現在のユーザーのロールを有効化します。実効特権は、有効なすべてのロールの特権と、ユーザーに直接付与された特権を合わせたものです。
すべてのロールを無効化することもできます:
または複数のロールを有効化できます:
現在有効なロールは system.current_roles で確認できます。
HTTP / プログラムからの SET ROLE の使用
サービスアカウントが HTTP 経由で接続する場合、SET ROLE; SELECT ... を複数文として送信することはできません。代わりに、ロールをクエリパラメータとして渡します:
?role=... は、その文の前に SET ROLE read_only_role を実行するのと同等です。複数の role パラメータは SET ROLE role 1, role 2 と同様に動作します。
一部のドライバ (例: Python 用 ClickHouse Connect) では、各リクエストで送信される role 設定を指定でき、サーバーはそれをセッションロールとして使用します。