SEPostgreSQL/Permissions
来自 PostgreSQL wiki
跳转至导航跳转至搜索数据库 (pg_database)
创建
- DAC
- 检查所有者的createdb授权
- 检查源数据库的所有权(如果不是模板)
- 检查表空间(如果指定)的CREATE授权
- SELinux
- 检查默认安全标签上的db_database:{create};根据源数据库
- (未来版本中表空间上的授权)
- 上下文信息
- 新数据库的名称
- 源数据库的 oid
- (表空间的 oid)
变更
- DAC
- 检查数据库的所有权
- 检查用户的createdb授权(如果是 RENAME TO,OWNER TO)
- 检查新所有者的成员资格(如果 OWNER TO)
- 检查表空间(如果 SET TABLESPACE)的 CREATE 权限
- SELinux
- 检查 db_database:{setattr}
- (未来版本中表空间上的授权)
- 上下文信息
- 事件类型和 oid
- (如果是 SET TABLESPACE,则为表空间的 oid)
删除
- DAC
- 检查数据库的所有权
- SELinux
- 检查 db_database:{drop}
- 上下文信息
- 仅事件类型和 oid
连接
- DAC
- 在 CheckMyDatabase() 中检查数据库的 CONNECT 权限
- SELinux
- 检查 db_database:{access}
- 上下文信息
- 仅事件类型和 oid
模式 (pg_namespace)
创建
- DAC
- 检查在数据库上的 CREATE or CREATE_TEMP 权限
- 检查所有者(如果持久模式)的成员资格
- SELinux
- 根据数据库在默认安全标签上检查 db_schema:{create}
- 上下文信息
- 新模式的名称
变更
- DAC
- 检查模式的 所有权
- 检查数据库(如果 RENAME TO,OWNER TO)的 CREATE 权限
- 检查新所有者的成员资格(如果 OWNER TO)
- SELinux
- 检查 db_schema:{setattr}
- 上下文信息
- 仅事件类型和 oid
删除
- DAC
- 检查模式的 所有权
- SELinux
- 检查 db_schema:{drop}
- 上下文信息
- 模式的 oid
- 一个标志,表示是否 CASCADE 或 RESTRICT
搜索
- DAC
- 检查 USAGE 权限
- SELinux
- 检查 db_schema:{search}
- 上下文信息
- 仅事件类型和 oid
关系 (pg_class)
创建
- DAC
- 检查新关系命名空间的 CREATE 权限
- 检查新关系表空间的 CREATE 权限(如果指定实际的 TABLESPACE)
- 检查正在继承的表(如果指定 INHERITS)的 所有权
- SELinux
- 基于命名空间,检查关系默认安全标签上的 db_xxx:{create}。
- db_xxx 是 db_table、db_sequence 还是 db_view,这取决于 relkind
- 基于关系,检查列默认安全标签上的 db_column:{create}
- 检查 db_schema:{add_name} 权限
- (未来版本中表空间上的授权)
- 检查正在继承的表(如果指定 INHERITS)的 db_table:{getattr} 权限
- 基于命名空间,检查关系默认安全标签上的 db_xxx:{create}。
- 上下文信息
- 新关系的名称
- 命名空间的 oid
- (表空间的 oid)
- relkind
- TupleDesc(它提供关于列的信息)
- 备忘录
- 在我看来,应该将继承表的权限检查与创建检查的主要部分分开,因为 MergeAttributes() 获取对父表的 ShareUpdateExclusiveLock。如果我们不立即引发错误,没有权限的使用者可以不受权限限制地访问父表。
变更
- DAC
- 检查关系的 所有权
- 检查命名空间的 CREATE 权限,如果是 ALTER RENAME TO/SET SCHEMA/OWNER TO
- 检查如果是 ALTER OWNER TO,新所有者的角色成员资格
- 检查约束表/列的 PK/FK REFERENCES 权限,如果是添加 FK 约束
- 检查表空间的 CREATE 权限,如果是 ALTER SET TABLESPACE
- 检查父关系的 所有权,如果是 ALTER INHERIT
- SELinux
- 检查 db_xxx:{setattr}
- 检查 db_column:{create} 或 db_column:{drop},如果是 ADD/DROP COLUMN
- 检查 db_column:{setattr},如果修改列
- 检查 db_schema:{add_name remove_name},如果为 ALTER RENAME TO/SET SCHEMA
- (未来版本中表空间上的授权)
- 检查父表的 db_table:{getattr} ,如果为 ALTER INHERIT
- 上下文信息
- 要修改的表/列的 oid 和 subid
- 新命名空间的 oid,如果为 ALTER SET SCHEMA
- (新表空间的 oid,如果为 ALTER SET TABLESPACE)
- 新名称(如果为 ALTER RENAME TO)
- ColumnDef(如果为 ALTER ADD COLUMN)
删除
- DAC
- 检查命名空间或关系的所有权
- SELinux
- 检查 db_xxx:{drop}
- 检查 db_schema:{remove_name}
- 上下文信息
- 关系的 oid
- 一个标志,表示是否 CASCADE 或 RESTRICT
序列操作
- DAC
- 检查在 currval()/lastval() 上的 SELECT 或 USAGE 权限
- 检查在 nextval() 上的 **USAGE** 或 **UPDATE** 权限
- 检查在 setval() 上的 UPDATE 权限
- SELinux
- 检查在 currval()/lastval() 上的 db_sequence:{get_value}
- 检查在 nextval() 上的 db_sequence:{next_value}
- 检查在 setval() 上的 db_sequence:{set_value}
- 上下文信息
- 仅事件类型和 oid
函数 (pg_proc)
创建
- DAC
- 检查命名空间的 CREATE 权限
- 检查语言的 USAGE 权限或超级用户的权限(取决于该语言是否受信任)
- (如果给定了 LEAKPROOF,则检查超级用户的权限)
- 如果替换,检查函数的所有权
- SELinux
- 根据命名空间,检查默认安全标签上的 db_procedure:{create}
- 检查命名空间的 db_schema:{add_name}
- 检查语言的 db_language:{implement}
- (如果给定了 LEAKPROOF,则检查 db_procedure:{install})
- 如果替换,检查 db_procedure:{drop} 和 db_schema:{remove_name}
- 上下文信息
- 新函数的名称
- 参数类型的 oid
- 命名空间的 oid
- 语言的 oid
- (一个标志,告知是否为 LEAKPROOF)
变更
- DAC
- 检查过程的所有权
- 如果为 RENAME TO/SET SCHEMA/OWNER TO,检查命名空间的 CREATE 权限
- 检查如果是 ALTER OWNER TO,新所有者的角色成员资格
- SELinux
- 检查 db_procedure:{setattr}
- 如果为 RENAME TO/SET SCHEMA,检查 db_schema:{add_name remove_name}
- 上下文信息
- 函数的 oid
- 命名空间的 oid(如果为 SET SCHEMA)
- 新函数名称(如果为 RENAME TO)
删除
- DAC
- 检查函数或命名空间的所有权
- SELinux
- 检查 db_procedure:{drop}
- 检查 db_schema:{remove_name}
- 上下文信息
- 函数的 oid
- 一个标志,表示是否 CASCADE 或 RESTRICT
执行
- DAC
- 检查 EXECUTE 权限
- SELinux
- 检查 db_procedure:{execute}
- 如果为受信任的函数,检查 db_procedure:{entrypoint} 和 process:{transition}
- 上下文信息
- 仅事件类型和 oid
语言 (pg_language)
创建
- DAC
- 如果 tmpldbacreate = true,检查超级用户的权限或数据库的所有权。
- SELinux
- 根据数据库,检查默认安全上下文中上的 db_language:{create}
- 检查处理器、内联和转换器函数的 db_procedure:{install}
- 上下文信息
- 新语言的名称
- 处理器、内联和转换器函数的 oid
变更
- DAC
- 检查语言的所有权
- 如果为 ALTER OWNER TO,检查语言新所有者的成员身份
- SELinux
- 检查 db_language:{setattr}
- 上下文信息
- 仅事件类型和 oid
删除
- DAC
- 检查语言的所有权
- SELinux
- 检查语言的 db_language:{drop}
- 上下文信息
- 语言的 oid
- 一个标志,表示是否 CASCADE 或 RESTRICT
聚集 (pg_aggregate)
创建
- DAC
- 检查命名空间的 CREATE 权限
- 检查转置和最终函数的 EXECUTE 权限
- SELinux
- 根据命名空间,检查默认安全标签上的 db_procedure:{create}
- 在转置和最终函数上检查 db_procedure:{install}
- 可能没有必要,因为 db_procedure:{execute} 应该在运行时检查
- 上下文信息
- 新函数的名称
- 命名空间的 oid
- 转置和最终函数的 oid
变更
- DAC
- 检查聚集的 所有权
- 检查命名空间的 CREATE 权限,如果 RENAME TO/SET SCHEMA
- 检查新所有者的 成员资格,如果 OWNER TO
- SELinux
- 检查 db_procedure:{setattr}
- 如果为 RENAME TO/SET SCHEMA,检查 db_schema:{add_name remove_name}
- 上下文信息
- 聚集的 oid
- 命名空间的 oid(如果为 SET SCHEMA)
删除
- DAC
- 检查聚集或命名空间的所有权
- SELinux
- 检查 db_procedure:{drop}
- 检查 db_schema:{remove_name}
- 上下文信息
- 聚集的 oid
- 一个标志,表示是否 CASCADE 或 RESTRICT
类型/域 (pg_type)
创建
- DAC
- 检查 superuser 权限或命名空间的 CREATE 权限,取决于是否是基本类型。
- 检查 type_in、type_out、type_recv、type_send、type_modin、type_modout 和 type_analyze 函数的所有权(如果是基本类型)。
- SELinux
- 检查插入元组到 pg_type 目录的权限,因为 selinux 目前没有类型的特定对象类。
- 检查 db_schema:{add_name}
- 在 type_in、type_out、type_recv、type_send、type_modin、type_modout 和 type_analyze 函数上检查 db_procedure:{install}。
- 上下文信息
- 新类型名称
- 命名空间的 oid
- type_in、type_out、type_recv、type_send、type_modin、type_modout 和 type_analyze 函数的 oid
变更
- DAC
- 检查类型的 所有权
- 检查命名空间的 CREATE 权限,如果是 ALTER RENAME TO/SET SCHEMA/OWNER TO
- 检查新所有者的 成员资格,如果 ALTER OWNER TO
- SELinux
- 检查更新 pg_type 目录的权限(selinux 目前没有类型的特定对象类)
- 检查 db_schema:{add_name remove_name},如果为 ALTER RENAME TO/SET SCHEMA
- 上下文信息
- 类型的 oid
- 命名空间的 oid(如果为 SET SCHEMA)
删除
- DAC
- 检查类型或命名空间的所有权
- SELinux
- 检查从 pg_type 目录中删除元组的权限,因为 selinux 目前没有类型的特定对象类。
- 检查 db_schema:{remove_name}
- 上下文信息
- 类型的 oid
- 一个标志,表示是否 CASCADE 或 RESTRICT