SEPostgreSQL 抽象

来自 PostgreSQL 维基
跳转到导航跳转到搜索

此维基页面介绍了一个新的抽象层来实现访问控制功能。

概述

如今,我们拥有各种可以应用于数据库对象访问的安全性模型。

本机数据库权限机制也是安全性模型之一。它根据要访问的数据库对象的数据库角色和 ACL(访问控制列表)做出其访问控制决策。

另一方面,我们目前有 SE-PostgreSQL,它被提议作为一种不同的方法来控制对数据库对象的访问,基于另一种安全性模型。它根据内核中的几个安全上下文和安全策略做出其访问控制决策。

两种安全性功能都有相同的目的,即使用 SQL 查询来控制对数据库对象的访问。但它们的标准并不相同。

从历史上看,本机数据库权限是 PostgreSQL 中唯一的安全性模型。因此,它的逻辑已在核心例程(如DefineRelation)中硬编码,并且还需要第二种安全性模型在其安全挂钩上设置各种核心例程。

然而,从根本上说,核心例程应该专注于安全机制是否允许所需的运行,或者不允许。如何允许所需的运行是一个可分离的问题。

一系列函数提供了一个抽象层来关注要检查的内容。例如,本机数据库权限要求数据库角色在使用ALTER TABLE修改时是表的拥有者。另一方面,SELinux 要求db_table:{setattr}应在目标表上允许。这security_class_alter_table调用两种安全性模型进行检查。做出决策的方式封装在抽象层中。

参考资料

常规 DML

security_table_permissions

void security_table_permissions(Oid table_oid, Oid user_id, AclMode required_perms,
                                Bitmapset selected_cols, Bitmapset modified_cols);

table_oid      : OID of the target relation
user_id        : OID of the database role to be checked
required_perms : Bitmask of the database privileges (e.g, ACL_SELECT)
selected_cols  : Bitmap of the referenced columns
modified_cols  : Bitmap of the modified columns

这将检查目标表和引用的或修改的列的权限,如果违反,则引发错误。

它应该被调用来代替ExecCheckRTEPerms()。此外,它也适用于COPY TO/FROMSELECT INTO语句。请注意,本机数据库权限不会检查INSERTOpenIntoRel()的权限,因为它隐含地假设表拥有者始终可以将元组插入新表。然而,这从根本上应该检查。

pg_database 对象

security_database_create

Datum security_database_create(const char *database_name, Oid dat_owner,
                               Oid tblspc_oid, DefElem *given_secon);

database_name : Name of the new database in creation
dat_owner     : OID of the new database owner
tablespace_id : OID of the tablespace 
given_secon   : User given security context, if exist

这将检查创建新数据库的权限,如果违反,则引发错误。如果存在,它将返回要分配给新数据库的安全上下文。

本机数据库权限检查have_createdb_privilege(),拥有者的成员资格和ACL_CREATE在表空间中。

security_database_alter

Datum security_database_alter(Oid database_oid, const char *new_name, Oit tblspc_oid,
                              Oid new_owner, DefElem *given_secon);

database_oid : OID of the database to be altered
new_name     : The new name of the database, if given
tblspc_oid   : The new tablespace of the database, if given
new_owner    : The new owner of the database, if given
given_secon  : The new security context of the database, if given

这将检查修改特定数据库的权限,如果违反,则引发错误。如果given_secon不为 NULL,它将返回要分配给数据库的安全上下文。

本机数据库权限检查数据库的拥有权和根据 ALTER 选项的相应权限。

security_database_drop

void security_database_drop(Oid database_oid);

database_oid : OID of the database to be dropped

这将检查删除特定数据库的权限,如果违反,则引发错误。

本机数据库权限检查数据库的拥有权。

security_database_connect

void security_database_connect(Oid database_oid)

datbase_oid : OID of the database to be connected

这将检查连接特定数据库的权限。

本机数据库权限检查ACL_CONNECT在数据库中。

