============== SECURITY LABEL ============== .. container:: refentry :name: SQL-SECURITY-LABEL .. container:: titlepage .. container:: refnamediv .. rubric:: SECURITY LABEL :name: security-label SECURITY LABEL — 定义或更改应用到一个对象的安全标签 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis SECURITY LABEL [ FOR provider ] ON { TABLE object_name | COLUMN table_name.column_name | AGGREGATE aggregate_name ( aggregate_signature ) | DATABASE object_name | DOMAIN object_name | EVENT TRIGGER object_name | FOREIGN TABLE object_name FUNCTION function_name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] | LARGE OBJECT large_object_oid | MATERIALIZED VIEW object_name | [ PROCEDURAL ] LANGUAGE object_name | PROCEDURE procedure_name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] | PUBLICATION object_name | ROLE object_name | ROUTINE routine_name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] | SCHEMA object_name | SEQUENCE object_name | SUBSCRIPTION object_name | TABLESPACE object_name | TYPE object_name | VIEW object_name } IS 'label' 其中 aggregate_signature 是: * | [ argmode ] [ argname ] argtype [ , ... ] | [ [ argmode ] [ argname ] argtype [ , ... ] ] ORDER BY [ argmode ] [ argname ] argtype [ , ... ] .. container:: refsect1 :name: id-1.9.3.170.5 .. rubric:: 描述 :name: 描述 ``SECURITY LABEL``\ 对一个数据库对象应用一个安全 标签。可以把任意数量的安全标签(每个标签提供者对应一个)关联到一个给定 的数据库对象。标签提供者是使用函数\ ``register_label_provider`` 注册自己的可装载模块。 .. note:: .. rubric:: 注意 :name: 注意 :class: title ``register_label_provider``\ 不是一个 SQL 函数,它只能在被载入 到后端的 C 代码中调用。 标签提供者决定一个给定标签是否合法并且它是否可以被分配该标签给一个给定 对象。一个给定标签的含义也同样由标签提供者判断。 PostgreSQL没有对一个标签提供者是否必须或者如何解释 安全标签做出限定,它仅仅只是提供了一种机制来存储它们。实际上,这个功能是 为了允许与基于标签的强制访问控制(MAC)系统集成(例如 SELinux)。这类系统会基于对象标签而不是传统的自主 访问控制(DAC)概念(例如用户和组)做出所有访问控制决定。 .. container:: refsect1 :name: id-1.9.3.170.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``object_name``* \ *``table_name.column_name``* \ *``aggregate_name``* \ *``function_name``* \ *``procedure_name``* \ *``routine_name``* 要被贴上标签的对象的名称。表、聚集、域、外部表、函数、存储过程、例程、序列、类型和视图 的名称可以是模式限定的。 *``provider``* 这个标签相关联的提供者的名称。所提到的提供者必须已被载入并且必须赞同所提出 的标签操作。如果正好只载入了一个提供者,可以出于简洁的需要忽略提供者的名称。 *``argmode``* 一个函数,存储过程或者聚集函数参数的模式:\ ``IN``\ 、\ ``OUT``\ 、 ``INOUT``\ 或者\ ``VARIADIC``\ 。如果被忽略,默认值会是 ``IN``\ 。注意\ ``SECURITY LABEL``\ 并不真正 关心\ ``OUT``\ 参数,因为判断函数的身份时只需要输入参数。因此列出 ``IN``\ 、\ ``INOUT``\ 和\ ``VARIADIC``\ 参数足矣。 *``argname``* 一个函数,存储过程或者聚集函数参数的名称。注意\ ``SECURITY LABEL`` 并不真正关心参数的名称,因为判断函数的身份时只需要参数的数据类型。 *``argtype``* 一个函数,存储过程或聚集函数参数的数据类型。 *``large_object_oid``* 大对象的 OID。 ``PROCEDURAL`` 这是一个噪声词。 *``label``* 写成一个字符串文本的新安全标签。如果写成\ ``NULL``\ 表示删除 原有的安全标签。 .. container:: refsect1 :name: id-1.9.3.170.7 .. rubric:: 示例 :name: 示例 下面的例子展示了如何更改一个表的安全标签。 .. code:: programlisting SECURITY LABEL FOR selinux ON TABLE mytable IS 'system_u:object_r:sepgsql_table_t:s0'; .. container:: refsect1 :name: id-1.9.3.170.8 .. rubric:: 兼容性 :name: 兼容性 在 SQL 标准中没有\ ``SECURITY LABEL``\ 命令。 .. container:: refsect1 :name: id-1.9.3.170.9 .. rubric:: 另见 :name: 另见 `sepgsql `__, ``src/test/modules/dummy_seclabel``