-
Notifications
You must be signed in to change notification settings - Fork 52
Add guide for custom pg_hba.conf rules via configSecret #1048
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,127 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| title: Run PostgreSQL with Custom pg_hba.conf Rules | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| menu: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| docs_{{ .version }}: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| identifier: pg-custom-pg-hba-configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: Custom pg_hba.conf | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| parent: pg-configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| weight: 15 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| menu_name: docs_{{ .version }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| section_menu_id: guides | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| > New to KubeDB? Please start [here](/docs/README.md). | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Using Custom pg_hba.conf Rules | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| KubeDB generates `pg_hba.conf` for every PostgreSQL pod from the database's TLS and `clientAuthMode` settings. This tutorial shows how to add your own host-based authentication rules on top of the generated ones — for example, to reject superuser connections from outside the pod network. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## How it works | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| Add a `user_hba.conf` key to the same `configSecret` you already use for `user.conf`. Its content is standard [pg_hba.conf syntax](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html), and it is spliced into the generated `pg_hba.conf` at a fixed position: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| local all all trust ┐ generated: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| host(ssl) all all 127.0.0.1/32 <auth> │ operator-essential | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| local replication all trust │ rules stay ABOVE | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| host(ssl) replication all 127.0.0.1/32 <auth> ┘ your rules | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| <your user_hba.conf rules> ← inserted here | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| host(ssl) all all 0.0.0.0/0 <auth> ┐ generated | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| host(ssl) replication postgres 0.0.0.0/0 <auth> │ catch-alls sit | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... ┘ BELOW your rules | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| `pg_hba.conf` is **first-match-wins** — the opposite of `postgresql.conf`, where the last setting wins. Placing your rules above the catch-alls means they take precedence over the defaults; placing them below the local/loopback essentials means a mistaken rule cannot lock KubeDB's own scripts, health checks, or sidecars out of the database. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **PostgreSQL ≥ 16**: the generated file references your rules with `include_if_exists`, so after editing the secret a `SELECT pg_reload_conf();` (or `pg ctl reload`) applies them live — no restart. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -eu
file="docs/guides/postgres/configuration/custom-pg-hba.md"
printf '%s\n' "Target line:"
sed -n '32,42p' "$file"
printf '%s\n' "Repository references to pg ctl and pg_ctl:"
rg -n -C 2 --fixed-strings -e 'pg ctl reload' -e 'pg_ctl reload' -e 'pg_reload_conf' .
printf '%s\n' "Executable tokens in the documented parenthetical:"
python3 - <<'PY'
import re
from pathlib import Path
text = Path("docs/guides/postgres/configuration/custom-pg-hba.md").read_text()
for match in re.finditer(r'`([^`]+)`', text):
value = match.group(1)
if "reload" in value:
print(repr(value), "=>", value.split())
PYRepository: kubedb/docs Length of output: 3227 🌐 Web query:
💡 Result: According to the official PostgreSQL 17 documentation, the syntax for the pg_ctl reload command is [1]: pg_ctl reload [-D datadir] [-s] The reload mode sends a SIGHUP signal to the postgres server process, which instructs the server to reread its configuration files (such as postgresql.conf and pg_hba.conf) without requiring a full server restart [1][2]. Options: -D datadir: Specifies the file system location of the database configuration files. If this is omitted, the PGDATA environment variable is used [1]. -s: Runs in silent mode, suppressing informational messages and only outputting errors [1]. Citations:
Fix the Use 🤖 Prompt for AI AgentsSource: MCP tools |
||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **PostgreSQL ≤ 15**: `pg_hba.conf` cannot include files, so your rules are copied in when the pod starts. Changes to the secret take effect on the next pod restart (a `PostgresOpsRequest` reconfigure restart, or delete the pods). | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+38
to
+39
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- target guide ---'
sed -n '1,140p' docs/guides/postgres/configuration/custom-pg-hba.md
printf '%s\n' '--- related configuration references ---'
rg -n -i 'custom-pg-hba|pg_hba|configSecret|secretName|replica|pg_reload_conf|include_if_exists' docs charts deploy config examples 2>/dev/null | head -n 240Repository: kubedb/docs Length of output: 41101 🌐 Web query:
💡 Result: In KubeDB, custom PostgreSQL configurations, including changes to pg_hba.conf, are managed via the spec.configSecret field in the Postgres CR [1][2]. KubeDB mounts this secret as a volume, typically referenced by PostgreSQL's include_if_exists directive within its primary configuration [1]. Regarding the behavior of applying changes and reloading: 1. Applying Changes: Updating the configuration secret directly does not automatically trigger a reload of the database configuration across replicas [3]. To apply changes, you must use a PostgresOpsRequest CR of type Reconfigure [4][3]. 2. Reload/Restart Behavior: When a PostgresOpsRequest is processed, the KubeDB Ops-manager operator manages the update process [3]. This process typically involves replacing or merging the configuration and performing a restart of the database pods (PetSet pods) to ensure the new configuration is applied [3]. 3. Reloading without Restart: While PostgreSQL itself supports reloading certain configurations via pg_reload_conf, KubeDB's standard reconfiguration workflow via PostgresOpsRequest is designed to perform a restart to guarantee the application of the new configuration [3]. If you are using GitOps, updating the configSecret reference in your GitOps-managed Postgres CR will automatically trigger the creation of a Reconfigure OpsRequest by the GitOps operator [5]. Citations:
🏁 Script executed: #!/bin/bash
set -e
for url in \
'https://kubedb.com/docs/v2025.6.30/guides/postgres/configuration/using-config-file/' \
'https://kubedb.com/docs/v2025.4.30/guides/postgres/reconfigure/overview/' \
'https://kubedb.com/docs/v2025.4.30/guides/postgres/reconfigure/cluster/' \
'https://www.postgresql.org/docs/17/functions-admin.html' \
'https://www.postgresql.org/docs/17/auth-pg-hba-conf.html'
do
echo "--- $url ---"
curl -L --fail --silent --show-error "$url" |
sed 's/<[^>]*>/ /g; s/ / /g; s/&/\&/g' |
tr -s '[:space:]' ' ' |
grep -oiE '.{0,220}(configSecret|pg_hba|reload|restart|replica|server).{0,320}' |
head -n 25 || true
doneRepository: kubedb/docs Length of output: 39103 🌐 Web query:
💡 Result: The pg_reload_conf function in PostgreSQL is a SQL-callable function that instructs the PostgreSQL server to reload its configuration files [1][2]. When executed, pg_reload_conf sends a SIGHUP signal to the main server process (postmaster) [1]. The main process then propagates this signal to all child server processes, causing the entire cluster to reread configuration files such as postgresql.conf, pg_hba.conf, and others [1][2][3]. Key details regarding pg_reload_conf: 1. Effect: Existing sessions will adopt the new configuration values after they complete any currently executing client command [2]. 2. Limitations: Parameters that can only be set at server start (often called static parameters) will not be updated by this command; they require a full server restart to take effect [2][4]. 3. Error Handling: If the configuration files contain invalid parameter settings, the server will ignore those specific invalid settings and log the errors during the reload process [2]. 4. Best Practices: Before running pg_reload_conf, you can verify the validity of your configuration changes using the pg_file_settings view, which highlights potential errors or settings that cannot be applied [1][5]. Running pg_reload_conf is functionally equivalent to executing pg_ctl reload from the command line or sending a SIGHUP signal directly to the main server process [1][2][4][3]. Citations:
Use a cluster-wide reconfiguration workflow. Editing the Secret and running 🤖 Prompt for AI AgentsSource: MCP tools |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## Before You Begin | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| Install KubeDB following the steps [here](/docs/setup/README.md), and create the `demo` namespace: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| $ kubectl create ns demo | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| namespace/demo created | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## Example: restrict the postgres superuser to the pod network | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| Create the config secret. `user.conf` must exist (it may be empty); `user_hba.conf` carries the rules: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| $ kubectl create secret generic -n demo pg-configuration \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| --from-literal=user.conf="" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| --from-file=user_hba.conf=./user_hba.conf | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| with `user_hba.conf`: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| # allow the postgres role from the pod network (replication, coordinator, probes) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| host all postgres 10.42.0.0/16 scram-sha-256 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| # reject the postgres role from everywhere else | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| host all postgres 0.0.0.0/0 reject | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| host all postgres ::/0 reject | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+64
to
+67
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win Replace the hard-coded Pod CIDR with cluster-specific values.
🤖 Prompt for AI AgentsSource: MCP tools |
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| Reference the secret from the Postgres object: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```yaml | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| apiVersion: kubedb.com/v1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| kind: Postgres | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| metadata: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: custom-postgres | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| namespace: demo | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| spec: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| version: "18.6" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| replicas: 3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| configSecret: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: pg-configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| storageType: Durable | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| storage: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| resources: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| requests: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| storage: 2Gi | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| accessModes: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| - ReadWriteOnce | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+78
to
+89
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win Set an explicit deletion policy for the cleanup example. The Postgres object omits Proposed manifest change spec:
version: "18.6"
+ deletionPolicy: WipeOut
replicas: 3📝 Committable suggestion
Suggested change
🤖 Prompt for AI AgentsSource: MCP tools |
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| After the database is ready, verify the rules landed in position: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| $ kubectl exec -n demo custom-postgres-0 -c postgres -- \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| psql -c "SELECT rule_number, type, database, user_name, address, auth_method \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| FROM pg_hba_file_rules ORDER BY rule_number;" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+95
to
+97
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- target document ---'
sed -n '1,140p' docs/guides/postgres/configuration/custom-pg-hba.md
printf '%s\n' '--- related configuration references ---'
rg -n --glob '*.md' --glob '*.yaml' --glob '*.yml' 'configSecret|configuration\.secretName|custom-pg-hba|custom-postgres-0|pg_hba_file_rules' .
printf '%s\n' '--- psql command usage ---'
rg -n --glob '*.md' --glob '*.yaml' --glob '*.yml' 'psql( |$)' docs | head -80Repository: kubedb/docs Length of output: 50369 🌐 Web query:
💡 Result: When connecting to PostgreSQL using the psql client, the default values for the database user and the target database are determined as follows: 1. Default PostgreSQL User: If no user is specified via the -U command-line option or the PGUSER environment variable, psql defaults to using the name of the current operating system (OS) user [1][2][3]. 2. Default Database: If no database name is specified on the command line or via the PGDATABASE environment variable, psql defaults to using the current database user name [4][3]. It is important to note that PostgreSQL database roles and operating system users are conceptually separate entities [1][2][5]. While many applications, including psql, default to assuming a correspondence between the two, this is not a technical requirement [1][2][5]. To override these defaults, you can use: - Command-line flags (e.g., psql -U username -d dbname) [1][5]. - Environment variables (e.g., PGUSER, PGDATABASE) [6][7]. - Connection service files (~/.pg_service.conf), which allow you to group multiple connection parameters together under a service name [8][7]. For security best practices, avoid routinely connecting as the superuser (typically named 'postgres') [8]. Instead, create individual database roles for your tasks [1][8]. Citations:
🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- PostgreSQL-specific configuration examples ---'
rg -n -C 4 --glob '*.md' --glob '*.yaml' --glob '*.yml' \
'kind: Postgres|apiVersion: kubedb.com/.+|kubectl exec.+postgres|psql -' \
docs/guides/postgres docs/examples/postgres | head -240
printf '%s\n' '--- container security context and PostgreSQL pod user references ---'
rg -n -C 3 --glob '*.md' --glob '*.yaml' --glob '*.yml' \
'runAsUser|runAsNonRoot|securityContext|serviceAccountName|container.*postgres|postgres.*container' \
docs/guides/postgres docs/examples/postgres | head -240Repository: kubedb/docs Length of output: 40300 🏁 Script executed: #!/bin/bash
set -eu
python3 - <<'PY'
from pathlib import Path
import re
target = Path("docs/guides/postgres/configuration/custom-pg-hba.md").read_text()
match = re.search(r'kubectl exec[^\n]*\\\n\s+([^\n]+)', target)
assert match, "target kubectl exec command not found"
command = match.group(1)
assert command.startswith("psql ")
assert " -U " not in command and " --username" not in command
assert " -d " not in command and " --dbname" not in command
comparison = Path("docs/guides/postgres/configuration/pgtune.md").read_text()
assert "psql -U postgres" in comparison
trust_doc = Path("docs/guides/postgres/reconfigure-tls/reconfigure-tls.md").read_text()
assert "local connection to trust" in trust_doc
proposed = command.replace("psql ", "psql -U postgres -d postgres ", 1)
assert "psql -U postgres -d postgres -c" in proposed
print("target:", command)
print("proposed:", proposed)
print("repository precedent and local-trust documentation found")
PYRepository: kubedb/docs Length of output: 406 Specify the PostgreSQL connection parameters. When Proposed command change- psql -c "SELECT rule_number, type, database, user_name, address, auth_method \
+ psql -U postgres -d postgres -c "SELECT rule_number, type, database, user_name, address, auth_method \📝 Committable suggestion
Suggested change
🤖 Prompt for AI AgentsSource: MCP tools |
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| The rows from `user_hba.conf` appear after the loopback/replication rules and before the `0.0.0.0/0` catch-alls. A connection as `postgres` from outside the pod CIDR now fails with: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| FATAL: pg_hba.conf rejects connection for host "...", user "postgres" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| while replication, health checks, and in-cluster clients are untouched. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## Rules of the road | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **Order within your file matters** — it is first-match-wins there too. Put narrower `allow` rules before wider `reject` rules, as in the example above. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **Don't reject `postgres` from the pod network.** The pg-coordinator sidecar connects to *peer pods* as `postgres` with `replication=database`, which matches ordinary `host` rules (not the `replication` keyword). A blanket `host all postgres 0.0.0.0/0 reject` without a preceding pod-CIDR allow breaks failover and standby sync. Always pair a reject with a pod-network allow, as shown. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **Physical replication** (`replication` keyword in the database column) between pods is protected by generated rules only on loopback; the pod-network replication catch-alls sit *below* your rules. If you write rules with `replication` in the database column, make sure streaming between pods still has a matching allow. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **Validate before you rely on a restart.** A syntactically invalid rule is refused at reload (PostgreSQL keeps the old rules and logs the error), but at *pod start* it is fatal and the pod will crash-loop. After editing the secret, reload and check the server log or `SELECT * FROM pg_hba_file_rules WHERE error IS NOT NULL;` before the next restart. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **`local` and loopback access cannot be overridden.** Rules above your file's position guarantee KubeDB's own scripts and probes keep working. Use `spec.allowedSchemas`/network policies for tighter isolation goals. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## Cleaning up | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| kubectl delete pg -n demo custom-postgres | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| kubectl delete secret -n demo pg-configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| kubectl delete ns demo | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## Next Steps | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
| - [Custom configuration](/docs/guides/postgres/configuration/using-config-file.md) for `postgresql.conf` settings. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| - [Reconfigure](/docs/guides/postgres/reconfigure/overview.md) a running database with a `PostgresOpsRequest`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: kubedb/docs
Length of output: 3336
🌐 Web query:
PostgreSQL 16 pg_hba.conf valid connection types host hostssl documentation💡 Result:
In PostgreSQL 16, the pg_hba.conf file defines connection types to control client access [1]. The host and hostssl types are both used for TCP/IP connections, but they differ in their requirement for SSL encryption [1]: host: This connection type matches connection attempts made using TCP/IP, regardless of whether the connection is encrypted with SSL, encrypted with GSSAPI, or unencrypted [1]. It acts as a general catch-all for TCP/IP-based connections [1]. hostssl: This connection type matches connection attempts made using TCP/IP only when the connection is established with SSL encryption [1]. For this to function, the PostgreSQL server must be built with SSL support and the ssl configuration parameter must be enabled in postgresql.conf [1]. If these conditions are not met, a hostssl record is ignored (except for a logged warning) because it cannot match any connections [1]. These connection types are part of the client authentication configuration, where PostgreSQL evaluates records in order and stops at the first match [1]. If no record matches a connection attempt, access is denied [1].
Citations:
Replace
host(ssl)with a valid HBA record type.Use
hostorhostsslin all four entries.host(ssl)is not validpg_hba.confsyntax.🤖 Prompt for AI Agents
Source: MCP tools