feat(pooler): make auth_user configurable by jonasbadstuebner · Pull Request #10899 · cloudnative-pg/cloudnative-pg · GitHub
Skip to content

feat(pooler): make auth_user configurable - #10899

Merged
mnencia merged 10 commits into
cloudnative-pg:mainfrom
jonasbadstuebner:feat/allow-auth-user-override
Jul 28, 2026
Merged

mnencia merged 10 commits into
cloudnative-pg:mainfrom
jonasbadstuebner:feat/allow-auth-user-override

Conversation

@jonasbadstuebner

@jonasbadstuebner jonasbadstuebner commented Jun 15, 2026 •

Copy link
Copy Markdown
Contributor

Adds an auth_user parameter to override the user PgBouncer uses to run the auth_query, instead of always deriving it from the auth query secret. This is meant for setups with a custom authQuerySecret where the desired role differs from what the secret implies.

Closes #10898

@jonasbadstuebner
jonasbadstuebner requested a review from a team June 15, 2026 10:10
@dosubot dosubot Bot added size:S This PR changes 10-29 lines, ignoring generated files. enhancement 🪄 New feature or request labels Jun 15, 2026
@cnpg-bot cnpg-bot added backport-requested ◀️ This pull request should be backported to all supported releases release-1.25 release-1.28 labels Jun 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@jonasbadstuebner
jonasbadstuebner force-pushed the feat/allow-auth-user-override branch from b5aecce to 5fedc76 Compare June 15, 2026 10:11
@dosubot dosubot Bot added size:XS This PR changes 0-9 lines, ignoring generated files. and removed size:S This PR changes 10-29 lines, ignoring generated files. labels Jun 15, 2026
@dosubot dosubot Bot added size:S This PR changes 10-29 lines, ignoring generated files. and removed size:XS This PR changes 0-9 lines, ignoring generated files. labels Jul 22, 2026
@armru
armru force-pushed the feat/allow-auth-user-override branch from 2f86388 to 97df595 Compare July 22, 2026 10:17
@armru

armru commented Jul 22, 2026

Copy link
Copy Markdown
Member

/test

@github-actions

Copy link
Copy Markdown
Contributor

@armru, here's the link to the E2E on CNPG workflow run: https://github.com/cloudnative-pg/cloudnative-pg/actions/runs/29911327582

@armru

armru commented Jul 22, 2026

Copy link
Copy Markdown
Member

/test

@github-actions

Copy link
Copy Markdown
Contributor

@armru, here's the link to the E2E on CNPG workflow run: https://github.com/cloudnative-pg/cloudnative-pg/actions/runs/29911874764

@cnpg-bot cnpg-bot added the ok to merge 👌 This PR can be merged label Jul 22, 2026
@dosubot dosubot Bot added the lgtm This PR has been approved by a maintainer label Jul 22, 2026
@litaocdl
litaocdl force-pushed the feat/allow-auth-user-override branch 2 times, most recently from 20547d9 to 9729aff Compare July 27, 2026 10:25
@litaocdl
litaocdl force-pushed the feat/allow-auth-user-override branch from 9729aff to fc73575 Compare July 27, 2026 10:26
@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:S This PR changes 10-29 lines, ignoring generated files. labels Jul 27, 2026
jonasbadstuebner and others added 8 commits July 27, 2026 17:45
Allows overwrite of auth_user to use for authQuery.

closes cloudnative-pg#10898

Signed-off-by: Jonas Badstübner <jonas@jb.software>
Drop the hand-written authUser field from the Pooler CRD: the feature is
driven by the auth_user key in spec.pgbouncer.parameters, and the schema
entry had no backing field in the Go API, so controller-gen regeneration
removes it.

Since auth_user has a dedicated slot in the pgbouncer.ini template, drop
the key from the generic parameters block instead of emitting the same
setting twice, and ignore an empty value so it cannot blank the user
derived from the auth query secret. Document the default derivation and
the fact that the override targets configurations with a custom
authQuerySecret, and cover the override with unit tests.

Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
…section

