SecureSocketsLayer(SSL)接続の使用

AdvancedServerデータベースへのEDB*Plus接続は、SecureSocketsLayer(SSL)接続を使用して実行できます。

SSLを使用するには、SSL接続に関連するデータベースサーバーでさまざまな前提条件の構成手順を実行し、EDB*Plusを実行するホストでJavaトラストストアとキーストアを作成する必要があります。

Java*truststore*は、Javaクライアント(EDB*Plus)がSSL接続を開始するサーバーの信頼性を検証するために使用する認証局(CA)証明書を含むファイルです。

Java*keystore*は、秘密鍵と公開鍵、およびそれらに対応する証明書を含むファイルです。キーストアは、EDB*Plus接続に使用されるサーバーへのクライアント認証に必要です。

以下は、SSL接続の設定に関するガイダンスとして参照できる資料です。

  • AdvancedServerデータベースへのSSL接続の設定については、次の場所にある*PostgreSQLCoreDocumentation*の(ServerSetupandOperation)のSSLによるセキュアなTCP接続に関するセクションを参照してください。

    https://www.postgresql.org/docs/11/ssl-tcp.html

  • SSLを使用したJDBCクライアント接続の詳細については、次の場所にある*PostgreSQLJDBCインターフェース*のクライアント( Using SSL )の構成に関するセクションを参照してください。

    https://jdbc.postgresql.org/documentation/head/ssl-client.html

以下のセクションでは、SSLを使用する構成手順について説明します。

  • AdvancedServerでのSSLの構成

  • EDB*PlusクライアントのSSLの構成

  • AdvancedServerデータベースへのSSL接続の要求

AdvancedServerでのSSLの構成

このセクションでは、データベースサーバーでSSLを構成して、EDB*PlusでSSLを使用する例を示します。この目的のために、自己署名証明書が使用されます。

ステップ1: 証明書署名要求(CSR)を作成します。

次の例では、生成された証明書署名要求ファイルは server.csr です。秘密鍵はファイル server.key として生成されます。

$ openssl req -new -nodes -text -out server.csr \
> -keyout server.key -subj "/CN=enterprisedb"
Generating a 2048 bit RSA private key
.............................+++
....................................................................+++
writing new private key to 'server.key'
-----

注釈

証明書を作成する場合、共通名フィールドに指定する値(この例ではCN=enterprisedbと指定)は、EDB*Plusに接続するときに指定したデータベースユーザー名である必要があります。

さらに、 pg_ident.conf ファイルで定義されているユーザー名マップを使用して、共通名とデータベースユーザー名の柔軟性を高めることができます。手順8と9は、ユーザー名 maps の使用について説明しています。

ステップ2: 自己署名証明書を生成します。

以下は、証明書署名要求ファイル server.csr と秘密鍵 server.key を入力として使用して、ファイル server.crt に自己署名証明書を生成します。

$ openssl x509 -req -days 365 -in server.csr -signkey server.key \
> -out server.crt
Signature ok
subject=/CN=enterprisedb
Getting Private key

ステップ3: ルート認証局(CA)ファイル( root.crt )として使用するサーバー証明書( server.crt )のコピーを作成します。

$ cp server.crt root.crt

ステップ4: 冗長な証明書署名リクエスト( server.csr )を削除します。

$ rm -f server.csr

ステップ5: 証明書と秘密鍵ファイルをAdvancedServerデータディレクトリ(たとえば、 /opt/edb/as10/data )に移動またはコピーします。

$ mv root.crt /opt/edb/as10/data
$ mv server.crt /opt/edb/as10/data
$ mv server.key /opt/edb/as10/data

ステップ6: 証明書ファイルと秘密鍵ファイルにファイルの所有権と権限を設定します。

所有権を、データベースサーバーのdataサブディレクトリを所有するオペレーティングシステムアカウントに設定します。所有者以外のグループまたはアカウントがこれらのファイルにアクセスできないように、アクセス許可を設定します。

$ chown enterprisedb root.crt server.crt server.key
$ chgrp enterprisedb root.crt server.crt server.key
$ chmod 600 root.crt server.crt server.key
$ ls -l
total 152
        .
        .
        .
