You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PostgreSQL默认超级用户为postgres的原因及修改方法,以及生产集群安装PostgreSQL-13时替换默认用户为集群超级用户的方案

嘿,这两个问题都是生产环境里调整PostgreSQL权限的常见需求,我来给你详细拆解:

一、为什么PostgreSQL默认将postgres设为超级用户?如何修改默认超级用户?

为什么默认用postgres做超级用户?

  • 安全优先的设计:PostgreSQL核心原则是避免用系统root用户直接运行数据库服务——root权限太大,一旦出问题风险极高。所以专门创建一个独立的postgres系统用户和同名数据库超级用户,隔离数据库操作和系统级操作,降低权限滥用的可能。
  • 简化安装流程:默认用户的存在让安装过程无需额外配置用户信息,新手或快速部署场景能快速完成初始化,不用纠结用户创建的细节。

修改默认超级用户的步骤(生产环境操作前务必备份!)

  1. 创建新的超级用户
    先切换到postgres用户进入psql终端:
    sudo -u postgres psql
    
    然后创建你的自定义超级用户(比如prod_superuser,记得替换成你的实际用户名):
    CREATE ROLE prod_superuser WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD 'your_strong_password_here';
    
  2. 迁移原有对象的所有权(推荐操作)
    如果原来的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');
    
  3. 禁用或删除原postgres用户
    • 若要保留用户但禁止登录:
      ALTER ROLE postgres NOLOGIN;
      
    • 若确定不再需要(需确保没有对象属于它):
      DROP ROLE postgres;
      
    系统层面的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

火山引擎 最新活动