#!/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();"
|