> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 一般的なアクセス管理クエリ

> この記事では、SQLユーザーとロールを定義し、それらの権限やアクセス許可をデータベース、テーブル、行、カラムに適用する基本を紹介します。

<Tip>
  **セルフマネージド**

  セルフマネージドの ClickHouse を使用している場合は、[SQL ユーザーとロール](/docs/ja/concepts/features/security/access-rights)を参照してください。
</Tip>

この記事では、SQL ユーザーとロールを定義する基本と、それらの権限やアクセス許可をデータベース、テーブル、行、カラムに適用する方法を説明します。

<div id="admin-user">
  ## Admin ユーザー
</div>

ClickHouse Cloud サービスには、サービスの作成時に `default` という admin ユーザーが作成されます。パスワードはサービス作成時に設定され、**Admin** ロールを持つ ClickHouse Cloud ユーザーであればリセットできます。

ClickHouse Cloud サービスに追加の SQL ユーザーを作成する場合、それらのユーザーには SQL の username と password が必要です。管理者レベルの privileges を付与する場合は、新しいユーザーにロール `default_role` を割り当ててください。たとえば、ユーザー `clickhouse_admin` を追加する場合は次のとおりです。

```sql theme={null}
CREATE USER IF NOT EXISTS clickhouse_admin
IDENTIFIED WITH sha256_password BY 'P!@ssword42!';
```

```sql theme={null}
GRANT default_role TO clickhouse_admin;
```

<Note>
  SQL Console を使用する場合、SQL ステートメントは `default` ユーザーとしては実行されません。代わりに、`sql-console:${cloud_login_email}` という名前のユーザーとして実行されます。ここで、`cloud_login_email` は現在クエリを実行しているユーザーのメールアドレスです。

  これらの自動生成された SQL Console ユーザーには、`default` ロールが付与されます。
</Note>

<div id="passwordless-authentication">
  ## パスワードレス認証
</div>

SQL Console で使用できるロールは 2 つあります。`default_role` と同じ権限を持つ `sql_console_admin` と、読み取り専用権限を持つ `sql_console_read_only` です。

Admin ユーザーにはデフォルトで `sql_console_admin` ロールが割り当てられているため、特に変更はありません。一方、`sql_console_read_only` ロールを使うと、Admin 以外のユーザーに対して、任意のインスタンスへの読み取り専用アクセスまたはフルアクセスを付与できます。このアクセスは Admin が設定する必要があります。これらのロールは、インスタンスごとの要件に合わせて `GRANT` または `REVOKE` コマンドで調整でき、加えた変更は永続的に保持されます。

<div id="granular-access-control">
  ### きめ細かなアクセス制御
</div>

このアクセス制御機能は、ユーザーレベルできめ細かく手動設定することもできます。新しい`sql_console_*`ロールをユーザーに割り当てる前に、`sql-console-role:<email>`ネームスペースに対応する、SQL Consoleのユーザー固有のデータベースロールを作成しておく必要があります。例:

```sql theme={null}
CREATE ROLE OR REPLACE sql-console-role:<email>;
GRANT <some grants> TO sql-console-role:<email>;
```

一致するロールが検出されると、定型的なロールではなく、そのロールがユーザーに割り当てられます。これにより、`sql_console_sa_role` や `sql_console_pm_role` のようなロールを作成して特定のユーザーに付与するなど、より複雑なアクセス制御の構成が可能になります。例えば:

```sql theme={null}
CREATE ROLE OR REPLACE sql_console_sa_role;
GRANT <whatever level of access> TO sql_console_sa_role;
CREATE ROLE OR REPLACE sql_console_pm_role;
GRANT <whatever level of access> TO sql_console_pm_role;
CREATE ROLE OR REPLACE `sql-console-role:christoph@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:jake@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:zach@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:christoph@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:jake@clickhouse.com`;
GRANT sql_console_pm_role to `sql-console-role:zach@clickhouse.com`;
```

<div id="test-admin-privileges">
  ## 管理者権限を確認する
</div>

`default` ユーザーからログアウトし、`clickhouse_admin` ユーザーで再度ログインします。

以下はすべて正常に実行できるはずです。

```sql theme={null}
SHOW GRANTS FOR clickhouse_admin;
```

```sql theme={null}
CREATE DATABASE db1
```

```sql theme={null}
CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
```

```sql theme={null}
INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc');
```

```sql theme={null}
SELECT * FROM db1.table1;
```

```sql theme={null}
DROP TABLE db1.table1;
```

