SEPostgreSQL 抽象
此维基页面介绍了一个新的抽象层来实现访问控制功能。
概述
如今,我们拥有各种可以应用于数据库对象访问的安全性模型。
本机数据库权限机制也是安全性模型之一。它根据要访问的数据库对象的数据库角色和 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/FROM和SELECT INTO语句。请注意,本机数据库权限不会检查INSERT对OpenIntoRel()的权限,因为它隐含地假设表拥有者始终可以将元组插入新表。然而,这从根本上应该检查。
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_CREATE或ACL_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用于AccessShareLock或ACL_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_SELECT或ACL_USAGE在序列对象上。
security_class_next_value
void security_class_next_value(Oid relid); relid : OID of the sequence to be fetched
这将检查获取特定序列对象的下一个值的权限,如果违反,则引发错误。
本机数据库权限检查ACL_UPDATE或ACL_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在序列对象上。