Managing SSL certificates
=========================

PEMは自己署名SSL証明書を使用します。

-  ユーザーインターフェイスとREST APIを提供する :ref:`WebサーバーとPEMバックエンドデータベースが個別にインストールされている場合の構成後の手順 <WebサーバーとPEMバックエンドデータベースが個別にインストールされている場合の構成後の手順>`  Apache
   httpdへの要求を保護するため。

-  :ref:`PEMバックエンドデータベースサーバーとエージェントの接続証明書 <PEMバックエンドデータベースサーバーとエージェントの接続証明書>` を保護および認証するため。

Webサーバー証明書
-----------------

PEMは、Apache httpdサーバーの自己署名SSL証明書を使用します。 Apache
httpdサーバーの自己署名SSL証明書とキーファイルは、PEMのインストール中に生成されます。

PEMに独自のSSL証明書を使用するには、Apache HTTP構成ファイル
``edb-ssl-pem.conf`` を更新します。

PEM VirtualHostセクションで、これらの2つのSSL指示子を更新します。

-  ``SSLCertificateFile``
   は、証明書ファイル、例、\ ``your_domain_name.crt`` です。

-  ``SSLCertificateKeyFile``
   は、証明書署名要求CSR、\ ``your_private.key``
   などを作成したときに生成された\ ``.key`` ファイルです。

例、次の更新を行います。

.. code:: shell

   #  Change the server name and file names in the configuration file to 

   #  match your certificate files.

   SSLEngine on
   SSLCertificateFile /path/to/your_domain_name.crt
   SSLCertificateKeyFile /path/to/your_private.key

セキュリティを強化するために、PEMでhttpd自己署名SSL証明書を信頼できるCA署名証明書に置き換えることができます。詳細については、
 `Replacing httpd self-signed SSL certificates <https://www.enterprisedb.com/postgres-tutorials/how-replacing-httpd-self-signed-ssl-certificates-trusted-ca-signed-certificates>`_ を参照してください。

PEMバックエンドデータベースサーバーとエージェントの接続証明書
-------------------------------------------------------------

デフォルトでは、PEMはPEMエージェントとバックエンドデータベース間で安全なSSL/TLS接続を実装します。また、独自の認証局CAとして機能して、PEMサーバーとエージェントの証明書とキーを生成します。
PEMサーバーとエージェントの自己署名SSL証明書とキーは、PEMのインストール中に生成されます。これらの証明書とキーは、エージェントからサーバーへの接続を暗号化します。さらに、PEMエージェントは、パスワードではなく証明書を使用して認証されます。

PEM自己署名SSL証明書とキーを、信頼できるCA証明書とキーに置き換えることができます。詳細については、
:ref:`信頼できるCAによって署名された証明書とキーを使用する <信頼できるCAによって署名された証明書とキーを使用する>` を参照してください。

PEM自己署名SSL証明書の仕組み
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

PEMサーバー構成スクリプトは、PEMバックエンドデータベースサーバーの自己署名SSL証明書とキーファイルを生成します。バックエンドデータベースサーバーは、これらの証明書とキーを使用して、エージェント接続を認証および暗号化します。各証明書には有効期限があります。証明書の有効期限が近づくと、証明書を再生成します。詳細については、
:ref:`Regenerating the server self-signed SSL certificates <Regenerating the server self-signed SSL certificates>` を参照してください。

PEMエージェントは、libpqインターフェイスを使用してPEMバックエンドデータベースサーバーに接続し、バックエンドデータベースサーバーのクライアントとして機能します。エージェントの自己署名SSL証明書とキーは、
:ref:`Registering a PEM agent <Registering a PEM agent>` 中に生成されます。
PEMエージェントは、自己署名SSL証明書とキーファイルを使用して、PEMバックエンドデータベースサーバーとの接続を確立します。

各エージェントには一意の識別子があり、エージェントの証明書とキーには対応する識別子があります。各証明書には有効期限があります。証明書の有効期限が近づくと、証明書を再生成します。詳細については、
:ref:`Regenerating the agent self-signed SSL certificates <Regenerating the agent self-signed SSL certificates>` を参照してください。

必要に応じて、エージェントごとに1つの証明書を使用するのではなく、すべてのエージェントに同じ証明書を使用できます。詳細については、
:ref:`共通エージェント証明書とキーペアを生成する <共通エージェント証明書とキーペアを生成する>` を参照してください。

