Managing SSL certificates#
PEMは自己署名SSL証明書を使用します。
ユーザーインターフェイスとREST APIを提供する WebサーバーとPEMバックエンドデータベースが個別にインストールされている場合の構成後の手順 Apache httpdへの要求を保護するため。
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ファイルです。
例、次の更新を行います。
# 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 を参照してください。
PEMバックエンドデータベースサーバーとエージェントの接続証明書#
デフォルトでは、PEMはPEMエージェントとバックエンドデータベース間で安全なSSL/TLS接続を実装します。また、独自の認証局CAとして機能して、PEMサーバーとエージェントの証明書とキーを生成します。 PEMサーバーとエージェントの自己署名SSL証明書とキーは、PEMのインストール中に生成されます。これらの証明書とキーは、エージェントからサーバーへの接続を暗号化します。さらに、PEMエージェントは、パスワードではなく証明書を使用して認証されます。
PEM自己署名SSL証明書とキーを、信頼できるCA証明書とキーに置き換えることができます。詳細については、 信頼できるCAによって署名された証明書とキーを使用する を参照してください。
PEM自己署名SSL証明書の仕組み#
PEMサーバー構成スクリプトは、PEMバックエンドデータベースサーバーの自己署名SSL証明書とキーファイルを生成します。バックエンドデータベースサーバーは、これらの証明書とキーを使用して、エージェント接続を認証および暗号化します。各証明書には有効期限があります。証明書の有効期限が近づくと、証明書を再生成します。詳細については、 Regenerating the server self-signed SSL certificates を参照してください。
PEMエージェントは、libpqインターフェイスを使用してPEMバックエンドデータベースサーバーに接続し、バックエンドデータベースサーバーのクライアントとして機能します。エージェントの自己署名SSL証明書とキーは、 Registering a PEM agent 中に生成されます。 PEMエージェントは、自己署名SSL証明書とキーファイルを使用して、PEMバックエンドデータベースサーバーとの接続を確立します。
各エージェントには一意の識別子があり、エージェントの証明書とキーには対応する識別子があります。各証明書には有効期限があります。証明書の有効期限が近づくと、証明書を再生成します。詳細については、 Regenerating the agent self-signed SSL certificates を参照してください。
必要に応じて、エージェントごとに1つの証明書を使用するのではなく、すべてのエージェントに同じ証明書を使用できます。詳細については、 共通エージェント証明書とキーペアを生成する を参照してください。
- SSL証明書を使用してPostgresで接続する方法の詳細については、
Securing TCP/IP connections with SSL を参照してください。
証明書とキーファイルの生成#
PEMサーバーは、バックエンドデータベースサーバーのデータディレクトリに証明書とキーファイルを生成します。
ca_certificate.crtca_key.keyroot.crtroot.crlserver.crtserver.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エージェントにそれらを使用します。
PEMバックエンドデータベースに1つの共通エージェントユーザーを作成します。
pem_agentロールをユーザーに付与します。
# Running as enterprisedb
psql -p 5444 -U enterprisedb -d pem
CREATE USER pem_agent_common_user;
GRANT pem_agent TO pem_agent_common_user;
エージェントキーを生成します。
# Running as root
openssl genrsa -out agent.key 4096
エージェントのCSRを生成します。
openssl req -new -key agent.key -out agent.csr -subj /C=IN/ST=MH/L=Pune/O=PEM/CN=<agent_user>
-subj は、要件に従って提供されます。
openssl x509コマンドを使用してCSRに署名し、エージェント証明書を生成します。
openssl x509 -req -days 365 -in agent.csr -CA ca_certificate.crt -CAkey ca_key.key -CAcreateserial -out agent.crt
agent.crtおよびagent.keyファイルのアクセス許可を変更します。
chmod 600 agent.crt agent.key
次のエージェント証明書とキーペアを使用します。
新しいPEMエージェントをリモートホストからPEMサーバーに登録するため。
a.エージェント証明書とキーペアをリモートエージェントホストにコピーし、エージェントを登録します。
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
pemagentサービスを有効にして開始します。
systemctl enable pemagent
systemctl start pemagent
エージェント証明書とキーペアを登録済みのエージェントに置き換えます。 a.エージェントホストの
agent.cfgファイルのagent_user、agent_ssl_key、およびagent_ssl_crtパラメーターを編集します。
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証明書とキーを取得した後、 自己署名サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 および 自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 証明書とキーを置き換えます。
自己署名サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。#
古いサーバー証明書とキーファイルをバックアップします。
# 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
サーバーのプライベートキーを生成します。
openssl genrsa -out server.key 4096
サーバーのCSRを生成します。
edb_notranlate_12 -subj は、要件に従って提供されます。 CN
には、PEMサーバーホストのホスト名またはドメイン修飾フルネームを使用することをお勧めします。
信頼できるCAからCA証明書
trusted_ca.crtを取得します。CAにCSRに署名し、サーバー証明書を生成するように依頼します。
新しいサーバー証明書の詳細が改ざんされていないことを確認し、指定した詳細と一致することを確認します。
openssl x509 -noout -text -in server.crt
CAから取得した新しい証明書を
root.crtファイルとして使用します。
cp trusted_ca.crt root.crt
信頼できるCAがCRLを提供しない場合、サーバーによるCRLの使用を無効にします。 CRLの使用を無効にするには、
postgresql.confファイルのssl_crl_fileパラメーターをコメント化します。
注釈
誤って以前のCAからのCRLを適切な場所に残し、ssl_crl_file をコメントアウトしない場合、サーバーは起動しますが、認証はSSLエラーメッセージ`tlsv1 alert unknown ca` で失敗します。エラーは、CRLが原因であることを指定していないため、これはコンテキスト外で発生した場合、デバッグが困難になる場合があります。
新しい
root.crt、server.key、およびserver.crtファイルをバックエンドデータベースサーバーのデータディレクトリにコピーします。
cp root.crt server.key server.crt /var/lib/edb/as<x>/data
新しい証明書とキーファイルの所有者と権限をデータディレクトリと同じになるように変更します。
- edb_notranlate_16 .. Note::
今はPEMサーバーを再起動しないでください。 PEMサーバーを再起動すると、登録されているすべてのエージェントが動作を停止します。
各PEMエージェントのSSL証明書を、信頼できるCA証明書に置き換えます。詳細については、これらの 自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 を参照してください。
PEMサーバーを再起動します。
Linuxの場合
# Running as root
systemctl start edb-as-<x>
バックエンドデータベースサーバーを再起動すると、PEMサーバーが再起動されます。
自己署名エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。#
自己署名サーバー証明書server.crt およびserver.key
およびCA証明書root.crt
を置き換えた後にのみ、自己署名エージェントSSL証明書を置き換えます。
psqlを使用して、SSL証明書の置き換えに必要なすべてのエージェント識別子IDを見つけます。
psql -U enterprisedb -d pem --no-psqlrc -t -A -c "SELECT id FROM pem.agent WHERE active=true"
2.キーファイルを必要とするエージェントを特定した後、各エージェントに対して
agent<ID>.keyを生成します。
edb_notranlate_19 <ID> はエージェント識別子です。
各エージェントのCSRを生成します。
edb_notranlate_20 -subj は、要件に応じて提供されます。 CN
の<ID> を適切なエージェント識別子に置き換えます。
注釈
エージェントごとに1つではなく、すべてのPEMエージェントに単一の証明書を使用する場合、共通のPostgresユーザーを作成し、 ID の代わりにこのユーザー名を指定します。 共通エージェント証明書とキーペアを生成する を参照してください。
CAにCSRに署名し、エージェント証明書を生成するように依頼します。
各ホストに証明書とキーファイルをコピーします。ここで、
<ID>は、/usr/edb/pem/agent/etc/agent.cfgファイルのagent_idと一致します。新しい
agent<ID>.crtおよびagent<ID>.keyファイルの所有権と権限を変更します。
chown root agent<ID>.crt agent<ID>.key
chmod 600 agent<ID>.crt agent<ID>.key
古いエージェント証明書とキーファイルをバックアップします。
# Running as root
mkdir root/.pem/certs
mv root/.pem/agent<ID>.* root/.pem/certs
各エージェントの証明書とキーファイルを、新しく生成されたファイルに置き換えます。
cp agent<ID>.key agent<ID>.crt root/.pem
PEMエージェントサービスを再起動します。
Linuxの場合
# Running as root
systemctl restart pemagent
Windowsの場合 サービスアプレットを使用してPEMエージェントを再起動します。 PEMエージェントサービスの名前はPostgres Enterprise Manager Agentです。 [ Services ]ダイアログボックスでサービス名を選択し、[ Restart the service ]を選択します。
証明書のテスト#
認証の問題が発生した場合は、これらのテストを使用して証明書を検証できます。
ルート証明書と照合して証明書を検証する#
サーバーのroot.crt
に従ってPEMエージェント証明書が信頼されるかどうかを確認するには、両方の証明書を同じマシンにコピーします。次に、次のコマンドを実行します。
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ファイルで定義されています。
注釈
共通エージェント証明書とキーペアを生成する の指示を使用した場合
PGUSER
を共通エージェントのユーザー名に設定する必要があります。接続が成功すると、データベースサーバーのPostgresバージョンを結果ます。成功は、証明書が有効で、Postgresユーザーが正しく構成されていることを意味します。