You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中所有用户均可通过pg_restore恢复备份吗?如何限制?

为什么testuser能成功恢复备份,以及如何阻止未授权用户恢复

这是个很实用的问题!咱们先搞清楚为什么你的testuser能成功恢复,再聊聊怎么限制这类操作。

为什么testuser可以恢复备份?

你成功用testuser执行pg_restore,并不代表所有用户都有这个能力,而是这个用户刚好满足了恢复所需的权限条件:

  1. 首先,testuser拥有目标数据库abcd_test1的CONNECT权限(默认情况下,public角色会被授予所有数据库的CONNECT权限,而新创建的用户默认属于public,所以能连接)。
  2. 其次,testuser在目标数据库里拥有创建对象的权限——如果是你用testuser创建的abcd_test1,那它默认就是数据库所有者,拥有该库的全部权限;就算不是所有者,只要被授予了CREATE权限(比如在public schema上),也能恢复备份里的表、函数等对象。
  3. 你的备份里应该没有包含全局对象(比如新角色、表空间),否则testuser需要CREATEROLE或CREATEDB这类高级权限才能恢复,而你只给了它LOGIN权限,说明备份内容只是数据库内的对象。

怎么阻止用户恢复数据库?

要限制未授权用户的恢复操作,核心是从权限控制和连接限制两方面入手:

1. 限制数据库的连接权限

默认情况下所有用户都能连接到数据库,你可以先撤销public角色的连接权限,只给需要的用户授权:

-- 撤销所有用户的默认连接权限
REVOKE CONNECT ON DATABASE abcd_test1 FROM PUBLIC;
-- 只给特定授权用户开放连接
GRANT CONNECT ON DATABASE abcd_test1 TO your_trusted_user;

2. 撤销用户的对象创建权限

如果用户不需要在目标数据库里创建对象,直接收回其CREATE权限:

-- 撤销testuser在public schema的创建权限
REVOKE CREATE ON SCHEMA public FROM testuser;
-- 如果备份涉及其他schema,也要对应处理
REVOKE CREATE ON SCHEMA your_other_schema FROM testuser;

没有创建权限的用户,就算能连接数据库,也无法通过pg_restore创建表、视图等对象,自然无法完成恢复。

3. 限制全局操作权限

如果你的备份包含角色、表空间这类全局对象,确保普通用户没有CREATEROLE、CREATEDB或超级用户权限——这些权限只有管理员级别的用户才应该拥有。

4. 网络层面的额外限制

你还可以通过修改pg_hba.conf文件,限制用户的连接来源,比如只允许特定IP段的用户连接到PostgreSQL实例,进一步降低未授权恢复的风险:

# 只允许192.168.1.0/24网段的用户连接abcd_test1数据库
host    abcd_test1    your_trusted_user    192.168.1.0/24    scram-sha-256

补充提醒

如果你的备份是用超级用户导出的,恢复时可能会覆盖目标数据库的权限设置。如果不想让备份里的权限影响现有数据库,可以在pg_restore命令里加上--no-privileges参数,跳过权限的恢复。

内容的提问来源于stack exchange,提问作者YogeshR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:05:05