クライアントTLS/SSL接続数
=========================

..  Seealso::
   :ref:`証明書 <証明書>` を参照してください。

CloudNativePGがTLS証明書をサポートする方法の詳細については、ページをご覧ください。

CloudNativePGオペレーターは、サーバー側とクライアント側での転送中の暗号化と認証の両方でTLS
/ SSLと連携するように設計されています。
CNPGオペレーターを使用して作成されたクラスターには、TLSクライアント証明書を作成および署名するための認証局CAが付属しています。
``kubectl`` の\ ``cnpg``
プラグインを介して、パスワードを使用する代わりにユーザーを認証するために使用できる新しいTLSクライアント証明書を発行できます。

TLS /
SSL証明書を介して認証するには、次の手順を参照してください。これは、

::

   apiVersion: postgresql.cnpg.io/v1
   kind: Cluster
   metadata:
     name: cluster-example
   spec:
     instances: 3
     postgresql:
       pg_hba:
         - hostssl app all all cert

     storage:
       size: 1Gi

マニフェスト。構成パラダイムの規則に従って、そのファイルは、 ``app``
と呼ばれるユーザーが所有する\ ``app``
データベースを自動的に作成します。\ ``bootstrap``
セクションの\ ``initdb`` 構成を介してこの規則を変更できます。

新しい証明書の発行
------------------

..  Seealso::
   :ref:`証明書 <証明書>` を参照してください。

``kubectl``
のプラグインの使用方法の詳細については、ページをご覧ください。

次のとおりに、\ ``cluster-example`` PostgreSQLクラスターに\ ``app``
ユーザーの証明書を作成できます。

.. code:: shell

   kubectl cnpg certificate cluster-app \
     --cnpg-cluster cluster-example \
     --cnpg-user app

これで、次の方法で証明書を検証できます。

.. code:: shell

   kubectl get secret cluster-app \
     -o jsonpath="{.data[tls\.crt]}" \
     | base64 -d | openssl x509 -text -noout \
     | head -n 11

出力

.. code:: console


   Certificate:
     Data:
       Version: 3 (0x2)
       Serial Number:
         5d:e1:72:8a:39:9f:ce:51:19:9d:21:ff:1e:4b:24:5d
       Signature Algorithm: ecdsa-with-SHA256
       Issuer: OU = default, CN = cluster-example
       Validity
         Not Before: Mar 22 10:22:14 2021 GMT
         Not After : Mar 22 10:22:14 2022 GMT
       Subject: CN = app

ご覧のとおり、デフォルトのTLSクライアント証明書は、90日間の有効期間と、PostgreSQLのユーザー名に対応する単純なCNで作成されます。これは、
``pg_hba.conf`` の\ ``hostssl`` エントリの\ ``cert``
認証方法を活用するために必要です。

TLS証明書を介した接続のテスト
-----------------------------

次に、CloudNativePGクラスターに接続するデモクライアントアプリケーションを構成することにより、このクライアント証明書をテストします。

``cert-test.yaml``
と呼ばれる次のマニフェストは、データベースクラスターが実行されているのと同じ名前空間にテストアプリケーションを使用してデモポッドを作成します。

.. code:: yaml

   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: cert-test
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: webtest
     template:
       metadata:
         labels:
           app: webtest
       spec:
         containers:
           - image: ghcr.io/cloudnative-pg/webtest:1.6.0
             name: cert-test
             volumeMounts:
               - name: secret-volume-root-ca
                 mountPath: /etc/secrets/ca
               - name: secret-volume-app
                 mountPath: /etc/secrets/app
             ports:
               - containerPort: 8080
             env:
               - name: DATABASE_URL
                 value: >
                   sslkey=/etc/secrets/app/tls.key
                   sslcert=/etc/secrets/app/tls.crt
                   sslrootcert=/etc/secrets/ca/ca.crt
                   host=cluster-example-rw.default.svc
                   dbname=app
                   user=app
                   sslmode=verify-full
               - name: SQL_QUERY
                 value: SELECT 1
             readinessProbe:
               httpGet:
                 port: 8080
                 path: /tx
         volumes:
           - name: secret-volume-root-ca
             secret:
               secretName: cluster-example-ca
               defaultMode: 0600
           - name: secret-volume-app
             secret:
               secretName: cluster-app
               defaultMode: 0600

このポッドは、CloudNativePGオペレーターによって管理されるシークレットをマウントします。

-  ``sslcert`` TLSクライアントのパブリック証明書

-  ``sslkey`` TLSクライアント証明書のプライベートキー

-  ``sslrootcert``
   インスタンスのIDを確認するために使用されるサーバーで証明書に署名したTLS認証局証明書

これらは、 ``psql`` および\ ``pgbench``
のような他のlibpqベースのアプリケーションがPostgresデータベースへのTLS暗号化接続を確立するために必要なデフォルトリソースを作成するために使用されます。

デフォルトでは、\ ``psql`` は、現在のユーザーの\ ``~/.postgresql``
ディレクトリ内の証明書を検索しますが、
sslkey、sslcert、sslrootcertオプションを使用して、libpqを暗号化マテリアルの実際の場所を指すことができます。上記のファイルのコンテンツは、kubectlの\ ``cnpg``
プラグインを使用して以前に作成したシークレットから収集されています。

次に、アプリケーションを展開します。

.. code:: shell

   kubectl create -f cert-test.yaml

次に、作成したポッドをPostgreSQLクライアントとして使用して、作成したばかりのTLS証明書を使用してSSL接続と認証を検証します。

準備状況プローブは、データベースサーバーに到達できるときにアプリケーションの準備ができていることを確認するように構成されています。

ポッドのコンテナ内でインタラクティブな\ ``bash``
を実行して、必要なオプションを使用して\ ``psql``
を実行することにより、接続が機能していることを確認できます。
PostgreSQLサーバーは、読み取り/書き込みのKubernetesサービスを介して公開されます。
``psql`` コマンドを指定してこのサービスに接続します。

.. code:: shell

   kubectl exec -it cert-test -- bash -c "psql
   sslkey=/etc/secrets/app/tls.key sslcert=/etc/secrets/app/tls.crt
   sslrootcert=/etc/secrets/ca/ca.crt host=cluster-example-rw.default.svc dbname=app
   user=app sslmode=verify-full -c select version();"

出力

.. code:: console

                                           version
   - -------------------------------------------------------------------------------------
   - -----------------
   PostgreSQL 16.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20191121 (Red Hat
   8.3.1-5), 64-bit
   (1 row)
