PostgreSQL的权限管理以角色(Role)为核心,通过分层权限分配、最小权限原则及连接控制实现安全管控。以下是Debian系统中PostgreSQL权限管理的关键策略及操作步骤:
PostgreSQL中,角色是权限的基本单位,分为两类:
LOGIN属性,可连接数据库(类似普通用户);LOGIN属性,用于归类权限(类似用户组)。权限分为数据库级别(如访问整个数据库)、模式级别(如访问public模式)、表/列级别(如操作特定表或列)、序列级别(如操作自增序列)等,支持继承(子角色继承父角色权限)和默认权限(设置未来对象的初始权限)。
CREATE ROLE命令,指定LOGIN属性和密码:CREATE ROLE myuser WITH LOGIN PASSWORD 'SecurePassword123';
LOGIN属性,用于权限归类:CREATE ROLE dev_group;
GRANT命令将角色赋予用户,使用户继承角色权限:GRANT dev_group TO myuser;
REVOKE命令移除用户的角色:REVOKE dev_group FROM myuser;
若需具备所有权限的角色(如管理员),添加SUPERUSER属性:
CREATE ROLE admin WITH SUPERUSER LOGIN PASSWORD 'AdminPass123';
授予用户对整个数据库的访问权限(如ALL PRIVILEGES或特定权限):
-- 授予所有权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
-- 授予仅连接和创建表的权限
GRANT CONNECT, CREATE ON DATABASE mydb TO dev_group;
控制用户对模式(如public)的访问(如使用、创建对象):
-- 授予使用public模式的权限
GRANT USAGE ON SCHEMA public TO myuser;
-- 授予在public模式下创建对象的权限
GRANT CREATE ON SCHEMA public TO dev_group;
细化到表或列的权限(如SELECT、INSERT、UPDATE):
-- 授予表的所有权限
GRANT ALL PRIVILEGES ON TABLE employees TO myuser;
-- 授予表的查询和插入权限(列级别)
GRANT SELECT (id, name), INSERT (name, department) ON TABLE employees TO dev_group;
针对自增序列(如SERIAL类型),授予使用和查询权限:
-- 授予序列的使用和查询权限
GRANT USAGE, SELECT ON SEQUENCE employees_id_seq TO myuser;
设置未来创建的对象的初始权限(如新表自动赋予某角色SELECT权限):
-- 设置future在public模式下创建的表自动赋予dev_group SELECT权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO dev_group;
使用REVOKE命令撤销已授予的权限:
-- 撤销表的更新权限
REVOKE UPDATE ON TABLE employees FROM myuser;
-- 撤销角色的创建权限
REVOKE CREATE ON SCHEMA public FROM dev_group;
\du命令查看所有角色的权限摘要,或查询pg_roles系统表:SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin FROM pg_roles WHERE rolname = 'myuser';
information_schema.table_privileges表,获取具体权限信息:SELECT table_catalog, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'myuser';
pg_hba.conf文件(位于/etc/postgresql/<version>/main/)用于控制客户端连接的身份验证和授权,需修改后重启或重载PostgreSQL服务。
host all all 127.0.0.1/32 md5
host all all 192.168.1.0/24 md5
hostssl all all 0.0.0.0/0 cert
修改后执行以下命令重载配置:
sudo systemctl reload postgresql
SELECT、INSERT权限,无需DROP权限);pg_hba.conf中的IP范围,优先使用SSL加密连接;ALTER DEFAULT PRIVILEGES设置未来对象的初始权限,防止权限过度开放。