SSL証明書を使用してPostgresで接続する方法の詳細については、
 `Securing TCP/IP connections with SSL <https://www.postgresql.org/docs/current/ssl-tcp.html>`_ を参照してください。

証明書とキーファイルの生成
^^^^^^^^^^^^^^^^^^^^^^^^^^

PEMサーバーは、バックエンドデータベースサーバーのデータディレクトリに証明書とキーファイルを生成します。

-  ``ca_certificate.crt``

-  ``ca_key.key``

-  ``root.crt``

-  ``root.crl``

-  ``server.crt``

-  ``server.key``

``ca_certificate.crt`` および\ ``ca_key.key``
ファイルは、エージェント登録プロセス中に使用され、エージェントのSSL証明書とキーファイルを生成します。

``root.crt`` ファイルは、\ ``ca_certificate.crt`` ファイルのコピーです。
``postgresql.conf`` ファイルで\ ``ssl_ca_file``
パラメーターを\ ``root.crt``
として設定することにより、バックエンドデータベースサーバーのルート証明書を使用します。

``root.crl``
には、実際のまたは割り当てられた有効期限の前に発行CAによって失効されたデジタル証明書の証明書失効リストCRLがあります。

``server.crt`` ファイルはPEMサーバーの署名された証明書であり、
``server.key`` ファイルは証明書のプライベートキーです。
PEMエージェント証明書は、これらのサーバー証明書とキーファイルを使用して生成されます。

PEM自己署名SSL証明書の更新
^^^^^^^^^^^^^^^^^^^^^^^^^^

PEMサーバーと共にインストールされるPEMエージェントは、\ ``ca_certificate.crt``
ファイルの有効期限を監視します。証明書の有効期限が間もなくエキスパイアと、PEMは次のことを行います。

-  既存の証明書ファイルのバックアップを作成します

-  新しい証明書ファイルを作成し、新しいCA証明書ファイルをPEMサーバー上の\ ``root.crt``
   ファイルに追加します

-  アクティブなエージェントの証明書ファイルを更新するジョブを作成します

-  PEMサーバーを再起動します

共通エージェント証明書とキーペアを生成する
------------------------------------------

エージェントごとに1ユーザーデフォルトではなく、すべてのPEMエージェントに単一のPostgresユーザーを作成して使用することにより、すべてのエージェントに同じ証明書を使用できます。

ユーザーを作成し、エージェント証明書とキーペアを生成し、すべてのPEMエージェントにそれらを使用します。

1. PEMバックエンドデータベースに1つの共通エージェントユーザーを作成します。
   ``pem_agent`` ロールをユーザーに付与します。

.. code:: shell

      # Running as enterprisedb
      psql -p 5444 -U enterprisedb -d pem
      CREATE USER pem_agent_common_user;
      GRANT pem_agent TO pem_agent_common_user;

1. エージェントキーを生成します。

.. code:: shell

      # Running as root
      openssl genrsa -out agent.key 4096 

1. エージェントのCSRを生成します。

.. code:: shell

      openssl req -new -key agent.key -out agent.csr -subj /C=IN/ST=MH/L=Pune/O=PEM/CN=<agent_user>

``-subj`` は、要件に従って提供されます。

1. ``openssl x509``
   コマンドを使用してCSRに署名し、エージェント証明書を生成します。

.. code:: shell

      openssl x509 -req -days 365 -in agent.csr -CA ca_certificate.crt -CAkey ca_key.key -CAcreateserial -out agent.crt

1. ``agent.crt`` および\ ``agent.key``
   ファイルのアクセス許可を変更します。

.. code:: shell

      chmod 600 agent.crt agent.key

1. 次のエージェント証明書とキーペアを使用します。

-  新しいPEMエージェントをリモートホストからPEMサーバーに登録するため。

a.エージェント証明書とキーペアをリモートエージェントホストにコピーし、エージェントを登録します。

.. code:: shell

           export PEM_SERVER_PASSWORD=edb

           /usr/edb/pem/agent/bin/pemworker --register-agent \
           --pem-server 192.168.99.130 \
           --pem-user enterprisedb \
           --pem-port 5444 \
           --pem-agent-user pem_agent_common_user \
           -o agent_ssl_crt= agent.crt \
           -o agent_ssl_key= agent.key

b. pemagentサービスを有効にして開始します。