Readers configuring their own auth query secret had no way to discover
that PgBouncer's connecting user can be overridden without scrolling
down to the full parameter list. Add a one-line pointer to it right
where custom authentication is described.

Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
If auth_user is customized, operator will not to create the auth user against the postgres database, user
need to ensure the auth_user exists and CONNECT to auth database privilege is granted

Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Overriding auth_user changes only the role PgBouncer requests during
the auth query, not the certificate it presents. The operator's
built-in pg_hba/pg_ident rules only match the literal
cnpg_pooler_pgbouncer user, so a custom auth_user with a
certificate-based auth query secret needs its own pg_hba rule and a
matching pg_ident entry to map the certificate's common name to the
new role.

Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
The auth_user override reassigns only the username used for the auth
query; the password in userlist.txt still comes from the secret
unchanged. Spell out that the secret's password field must therefore
hold the actual PostgreSQL password of the overridden role, not the
password of whatever username the secret originally named.

Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Mirrors the existing DatabaseRole callout in the RBAC on Custom
Resources section. A Pooler's authQuery field already runs arbitrary
SQL against the postgres database pre-existing this feature; auth_user
only selects which role that SQL runs as. Write access to a Pooler
therefore deserves the same care as write access to the Cluster
resource, same as DatabaseRole.

Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
auth_user was never quote-escaped for userlist.txt, unlike the
password field, so a value containing a double quote would desync
the two quoted fields on that line. Factor the existing password
escaping into a shared escapePgBouncerUserListValue helper and apply
it to auth_user too, covering both the secret-derived value and the
new override.

Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
@mnencia
mnencia force-pushed the feat/allow-auth-user-override branch from 0ca5e36 to 99456db Compare July 27, 2026 15:45
mnencia added 2 commits July 27, 2026 18:09
PgBouncer only consults auth_query/auth_user when the client-facing
method resolved by auth_type is password-based; with a peer, cert, or
trust rule in the Pooler's own pg_hba, the override has no effect for
that client. Also clarify that auth_type's hba mode reads the
Pooler's own pg_hba list, distinct from the Cluster's pg_hba added
for the cert-auth override case.

Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Read the override and delete the key right after building the
parameters map, instead of after the unrelated isCertAuth branch, so
the override reads as applying right where the parameter set is
built.

Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
@mnencia

mnencia commented Jul 27, 2026

Copy link
Copy Markdown
Member

/test

@github-actions

Copy link
Copy Markdown
Contributor

@mnencia
mnencia merged commit 4d28b6b into cloudnative-pg:main Jul 28, 2026
33 checks passed
cnpg-bot pushed a commit that referenced this pull request Jul 28, 2026
Adds an auth_user parameter to override the user PgBouncer uses to run
the auth_query, instead of always deriving it from the auth query
secret. This is meant for setups with a custom authQuerySecret where the
desired role differs from what the secret implies.

Closes #10898

Signed-off-by: Jonas Badstübner <jonas@jb.software>
Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Co-authored-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Co-authored-by: Tao Li <tao.li@enterprisedb.com>
Co-authored-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
(cherry picked from commit 4d28b6b)
mnencia added a commit that referenced this pull request Jul 28, 2026
Adds an auth_user parameter to override the user PgBouncer uses to run
the auth_query, instead of always deriving it from the auth query
secret. This is meant for setups with a custom authQuerySecret where the
desired role differs from what the secret implies.

Closes #10898

Signed-off-by: Jonas Badstübner <jonas@jb.software>
Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Co-authored-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Co-authored-by: Tao Li <tao.li@enterprisedb.com>
Co-authored-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
(cherry picked from commit 4d28b6b)
mnencia added a commit that referenced this pull request Jul 28, 2026
Adds an auth_user parameter to override the user PgBouncer uses to run
the auth_query, instead of always deriving it from the auth query
secret. This is meant for setups with a custom authQuerySecret where the
desired role differs from what the secret implies.

Closes #10898

Signed-off-by: Jonas Badstübner <jonas@jb.software>
Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Co-authored-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Co-authored-by: Tao Li <tao.li@enterprisedb.com>
Co-authored-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
(cherry picked from commit 4d28b6b)
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Sep 24, 2026
##### [\`v1.30.1\`](https://github.com/cloudnative-pg/cloudnative-pg/releases/tag/v1.30.1)

**Release date:** Sep 23, 2026

##### Enhancements