-rw------- 1 enterprisedb enterprisedb 985 Aug 22 11:00 root.crt
-rw------- 1 enterprisedb enterprisedb 985 Aug 22 10:59 server.crt
-rw------- 1 enterprisedb enterprisedb 1704 Aug 22 10:58 server.key

ステップ7: postgresql.conf ファイルで、次の変更を行います。

ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'

ステップ8: pg_hba.conf ファイルを変更して、EDB*PlusがSSL接続を行う目的のデータベースでSSLの使用を有効にします。

pg_hba.conf ファイルの hostssl タイプは、クライアント(EDB*Plus)からのSSL接続試行を検証するためにエントリが使用されることを示します。

認証方法は、証明書の共通名(この例ではenterprisedb)を使用して認証が実行されるクライアントからのSSL証明書を要求するために、オプション clientcert=1 でcertに設定されています。

The map=sslusers option specifies that a mapping named sslusers defined in the pg_ident.conf file is to be used for authentication. This mapping allows a connection to the database if the common name from the certificate and the database user name attempting the connection match the SYSTEM-USERNAME/PG-USERNAME pair listed in the pg_ident.conf file.

以下は、データベース(edb)がSSL接続を使用する必要がある場合の pg_hba.conf ファイルの設定例です。

# TYPE      DATABASE    USER     ADDRESS           METHOD

# "local" is for Unix domain socket connections only
  local     all         all                        md5
# IPv4 local connections:
  hostssl   edb         all      192.168.2.0/24    cert clientcert=1 map=sslusers

ステップ9: 以下は、 map=sslusers オプションによって pg_hba.conf ファイルに関連する pg_ident.conf ファイル内のユーザー名マップを示しています。これらのユーザー名マップを使用すると、EDB*Plusに接続するときにデータベースユーザー名 edbuser 、 postgres 、または enterprisedb を指定できます。

# MAPNAME   SYSTEM-USERNAME   PG-USERNAME
 sslusers   enterprisedb      edbuser
 sslusers   enterprisedb      postgres
 sslusers   enterprisedb      enterprisedb

ステップ10: 構成ファイルに変更を加えた後、データベースサーバーを再起動します。

EDB*PlusクライアントのSSLの構成

データベースサーバーでSSLを構成した後、次の手順では、EDB*Plus(JDBCクライアント)の証明書とキーストアファイルを生成する例を示します。

ステップ1: データベースサーバーのデータサブディレクトリの下にあるファイル server.crt および server.key を使用して、これらのファイルのコピーを作成し、EDB*Plusを実行するホストに移動します。

これらのファイルを目的のディレクトリに保存して、次の手順で生成される信頼できる証明書とキーストアファイルを含めます。推奨される場所は、EDB*Plusを呼び出すホームユーザーアカウントの下に .postgresql サブディレクトリを作成することです。したがって、これらのファイルは、EDB*Plusを実行するユーザーアカウントの ~/.postgresql ディレクトリの下にあります。

この例では、ファイル edb.crt は server.crt のコピーであり、 edb.key は server.key のコピーであると想定しています。

ステップ2: edb.crt の追加コピーを作成します。

$ cp edb.crt edb_root.crt
$ ls -l
total 12
-rw-r--r-- 1 user user  985   Aug 22 14:17  edb.crt
-rw-r--r-- 1 user user  1704  Aug 22 14:18  edb.key
-rw-r--r-- 1 user user  985   Aug 22 14:19  edb_root.crt

ステップ3: ファイル edb_root.crt のDistinguishedEncodingRules(DER)形式を作成します。このファイルの生成されたDER形式は edb_root.crt.der です。手順4で使用される keytool プログラムには、ファイルのDER形式が必要です。

$ openssl x509 -in edb_root.crt -out edb_root.crt.der -outform der
$ ls -l
total 16
-rw-r--r-- 1 user user  985  Aug 22 14:17  edb.crt
-rw-r--r-- 1 user user  1704 Aug 22 14:18  edb.key
-rw-r--r-- 1 user user  985  Aug 22 14:19  edb_root.crt
-rw-rw-r-- 1 user user  686  Aug 22 14:21  edb_root.crt.der