.. code:: shell

           systemctl enable pemagent
           systemctl start pemagent

-  エージェント証明書とキーペアを登録済みのエージェントに置き換えます。
   a.エージェントホストの\ ``agent.cfg`` ファイルの\ ``agent_user``
   、\ ``agent_ssl_key`` 、および\ ``agent_ssl_crt``
   パラメーターを編集します。

.. code:: shell

           vi /usr/edb/pem/agent/etc/agent.cfg
           # Edit the agent username
           agent_user=pem_agent_common_user
           # Edit the ssl parameters with new certificate and key file location
           agent_ssl_key=<new_location>/agent.key
           agent_ssl_crt=<new_location>/agent.crt
   ``` b. pemagentサービスを再起動します。

   ```shell
           systemctl restart pemagent

信頼できるCAによって署名された証明書とキーを使用する
----------------------------------------------------

PEM自己署名SSL証明書とキーを、信頼できるCAによって署名された証明書とキーに置き換えます。

信頼できるCA証明書とキーを取得した後、
:ref:`自己署名サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 <自己署名サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。>` および :ref:`自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 <自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。>` 証明書とキーを置き換えます。

自己署名サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. 古いサーバー証明書とキーファイルをバックアップします。

.. code:: shell

      # Running as root
      mkdir /var/lib/edb/as<x>/data/certs
      cd /var/lib/edb/as<x>/data/
      mv server. *root.*  ca_* /var/lib/edb/as<x>/data/certs

1. サーバーのプライベートキーを生成します。

.. code:: shell

      openssl genrsa -out server.key 4096 

1. サーバーのCSRを生成します。

edb_notranlate_12 ``-subj`` は、要件に従って提供されます。 ``CN``
には、PEMサーバーホストのホスト名またはドメイン修飾フルネームを使用することをお勧めします。

1. 信頼できるCAからCA証明書 ``trusted_ca.crt`` を取得します。

2. CAにCSRに署名し、サーバー証明書を生成するように依頼します。

3. 新しいサーバー証明書の詳細が改ざんされていないことを確認し、指定した詳細と一致することを確認します。

.. code:: shell

      openssl x509 -noout -text -in server.crt

1. CAから取得した新しい証明書を\ ``root.crt`` ファイルとして使用します。

.. code:: shell

      cp trusted_ca.crt root.crt

1. 信頼できるCAがCRLを提供しない場合、サーバーによるCRLの使用を無効にします。
   CRLの使用を無効にするには、 ``postgresql.conf``
   ファイルの\ ``ssl_crl_file`` パラメーターをコメント化します。

..  Note::
   誤って以前のCAからのCRLを適切な場所に残し、`ssl_crl_file` をコメントアウトしない場合、サーバーは起動しますが、認証はSSLエラーメッセージ`tlsv1 alert unknown ca` で失敗します。エラーは、CRLが原因であることを指定していないため、これはコンテキスト外で発生した場合、デバッグが困難になる場合があります。

1. 新しい\ ``root.crt`` 、\ ``server.key`` 、および\ ``server.crt``
   ファイルをバックエンドデータベースサーバーのデータディレクトリにコピーします。

.. code:: shell

      cp root.crt server.key server.crt /var/lib/edb/as<x>/data

1. 新しい証明書とキーファイルの所有者と権限をデータディレクトリと同じになるように変更します。

edb_notranlate_16 ..  Note::
   今はPEMサーバーを再起動しないでください。 PEMサーバーを再起動すると、登録されているすべてのエージェントが動作を停止します。

1. 各PEMエージェントのSSL証明書を、信頼できるCA証明書に置き換えます。詳細については、これらの
   :ref:`自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 <自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。>`  を参照してください。

2. PEMサーバーを再起動します。

-  Linuxの場合

.. code:: shell

      # Running as root
      systemctl start edb-as-<x>

バックエンドデータベースサーバーを再起動すると、PEMサーバーが再起動されます。

自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

自己署名サーバー証明書\ ``server.crt`` および\ ``server.key``
およびCA証明書\ ``root.crt``
を置き換えた後にのみ、自己署名エージェントSSL証明書を置き換えます。

1. psqlを使用して、SSL証明書の置き換えに必要なすべてのエージェント識別子IDを見つけます。

.. code:: shell

      psql -U enterprisedb -d pem --no-psqlrc -t -A -c "SELECT id FROM pem.agent WHERE active=true"

