다음과 함께 연결 풀링 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 인증을 지원하며, 귀하가 관리하는 인프라에 설치된 버전이어야 합니다. 트랜잭션 풀링 모드에서 프로토콜 수준의 준비된 문(prepared statement)을 사용할 계획이라면, PgBouncer 1.21.0 버전 이상을 사용하십시오.
psql클라이언트.- 배포 연결 정보:
- [연결 문자열] 에 있는 호스트 이름과 포트...
ibmcloud cdb deployment-cacert를 통해 조회한 CA 인증서.
pgbouncer_lookup 에 대한 지원이 각 배포 환경에 순차적으로 적용되고 있습니다. 배포 환경에 해당 기능이 정상적으로 작동하는지 확인하려면, admin 계정으로 psql 에 접속한 후 \df public.pgbouncer_lookup 를 실행하십시오. 결과가 비어 있는 경우, 배포 대상은 향후 예정된 유지보수 업데이트를 통해
해당 함수를 받게 됩니다.
전용 인증 사용자 생성
PgBouncer auth_query 를 하나의 지정된 로그인 역할로 실행하는 경우, 해당 역할은 입니다. 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 함수를 실행할 수 있는 권한이 부여됩니다. 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 ’ 구성 참조 문서를 참조하십시오.
설정 확인
-
조회 결과가 데이터베이스 사용자 중 한 명과 일치하는지 확인하십시오.
psql에admin로 접속한 후 다음 명령을 실행하세요:SELECT usename, passwd IS NOT NULL AS can_authenticate FROM public.pgbouncer_lookup('<APP_USERNAME>');그 결과, ‘
can_authenticate = t’로 구성된 한 행이 생성됩니다. 이 쿼리는 비밀번호 확인 창이 표시되지 않도록 작성되었습니다.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변수, 임시 테이블, 자문 잠금(advisory locks),LISTEN채널과 같은 세션 상태가 트랜잭션 간에 이어지지 않습니다. 프로토콜 수준의 사전 정의된 문장을 사용하려면max_prepared_statements및 PgBouncer 1.21.0 이상의 버전이 필요합니다. 자세한 내용은 PgBouncer features를 참조하십시오. - 현행 환경에서 주요 버전 업그레이드를 수행하는 동안 배포 시스템이 잠시 중단되며, 열려 있는 연결은 종료됩니다(SQLSTATE
57P01). PgBouncer 서버 연결을 자동으로 다시 설정하지만, 애플리케이션에서는 중단된 트랜잭션을 재시도하고 문장을 다시 준비해야 합니다. - 읽기 전용 사용자는 기본 엔드포인트에 연결할 수 없습니다. 두 리플리카의 연결을 통합하려면, 읽기 전용 리플리카를 가리키는 별도의
[databases]항목을 추가하십시오.