> ## 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.

# 認証用SSLユーザー証明書の設定

> このガイドでは、SSLユーザー証明書認証を設定するためのシンプルで最小限の構成を説明します。

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            ClickHouse Cloud では利用できません
        </div>;
};

<CloudNotSupportedBadge />

<Note>
  このページは [ClickHouse Cloud](https://clickhouse.com/cloud) には適用されません。ここで説明している機能は ClickHouse Cloud サービスではご利用いただけません。
  詳しくは、ClickHouse の [Cloud Compatibility](/docs/ja/products/cloud/guides/cloud-compatibility) ガイドを参照してください。
</Note>

このガイドでは、SSL ユーザー証明書を使用した認証を設定するための、シンプルで最小限の設定について説明します。このチュートリアルは、[TLS の設定ガイド](/docs/ja/concepts/features/security/tls/configuring-tls)を前提としています。

<Note>
  SSL ユーザー認証は、`https`、`native`、`mysql`、`postgresql` の各インターフェイスを使用する場合にサポートされます。

  ClickHouse ノードでは、安全な認証のために `<verificationMode>strict</verificationMode>` を設定する必要があります (ただし、テスト目的であれば `relaxed` でも動作します) 。

  MySQL インターフェイスで AWS NLB を使用する場合は、以下の未公開オプションを有効にするよう AWS サポートに依頼する必要があります。

  > 当社の NLB の Proxy Protocol v2 を、以下の `proxy_protocol_v2.client_to_server.header_placement,Value=on_first_ack` のように設定できるようにしたいです。
</Note>

<Steps>
  <Step title="SSLユーザー証明書を作成する" id="1-create-ssl-user-certificates">
    <Note>
      この例では、自己署名CAによる自己署名証明書を使用します。本番環境では、CSR を作成し、適切な証明書を取得するために PKI チームまたは証明書プロバイダーに提出してください。
    </Note>

    1. Certificate Signing Request (CSR) と秘密鍵を生成します。基本的な形式は次のとおりです。
       ```bash theme={null}
       openssl req -newkey rsa:2048 -nodes -subj "/CN=<my_host>:<my_user>"  -keyout <my_cert_name>.key -out <my_cert_name>.csr
       ```
       この例では、このサンプル環境で使用するドメインとユーザーに対して次を使用します。
       ```bash theme={null}
       openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1.marsnet.local:cert_user"  -keyout chnode1_cert_user.key -out chnode1_cert_user.csr
       ```

    <Note>
      CN は任意であり、証明書の識別子として任意の文字列を使用できます。これは、以降の手順でユーザーを作成する際に使用されます。
    </Note>

    2. 認証に使用する新しいユーザー証明書を生成して署名します。基本的な形式は次のとおりです。
       ```bash theme={null}
       openssl x509 -req -in <my_cert_name>.csr -out <my_cert_name>.crt -CA <my_ca_cert>.crt -CAkey <my_ca_cert>.key -days 365
       ```
       この例では、このサンプル環境で使用するドメインとユーザーに対して次を使用します。
       ```bash theme={null}
       openssl x509 -req -in chnode1_cert_user.csr -out chnode1_cert_user.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365
       ```
  </Step>

  <Step title="SQLユーザーを作成し、権限を付与する" id="2-create-a-sql-user-and-grant-permissions">
    <Note>
      SQL ユーザーを有効にしてロールを設定する方法の詳細については、[SQL ユーザーとロールの定義](/docs/ja/concepts/features/security/access-rights) ユーザーガイドを参照してください。
    </Note>

    1. 証明書認証を使用する SQL ユーザーを作成します。
       ```sql theme={null}
       CREATE USER cert_user IDENTIFIED WITH ssl_certificate CN 'chnode1.marsnet.local:cert_user';
       ```

    2. 新しい証明書ユーザーに権限を付与します。
       ```sql theme={null}
       GRANT ALL ON *.* TO cert_user WITH GRANT OPTION;
       ```

    <Note>
      説明のため、この演習ではこのユーザーに管理者の全権限を付与しています。権限の設定については、ClickHouse の [RBAC ドキュメント](/docs/ja/concepts/features/security/access-rights) を参照してください。
    </Note>

    <Note>
      ユーザーとロールの定義には SQL を使用することを推奨します。ただし、現在設定ファイルでユーザーとロールを定義している場合、ユーザーは次のようになります。

      ```xml theme={null}
      <users>
          <cert_user>
              <ssl_certificates>
                  <common_name>chnode1.marsnet.local:cert_user</common_name>
              </ssl_certificates>
              <networks>
                  <ip>::/0</ip>
              </networks>
              <profile>default</profile>
              <access_management>1</access_management>
              {/* additional options*/}
          </cert_user>
      </users>
      ```
    </Note>
  </Step>

  <Step title="検証" id="3-testing">
    1. ユーザー証明書、ユーザー秘密鍵、および CA 証明書をリモートノードにコピーします。

    2. 証明書とパスを指定して、ClickHouse の [client config](/docs/ja/concepts/features/interfaces/client#configuration_files) で OpenSSL を設定します。

       ```xml theme={null}
       <openSSL>
           <client>
               <certificateFile>my_cert_name.crt</certificateFile>
               <privateKeyFile>my_cert_name.key</privateKeyFile>
               <caConfig>my_ca_cert.crt</caConfig>
           </client>
       </openSSL>
       ```

    3. `clickhouse-client` を実行します。
       ```bash theme={null}
       clickhouse-client --user <my_user> --query 'SHOW TABLES'
       ```

    <Note>
      設定で証明書が指定されている場合、clickhouse-client に渡したパスワードは無視されることに注意してください。
    </Note>
  </Step>

  <Step title="HTTP のテスト" id="4-testing-http">
    1. ユーザー証明書、ユーザー秘密鍵、および CA 証明書をリモートノードにコピーします。

    2. `curl` を使用してサンプルの SQL コマンドをテストします。基本的な形式は次のとおりです。
       ```bash theme={null}
       echo 'SHOW TABLES' | curl 'https://<clickhouse_node>:8443' --cert <my_cert_name>.crt --key <my_cert_name>.key --cacert <my_ca_cert>.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: <my_user>" --data-binary @-
       ```
       例:
       ```bash theme={null}
       echo 'SHOW TABLES' | curl 'https://chnode1:8443' --cert chnode1_cert_user.crt --key chnode1_cert_user.key --cacert marsnet_ca.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: cert_user" --data-binary @-
       ```
       出力は次のようになります。
       ```response theme={null}
       INFORMATION_SCHEMA
       default
       information_schema
       system
       ```

    <Note>
      パスワードが指定されていないことに注意してください。証明書がパスワードの代わりに使用され、ClickHouse はそれを用いてユーザーを認証します。
    </Note>
  </Step>
</Steps>

<div id="summary">
  ## まとめ
</div>

この記事では、SSL証明書認証用のユーザーを作成して設定するための基本事項を説明しました。この方法は、`clickhouse-client`、または `https` インターフェイスをサポートし、HTTPヘッダーを設定できる任意のクライアントで使用できます。生成された証明書と秘密鍵は、証明書が ClickHouse データベース上の操作に対するユーザーの認証と認可に使用されるため、非公開にし、アクセスを制限して保管してください。証明書と秘密鍵は、パスワードと同様に扱ってください。
