刘光辉
15 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/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();"