```sql theme={null}
DROP DATABASE db1;
```

<div id="non-admin-users">
  ## 非管理者ユーザー
</div>

ユーザーには必要な権限のみを付与し、全員を管理者ユーザーにすべきではありません。以下では、想定されるシナリオ例と、それぞれに必要なロールを示します。

<div id="preparation">
  ### 準備
</div>

以降の例で使用するこれらのテーブルとユーザーを作成します。

<div id="creating-a-sample-database-table-and-rows">
  #### サンプルのデータベース、テーブル、行を作成する
</div>

<Steps>
  <Step title="テスト用データベースを作成する" id="create-a-test-database">
    ```sql theme={null}
    CREATE DATABASE db1;
    ```
  </Step>

  <Step title="テーブルを作成する" id="create-a-table">
    ```sql theme={null}
    CREATE TABLE db1.table1 (
       id UInt64,
       column1 String,
       column2 String
    )
    ENGINE MergeTree
    ORDER BY id;
    ```
  </Step>

  <Step title="テーブルにサンプル行を追加する" id="populate">
    ```sql theme={null}
    INSERT INTO db1.table1
       (id, column1, column2)
    VALUES
       (1, 'A', 'abc'),
       (2, 'A', 'def'),
       (3, 'B', 'abc'),
       (4, 'B', 'def');
    ```
  </Step>

  <Step title="テーブルを確認する" id="verify">
    ```sql title="クエリ" theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response title="レスポンス" theme={null}
    Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    │  3 │ B       │ abc     │
    │  4 │ B       │ def     │
    └────┴─────────┴─────────┘
    ```
  </Step>

  <Step title={<>Create <code>column_user</code></>} id="create-a-user-with-restricted-access-to-columns">
    特定のカラムへのアクセス制限を実演するために使用する一般ユーザーを作成します。

    ```sql theme={null}
    CREATE USER column_user IDENTIFIED BY 'password';
    ```
  </Step>

  <Step title={<>Create <code>row_user</code></>} id="create-a-user-with-restricted-access-to-rows-with-certain-values">
    特定の値を持つ行へのアクセス制限を実演するために使用する一般ユーザーを作成します。

    ```sql theme={null}
    CREATE USER row_user IDENTIFIED BY 'password';
    ```
  </Step>
</Steps>

<div id="creating-roles">
  #### ロールの作成
</div>

この一連の例では、次のことを行います。

* カラムや行など、異なる権限に対応するロールを作成します
* ロールに権限を付与します
* 各ロールにユーザーを割り当てます

ロールは、ユーザーごとに個別に管理する代わりに、特定の権限を持つユーザーのグループを定義するために使用します。

<Steps>
  <Step title={<>このロールのユーザーが database <code>db1</code> の <code>table1</code> で <code>column1</code> のみを参照できるよう制限するロールを作成します:</>} id="create-column-role">
    ```sql theme={null}
    CREATE ROLE column1_users;
    ```
  </Step>

  <Step title={<> <code>column1</code> の参照を許可する権限を設定します</>} id="set-column-privileges">
    ```sql theme={null}
    GRANT SELECT(id, column1) ON db1.table1 TO column1_users;
    ```
  </Step>

  <Step title={<>ユーザー <code>column_user</code> を <code>column1_users</code> ロールに追加します</>} id="add-column-user-to-role">
    ```sql theme={null}
    GRANT column1_users TO column_user;
    ```
  </Step>

  <Step title={<>このロールのユーザーが選択された行のみを参照できるよう制限するロールを作成します。この例では、<code>column1</code> に <code>A</code> を含む行のみです</>} id="create-row-role">
    ```sql theme={null}
    CREATE ROLE A_rows_users;
    ```
  </Step>

  <Step title={<> <code>row_user</code> を <code>A_rows_users</code> ロールに追加します</>} id="add-row-user-to-role">
    ```sql theme={null}
    GRANT A_rows_users TO row_user;
    ```
  </Step>

  <Step title={<> <code>column1</code> の値が <code>A</code> の場合にのみ参照を許可するポリシーを作成します</>} id="create-row-policy">
    ```sql theme={null}
    CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;
    ```
  </Step>

  <Step title="database と table に対する権限を設定します" id="set-db-table-privileges">
    ```sql theme={null}
    GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;
    ```
  </Step>

  <Step title="他のロールが引き続きすべての行にアクセスできるよう、明示的な権限を付与します" id="grant-other-roles-access">
    ```sql theme={null}
    CREATE ROW POLICY allow_other_users_filter 
    ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;
    ```

    <Note>
      ポリシーをテーブルに適用すると、システムはそのポリシーを適用し、そのポリシーで定義されたユーザーとロールのみがそのテーブルに対して操作を実行できるようになります。それ以外のすべてのユーザーは、いかなる操作も拒否されます。他のユーザーに制限付きの行ポリシーが適用されないようにするには、他のユーザーやロールに通常のアクセス、または別の種類のアクセスを許可する別のポリシーを定義する必要があります。
    </Note>
  </Step>
