在 Debian 上,pgAdmin 的权限分组应同时考虑两层:一是操作系统层面的系统用户与组,用于控制对 pgAdmin 程序与配置文件的访问;二是 PostgreSQL 的角色与权限模型,用于实现数据库对象的授权与分组管理。
一、概念与总体思路
- 系统级分组:通过 Linux 的用户/组管理 pgAdmin 的运行账户、配置文件与日志目录的访问权限,确保仅授权人员可访问管理界面与敏感文件。
- 数据库级分组:PostgreSQL 使用**角色(ROLE)**体系,可将用户加入“组角色”,再对数据库、模式、表、视图等对象授予权限,实现“权限分组”和批量授权。
- pgAdmin 内部账户:pgAdmin 4 的 Web 界面支持创建多个用户并分配角色(如 Administrator、Editor、Viewer),用于划分界面与操作能力;但底层数据访问仍由 PostgreSQL 权限决定。
二、系统级分组步骤
- 创建系统用户与组(用于运行与维护 pgAdmin):
- 创建服务账户:sudo adduser --system --no-create-home --group pgadmin_svc
- 如需让运维人员访问 pgAdmin,可创建普通用户并加入专用组:sudo groupadd pgadmin;sudo usermod -aG pgadmin alice
- 调整目录与文件权限(示例路径,按实际安装为准):
- 安装目录:sudo chown -R root:pgadmin_svc /usr/pgadmin4;sudo chmod -R 750 /usr/pgadmin4
- 配置文件:sudo chown root:root /etc/pgadmin4/pgadmin4.conf;sudo chmod 600 /etc/pgadmin4/pgadmin4.conf
- 日志目录:sudo setfacl -m u:alice:rwx /var/log/pgadmin4
- 说明:上述分组确保只有pgadmin_svc能运行与写入程序目录,指定管理员(如 alice)可访问日志,遵循最小权限原则。
三、数据库级分组步骤
- 创建“组角色”(不带 LOGIN,仅用于授权聚合),将用户加入该组角色,实现权限分组与复用:
- 创建只读与读写组角色:
- CREATE ROLE readonly NOLOGIN;
- CREATE ROLE readwrite NOLOGIN;
- 授予公共连接与模式使用:
- GRANT CONNECT ON DATABASE target_db TO readonly, readwrite;
- GRANT USAGE ON SCHEMA public TO readonly, readwrite;
- 授予对象权限(示例对 public 模式):
- GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
- GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readwrite;
- GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO readwrite;
- 让未来新建表自动继承只读权限:
- ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
- 将用户加入组角色(实现“分组”):
- GRANT readonly TO alice, bob;
- GRANT readwrite TO carol;
- 说明:通过“组角色”把用户归类,再统一授予权限,便于维护与审计;对象级权限可在 pgAdmin 的对象属性 → Permissions 中批量设置。
四、pgAdmin 内部用户与界面权限
- 登录 pgAdmin Web(默认端口 5050 或 /pgadmin4),创建多个用户账户,并在服务器/数据库/模式的Properties → Permissions 中为用户或角色分配权限(如 SELECT、INSERT、UPDATE、DELETE、ALL)。
- 在对象权限页可使用ACL 权限快速设置向导进行批量授权,提升效率。
- 安全建议:
- 仅暴露必要端口与网段(如 ufw 仅允许可信 IP 访问 5050/tcp)。
- 启用 HTTPS(在 /etc/pgadmin4/pgadmin4.conf 中设置 ENABLE_HTTPS = True 并配置证书),保护凭据与数据传输。
五、快速示例 只读与读写两组
- 目标:让 alice、bob 只读访问 target_db.public;carol 可读写;所有新表自动对只读组可见。
- SQL 示例:
- CREATE ROLE readonly NOLOGIN;
- CREATE ROLE readwrite NOLOGIN;
- GRANT CONNECT ON DATABASE target_db TO readonly, readwrite;
- GRANT USAGE ON SCHEMA public TO readonly, readwrite;
- GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
- GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readwrite;
- GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO readwrite;
- ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
- GRANT readonly TO alice, bob;
- GRANT readwrite TO carol;
- 说明:完成后,alice/bob 获得只读,carol 获得读写;后续在 public 中新建的表会自动对 readonly 组授予 SELECT。