PostgreSQL默认超级用户为postgres的原因及修改方法,以及生产集群安装PostgreSQL-13时替换默认用户为集群超级用户的方案
嘿,这两个问题都是生产环境里调整PostgreSQL权限的常见需求,我来给你详细拆解:
一、为什么PostgreSQL默认将postgres设为超级用户?如何修改默认超级用户?
为什么默认用postgres做超级用户?
- 安全优先的设计:PostgreSQL核心原则是避免用系统root用户直接运行数据库服务——root权限太大,一旦出问题风险极高。所以专门创建一个独立的
postgres系统用户和同名数据库超级用户,隔离数据库操作和系统级操作,降低权限滥用的可能。 - 简化安装流程:默认用户的存在让安装过程无需额外配置用户信息,新手或快速部署场景能快速完成初始化,不用纠结用户创建的细节。
修改默认超级用户的步骤(生产环境操作前务必备份!)
- 创建新的超级用户
先切换到postgres用户进入psql终端:
然后创建你的自定义超级用户(比如sudo -u postgres psqlprod_superuser,记得替换成你的实际用户名):CREATE ROLE prod_superuser WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD 'your_strong_password_here'; - 迁移原有对象的所有权(推荐操作)
如果原来的postgres用户下有数据库、表、schema等对象,得把所有权转移给新用户,避免权限问题:-- 迁移所有业务数据库的所有权 UPDATE pg_database SET datdba = (SELECT oid FROM pg_roles WHERE rolname = 'prod_superuser') WHERE datname NOT IN ('postgres', 'template0', 'template1'); -- 迁移所有自定义schema的所有权 UPDATE pg_namespace SET nspowner = (SELECT oid FROM pg_roles WHERE rolname = 'prod_superuser') WHERE nspname NOT IN ('pg_catalog', 'information_schema'); - 禁用或删除原postgres用户
- 若要保留用户但禁止登录:
ALTER ROLE postgres NOLOGIN; - 若确定不再需要(需确保没有对象属于它):
DROP ROLE postgres;
sudo usermod -s /sbin/nologin postgres - 若要保留用户但禁止登录:
二、安装PostgreSQL 13时使用自定义超级用户作为默认用户的实现方案
这个需求需要在初始化数据库阶段就指定自定义用户,而不是用默认的postgres,步骤如下(以RHEL/CentOS为例,Debian/Ubuntu操作逻辑一致,仅包管理命令不同):
1. 提前创建系统级自定义用户
先在操作系统上创建对应的用户(比如prod_superuser),确保它有独立的home目录和合适的shell:
sudo useradd -m -d /home/prod_superuser -s /bin/bash prod_superuser sudo passwd prod_superuser
2. 安装PostgreSQL 13包
先添加官方源(如果没加的话),然后安装服务包:
# RHEL/CentOS 系统 sudo yum install -y postgresql13-server
⚠️ 注意:不要执行默认的初始化命令(postgresql-13-setup initdb),我们要手动初始化!
3. 手动初始化数据库,指定自定义超级用户
# 创建数据库数据目录(默认路径是/var/lib/pgsql/13/data,也可以自定义) sudo mkdir -p /var/lib/pgsql/13/data # 修改目录所有权为自定义系统用户 sudo chown -R prod_superuser:prod_superuser /var/lib/pgsql/13/data # 切换到自定义用户,执行初始化命令,指定默认超级用户 sudo -u prod_superuser /usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data -U prod_superuser
这里的-U prod_superuser就是核心参数,让PostgreSQL把这个用户设为默认超级用户,替代postgres。
4. 配置服务以自定义用户运行
编辑PostgreSQL的systemd服务配置文件:
sudo vi /usr/lib/systemd/system/postgresql-13.service
找到User=和Group=两行,把原来的postgres改成你的自定义用户:
User=prod_superuser Group=prod_superuser
然后重新加载systemd配置并启动服务:
sudo systemctl daemon-reload sudo systemctl enable --now postgresql-13
5. 验证配置是否生效
登录数据库检查超级用户列表:
sudo -u prod_superuser psql -c "SELECT rolname, rolsuper FROM pg_roles WHERE rolsuper = true;"
你应该会看到prod_superuser是唯一的(或主要的)超级用户。再检查数据目录的所有权:
ls -ld /var/lib/pgsql/13/data
所有者应该显示为prod_superuser:prod_superuser。
6. 清理默认postgres用户(可选)
如果系统中存在postgres用户,建议禁用它即可(不建议直接删除,避免依赖问题):
sudo usermod -s /sbin/nologin postgres
内容的提问来源于stack exchange,提问作者rishikanth




