Managing SSL certificates#
PEMはSSL証明書を使用します。
ユーザーインターフェイスとREST APIを提供する Webサーバー証明書 への要求を保護するため。
PEMバックエンドデータベースサーバーとエージェントの接続証明書 を保護および認証するため。
Webサーバー証明書#
PEMは、初期構成中にWebサーバーのSSL証明書とキーファイルを生成します。証明書は自己署名であるため、ユーザーがブラウザーでPEM WebアプリケーションのURLを開くと、サイトが安全でないことを示す警告が表示されます。
セキュリティを強化し、この警告を削除するには、自己署名SSL証明書を、信頼できる認証局によって署名された証明書に置き換えることができます。
Webサーバー証明書NGINXの置き換え#
NGINXで独自のSSL証明書を使用するには、構成ファイルを更新します。
RHEL同様のシステムの場合
/etc/nginx/conf.d/edb-pem.confDebian系システムの場合
/etc/nginx/sites-available/edb-pem.conf
証明書ファイルと一致するように、構成ファイルのサーバー名とファイルパスを変更します。
server {
# lines omitted here
server_name <yourdomain.com>;
# lines omitted here
}
server {
# lines omitted here
server_name <yourdomain.com>;
ssl_certificate /path/to/your_domain_name.crt
ssl_certificate_key /path/to/your_private.key
# lines omitted here
}
Webサーバー証明書の置き換えApache HTTPD#
Apache HTTPDで独自のSSL証明書を使用するには、構成ファイル
edb-ssl-pem.conf
を更新します。証明書ファイルと一致するように、構成ファイルのサーバー名とファイルパスを変更します。
ServerName yourdomain.com
# lines omitted here
SSLCertificateFile /path/to/your_domain_name.crt
SSLCertificateKeyFile /path/to/your_private.key
PEMバックエンドデータベースサーバーとエージェントの接続証明書#
PEMは、PEMエージェントとバックエンドデータベース間に安全なSSL/TLS接続を実装します。 各エージェントには、サーバーとの通信の暗号化と、パスワードの代わりにサーバーでの認証の両方に使用されるSSL証明書があります。
PEMはsslutils拡張機能を使用して、PEMサーバーがSSL証明書とキーを生成および署名できるようにします。新しいエージェントが登録されると、PEMサーバーは証明書を発行します。 PEMサーバーによって発行された証明書はPEMサーバーによって署名されます。つまり、PEMサーバーが認証局CAとして機能することを意味します。
このアプローチが適切でない場合は、PEMの外部で生成され、信頼できるCAによって署名されたSSL証明書とキーを使用できます。 詳細については、 信頼できるCAによって署名された証明書とキーを使用する を参照してください。
PEMサーバー上の証明書とキーファイル#
PEMサーバーの初期構成中に、次のファイルがPEMサーバーのPostgresデータディレクトリに生成されます。
ca_certificate.crtca_key.keyroot.crtroot.crlserver.crtserver.key
ca_certificate.crt およびca_key.key
ファイルは、PEMサーバーがエージェント登録中にエージェントに対して生成された証明書に署名するために使用されます。これらはserver.crt
の署名にも使用されます。手動で置き換えない限り、
’ca_certificate.crt’ファイルはルートCAとして機能するため、自己署名証明書です。
root.crt ファイルは、ca_certificate.crt ファイルのコピーです。
postgresql.conf ファイルのssl_ca_file
パラメーターは、このファイルをポイントしています。
root.crl
は、実際の有効期限または割り当てられた有効期限の前に発行CAによって失効された証明書の証明書失効リストCRLです。
postgresql.conf ファイルのssl_crl_file
パラメーターは、このファイルをポイントしています。
server.crt ファイルはPEMサーバーの署名された証明書であり、
server.key ファイルは証明書のプライベートキーです。
postgresql.conf ファイルのssl_cert_file
パラメーターは、このファイルをポイントしています。
これらのファイルは、有効期限が近づくと自動的に更新されます。 PEM証明書の更新 を参照してください。
PEMエージェントの証明書とキーファイル#
各エージェントのSSL証明書とキーは、 Registering a PEM agent 中に生成されます。
PEMエージェントは、libpqインターフェイスを使用してPEMバックエンドデータベースサーバーに接続し、バックエンドデータベースサーバーのクライアントとして機能します。
PEMエージェントは、cert
認証方法を使用し、sslを有効にしてサーバーに接続します。これは、接続がエージェントのキーを使用して暗号化され、パスワードなどの代わりにエージェントの証明書を使用して認証されることを意味します。
各エージェントには一意の識別子があり、エージェントの証明書とキーには対応する識別子があります。
必要に応じて、エージェントごとに1つの証明書を使用するのではなく、すべてのエージェントに同じ証明書を使用できます。詳細については、 共通エージェント証明書とキーペアを生成する を参照してください。
SSL証明書を使用してPostgresで接続する方法の詳細については、 Postgresドキュメントの Securing TCP/IP connections with SSL を参照してください。
PEM証明書の更新#
SSL証明書には有効期限があります。
PEMによって生成された証明書とキーを使用している場合、PEMは有効期限が前にそれらを置き換えます。
PEMサーバーと共にインストールされるPEMエージェントは、ca_certificate.crt
ファイルの有効期限を監視します。証明書の有効期限が間もなくエキスパイアと、PEMは次のことを行います。
既存の証明書ファイルのバックアップを作成します。
新しい証明書ファイルを作成し、新しいCA証明書ファイルをPEMサーバー上の
root.crtファイルに追加します。アクティブなエージェントの証明書ファイルを更新するジョブを作成します。
PEMサーバーを再起動します。
重要
独自の証明書を提供するか、すべてのエージェントに単一の証明書を使用する場合、自動更新ジョブを無効にします。 PEMサーバーで、次のSQLを実行します。
UPDATE pem.job
SET jobenabled=false
WHERE jobname = Check CA certificate expiry;
共通エージェント証明書とキーペアを生成する#
エージェントごとに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
pemagentサービスを再起動します。
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を生成します。
openssl req -new -key server.key -out server.csr -subj /C=IN/ST=MH/L=Pune/O=EDB/CN=PEM
-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
新しい証明書とキーファイルの所有者と権限をデータディレクトリと同じ名前に変更します。
cd /var/lib/edb/as<x>/data/
chown enterprisedb server.* root.crt ca_certificate.crt
chmod 600 server.* root.crt ca_certificate.crt
注釈
今はPEMサーバーを再起動しないでください。 PEMサーバーを再起動すると、登録されているすべてのエージェントが動作を停止します。
各PEMエージェントのSSL証明書を、信頼できるCA証明書に置き換えます。詳細については、これらの エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 を参照してください。
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を生成します。
openssl genrsa -out agent<ID>.key 4096
<ID> はエージェント識別子です。
各エージェントのCSRを生成します。
openssl req -new -key agent<ID>.key -out agent<ID>.csr -subj /C=IN/ST=MH/L=Pune/O=PEM/CN=agent<ID>
-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 ]を選択します。
注釈
前述のプロセスに従って登録されたエージェントの場合、 Providing an existing SSL certificate and key に示すように、登録時にエージェントに証明書を提供できます。
!!!note 新しいエージェント証明書にパスフレーズが必要な場合、
agent_ssl_passphrase_script
パラメーターを使用してパスフレーズを返すスクリプトへのパスを指定します。パラメーターの詳細については、
Modifying agent configuration を参照してください。
証明書のテスト#
認証の問題が発生した場合は、これらのテストを使用して証明書を検証できます。
ルート証明書と照合して証明書を検証する#
サーバーのroot.crt
に従ってPEMエージェント証明書が信頼されるかどうかを確認するには、両方の証明書を同じマシンにコピーします。次に、次のコマンドを実行します。
openssl verify -verbose -CAfile root.crt agent1.crt
このコマンドは、成功した場合はagent1.crt: OK
、失敗した場合は説明メッセージを返します。
PEMバックエンドデータベースへのテスト接続を作成する#
エージェントユーザーが証明書を使用して接続できるかどうかを確認するには、エージェントが存在するサーバーのrootとして、次のコマンドを実行します。
PGHOST=<pem_host>
PGPORT=<pem_db_port>
PGUSER=agent<ID>
PGSSLCERT=/root/.pem/agent<ID>.crt
PGSSLKEY=/root/.pem/agent<ID>.key
PGSSLMODE=require
export PGHOST PGPORT PGUSER PGSSLCERT PGSSLKEY PGSSLMODE
<psql_path> -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ユーザーが正しく構成されていることを意味します。