SEPostgreSQL 参考资料

来自 PostgreSQL Wiki
跳转到导航跳转到搜索

SepgsqlLogo.png

本章介绍了与 SE-PostgreSQL 相关的参考资料。

  • 章节列表
  1. 介绍
  2. 架构
  3. 规范
  4. SELinux 概述
  5. 管理
  6. 参考
  7. 开发

对象类和访问向量

概述

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

通用数据库类

一些访问向量对数据库对象是通用的,因此它们通常包含在这些对象类中。 我们将在本节中介绍它们(createdropgetattrsetattrrelabelfromrelabelto)。

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_tunpriv_sepgsql_table_t.
select
当需要通过以下方式引用表时需要它:SELECTCOPY TO语句以及其他包含任何引用的语句,例如RETURNING子句。
请注意,我们可以将引用视为WHERE, ORDER BY和其他子句也需要db_table:{select}权限,尽管它不会直接返回内容。
update
当需要通过以下方式更新表时需要它:UPDATE语句。
insert
当需要通过以下方式插入表时需要它:INSERTCOPY FROM语句。
delete
当需要通过以下方式删除表时需要它:DELETETRUNCATE语句。
lock
当需要通过以下方式显式锁定表时需要它:LOCK语句或SELECT ... FOR UPDATE/SHARE语句。
请注意,它不需要在隐式表锁上使用。

db_procedure 类

db_procedure 类表示 SQL 函数,并继承了通用的数据库对象类,因此它具有常见的六个访问向量。

默认安全上下文
它继承了模式的安全性上下文,该模式是在其中部署 SQL 函数的模式。
默认策略对TYPE_TRANSITION类有一些db_procedure规则,因此新表将被标记为sepgsql_proc_exec_t, user_sepgsql_proc_exec_tunpriv_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
当需要引用通过以下方式引用的列时需要它:SELECTCOPY TO语句以及其他包含任何引用的语句,例如RETURNING子句。
update
当需要在以下列出的列上使用时需要它:UPDATE语句。
insert
当需要在以下列出的列上使用时需要它:INSERTCOPY 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_tunpriv_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_thttpd_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 行)