Securing client application connections#

PGDへのクライアントアプリケーションの接続は、読み取り/書き込みおよび読み取り専用のルーティングエンドポイントを提供する接続マネージャーを介して通過します。このパスを保護するには、2つのポイントでの構成が必要です。クライアント側で、アプリケーションの認証と接続の方法を制御し、バックエンド側で、Connection Managerがクライアントに代わってPostgresノードを認証する方法を制御します。

クライアントからConnection Managerへの接続の保護#

SSLを有効にし、認証を構成してアプリケーショントラフィックを暗号化し、クラスターに接続できるクライアントを制御します。

SSLの有効化#

クライアント接続にSSLを使用するには、次のファイルが各ノードのデータディレクトリに存在する必要があります。それらを生成するためのガイダンスについては、PostgreSQLドキュメントの SSL certificate setup を参照してください。

  • server.crt およびserver.key — ノードのサーバー証明書とプライベートキー。

各ノードのpostgresql.conf でSSLを有効にします。

ssl = on
ssl_cert_file = server.crt
ssl_key_file = server.key

各ノードでPostgresを再起動して、変更を適用します。

pg_ctl restart -D "$PGDATA"

server.key が暗号化されている場合、Connection Managerはssl_passphrase_command の復号化をサポートします。キーは、AES暗号化を使用したPKCS#8形式である必要があります。

SSL証明書要件を満たす#

接続マネージャーはTLSにrustlを使用します。これにより、OpenSSLよりも厳密な証明書要件が適用されます。これらの要件を満たさない証明書は、接続マネージャーを起動できません。要件は、Postgresが使用する同じserver.crt ファイルに適用されます。一部のEDBパッケージは、FIPSサポートを有効にしてビルドされます。その場合、Connection Managerは FIPS 140-3 暗号化要件も適用します。

サーバー証明書は次のことを行う必要があります。

  • Be X.509 v3

  • インクルード basicConstraints: CA:FALSE

  • ノードのホスト名またはIPアドレスを使用してsubjectAltName を含めます

  • インクルード extKeyUsage: serverAuth

証明書には、SHA-256以上のRSAまたはECDSAキーを使用する必要があります。 DSAキーとMD5またはSHA-1署名はサポートされていません。

OpenSSLとは異なり、rustlsはホスト名検証のためにコモンネームCNにフォールバックしません。 subjectAltName 拡張機能が必要です。

認証の構成#

接続マネージャーは、Postgresで使用可能な認証方法のほとんどをサポートしています。各ノードの pg_hba.conf にルールを追加して認証を構成し、Postgresをリロードしてそれらを適用します。

サポートされている認証方法については、 Connection Managerの認証方法 を参照してください。 Connection Managerでcert 認証を使用することはお勧めしません。詳細は、 Using client certificate authentication を参照してください。

各ノードのpg_hba.conf にルールを追加して、接続できるクライアントと認証方法を制御します。例、アプリケーションサーバーからのパスワード認証を要求するには

hostssl   all   all   10.0.0.0/8   scram-sha-256

pg_hba.conf を編集した後、Postgresをリロードして変更を適用します。

pg_ctl reload -D "$PGDATA"

注釈

pg_hba.conf ルールが接続マネージャーでサポートされていない場合、警告としてログに記録され無視されます。接続マネージャーは、サポートしているルールを使用して動作を継続します。 pg_hba.conf 変更の後、Postgresサーバーログを確認して、サポートされていないルールがないかを確認します。

エンドポイントの構成#

接続マネージャーは、プライマリノードにトラフィックをルーティングする読み取り/書き込みエンドポイント、レプリカ全体でロードバランシングを行う読み取り専用エンドポイント、および管理APIのHTTPエンドポイントの3つのエンドポイントを公開します。デフォルトが環境内の他のサービスと競合する場合、エンドポイントポートを構成します。接続数を制限してデータベースを保護したり、HTTPエンドポイントでHTTPSを有効にしたりすることもできます。

Option

Default

Purpose

read_write_port

Postgres port + 1000 (usually 6432)

Read-write connections

read_only_port

read_write_port + 1 (usually 6433)

Read-only connections

http_port

read_write_port + 2 (usually 6434)

HTTP management API (returns JSON)

pgd group set-option を使用してこれらを構成します。

pgd group set-option --group-name <group_name> read_write_port <port>

HTTPエンドポイントでのHTTPSの有効化#

デフォルトでは、HTTP管理エンドポイントはプレーンHTTPを使用します。 HTTPSを有効にするには

  1. use_https をtrue に設定します。

pgd group set-option --group-name <group_name> use_https true
  1. Connection Managerは、 SSLの有効化 セクションで構成されたものと同じserver.crt およびserver.key ファイルを使用します。これらのファイルが各ノードのデータディレクトリに存在することを確認します。

注釈

Postgresで`ssl = on` がグローバルに設定されていない場合でも、HTTPSを有効にできます。いずれかの証明書ファイルが欠落している場合、Connection Managerは`use_https` 設定に関係なくプレーンHTTPにフォールバックします。

接続制限の設定#

接続マネージャーは、各エンドポイントでクライアントとサーバーの接続に個別の制限を適用し、デフォルトでpostgresql.conf からmax_connections に設定されます。制限をオーバーライドするには

pgd group set-option --group-name <group_name> read_write_max_client_connections <value>

Option

Default

Description

read_write_max_client_connections

max_connections

読み取り/書き込みポートでの最大クライアント接続

read_write_max_server_connections

max_connections

読み取り/書き込みトラフィックの最大サーバー接続

read_only_max_client_connections

max_connections

読み取り専用ポートでの最大クライアント接続

read_only_max_server_connections

max_connections

読み取り専用トラフィックの最大サーバー接続

注釈

サーバー接続制限 read_write_max_server_connections および`read_only_max_server_connections` は、現在ユーザーごとに適用されています。これは既知の制限であり、将来のリリースで解除される予定です。

コンセンサスタイムアウトの設定#

デフォルトでは、接続マネージャーはクォーラムを失うとすぐに接続を拒否します。これにより、一貫性を保証できないクラスターへのルーティングトラフィックから保護されます。コンセンサスタイムアウトを設定すると、クラスターに接続が拒否される前に回復する猶予期間が与えられ、クラスターの状態が不確実なときに接続を受け入れるというコストで、一時的な障害中の可用性が向上します。アプリケーションが猶予期間中に不確実性を許容できる場合にのみこの値を設定します。

pgd group set-option --group-name <group_name> read_write_consensus_timeout <seconds>

ノード接続への接続マネージャーの保護#

接続マネージャーはクライアント接続を受け入れると、クライアントの資格情報を使用して適切なバックエンドノードに接続します。各バックエンドノードには、接続マネージャーからのこの接続を許可するpg_hba.conf ルールが必要です。

SCRAM-SHA-256は、これらのバックエンド接続に推奨される認証方法です。 Connection Managerとのクライアント接続にcert 認証を使用することはお勧めしません。クライアント証明書は転送できないため、クライアントがcert で認証するとき、Connection Managerからノードへの接続はtrust などの別の認証方法を使用する必要があります。

  1. 各ノードのpg_hba.conf にルールを追加して、Connection Managerがクライアントユーザーとして接続できるようにします。

hostssl all all <node_address>/32 scram-sha-256

<node_address> を、Connection Managerがそのノード上のPostgresに接続するアドレスに置き換えます。

  1. pg_hba.conf を編集した後、Postgresをリロードして変更を適用します。

pg_ctl reload -D "$PGDATA"