SEPostgreSQL 参考资料
本章介绍了与 SE-PostgreSQL 相关的参考资料。
- 章节列表
对象类和访问向量
概述
SELinux 将其访问权限表示为对象类和访问向量的组合。 对象类指的是对象类型,例如文件, 目录, tcp_socket等等。 对某个对象的可用操作取决于对象的类型,例如,我们不能在目录上发送数据包,因此安全策略为每个对象类定义了一组特定的权限。 我们称它们为访问向量。
此表介绍了目前我们拥有的数据库对象的所有对象类和访问向量。
db_database | db_tablespace | db_schema | db_schema_temp | db_table | db_sequence | db_procedure | db_column | db_tuple | db_blob |
---|---|---|---|---|---|---|---|---|---|
create | create | create | create | create | create | create | create | create | |
drop | drop | drop | drop | drop | drop | drop | drop | drop | |
getattr | getattr | getattr | getattr | getattr | getattr | getattr | getattr | getattr | |
setattr | setattr | setattr | setattr | setattr | setattr | setattr | setattr | setattr | |
relabelfrom | relabelfrom | relabelfrom | relabelfrom | relabelfrom | relabelfrom | relabelfrom | relabelfrom | relabelfrom | relabelfrom |
relabelto | relabelto | relabelto | relabelto | relabelto | relabelto | relabelto | relabelto | relabelto | relabelto |
access | createon | search | search | select | get_value | execute | select | select | read |
load_module | add_name | add_name | update | next_value | entrypoint | update | update | write | |
superuser | remove_name | remove_name | insert | set_value | install | insert | insert | import | |
delete | untrusted | delete | export | ||||||
lock |
通用数据库类
一些访问向量对数据库对象是通用的,因此它们通常包含在这些对象类中。 我们将在本节中介绍它们(create、drop、getattr、setattr、relabelfrom 和 relabelto)。
- create
- 它需要在使用以下语句创建的数据库对象上使用:CREATE xxx通常情况下。
- 当我们创建新的数据库对象时,SE-PostgreSQL 会在它们上面分配一个默认的安全上下文(如果没有明确给出),然后使用该默认安全上下文检查客户端对它们的权限。
- 例如,当用户尝试创建一个新表时,它可能会分配system_u:object_r:sepgsql_table_t:s0到新表上,并检查用户的db_table:{create}权限。 如果不允许,SE-PostgreSQL 将不再允许执行给定的查询。
- drop
- 它需要在使用以下语句删除的数据库对象上使用:DROP xxx通常情况下。
- getattr
- 它需要在使用以下语句引用的数据库对象上使用:SELECT ... FROM <系统目录>通常情况下。
- setattr
- 它需要在使用以下语句更新的数据库对象上使用:ALTER xxx通常情况下。
- relabelfrom
- 当我们更改它们的安全性上下文时,它需要在具有较旧安全性上下文的数据库对象上使用。
- relabelto
- 当我们更改它们的安全性上下文时,它需要在具有较新安全性上下文的数据库对象上使用。
db_database 类
db_database 类表示数据库对象本身,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文
- 数据库对象充当任何其他数据库对象的TYPE_TRANSITION的根。 因此,它没有任何父对象。
- 当安全策略给出默认上下文时,SE-PostgreSQL 会尝试分配它。 其配置可以存储在以下位置:/etc/selinux/${POLICYTYPE}/contexts/sepgsql_context.
- 如果没有给出配置,它将继承客户端进程的安全性上下文。 但是,默认安全策略对它们有TYPE_TRANSITION规则,因此所有新数据库将被标记为sepgsql_db_t.
- access
- 当客户端连接到某个数据库时需要它。 它类似于ACL_CONNECT在数据库 ACL 机制上的作用。
- load_module
- 当动态链接库加载到当前地址空间时需要它。
- 当前数据库(而不是客户端)需要被允许加载库。
- 请注意,它是在加载 DLL 时检查的,不同于db_database:{install_module}.
- superuser
- 当客户端以数据库超级用户身份执行时需要它。
- 如果权限不允许,客户端不能以超级用户身份执行,但 SE-PostgreSQL 不会引发错误。 它只能以非特权数据库用户身份执行。
db_tablespace 类
- createon
- 当客户端尝试在目标表空间上创建内容时需要它。
db_schema 类
db_schema 类表示模式对象(不是临时对象),并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文
- 它继承了数据库的安全性上下文,该数据库是在其中部署模式对象的数据库。
- search
- 当客户端引用某个模式对象中的数据库对象时需要它。 它类似于ACL_USAGE在模式对象上的作用。
- add_object
- 当客户端在某个模式对象中创建数据库对象时需要它。
- remove_object
- 当客户端在某个模式对象中删除数据库对象时需要它。
db_schema_temp 类
db_schema_temp 类表示临时方案对象,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文
- 与db_schema类相同。
- search(现在未实现)
- 当客户端引用某个模式对象中的数据库对象时应该需要它。
- add_object
- 与db_schema:{add_object}
- remove_object
- 与db_schema:{remove_object}
db_table 类
db_table 类表示常规表对象,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文
- 它继承了模式的安全性上下文,该模式是在其中部署表对象的模式。
- 默认策略对TYPE_TRANSITION类有一些db_table规则,因此新表将被标记为sepgsql_table_t, user_sepgsql_table_t或unpriv_sepgsql_table_t.
- select
- 当需要通过以下方式引用表时需要它:SELECT或COPY TO语句以及其他包含任何引用的语句,例如RETURNING子句。
- 请注意,我们可以将引用视为WHERE, ORDER BY和其他子句也需要db_table:{select}权限,尽管它不会直接返回内容。
- update
- 当需要通过以下方式更新表时需要它:UPDATE语句。
- insert
- 当需要通过以下方式插入表时需要它:INSERT或COPY FROM语句。
- delete
- 当需要通过以下方式删除表时需要它:DELETE或TRUNCATE语句。
- lock
- 当需要通过以下方式显式锁定表时需要它:LOCK语句或SELECT ... FOR UPDATE/SHARE语句。
- 请注意,它不需要在隐式表锁上使用。
db_procedure 类
db_procedure 类表示 SQL 函数,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文
- 它继承了模式的安全性上下文,该模式是在其中部署 SQL 函数的模式。
- 默认策略对TYPE_TRANSITION类有一些db_procedure规则,因此新表将被标记为sepgsql_proc_exec_t, user_sepgsql_proc_exec_t或unpriv_sepgsql_proc_exec_t.
- execute
- 当需要执行过程时需要它。 它类似于ACL_EXECUTE在数据库 ACL 机制上的作用。
- entrypoint
- 当需要以受信任的过程身份执行过程时需要它。
- 有关更多详细信息,请参见PUT HERE A PROPER URL。
- 受信任的过程会导致域转换,因此process:{transition}也需要被允许。
- 当客户端(staff_t)调用导致域转换到sepgsql_trusted_proc_exec_t)的受信任过程(sepgsql_trusted_proc_t.
- )时,需要以下策略。 请注意,由于实现原因,我们不支持将内置函数用作受信任的过程。
- allow staff_t sepgsql_trusted_proc_exec_t : db_procedure { execute entrypoint };
- allow staff_t sepgsql_trusted_proc_t : process { transition };
- type_transition staff_t sepgsql_trusted_proc_exec_t : db_procedure sepgsql_proc_t;
- install
- 当需要将过程安装为系统内部内容的一部分时需要它。
- PostgreSQL 以服务器内部内容的一部分身份调用用户定义的函数,因此 SE-PostgreSQL 在安装时检查其正确性。
- untrusted
- 当创建使用不受信任语言的过程时需要它,除了db_procedure:{create}
db_sequence 类
db_sequence 类表示序列对象,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文
- 它继承了模式的安全性上下文,该模式是在其中部署序列对象的模式。
- get_value
- 当需要引用序列而不进行任何更改时需要它。
- next_value
- 当需要引用序列并增加其值时需要它。
- set_value
- 当需要为序列设置给定值时需要它。
db_column 类
db_column 类表示表列对象,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文。
- 它继承了包含该列的表的安全性上下文。
- select
- 当需要引用通过以下方式引用的列时需要它:SELECT或COPY TO语句以及其他包含任何引用的语句,例如RETURNING子句。
- update
- 当需要在以下列出的列上使用时需要它:UPDATE语句。
- insert
- 当需要在以下列出的列上使用时需要它:INSERT或COPY FROM语句。
db_tuple 类
db_tuple 类表示常规表中的元组,它包含六个访问向量。
- 默认安全上下文
- 它继承了包含该元组的表的安全性上下文。
- relabelfrom
- 当需要重新标记具有较旧上下文的元组时需要它。
- relabelto
- 当需要重新标记具有较新上下文的元组时需要它。
- select
- 当需要选择元组时需要它。
- update
- 当需要更新元组时需要它。
- insert
- 当需要插入元组时需要它。
- delete
- 当需要删除元组时需要它。
db_blob 类
db_blob 类表示二进制大型对象,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。
- 默认安全上下文
- 它继承了数据库的安全性上下文。
- 默认策略对TYPE_TRANSITION对 db_blob 类有一些规则,因此新的大型对象将被标记为sepgsql_blob_t, user_sepgsql_blob_t或unpriv_sepgsql_blob_t.
- read
- 大型对象需要使用以下函数读取:loread()或lo_export().
- write
- 大型对象需要使用以下函数写入:lowrite(), lo_truncate()或lo_import().
- import
- 大型对象需要使用以下函数导入:lo_import()函数,而不仅仅是db_blob:{write}.
- 请注意,大型对象在创建时会使用默认的安全上下文,因此会检查默认的安全上下文中的权限。
- export
- 大型对象需要使用以下函数导出:lo_export()函数,而不仅仅是db_blob:{read}.
默认安全策略
概述
本节介绍默认安全策略以及sepostgresql-devel策略模块中预定义的对象类型和布尔值列表。在大多数情况下,我们不需要从头开始编写自己的安全策略模块。请考虑通过自定义默认安全策略来实现您的安全设计。
默认安全策略定义了各种域。其中一些称为非受限域,例如unconfined_t,在该域中允许广泛的权限。默认安全策略还允许非受限域对数据库对象执行任何操作,但有一些例外。请注意,本节中的介绍针对除非受限域以外的域,例如user_t和httpd_t.
一些 SELinux 角色有前缀(这是安全策略的常规规则),例如user, staff等等。它们有与前缀相关的类型,例如user_home_t。它支持角色级别分离,默认安全策略还为数据库对象定义了带前缀的类型。在本文档中,它显示为(PREFIX)它可以被user或其他类型在实际中替换。
预定义类型
数据库类型
- sepgsql_db_t
- 这是默认安全策略中唯一可以分配给数据库的类型。
- 它允许受限域连接,但不允许创建、删除、修改数据库以及以超级用户身份执行操作。
表空间类型
- sepgsql_tablespace_t
- 这是默认安全策略中唯一可以分配给表空间的类型。
- 目前,它没有提供任何特定的保护。
模式类型
- sepgsql_schema_t
- sepgsql_schema_temp_t
表类型
- sepgsql_table_t
- 这是非受限域创建的新表的默认类型。
- 它允许受限域执行所有 DML 操作(db_table:{select update insert delete}),但 DDL 操作不被允许。
- sepgsql_fixed_table_t
- 它允许受限域db_table:{select insert}操作。
- 此类型的目的是保护插入的信息,防止意外操作或删除。
- 例如,存储需要出于法律原因保留一定时间的文档。
- sepgsql_ro_table_t
- 它允许受限域db_table:{select}操作。
- 此类型的目的是设置只读表。
- 例如,设置一个不可更新的商品主表。
- sepgsql_secret_table_t
- 它不允许受限域执行任何操作,因此他们需要通过受信任的程序访问此类型(如果提供)。
- 例如,存储信用卡号码等机密信息。
- sepgsql_sysobj_t
- 这是系统目录的默认类型。
- 它允许受限域db_table:{select}操作。
- (PREFIX)_sepgsql_table_t
- 这是带前缀域创建的新表的默认类型。
- 它允许带前缀的域执行所有 DML 操作(db_table:{select update insert delete}),它还允许它们执行 DDL 操作(db_table:{create drop setattr}当sepgsql_enable_users_ddl启用时。
- 例如,基于角色的分离。
- (PREFIX)_sepgsql_sysobj_t
- 这是系统目录中元组的默认类型,由带前缀的域创建。
- 它始终允许带前缀的域db_tuple:{select},并且还允许db_tuple:{update insert delete}当sepgsql_enable_users_ddl启用时。
- unpriv_sepgsql_table_t
- 这是没有前缀的受限域创建的新表的默认类型。
- 它允许受限域执行所有 DML 操作(db_table:{select update insert delete}),它还允许它们执行 DDL 操作(db_table:{create drop setattr}当sepgsql_enable_users_ddl启用时。
- unpriv_sepgsql_sysobj_t
- 这是没有前缀的受限域创建的系统目录中元组的默认类型。
- 它始终允许受限域db_tuple:{select},并且还允许db_tuple:{update insert delete}当sepgsql_enable_users_ddl启用时。
序列类型
- sepgsql_seq_t
- (PREFIX)_sepgsql_seq_t
- unpriv_sepgsql_seq_t
过程类型
- sepgsql_proc_exec_t
- 这是非受限域定义的新函数以及初始设置的默认类型。
- 它允许任何域执行和安装函数,但禁止受限域执行db_procedure:{create drop setattr}.
- sepgsql_trusted_proc_exec_t
- 这是受信任过程的类型。
- 它允许任何域执行该函数,然后受限域转换为非受限域(sepgsql_trusted_proc_t)。因为我们不需要受信任过程作为系统内部内容,db_procedure:{install}不被允许。
- 此类型的目的是提供安全的方式来访问机密信息。不用说,只有非受限域可以设置受信任过程,但这应该谨慎操作。
- (PREFIX)_sepgsql_proc_exec_t
- 这是带前缀的域定义的新函数的默认类型。
- 它允许带前缀的域db_procedure:{execute}和db_procedure:{create drop setattr}当sepgsql_enable_users_ddl启用时。
- 但它禁止非受限域执行使用此类型的函数,因为我们认为非受限域不应该在没有验证其安全性之前调用用户定义的函数。如果非受限域需要调用用户定义的函数,请先验证其声明并将其重新标记为sepgsql_proc_t。
- unpriv_sepgsql_proc_exec_t
- 这是没有前缀的受限域定义的新函数的默认类型。
- 它允许受限域db_procedure:{execute}和db_procedure:{create drop setattr}当sepgsql_enable_users_ddl启用时。
- 但它禁止非受限域执行使用此类型的函数,因为我们认为非受限域不应该在没有验证其安全性之前调用用户定义的函数。如果非受限域需要调用用户定义的函数,请先验证其声明并将其重新标记为sepgsql_proc_t。
大型对象类型
- sepgsql_blob_t
- 这是非受限域创建的新大型对象的默认类型。
- 它允许受限域读取和写入,但不允许创建、删除等操作。
- sepgsql_ro_blob_t
- 它允许受限域读取大型对象。
- sepgsql_secret_blob_t
- 它不允许受限域执行任何操作。因此,他们需要通过受信任的程序访问它们(如果提供)。
- (PREFIX)_sepgsql_blob_t
- 这是带前缀的域创建的新大型对象的默认类型。
- 它允许它们执行除重新标记以外的任何操作。
- unpriv_sepgsql_blob_t
- 这是在带前缀的受限域内创建的新大型对象的默认类型。
- 它允许它们执行除重新标记以外的任何操作。
预定义的布尔值
- sepgsql_enable_users_ddl
- default = true
- 它允许控制受限域执行 DDL 语句(CREATE/ALTER/DROP)的能力。
- 当它关闭时,SE-PostgreSQL 会阻止受限域调用 DDL。
- sepgsql_enable_auditallow (sepostgresql-devel.pp)
- default = false
- 它允许打开/关闭允许访问的审核消息。
- 当它打开时,SE-PostgreSQL 会为允许访问的事件生成审核消息,除了db_tuple对象类,以避免审核日志泛滥,因为一个查询可以访问大量元组。
- sepgsql_enable_auditdeny (sepostgresql-devel.pp)
- default = true
- 它允许打开/关闭拒绝访问的审核消息。
- 当它打开时,SE-PostgreSQL 会为拒绝访问的事件生成审核消息,除了db_tuple对象类,以避免审核日志泛滥,因为一个查询可以访问大量元组。
- sepgsql_regression_test_mode (sepostgresql-devel.pp)
- default = false
- 它允许正确运行回归测试。
- 当它打开时,它允许直接加载部署在用户主目录上的动态链接库。
- 请注意,除了回归测试阶段外,它不应打开,因为它从根本上来说是不安全的。
增强型 SQL 语句
本节介绍 SQL 语句的新扩展,以支持显式安全上下文。
- CREATE DATABASE
- CREATE DATABASE dbname SECURITY_LABEL = '数据库上下文';
- 增强型CREATE DATABASE语句允许使用显式安全上下文创建新的数据库。
- db_database:{create}权限需要在显式指定的安全上下文中允许。
- 示例
- postgres=# CREATE DATABASE testdb SECURITY_LABEL =
- 'system_u:object_r:sepgsql_db_t:Classified';
- CREATE DATABASE
- postgres=#
- ALTER DATABASE
- ALTER DATABASE dbname SECURITY_LABEL = '数据库上下文';
- 增强型ALTER DATABASE语句允许更改现有数据库的安全上下文。
- db_database:{setattr relabelfrom}权限需要在数据库上允许,并且db_database:{relabelto}权限需要在显式指定的安全上下文中允许。
- 示例
- postgres=# ALTER DATABASE testdb SECURITY_LABEL =
- 'system_u:object_r:sepgsql_db_t:Secret';
- ALTER DATABASE
- CREATE TABLE
- CREATE TABLE table_name (
- column_name <TYPE> [<CONSTRAINT>] SECURITY_CONTEXT = '列上下文',
- :
- ) [<table options>] SECURITY_LABEL = '表上下文';
- 增强型CREATE TABLE语句允许使用显式安全上下文创建新的表和列。
- db_table:{create}或db_column:{create}权限需要在显式指定的安全上下文中允许。
- 请注意,新创建的列会继承关系的安全上下文,因此,当您省略SECURITY_LABEL = '...'选项用于列时,所有列都被标记为为表显式指定的那个。
- 示例
- postgres=# CREATE TABLE testtbl (
- x int PRIMARY KEY,
- y text SECURITY_LABEL = 'system_u:object_r:sepgsql_ro_table_t', z date
- ) SECURITY_LABEL = 'system_u:object_r:sepgsql_fixed_table_t';
- NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "testtbl_pkey" for table "testtbl"
- CREATE TABLE
- ALTER TABLE
- ALTER TABLE table_name [ALTER column_name] SECURITY_LABEL = '表/列上下文'
- 增强型ALTER TABLE语句允许更改现有表或列的安全上下文。
- db_table:{setattr relabelfrom}或db_column:{setattr relabelfrom}权限需要在当前表或列上允许,并且db_table:{relabelto}或db_column:{relabelto}权限需要在显式指定的安全上下文中允许。
- 示例
- postgres=# ALTER TABLE testtbl ALTER x SECURITY_LABEL =
- 'system_u:object_r:sepgsql_table_t:Classified';
- ALTER TABLE
- CREATE FUNCTION
- CREATE [OR REPLACE] FUNCTION function_name (<type>,...) RETURNS <type> [<options> ...]
- SECURITY_LABEL = '函数上下文'
- [AS ‘<definition>’]
- 增强型CREATE FUNCTION语句允许使用显式安全上下文创建新的函数。
- db_procedure:{create}权限需要在显式指定的安全上下文中允许。
- 示例
- postgres=# CREATE or REPLACE function less_than (integer, integer)
- RETURNS bool LANGUAGE 'sql'
- SECURITY_LABEL = 'system_u:object_r:user_sepgsql_proc_exec_t'
- AS 'SELECT $1 < $2';
- CREATE FUNCTION
- ALTER FUNCTION
- ALTER FUNCTION function_name SECURITY_LABEL = '函数上下文'
- 增强型ALTER FUNCTION语句允许更改现有函数的安全上下文。
- db_procedure:{setattr relabelfrom}权限需要在当前过程中允许,并且db_procedure:{relabelto}权限需要在显式指定的安全上下文中允许。
- 示例
- postgres=# ALTER FUNCTION less_than (integer, integer)
- SECURITY_LABEL = 'system_u:object_r:sepgsql_proc_t';
- ALTER FUNCTION
增强型 SQL 函数
本节介绍了一些新的函数,用于利用 SE-PostgreSQL 的安全功能。
- text lo_get_security(oid loid)
- 此函数返回给定大型对象的安全性属性。
- 示例
- postgres=# SELECT lo_get_security(16454);
- lo_get_security
- --------------------------------------
- unconfined_u:object_r:sepgsql_blob_t
- (1 row)
- bool lo_set_security(oid loid, text context)
- 此函数允许将新的安全属性设置为给定的大型对象。它返回true,如果成功。
- 示例
- postgres=# SELECT lo_set_security(16454, 'unconfined_u:object_r:sepgsql_ro_blob_t');
- lo_set_security
- -----------------
- t
- (1 row)
- postgres=# SELECT lo_get_security(16454);
- lo_get_security
- -----------------------------------------
- unconfined_u:object_r:sepgsql_ro_blob_t
- (1 row)
- text sepgsql_getcon()
- 此函数返回客户端的当前安全策略。
- 它通过带标签的网络设施传递,SE-PostgreSQL 会在做出访问控制决策时将其应用为客户端的权限。换句话说,我们可以将当前权限视为该函数的结果。
- 示例
- postgres=# SELECT sepgsql_getcon();
- sepgsql_getcon
- -------------------------------------------------------------
- unconfined_u:unconfined_r:unconfined_t:SystemLow-SystemHigh
- (1 row)
- text sepgsql_server_getcon()
- 此函数返回服务器进程的当前安全策略。
- 示例
- postgres=# select sepgsql_server_getcon();
- sepgsql_server_getcon
- -----------------------------------
- system_u:system_r:postgresql_t:s0
- (1 row)
- text sepgsql_get_user(text context)
- 此函数返回给定安全上下文的用户字段。
- 示例
- postgres=# SELECT sepgsql_get_user(security_context), * FROM drink;
- sepgsql_get_user | id | name | price
- ------------------+----+-------+-------
- unconfined_u | 1 | water | 100
- unconfined_u | 2 | coke | 120
- unconfined_u | 3 | juice | 130
- unconfined_u | 4 | cofee | 180
- (4 行)
- text sepgsql_set_user(text context, text new_user)
- 此函数返回一个修改后的安全上下文,其用户字段被给定new_user替换。它可以用作重新标记的新值。
- 示例
- postgres=# UPDATE drink SET security_context =
- sepgsql_set_user(security_context, 'system_u') WHERE id in (3,4);
- UPDATE 2
- postgres=# SELECT security_context, * FROM drink ORDER BY id;
- security_context | id | name | price
- --------------------------------------------------+----+-------+-------
- unconfined_u:object_r:sepgsql_table_t | 1 | water | 100
- unconfined_u:object_r:sepgsql_table_t:Classified | 2 | coke | 120
- system_u:object_r:sepgsql_table_t:Classified | 3 | juice | 130
- system_u:object_r:sepgsql_table_t | 4 | cofee | 180
- (4 行)
- text sepgsql_get_role(text context)
- 此函数返回给定安全上下文的角色字段。
- 示例
- postgres=# SELECT sepgsql_get_role(security_context), * FROM drink;
- sepgsql_get_role | id | name | price
- ------------------+----+-------+-------
- object_r | 1 | water | 100
- object_r | 2 | coke | 120
- object_r | 3 | juice | 130
- object_r | 4 | cofee | 180
- (4 行)
- text sepgsql_set_role(text context, text new_role)
- 此函数返回一个修改后的安全上下文,其角色字段被给定new_role替换。它可以用作重新标记的新值。
- 示例
- postgres=# UPDATE drink SET security_context =
- sepgsql_set_role(security_context, 'system_r') WHERE id in (1,4);
- ERROR: unconfined_u:system_r:sepgsql_ro_table_t:s0: 无效的安全属性
- 请注意,默认安全策略不允许更改任何对象内安全上下文的role字段,因此上面的示例会出错,但此函数会正确生成安全上下文字符串。
- text sepgsql_get_type(text context)
- 此函数返回给定安全上下文的类型/域字段。
- 示例
- postgres=# SELECT sepgsql_get_type(security_context), * FROM drink;
- sepgsql_get_type | id | name | price
- ------------------+----+-------+-------
- sepgsql_table_t | 1 | water | 100
- sepgsql_table_t | 2 | coke | 120
- sepgsql_table_t | 3 | juice | 130
- sepgsql_table_t | 4 | cofee | 180
- (4 行)
- text sepgsql_set_type(text context, text new_type)
- 此函数返回一个修改后的安全上下文,其类型/域字段被给定new_type替换。它可以用作重新标记的新值。
- 示例
- postgres=# UPDATE drink SET security_context =
- sepgsql_set_type(security_context, 'sepgsql_ro_table_t') WHERE id in (1,4);
- UPDATE 2
- postgres=# SELECT security_context, * FROM drink ORDER BY id;
- security_context | id | name | price
- --------------------------------------------------+----+-------+-------
- unconfined_u:object_r:sepgsql_ro_table_t | 1 | water | 100
- unconfined_u:object_r:sepgsql_table_t:Classified | 2 | coke | 120
- unconfined_u:object_r:sepgsql_table_t:Classified | 3 | juice | 130
- unconfined_u:object_r:sepgsql_ro_table_t | 4 | cofee | 180
- (4 行)
- text sepgsql_get_range(text context)
- 此函数返回给定安全上下文的范围字段。
- 示例
- postgres=# SELECT sepgsql_get_range(security_context), * FROM drink ORDER BY id;
- sepgsql_get_range | id | name | price
- -------------------+----+-------+-------
- s0 | 1 | water | 100
- s0:c0 | 2 | coke | 120
- s0:c0 | 3 | juice | 130
- s0 | 4 | cofee | 180
- (4 行)
- text sepgsql_set_range(text context, text new_range)
- 此函数返回一个修改后的安全上下文,其范围字段被给定new_range替换。它可以用作重新标记的新值。
- 示例
- postgres=# UPDATE drink SET security_context =
- sepgsql_set_range(security_context, 'Classified') WHERE id in (2,3);
- UPDATE 2
- postgres=# SELECT security_context, * FROM drink ORDER BY id;
- security_context | id | name | price
- --------------------------------------------------+----+-------+-------
- unconfined_u:object_r:sepgsql_table_t | 1 | water | 100
- unconfined_u:object_r:sepgsql_table_t:Classified | 2 | coke | 120
- unconfined_u:object_r:sepgsql_table_t:Classified | 3 | juice | 130
- unconfined_u:object_r:sepgsql_table_t | 4 | cofee | 180
- (4 行)