#!/usr/bin/env bash # 收紧 cx-postgres 的 pg_hba.conf:postgres 超户【只允许 docker 内网】、公网一律 reject,然后 reload。 # # 策略(在第一条 "host all all all" 规则【之前】插入 3 行,pg_hba 首个匹配即生效): # 1) host all postgres 172.16.0.0/12 scram-sha-256 —— docker 内网(pgloader 迁移用)放行,需密码 # 2) host all postgres 0.0.0.0/0 reject —— 其余(公网)一律拒绝超户 # 3) host all postgres ::/0 reject # 业务角色(jnpf_app 等)不匹配上述 user=postgres 规则,继续走末尾 host-all-all-all scram,照常远程可连。 # 为何放行 172.16/12:Part C 的 S1 重迁 pgloader 从 docker 内网(172.x)用 postgres 灌数据,需保留; # 公网(非私有网段)命中 reject,纵深防御(即便超户密码泄露也无法从公网登录)。 # 本地 127.0.0.1/socket 的 trust 规则更靠前,不受影响(docker exec 照常)。 # # 幂等:已插入则跳过。容器内 psql 走 socket=trust,无需密码。 set -euo pipefail CONTAINER="${CONTAINER:-cx-postgres}" docker exec -i "$CONTAINER" bash -s <<'INNER' set -euo pipefail PGDATA="$(ls -d /var/lib/postgresql/*/docker 2>/dev/null | head -1)" HBA="$PGDATA/pg_hba.conf" [ -f "$HBA" ] || { echo "!! 找不到 pg_hba.conf ($HBA)"; exit 1; } if grep -qE 'postgres[[:space:]]+172\.16\.0\.0/12' "$HBA"; then echo "pg_hba 已含 postgres 内网放行+公网 reject,跳过" else awk ' !done && $1=="host" && $2=="all" && $3=="all" && $4=="all" { print "host all postgres 172.16.0.0/12 scram-sha-256" print "host all postgres 0.0.0.0/0 reject" print "host all postgres ::/0 reject" done=1 } { print } ' "$HBA" > "$HBA.new" mv "$HBA.new" "$HBA" echo "已在 host-all-all-all 前插入 postgres 内网放行+公网 reject" fi INNER docker exec "$CONTAINER" psql -U postgres -c "SELECT pg_reload_conf();"