</Steps>

<div id="verification">
  ## 確認
</div>

<div id="testing-role-privileges-with-column-restricted-user">
  ### カラム制限付きユーザーでロール権限をテストする
</div>

<Steps>
  <Step title={<>`clickhouse_admin` ユーザーで ClickHouse client にログインします</>} id="login-admin-user">
    ```bash theme={null}
    clickhouse-client --user clickhouse_admin --password password
    ```
  </Step>

  <Step title="admin ユーザーでデータベース、テーブル、およびすべての行へのアクセスを確認します。" id="verify-admin-access">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: f5e906ea-10c6-45b0-b649-36334902d31d

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    │  3 │ B       │ abc     │
    │  4 │ B       │ def     │
    └────┴─────────┴─────────┘
    ```
  </Step>

  <Step title={<>`column_user` ユーザーで ClickHouse client にログインします</>} id="login-column-user">
    ```bash theme={null}
    clickhouse-client --user column_user --password password
    ```
  </Step>

  <Step title={<>すべてのカラムを指定して <code>SELECT</code> をテストします</>} id="test-select-all-columns">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: 5576f4eb-7450-435c-a2d6-d6b49b7c4a23

    0 rows in set. Elapsed: 0.006 sec.

    Received exception from server (version 22.3.2):
    Code: 497. DB::Exception: Received from localhost:9000. 
    DB::Exception: column_user: Not enough privileges. 
    To execute this query it's necessary to have grant 
    SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
    ```

    <Note>
      すべてのカラムを指定していますが、このユーザーにアクセスが許可されているのは `id` と `column1` のみであるため、アクセスは拒否されます
    </Note>
  </Step>

  <Step title={<>指定されていて、かつ許可されているカラムのみを使った <code>SELECT</code> クエリを確認します:</>} id="verify-allowed-columns">
    ```sql theme={null}
    SELECT
        id,
        column1
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9

    ┌─id─┬─column1─┐
    │  1 │ A       │
    │  2 │ A       │
    │  3 │ B       │
    │  4 │ B       │
    └────┴─────────┘
    ```
  </Step>
</Steps>

<div id="testing-role-privileges-with-row-restricted-user">
  ### 行制限付きユーザーでロール権限をテストする
</div>