- Added `restoreAdditionalCommandArgs` to `.barmanObjectStore.data` for in-tree Barman Cloud recoveries, so custom flags are forwarded to `barman-cloud-restore` during recovery. ([#11278](cloudnative-pg/cloudnative-pg#11278)) <!-- 1.29 1.28 -->

- Plugin authors no longer need to re-derive whether an empty WAL archive should be treated as an error: the operator now computes the `check_empty_wal_archive` decision once and passes it to CNPG-I plugins on both WAL archiving and restore hooks. ([#11216](cloudnative-pg/cloudnative-pg#11216)) <!-- 1.29 1.28 -->

- Allowed setting the `ssl_ecdh_curve` PostgreSQL parameter in `.spec.postgresql.parameters`. It was previously rejected by the validating webhook even though the operator does not manage it. Contributed by [@Jamstah](https://github.com/Jamstah). ([#11308](cloudnative-pg/cloudnative-pg#11308)) <!-- 1.29 1.28 -->

- Added support for setting `auth_user` in `spec.pgbouncer.parameters` to override the user PgBouncer uses for its `auth_query` connection, instead of always deriving it from the `authQuerySecret`. Useful with a custom `authQuerySecret` where the role to authenticate as differs from the one implied by the Secret. Contributed by [@jonasbadstuebner](https://github.com/jonasbadstuebner). ([#10899](cloudnative-pg/cloudnative-pg#10899)) <!-- 1.29 1.28 -->

- Fixed PgBouncer metrics silently reporting zero when PgBouncer adds or reorders columns: `SHOW STATS` and `SHOW POOLS` results are now matched by column name instead of by position. Contributed by [@AdzerKI](https://github.com/AdzerKI) (`SHOW STATS`). ([#11366](cloudnative-pg/cloudnative-pg#11366), [#11464](cloudnative-pg/cloudnative-pg#11464)) <!-- 1.29 1.28 -->

- `cnpg` plugin:

  - Added a `--dry-run` option to the `backup` command that prints the `Backup` resource that would be created, without creating it. ([#11233](cloudnative-pg/cloudnative-pg#11233)) <!-- 1.29 1.28 -->

##### Security and Supply Chain

- Fixed a webhook validation bypass where an absolute extension path with an embedded `..` traversal (e.g. `/a/../../../../etc`) was accepted because only the raw path was checked; such paths still escaped the extension's mount point once resolved at runtime. Affected entries are now resolved and rejected/skipped consistently across admission, the major-upgrade job, and already-persisted Cluster specs. Contributed by [@Anand-240](https://github.com/Anand-240). ([#11210](cloudnative-pg/cloudnative-pg#11210)) <!-- 1.29 1.28 -->

- Updated `google.golang.org/grpc` to v1.83.1, fixing [CVE-2026-84304](https://nvd.nist.gov/vuln/detail/CVE-2026-84304) / GHSA-vp52-pcj8-j9qc (gRPC-Go heap memory exhaustion via HTTP/2 DATA frame fragmentation). ([#11394](cloudnative-pg/cloudnative-pg#11394)) <!-- 1.29 1.28 -->

##### Changes

- Updated the default PostgreSQL operand image to 18.6-system-trixie. ([#11257](cloudnative-pg/cloudnative-pg#11257)) <!-- 1.29 1.28 -->

- Moved the operator's own base image from Debian 12 (bookworm) to Debian 13 (trixie), now that Debian 12 has moved to LTS-only maintenance. ([#11193](cloudnative-pg/cloudnative-pg#11193)) <!-- 1.29 1.28 -->

##### Fixes

- Demoted an unreachable old primary immediately during failover, instead of waiting on checkpoint and fast-shutdown attempts that could never complete. Previously, an old primary whose PostgreSQL had become unresponsive was never shut down, so it could never rejoin the cluster as a replica of the new primary. The shutdown is now requested without blocking the reconciler, though demotion can still take up to a minute or more if PostgreSQL keeps ignoring shutdown signals. ([#11347](cloudnative-pg/cloudnative-pg#11347)) <!-- 1.29 1.28 -->

- Fixed failover and Pod recreation getting stuck while any instance in the cluster was fenced. A fenced instance kept reporting itself as healthy on its status endpoint even though its Pod was permanently not Ready, which blocked the readiness guard, the primary-election logic, and the Pod-reattachment gate from reacting to an unrelated failure elsewhere in the cluster, leaving it stalled until someone manually removed the fencing. All three now recognize and skip fenced instances. ([#11274](cloudnative-pg/cloudnative-pg#11274)) <!-- 1.29 1.28 -->

- Fixed a failover that could stall forever or get silently reverted. While a failover was pending, the reconciler could skip checking whether it was ready to complete, or mistake the pending state for a missing Pod and reset the target primary back to the unhealthy one. It now keeps progressing a pending failover and completes it once the WAL receivers are down, rechecking quorum safety right before promoting in case it changed while waiting. ([#11336](cloudnative-pg/cloudnative-pg#11336)) <!-- 1.29 1.28 -->

- Fixed the designated-primary sort in `PostgresqlStatusList` so a tie on LSN no longer sorts it out of order. If the designated primary's Pod later disappeared from the status list, this could have led the operator to promote the wrong standby. ([#11494](cloudnative-pg/cloudnative-pg#11494)) <!-- 1.29 1.28 -->

- Gated PostgreSQL startup on the instance manager actually holding the primary `Lease`, closing a window where a restarting or rescheduled primary could start accepting writes before acquiring the lease. Lease acquisition now happens during instance initialization, strictly before PostgreSQL is allowed to start, instead of only later in the reconciliation loop once the instance was already reported ready. ([#11356](cloudnative-pg/cloudnative-pg#11356))

- Bounded the primary lease take-over `Get` call to the lease's `RenewDeadline`, so a call against an unreachable API server now fails fast and retries instead of blocking indefinitely. Left unbounded, the same stalled call could also delay a primary's own lease renewal after a transient API server blip, risking an unwanted takeover by another instance once the lease appeared to expire. ([#11350](cloudnative-pg/cloudnative-pg#11350))

- Stopped abandoning a fast shutdown after 60 seconds. The request carried no explicit timeout, so `pg_ctl` fell back to its own implicit 60-second limit, and the instance manager, being PID 1 in the container, took PostgreSQL down mid-shutdown regardless of a larger configured `stopDelay`. The fast phase now waits for the full `stopDelay` instead. ([#11263](cloudnative-pg/cloudnative-pg#11263)) <!-- 1.29 1.28 -->

- Waited for certificate status before refreshing secrets during bootstrap. ([#11450](cloudnative-pg/cloudnative-pg#11450)) <!-- 1.29 1.28 -->

- Fixed in-tree Barman Cloud recovery ignoring `wal.maxParallel` and `wal.restoreAdditionalCommandArgs`, fetching WAL one segment at a time instead of using the configured parallelism. ([#11105](cloudnative-pg/cloudnative-pg#11105)) <!-- 1.29 1.28 -->

- Honored the `unrecoverable` annotation on pending and terminating instances. ([#11241](cloudnative-pg/cloudnative-pg#11241)) <!-- 1.29 1.28 -->

- Honored `Backup.spec.online` when finalizing VolumeSnapshot-based backups, so a cold backup is no longer reported as online in status. ([#11276](cloudnative-pg/cloudnative-pg#11276)) <!-- 1.29 1.28 -->

- Set `--no-data-checksums` explicitly when `.spec.postgresql.dataChecksums` is `false` on PostgreSQL 18+, which now enables checksums by default in `initdb`. Contributed by [@evan314159](https://github.com/evan314159). ([#11488](cloudnative-pg/cloudnative-pg#11488)) <!-- 1.29 1.28 -->

- Stopped discarding `.spec.inheritedMetadata` labels on PVC reconciliation; they were applied before, and then overwritten by, the operator's own labels. Contributed by [@GellertBabel](https://github.com/GellertBabel). ([#11499](cloudnative-pg/cloudnative-pg#11499)) <!-- 1.29 1.28 -->

- Stopped `Pooler` and `DatabaseRole` from recreating their owned resources after being marked for deletion, which could block an external finalizer (e.g. ArgoCD foreground deletion) waiting for those resources to disappear. Contributed by [@mjlshen](https://github.com/mjlshen). ([#11359](cloudnative-pg/cloudnative-pg#11359)) <!-- 1.29 1.28 -->

- Handled a `NULL` `stats_reset` value in the `pg_stat_wal` metric, which could occasionally break Prometheus scraping on PostgreSQL 18 clusters. Contributed by [@HoniSanders](https://github.com/HoniSanders). ([#11207](cloudnative-pg/cloudnative-pg#11207)) <!-- 1.29 1.28 -->

- Recovered log streaming when a stale non-FIFO file blocked the log pipe. ([#11246](cloudnative-pg/cloudnative-pg#11246)) <!-- 1.29 1.28 -->

- Stopped sampling logs of the Pods' processes, so no log lines are silently dropped. ([#11131](cloudnative-pg/cloudnative-pg#11131)) <!-- 1.29 1.28 -->

- Stopped caching Helm release Secrets in the operator, which could spike memory usage and crashloop the operator on clusters with large Helm releases installed alongside it. ([#11211](cloudnative-pg/cloudnative-pg#11211)) <!-- 1.29 1.28 -->

- Re-ran owned-resource finalizer cleanup after an operator restart, so a namespace deleted while the operator was down doesn't hang in `Terminating` forever. ([#11215](cloudnative-pg/cloudnative-pg#11215)) <!-- 1.29 1.28 -->

- Fixed rejoining replicas taking a long time to complete `pg_rewind` when WAL prefetching (`wal.maxParallel > 1`) was enabled. ([#11204](cloudnative-pg/cloudnative-pg#11204)) <!-- 1.29 1.28 -->

- Treated a PostgreSQL instance rejecting connections as started up in probes. ([#11152](cloudnative-pg/cloudnative-pg#11152)) <!-- 1.29 1.28 -->

- Stopped issuing a redundant PATCH on every reconciliation when a cluster's `pvcTemplate` set `volumeAttributesClass`. Contributed by [@andrew-farries](https://github.com/andrew-farries). ([#11196](cloudnative-pg/cloudnative-pg#11196)) <!-- 1.29 1.28 -->

- Stopped halting replication slot reconciliation at the first failing slot. ([#11119](cloudnative-pg/cloudnative-pg#11119)) <!-- 1.29 1.28 -->

- During rollouts, compared the running configuration hash, rather than the on-disk one, avoiding unnecessary switchovers. ([#11130](cloudnative-pg/cloudnative-pg#11130)) <!-- 1.29 1.28 -->

- Retried `VolumeSnapshot` errors until the deadline, instead of giving up early. ([#11132](cloudnative-pg/cloudnative-pg#11132)) <!-- 1.29 1.28 -->

- Symlinked `pg_wal` to the WAL volume during plugin-based recovery, instead of replaying WAL onto the data volume, which could exhaust it on a large point-in-time recovery. ([#11127](cloudnative-pg/cloudnative-pg#11127)) <!-- 1.29 1.28 -->

- Corrected grammar in `PhaseUpgradeDelayed` status messages. Contributed by [@Utkarsh-sharma47](https://github.com/Utkarsh-sharma47). ([#11065](cloudnative-pg/cloudnative-pg#11065)) <!-- 1.29 1.28 -->

- CloudNativePG Interface (CNPG-I):

  - Reported the Postgres capabilities of a plugin correctly. ([#11447](cloudnative-pg/cloudnative-pg#11447)) <!-- 1.29 1.28 -->
  - Prevented the plugin status field from flapping on Cluster reconciliation. Contributed by [@sharifmshaker](https://github.com/sharifmshaker). ([#11386](cloudnative-pg/cloudnative-pg#11386)) <!-- 1.29 1.28 -->
  - Replaced a finalizer with in-memory cleanup on Service deletion. This avoids namespaces hanging in `Terminating` state when the operator and its plugins run in the same namespace. Contributed by [@maxlengdell](https://github.com/maxlengdell). ([#10940](cloudnative-pg/cloudnative-pg#10940)) <!-- 1.29 -->

- `cnpg` plugin:

  - Used UTC time zone for the default backup name. ([#11329](cloudnative-pg/cloudnative-pg#11329)) <!-- 1.29 1.28 -->
  - Deleted PVCs before Pods in `cnpg destroy`, avoiding a race that could leave dangling PVCs needing a second invocation to clean up. Contributed by [@daanvinken](https://github.com/daanvinken). ([#10847](cloudnative-pg/cloudnative-pg#10847)) <!-- 1.29 1.28 -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-requested ◀️ This pull request should be backported to all supported releases enhancement 🪄 New feature or request lgtm This PR has been approved by a maintainer ok to merge 👌 This PR can be merged release-1.28 release-1.30 size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Make auth_user configurable

5 participants