security_database_reindex

void security_database_reindex(Oid database_oid)

database_oid : OID of the database to be reindexed

这将检查重新索引特定数据库中的关系的权限。

本机数据库权限检查数据库的拥有权。

security_database_comment

void security_database_comment(Oid database_oid)

database_oid : OID of the database to be commented

这将检查对特定数据库进行注释的权限。

本机数据库权限检查数据库的拥有权。

pg_namespace 对象

security_namespace_create

Datum security_namespace_create(bool is_temp, DefElem *given_secon)

is_temp     : true, if temporary namespace
given_secon : User given security context, if exist

这将检查创建新模式的权限,如果违反,则引发错误。如果存在,它将返回要分配给新命名空间的安全上下文。

本机数据库权限检查ACL_CREATEACL_CREATE_TEMP在数据库中。

security_namespace_alter

Datum security_namespace_alter(Oid namespace_oid, const char *new_name,
                               Oid new_owner, DefElem *given_secon)

namespace_oid : OID of the namespace to be altered
new_name      : The new name of the namespace, if given
new_owner     : The new owner of the namespace, if given
given_secon   : The new security context of the namespace, if given

这将检查修改特定命名空间的权限,如果违反,则引发错误。如果given_secon不为 NULL,它将返回要分配给数据库的安全上下文。

本机数据库权限检查命名空间的拥有权和ACL_CREATE在数据库中。(由于硬编码规则,不允许重命名 pg_temp。)

security_namespace_drop

void security_namespace_drop(Oid namespace_oid)

namespace_oid : OID of the namespace to be dropped

这将检查删除特定命名空间的权限,如果违反,则引发错误。

本机数据库权限检查命名空间的拥有权。

security_namespace_search

bool security_namespace_search(Oid namespace_oid)

namespace_oid : OID of the namespace to be searched at.

这将检查在特定命名空间中搜索的权限,如果违反,则引发错误。

本机数据库权限检查ACL_USAGE的命名空间。

security_namespace_comment

void security_namespace_comment(Oid namespace_oid)

namespace_oid : OID of the namespace to be commented on.

这将检查对特定命名空间进行注释的权限,如果违反,则引发错误。

本机数据库权限检查命名空间的拥有权。

pg_class 对象

security_class_create

Datum *security_class_create(TupleDesc *tupdesc, const char *rel_name, char relkind,
                             Oid rel_owner, Oid rel_tblspc, Oid rel_nspid, CreateStmt *stmt);
tupdesc    : TupleDesc object of the new relation in creation
rel_name   : Name of the new relation in creation
rel_kind   : Relkind of the new relation
rel_owner  : OID of the relation owner
rel_tblspc : OID of the tablespace
rel_nspid  : OID of the namespace
stmt       : CreateStmt object, if exists.

这将检查创建新表和列的权限,如果违反,则引发错误。它将返回要分配给新表和列的安全上下文的数组。如果给定的relkind不需要权限检查(例如RELKIND_TOASTVALUE),它只返回安全上下文的数组。

本机数据库权限检查ACL_CREATE在命名空间中,并且ACL_CREATE在表空间中(如果不是默认表空间)。

security_class_create_copy

Datum *security_class_create_copy(Relation relation);

relation : relation of the source relation

这不会检查任何内容,但将返回要分配给由make_new_heap()创建的新临时表的安全上下文的数组。临时表用于实现表重写,因此表需要具有相同的安全上下文。

security_class_create_inherit

void security_class_create_inherit(Relation parent);

parent : relation of the parent relation

这将检查创建继承特定表的子函数的权限,如果违反,则引发错误。

本机数据库权限检查父表的拥有权。

security_class_alter

Datum security_class_alter(Oid relid, const char *new_name, Oid new_owner,
                           Oid new_tblspc, Oid new_nspid, DefElem *new_secon);