<Steps>
  <Step title={<>`row_user` を使用して ClickHouse client にログインする</>} id="login-row-user">
    ```bash theme={null}
    clickhouse-client --user row_user --password password
    ```
  </Step>

  <Step title="表示される行を確認する" id="view-available-rows">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb

    ┌─id─┬─column1─┬─column2─┐
    │  1 │ A       │ abc     │
    │  2 │ A       │ def     │
    └────┴─────────┴─────────┘
    ```

    <Note>
      上記の 2 行だけが返されることを確認してください。`column1` の値が `B` の行は除外されているはずです。
    </Note>
  </Step>
</Steps>

<div id="modifying-users-and-roles">
  ## ユーザーとロールの変更
</div>

必要な権限の組み合わせに応じて、ユーザーには複数のロールを割り当てることができます。複数のロールを使用する場合、システムはそれらを組み合わせて権限を判定するため、結果としてロールの権限は累積されます。

たとえば、`role1` が `column1` に対する SELECT のみを許可し、`role2` が `column1` と `column2` に対する SELECT を許可している場合、ユーザーは両方のカラムにアクセスできます。

<Steps>
  <Step title="管理者アカウントを使用して、デフォルトロール付きで行とカラムの両方に制限をかけた新しいユーザーを作成する" id="create-restricted-user">
    ```sql theme={null}
    CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;
    ```
  </Step>

  <Step title={<>`A_rows_users` ロールの既存の権限を取り消す</>} id="remove-prior-privileges">
    ```sql theme={null}
    REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;
    ```
  </Step>

  <Step title={<>`A_row_users` ロールが `column1` のみを SELECT できるようにする</>} id="allow-column1-select">
    ```sql theme={null}
    GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;
    ```
  </Step>

  <Step title={<>`row_and_column_user` で ClickHouse client にログインする</>} id="login-restricted-user">
    ```bash theme={null}
    clickhouse-client --user row_and_column_user --password password;
    ```
  </Step>

  <Step title="すべてのカラムでテストする:" id="test-all-columns-restricted">
    ```sql theme={null}
    SELECT *
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: 8cdf0ff5-e711-4cbe-bd28-3c02e52e8bc4

    0 rows in set. Elapsed: 0.005 sec.

    Received exception from server (version 22.3.2):
    Code: 497. DB::Exception: Received from localhost:9000. 
    DB::Exception: row_and_column_user: Not enough privileges. 
    To execute this query it's necessary to have grant 
    SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)
    ```
  </Step>

  <Step title="許可されたカラムのみに絞ってテストする:" id="test-limited-columns">
    ```sql theme={null}
    SELECT
        id,
        column1
    FROM db1.table1
    ```

    ```response theme={null}
    Query id: 5e30b490-507a-49e9-9778-8159799a6ed0

    ┌─id─┬─column1─┐
    │  1 │ A       │
    │  2 │ A       │
    └────┴─────────┘
    ```
  </Step>
</Steps>

<div id="troubleshooting">
  ## トラブルシューティング
</div>

権限が重複したり組み合わさったりして、予期しない結果になることがあります。そのような場合は、管理者アカウントを使用して次のコマンドで原因を絞り込めます

<div id="listing-the-grants-and-roles-for-a-user">
  ### ユーザーの権限とロールを一覧表示する
</div>

```sql theme={null}
SHOW GRANTS FOR row_and_column_user
```

```response theme={null}
Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b

┌─GRANTS FOR row_and_column_user───────────────────────────┐
│ GRANT A_rows_users, column1_users TO row_and_column_user │
└──────────────────────────────────────────────────────────┘
```

<div id="list-roles-in-clickhouse">
  ### ClickHouse のロールを一覧表示する
</div>

```sql theme={null}
SHOW ROLES
```

```response theme={null}
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a

┌─name────────────┐
│ A_rows_users    │
│ column1_users   │
└─────────────────┘
```

<div id="display-the-policies">
  ### ポリシーを表示
</div>

```sql theme={null}
SHOW ROW POLICIES
```

```response theme={null}
Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc

┌─name───────────────────────────────────┐
│ A_row_filter ON db1.table1             │
│ allow_other_users_filter ON db1.table1 │
└────────────────────────────────────────┘
```

<div id="view-how-a-policy-was-defined-and-current-privileges">
  ### ポリシーの定義内容と現在の権限を確認する
</div>

```sql theme={null}
SHOW CREATE ROW POLICY A_row_filter ON db1.table1
```

```response theme={null}
Query id: 0d3b5846-95c7-4e62-9cdd-91d82b14b80b

┌─CREATE ROW POLICY A_row_filter ON db1.table1────────────────────────────────────────────────┐
│ CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
```

<div id="example-commands-to-manage-roles-policies-and-users">
  ## ロール、ポリシー、ユーザーを管理するためのコマンド例
</div>

次のコマンドでは、以下の操作を実行できます。

* 権限を削除する
* ポリシーを削除する
* ユーザーのロール割り当てを解除する
* ユーザーとロールを削除する
  <br />

<Tip>
  これらのコマンドは、admin ユーザーまたは `default` ユーザーとして実行してください
</Tip>

<div id="remove-privilege-from-a-role">
  ### ロールから権限を削除する
</div>

```sql theme={null}
REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users;
```

<div id="delete-a-policy">
  ### ポリシーを削除する
</div>

```sql theme={null}
DROP ROW POLICY A_row_filter ON db1.table1;
```

<div id="unassign-a-user-from-a-role">
  ### ユーザーからロールの割り当てを解除する
</div>

```sql theme={null}
REVOKE A_rows_users FROM row_user;
```

<div id="delete-a-role">
  ### ロールを削除する
</div>

```sql theme={null}
DROP ROLE A_rows_users;
```

<div id="delete-a-user">
  ### ユーザーを削除する
</div>

```sql theme={null}
DROP USER row_user;
```

<div id="summary">
  ## 要約
</div>

この記事では、SQL のユーザーとロールの作成の基本と、ユーザーおよびロールの権限を設定・変更する手順を説明しました。各項目の詳細については、ユーザーガイドとリファレンスドキュメントを参照してください。
