PostgreSQL 安全管理 最佳实践
在实际生产中, 应遵循以下规范 :
1 使用超级用户创建数据库,模式,应用所需的对象。
(如表,索引,函数)。
2 创建应用账号角色。
3 回收数据库,schema,language,应用对象的public权限。
revoke all on database dbname from public;
revoke all on schema sch_name from public;
revoke all on language plpgsql from public;
revoke all on table ... from public;
revoke all on function ... from public;
4 将数据库,schema的使用权限赋予给应用账号。
grant connect on database dbname to approle;
|grant usage on schema sch_name to approle;
5 将应用需要访问的对象的相关权限赋予给应用账号。
例如表的select,insert,update,delete权限, 函数的execute权限等.
这样,应用账号只有对象的使用权限,没有对象的DROP,TRUNCATE,REPLACE权限,相对来说是更安全的。
6 函数语言安全
建议回收函数语言的public权限,以及普通用户的权限,用户不能创建函数。执行online code。
revoke all on language plpgsql from public;
revoke all on language plpgsql from app_role;
7 防止执行不带条件的delete ,update。
例如,在需要保护的表里,新增一条dummy记录,创建行触发器,当这条记录被更新或删除时,抛出异常。
对于业务上不允许执行删除操作的表,不要赋予该表的delete权限给应用账号,也就不会有这个风险