relid      : OID of the relation to be altered
new_name   : New name of the relation, if given
new_owner  : New owner of the relation, if given
new_tblspc : New tablespace of the relation, if given
new_nspid  : New namespace of the relation, if given
new_secon  : New security context of the relation, if given

这将检查修改特定表的权限,如果违反,则引发错误。如果new_secon不为 NULL,它将返回要分配给数据库的安全上下文。

本机数据库权限检查关系的拥有权和根据选项的相应权限。

security_class_drop

void security_class_drop(Oid relid);

relid : OID of the relation to be dropped

这将检查删除特定表的权限,如果违反,则引发错误。

本机数据库权限检查关系的拥有权。

security_class_lock

void security_class_lock(Oid relid, LOCKMODE lockmode);

relid    : OID of the relation to be locked
lockmode : required lock mode

这将检查使用LOCK命令锁定特定表的权限,如果违反,则引发错误。

本机数据库权限检查ACL_SELECT用于AccessShareLockACL_UPDATE | ACL_DELETE | ACL_TRUNCATE用于其他锁模式。

security_class_trigger

void security_class_trigger(Oid relid, Oid constrrelid, Oid func_oid);

relid     : OID of the relation on which the new trigger is set
consrelid : OID of the relation which is constrained by the new trigger
func_oid  : OID of the trigger function

这将检查在特定表上创建触发器函数的权限,如果违反,则引发错误。

本机数据库权限检查ACL_TRIGGER在关系上。

security_class_reference

void security_class_reference(Oid relid, int16 *attnums, int natts);

relid   : OID of the relation on which FK constraint is set
attnums : An arrary of attribute numbers
natts   : The length of attnums array

这将检查在特定表上创建外键约束的权限,如果违反,则引发错误。

本机数据库权限检查ACL_REFERENCE在关系上。

security_class_truncate

void security_class_truncate(Relation rel)

rel : Relation to be truncated

这将检查截断特定表的权限,如果违反,则引发错误。

本机数据库权限检查ACL_TRUNCATE在关系上。

security_class_reindex

void security_class_reindex(Oid relid)

relid : OID of the index to be reindexed

这将检查重新索引特定表或特定索引的索引的权限,如果违反,则引发错误。

本机数据库权限检查表的拥有权。

security_class_vacuum

bool security_class_vacuum(Relation vacuum_rel)

vacuum_rel : The relation to be vacuumed

这将检查真空特定关系的权限,如果违反,则返回false,如果违反,则引发错误。

本机数据库权限检查关系的拥有权,或者如果不是共享关系,则检查数据库的拥有权。

security_class_get_tid

void security_class_get_tid(Oid relid);

这将检查获取特定关系上的当前事务标识符的权限,如果违反,则引发错误。

本机数据库权限检查ACL_SELECT在关系上。

security_class_get_value

void security_class_get_value(Oid relid);

relid : OID of the sequence to be referenced

这将检查引用特定序列对象的当前值的权限,如果违反,则引发错误。

本机数据库权限检查ACL_SELECTACL_USAGE在序列对象上。

security_class_next_value

void security_class_next_value(Oid relid);

relid : OID of the sequence to be fetched

这将检查获取特定序列对象的下一个值的权限,如果违反,则引发错误。

本机数据库权限检查ACL_UPDATEACL_USAGE在序列对象上。

security_class_set_value

void security_class_set_value(Oid relid);

relid : OID of the sequence to be set a new value.

这将检查设置特定序列对象的离散值的权限,如果违反,则引发错误。

本机数据库权限检查ACL_UPDATE在序列对象上。

pg_attribute 对象

pg_proc 对象

pg_language 对象

pg_tablespace 对象

pg_foreign_data_wrapper 对象

pg_foreign_server 对象

pg_type 对象

pg_oper 对象

pg_opclass 对象

pg_opfamily 对象

pg_conversion 对象

pg_ts_dict 对象

pg_ts_config 对象

pg_ts_parser 对象

pg_ts_template 对象