为数据库备份脚本配置最小特权sudo,需创建专用服务账户dbbackup,通过sudoers白名单严格限定其仅能以postgres身份执行指定pg_dump/pg_basebackup命令,禁用shell与环境继承,并启用完整审计日志。

为数据库备份脚本配置最小特权的 sudo,核心是不让脚本拥有 shell 或任意命令执行能力,只准它调用特定二进制、带固定参数、以指定身份运行,并全程可审计。
1. 创建专用执行用户和组
不建议用运维人员账号直接跑备份脚本。应新建服务账户,无登录权限:
-
创建用户:
sudo useradd -r -s /usr/sbin/nologin dbbackup -
加入必要组(如需读取数据库文件):
sudo usermod -aG postgres dbbackup - 备份脚本归该用户所有:
sudo chown dbbackup:dbbackup /opt/scripts/backup-postgres.sh
2. 用 visudo 配置精确命令白名单
在 /etc/sudoers.d/db-backup 中写入(用 sudo visudo -f /etc/sudoers.d/db-backup):
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 只允许以
postgres身份执行pg_dump和pg_basebackup的特定形式: dbbackup ALL=(postgres) NOPASSWD: /usr/bin/pg_dump --clean --if-exists --format=custom --file=/backup/pg/*.dump *, /usr/bin/pg_basebackup -D /backup/base -Ft -z -P- 显式拒绝危险入口:
dbbackup ALL=(postgres) !/bin/sh, !/bin/bash, !/usr/bin/python3 -c, !/usr/bin/perl - 禁用环境继承:
Defaults:dbbackup env_reset,必要时仅保留:env_keep += "LANG LC_TIME"
3. 脚本内调用必须用完整 sudo 命令
备份脚本中不能写 pg_dump ...,而要明确加 sudo 并限定目标用户:
- ✅ 正确写法:
sudo -u postgres pg_dump --clean --if-exists -U postgres mydb > /backup/mydb.dump - ❌ 错误写法:
pg_dump ...(绕过 sudo 约束)或sudo pg_dump ...(未指定 -u,可能以 root 身份执行) - 建议封装成函数并校验返回值,避免静默失败
4. 启用审计与行为约束
在 /etc/sudoers.d/db-backup 顶部添加全局设置:
Defaults logfile="/var/log/sudo-db.log"-
Defaults log_input,log_output(需提前创建/var/log/sudo-io/并设权限) -
Defaults requiretty(防止 cron 或 web 调用;若必须后台运行,可单独加!requiretty到该行规则末尾) - 确认日志路径被 rsyslog 或 journald 收集,定期检查
sudo tail -f /var/log/sudo-db.log










