接続プーリング( PgBouncer
PgBouncerPostgreSQL 用の軽量な接続プールツールです。 少数のデータベース接続を維持し、それらを多数のアプリケーションクライアント間で共有します。これにより、 接続制限の 範囲内でデプロイが可能となり、クライアントごとに新しい接続を開く際のオーバーヘッドを回避できます。
IBM Cloud® Databases for PostgreSQL これらのデプロイメントには、 PgBouncer's auth_query 認証が組み込まれています。 すべてのデプロイメントには、 public.pgbouncer_lookup 関数と pgbouncer_auth ロールが含まれているため、実行している PgBouncer インスタンスは、そのデプロイメントに対してデータベースユーザーを直接検証することができます。 データベースユーザー用のローカルパスワードリストは保持されず、パスワードの変更は PgBouncer の再起動や再読み込みを必要とせずに、即座に反映されます。
Databases for PostgreSQL PgBouncer をホストまたは運営しているわけではありません。 PgBouncer は、仮想サーバー、 Kubernetes クラスター、アプリケーションのサイドカーなど、ご自身のインフラストラクチャ上でインストール、実行、セキュリティ対策、および更新を行います。 接続管理の詳細については、「 接続の管理 」を参照してください。
開始前に
以下が必要です。
- 管理者パスワードの設定 を使用した Databases for PostgreSQL の展開。
- UI、CLI、またはAPIで作成された、アプリケーション用のデータベースユーザー。
- PgBouncer 1.11.0 SCRAM認証に対応した、バージョンまたはそれ以降のものが、ご自身が管理するインフラストラクチャにインストールされていること。 トランザクション・プーリング・モードでプロトコルレベルのプリペアード・ステートメントを使用する場合は、 PgBouncer ( 1.21.0 以降)を使用してください。
psqlのクライアント。- お客様のデプロイメント接続情報:
- [接続文字列]から取得したホスト名とポート番号...
- CA証明書(
ibmcloud cdb deployment-cacertで取得)。
pgbouncer_lookup のサポートは、各導入環境において順次展開されています。 デプロイメントにこの機能が実装されていることを確認するには、 admin として psql に接続し、 \df public.pgbouncer_lookup を実行してください。 結果が空の場合、次のメンテナンス更新時に、デプロイメントにその関数が適用されます。
専用の認証ユーザーを作成する
PgBouncer auth_query を1つの指定されたログインロールとして実行する場合、そのロールは となります。 auth_user この目的のみに使用するロールを作成してください。 データを一切所有せず、他の何も実行しない専用の役割こそが、最小権限の原則に基づく最適な選択肢です。
「 admin 」ユーザーとして psql に接続し、ロールを作成して、そのロールに「 pgbouncer_auth 」を付与します:
CREATE ROLE pool_auth WITH LOGIN PASSWORD '<POOL_AUTH_PASSWORD>';
GRANT pgbouncer_auth TO pool_auth;
pgbouncer_auth ロールには、 pgbouncer_lookup 関数を実行する権限という、1つの権限のみが付与されています。 admin ユーザーは、admin オプション付きの pgbouncer_auth を保持しているため、メンバーシップの付与や取り消しはご自身で行ってください。 サービス認証情報に表示させたい場合は、 ibmcloud cdb user-create を使用してユーザーを作成することもできますが、 この方法で作成されたユーザーは ibm-cloud-base-user のメンバーとなり、ユーザーやデータベースを作成できるようになります。これは、認証用ユーザーに必要な権限の範囲を超えています。
pgbouncer_auth の権限は、専用の認証ユーザーのみに付与してください。 このロールのメンバーであれば誰でも、他のデータベースユーザーの保存済みパスワード検証情報を閲覧できるため、メンバーが増えるたびに、認証情報が漏洩した場合の影響範囲が拡大することになります。
認証ユーザーを無効にするには、そのメンバーシップを取り消します:
REVOKE pgbouncer_auth FROM pool_auth;
設定 PgBouncer
Databases for PostgreSQL の展開環境に接続するには、 PgBouncer で以下の設定が必要です:
auth_type = scram-sha-256, なぜなら、デプロイメントには SCRAM-SHA-256 のパスワード検証情報が保存されているからです。auth_query = SELECT * FROM public.pgbouncer_lookup($1), なぜなら、 PgBouncer's のデフォルト設定であるauth_queryは、pg_authidを直接読み込むようになっており、データベースユーザーにはそのファイルを読み取る権限がないからです。- サーバー側の TLS。デプロイ先では TLS 接続のみを受け付けるためです。
server_tls_sslmode = verify-fullを設定し、ibmcloud cdb deployment-cacertで取得した証明書を、server_tls_ca_fileで設定したパスに保存してください。
PgBouncer 自身の auth_user の認証情報を auth_file から読み込むため、この設定では、 userlist.txt にはauth_userの認証情報のみが含まれます。 他のすべてのユーザーは、 auth_query を経由して解決されます。 ファイルのアクセス権を、 PgBouncer プロセスの所有者に限定します。たとえば、モードを 0600 に設定します。
"pool_auth" "<POOL_AUTH_PASSWORD>"
<HOSTNAME> および <PORT> が 接続文字列 から取得される、完全な最小構成です:
[databases]
ibmclouddb = host=<HOSTNAME> port=<PORT> dbname=ibmclouddb
[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
auth_user = pool_auth
auth_query = SELECT * FROM public.pgbouncer_lookup($1)
server_tls_sslmode = verify-full
server_tls_ca_file = /etc/pgbouncer/ca-certificate.crt
pool_mode = session
max_client_conn = 200
default_pool_size = 20
auth_dbname = postgres を設定しないでください。 postgres データベースには、LOOKUP関数がインストールされていません。 auth_dbname を未設定のままにしておくと、認証クエリはクライアントが接続するデータベースで実行されます。 今後作成するデータベースには、この機能が自動的に含まれます。
各設定の詳細については、『 PgBouncer 』の設定リファレンスを参照してください。
セットアップの検証
-
その検索によって、データベースユーザーのうちの1人が特定されることを確認してください。
psqlに「admin」として接続し、次のコマンドを実行します:SELECT usename, passwd IS NOT NULL AS can_authenticate FROM public.pgbouncer_lookup('<APP_USERNAME>');その結果、
can_authenticate = tという1行が表示されます。 このクエリは、パスワード確認画面が表示されないように記述されています。adminを含む、サービス専用ユーザーからは、行が返されません。 -
データベースユーザーとして、 PgBouncer 経由で接続します:
psql "host=127.0.0.1 port=6432 dbname=ibmclouddb user=<APP_USERNAME>"接続に成功した場合、 PgBouncer は
auth_queryを通じてユーザーを正しく認証しています。 -
データベースユーザーのパスワードを変更し、新しいパスワードを使用して PgBouncer 経由で再接続してください:
ibmcloud cdb user-password <DEPLOYMENT_NAME_OR_CRN> <APP_USERNAME> <NEW_PASSWORD>新しいパスワードはすぐに有効になります。 PgBouncer の再起動やリロード、あるいは
userlist.txtの設定変更は必要ありません。
セキュリティモデルの仕組み
pgbouncer_lookup 関数は、 PgBouncer が認証を行うために必要な情報のみを提供します。
- この関数は、
SECURITY DEFINERsearch_pathを固定した状態で実行され、pg_catalog.pg_authidをユーザーに代わって読み込みます。pg_authidおよびpg_shadowへの直接アクセスは、引き続きブロックされたままです。 - ハッシュ化されたSCRAM検証情報を返すものであり、平文のパスワードが返されることは決してありません。
- ログインが許可されているロールのみが解決されます。
adminや、内部レプリケーションおよび運用ユーザーなどのサービス専用ユーザーは、決して解決されません。 - ロールの
VALID UNTILタイムスタンプが過去の日付である場合、この関数はNULLのパスワードを返すため、認証は失敗し、パスワードの有効期限が引き続き適用されます。 PUBLICに対する関数の実行権限は取り消され、adminおよびpgbouncer_authのメンバーにのみ付与されます。
PgBouncer's デフォルトでは、 auth_query は pg_authid を直接読み取りますが、データベースユーザーにはその権限がありません。 このような状況では、 PgBouncer のドキュメントでは、代わりにスーパーユーザー以外のユーザーを通じて
SECURITY DEFINER 関数を呼び出すことを推奨しています。 pgbouncer_lookup 関数は、そのサービスの予約済みユーザーを除外した、その関数です。
制限事項および留意点
- PgBouncer デプロイメントの
max_connectionsを発生させません。 すべての PgBouncer インスタンスからのサーバー接続の合計数が 接続制限 内に収まるよう、default_pool_sizeのサイズを調整してください。 制限に達した場合は、「 最大接続数の増加 」を参照してください。 adminのユーザーは、auth_query経由で認証を行うことができません。 管理作業を行う際は、 PgBouncer を経由せず、adminとしてデプロイメントに直接接続してください。postgresデータベースにはルックアップ機能がないため、auth_dbname = postgresを設定してはいけません。- トランザクション・プーリング・モード(
pool_mode = transaction)では、SET変数、一時テーブル、アドバイザリ・ロック、LISTENチャネルなどのセッション状態は、トランザクション間で引き継がれません。 プロトコルレベルのプリペアードステートメントを使用するには、max_prepared_statementsおよび PgBouncer 1.21.0 以降が必要です。 詳細については、「 PgBouncer の機能 」をご覧ください。 - インプレースでのメジャーバージョンアップグレード 中は、デプロイメントが一時的に停止し、開いている接続は切断されます(SQLSTATE
57P01)。 PgBouncer サーバーへの接続は自動的に再確立されますが、アプリケーション側では中断されたトランザクションの再試行やステートメントの再準備を行う必要があります。 - 読み取り専用ユーザーは、プライマリエンドポイントに接続できません。 それぞれの接続を統合するには、 読み取り専用レプリカ を指す別の
[databases]エントリを追加してください。