ステップ4: keytool プログラムを使用して、入力として edb_root.crt.der を使用してキーストアファイル (postgresql.keystore) を作成します。このプロセスにより、Postgresデータベースサーバーの証明書がキーストアファイルに追加されます。

Note: The file name postgresql.keystore is recommended so that it can be accessed in its default directory location ~/.postgresql/postgresql.keystore, which is under the home directory of the user account invoking EDB*Plus. Also note that the file name suffix can be .jks instead of .keystore (thus, file name postgresql.jks). However, in the remainder of these examples, file name postgresql.keystore is used.

Windowsのみ: パスは %APPDATA%/.postgresql/postgresql.keystore です

keytool プログラムは、Javaランタイム環境インストールの bin サブディレクトリにあります。

新しいパスワードの入力を求められます。このパスワードはPGSSLCERTPASS環境変数で指定する必要があるため、保存してください。

$ /usr/java/jdk1.8.0_131/jre/bin/keytool -keystore postgresql.keystore
> -alias postgresqlstore -import -file edb_root.crt.der
Enter keystore password:
Re-enter new password:
Owner: CN=enterprisedb
Issuer: CN=enterprisedb
Serial number: c60f40256b0e8d53
Valid from: Tue Aug 22 10:59:25 EDT 2017 until: Wed Aug 22 10:59:25 EDT
2018
Certificate fingerprints:
  MD5: 85:0B:E9:A7:6E:4F:7C:B0:9B:D6:3A:44:55:E2:E9:8E
  SHA1: DD:A6:71:24:0B:6C:F8:BC:7A:4C:89:9B:DC:22:6A:6C:B0:F5:3F:7C
  SHA256:
  DC:02:64:E2:B0:E9:6F:1C:FC:4F:AE:E6:18:85:0B:79:57:43:C3:C5:AE:43:0D:37:49:53:6D:11:69:06:46:48
  Signature algorithm name: SHA1withRSA
  Version: 1
Trust this certificate? [no]: yes
Certificate was added to keystore

ステップ5: ファイル edb.crt および edb.key を入力として使用して、キーストアファイル (postgresql.p12) の PKCS #12 形式を作成します。

注: ファイル名 postgresql.p12 は、EDB*Plusを呼び出すユーザーアカウントのホームディレクトリの下にあるデフォルトディレクトリの場所 ~/.postgresql/postgresql.p12 からアクセスできるようにすることをお勧めします。

Windowsのみ: パスは%APPDATA%/。postgresql/postgresql.p12です

新しいパスワードの入力を求められます。このパスワードはPGSSLKEYPASS環境変数で指定する必要があるため、保存してください。

$ openssl pkcs12 -export -in edb.crt -inkey edb.key -out postgresql.p12

Enter Export Password:

Verifying - Enter Export Password:

$ ls –l

total 24

-rw-rw-r-- 1 user user 985 Aug 24 12:18 edb.crt

-rw-rw-r-- 1 user user 1704 Aug 24 12:18 edb.key

-rw-rw-r-- 1 user user 985 Aug 24 12:20 edb_root.crt

-rw-rw-r-- 1 user user 686 Aug 24 12:20 edb_root.crt.der

-rw-rw-r-- 1 user user 758 Aug 24 12:26 postgresql.keystore

-rw-rw-r-- 1 user user 2285 Aug 24 12:28 postgresql.p12

ステップ6: postgresql.keystore および postgresql.p12 ファイルがまだ ~/.postgresql ディレクトリにない場合、それらをその場所に移動またはコピーします。

Windowsのみ: ディレクトリは %APPDATA%/.postgresql です。

ステップ7: デフォルトの場所 ~/.postgresql が使用されていない場合、 postgresql.keystore ファイルへのフルパス(ファイル名を含む)は PGSSLCERT 環境変数で設定する必要があります、およびファイル postgresql.p12 へのフルパス(ファイル名を含む)は、EDB*Plusを呼び出す前に PGSSLKEY 環境変数で設定する必要があります。

さらに、ステップ4で生成されたファイルの名前が postgresql.keystore または postgresql.jks ではなかった場合は、 PGSSLCERT 環境変数を使用してファイル名とその場所を指定します。同様に、ステップ5で生成されたファイルの名前が postgresql.p12 ではなかった場合は、 PGSSLKEY 環境変数を使用してファイル名とその場所を指定します。