1. 2.キーファイルを必要とするエージェントを特定した後、各エージェントに対して\ ``agent<ID>.key``
   を生成します。

edb_notranlate_19 ``<ID>`` はエージェント識別子です。

1. 各エージェントのCSRを生成します。

edb_notranlate_20 ``-subj`` は、要件に応じて提供されます。 ``CN``
の\ ``<ID>`` を適切なエージェント識別子に置き換えます。

..  Note::
   エージェントごとに1つではなく、すべてのPEMエージェントに単一の証明書を使用する場合、共通のPostgresユーザーを作成し、 `ID` の代わりにこのユーザー名を指定します。 :ref:`共通エージェント証明書とキーペアを生成する <共通エージェント証明書とキーペアを生成する>` を参照してください。

1. CAにCSRに署名し、エージェント証明書を生成するように依頼します。

2. 各ホストに証明書とキーファイルをコピーします。ここで、 ``<ID>``
   は、\ ``/usr/edb/pem/agent/etc/agent.cfg`` ファイルの\ ``agent_id``
   と一致します。

3. 新しい\ ``agent<ID>.crt`` および\ ``agent<ID>.key``
   ファイルの所有権と権限を変更します。

.. code:: shell

       chown root agent<ID>.crt agent<ID>.key
       chmod 600 agent<ID>.crt agent<ID>.key

1. 古いエージェント証明書とキーファイルをバックアップします。

.. code:: shell

      # Running as root
      mkdir root/.pem/certs
      mv root/.pem/agent<ID>.* root/.pem/certs

1. 各エージェントの証明書とキーファイルを、新しく生成されたファイルに置き換えます。

.. code:: shell

      cp agent<ID>.key agent<ID>.crt root/.pem

7. PEMエージェントサービスを再起動します。

-  Linuxの場合

.. code:: shell

      # Running as root
      systemctl restart pemagent

-  Windowsの場合
   サービスアプレットを使用してPEMエージェントを再起動します。
   PEMエージェントサービスの名前はPostgres Enterprise Manager
   Agentです。 [ Services ]ダイアログボックスでサービス名を選択し、[
   **Restart the service** ]を選択します。

証明書のテスト
--------------

認証の問題が発生した場合は、これらのテストを使用して証明書を検証できます。

ルート証明書と照合して証明書を検証する
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

サーバーの\ ``root.crt``
に従ってPEMエージェント証明書が信頼されるかどうかを確認するには、両方の証明書を同じマシンにコピーします。次に、次のコマンドを実行します。

.. code:: shell

   openssl verify -verbose -CAfile root.crt  agent1.crt

このコマンドは、成功した場合は\ ``agent1.crt: OK``
、失敗した場合は説明メッセージを返します。

PEMバックエンドデータベースへのテスト接続を作成する
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

エージェントユーザーが証明書を使用して接続できるかどうかを確認するには、エージェントが存在するサーバーで、rootとして次のコマンドを実行します。

\```shell PGHOST= PGPORT= PGUSER=agent PGSSLCERT=/root/.pem/agent.crt
PGSSLKEY=/root/.pem/agent.key PGSSLMODE=require

export PGHOST PGPORT PGUSER PGSSLCERT PGSSLKEY PGSSLMODE

-A -t -c “SELECT version()” \``\` ここで

-  ``<psql_path>`` は、 psql実行可能ファイル、たとえば
   ``/usr/edb/as15/bin/psql`` へのフルパスです。

-  ``<pem_host>`` は、PEMサーバーのホスト名またはIPアドレスです。

-  ``<pem_db_port>`` は、PEMバックエンドデータベースサーバーポートです。

-  ``<ID>``
   は、テストするエージェントのIDです。\ ``/usr/edb/pem/agent/etc/agent.cfg``
   ファイルで定義されています。

..  Note::
   :ref:`共通エージェント証明書とキーペアを生成する <共通エージェント証明書とキーペアを生成する>` の指示を使用した場合

``PGUSER``
を共通エージェントのユーザー名に設定する必要があります。接続が成功すると、データベースサーバーのPostgresバージョンを結果ます。成功は、証明書が有効で、Postgresユーザーが正しく構成されていることを意味します。

.. toctree::
  :maxdepth: 3

  Administering--certificates--replacing_ssl_certificates
  Administering--certificates--regenerating_agent_certificates