EDB*PlusとAdvancedServerデータベース間のSSL接続の要求

SSL接続を実行するために、次のトピックに対処してください。

  • 信頼できる証明書とキーストアファイルは、データベースサーバーとEDB*Plusを呼び出すクライアントホストの両方に対して生成されています。

  • データベースサーバーの postgresql.conf ファイルには、更新された構成パラメーターが含まれています。

  • データベースサーバーの pg_hba.conf ファイルには、SSL接続を許可するために必要なエントリが含まれています。

  • クライアントホストの場合、クライアントの証明書とキーストアファイルがユーザーアカウントの ~/.postgresql ディレクトリに配置されているか、環境変数PGSSLCERTおよびPGSSLKEYがEDB*Plusを呼び出す前に設定されています。

  • PGSSLCERTPASS環境変数にパスワードが設定されています。

  • PGSSLKEYPASS環境変数にパスワードが設定されている

EDB*Plusを呼び出すときは、 connectstring オプションのように、データベース接続文字列に ?ssl=true パラメータを含めます。

次の例は、データベースサーバーに対してリモートのホストから呼び出されたEDB*Plusを示しています。

データベースサーバーの postgresql.conf ファイルには、以下の変更されたパラメーターが含まれています:

ssl = on

ssl_cert_file = 'server.crt'

ssl_key_file = 'server.key'

ssl_ca_file = 'root.crt'

データベースサーバーの pg_hba.conf ファイルには、リモートホストのEDB*Plusから接続するための次のエントリが含まれています。

# TYPE DATABASE USER ADDRESS METHOD

# "local" is for Unix domain socket connections only

local all all md5

# IPv4 local connections:

hostssl edb all 192.168.2.24/32 cert clientcert=1

EDB*Plusが呼び出されるリモートホストでは、 user という名前のLinuxユーザーアカウントの ~/.postgresql ディレクトリに証明書とキーストアファイルが含まれています。

[user@localhost ~]$ whoami

user

[user@localhost ~]$ cd .postgresql

[user@localhost .postgresql]$ pwd

/home/user/.postgresql

[user@localhost .postgresql]$ ls -l

total 8

-rw-rw-r-- 1 user user 758 Aug 24 12:37 postgresql.keystore

-rw-rw-r-- 1 user user 2285 Aug 24 12:37 postgresql.p12

Logged into Linux with the account named user, EDB*Plus is successfully
invoked with the ssl=true parameter:

$ export PGSSLCERTPASS=keypass

$ export PGSSLKEYPASS=exppass

$ cd /opt/edb/as10/edbplus

$ ./edbplus.sh enterprisedb/password@192.168.2.22:5444/edb?ssl=true

Connected to EnterpriseDB 10.0.1 (192.168.2.22:5444/edb) AS enterprisedb

EDB*Plus: Release 10 (Build 36.0.0)

Copyright (c) 2008-2017, EnterpriseDB Corporation. All rights reserved.

SQL>

または、証明書とキーストアファイルを ~/.postgresql に配置せずに、別のディレクトリに配置して、EDB*Plusを次の方法で呼び出すことができます:

$ export PGSSLCERT=/home/user/ssl/postgresql.keystore

$ export PGSSLKEY=/home/user/ssl/postgresql.p12

$ export PGSSLCERTPASS=keypass

$ export PGSSLKEYPASS=exppass

$ cd /opt/edb/as10/edbplus

$ ./edbplus.sh enterprisedb/password@192.168.2.22:5444/edb?ssl=true

Connected to EnterpriseDB 10.0.1 (192.168.2.22:5444/edb) AS enterprisedb

EDB*Plus: Release 10 (Build 36.0.0)

Copyright (c) 2008-2017, EnterpriseDB Corporation. All rights reserved.

SQL>

どちらの場合も、EDB*Plusへのログインに使用されるデータベースユーザー名はenterprisedbであることに注意してください。これは、証明書の作成時に共通名フィールドに指定されたユーザーだからです。 map オプション付きの pg_hba.conf ファイルと pg_ident.conf ファイルが使用されている場合、他のデータベースユーザー名を使用できます。