mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Add a SECURITY LABEL command.
This is intended as infrastructure to support integration with label-based mandatory access control systems such as SE-Linux. Further changes (mostly hooks) will be needed, but this is a big chunk of it. KaiGai Kohei and Robert Haas
This commit is contained in:
@ -208,6 +208,11 @@
|
||||
<entry>query rewrite rules</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><link linkend="catalog-pg-seclabel"><structname>pg_seclabel</structname></link></entry>
|
||||
<entry>security labels on database objects</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><link linkend="catalog-pg-shdepend"><structname>pg_shdepend</structname></link></entry>
|
||||
<entry>dependencies on shared objects</entry>
|
||||
@ -4229,6 +4234,77 @@
|
||||
</sect1>
|
||||
|
||||
|
||||
<sect1 id="catalog-pg-seclabel">
|
||||
<title><structname>pg_seclabel</structname></title>
|
||||
|
||||
<indexterm zone="catalog-pg-seclabel">
|
||||
<primary>pg_seclabel</primary>
|
||||
</indexterm>
|
||||
|
||||
<para>
|
||||
The catalog <structname>pg_seclabel</structname> stores security
|
||||
labels on database objects. See the
|
||||
<xref linkend="sql-security-label"> statement.
|
||||
</para>
|
||||
|
||||
<table>
|
||||
<title><structname>pg_seclabel</structname> Columns</title>
|
||||
|
||||
<tgroup cols="4">
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name</entry>
|
||||
<entry>Type</entry>
|
||||
<entry>References</entry>
|
||||
<entry>Description</entry>
|
||||
</row>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><structfield>objoid</structfield></entry>
|
||||
<entry><type>oid</type></entry>
|
||||
<entry>any OID column</entry>
|
||||
<entry>The OID of the object this security label pertains to</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structfield>classoid</structfield></entry>
|
||||
<entry><type>oid</type></entry>
|
||||
<entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.oid</literal></entry>
|
||||
<entry>The OID of the system catalog this object appears in</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structfield>objsubid</structfield></entry>
|
||||
<entry><type>int4</type></entry>
|
||||
<entry></entry>
|
||||
<entry>
|
||||
For a security label on a table column, this is the column number (the
|
||||
<structfield>objoid</> and <structfield>classoid</> refer to
|
||||
the table itself). For all other object types, this column is
|
||||
zero.
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structfield>provider</structfield></entry>
|
||||
<entry><type>text</type></entry>
|
||||
<entry></entry>
|
||||
<entry>The label provider associated with this label.</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structfield>label</structfield></entry>
|
||||
<entry><type>text</type></entry>
|
||||
<entry></entry>
|
||||
<entry>The security label applied to this object.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="catalog-pg-shdepend">
|
||||
<title><structname>pg_shdepend</structname></title>
|
||||
|
||||
@ -5883,6 +5959,11 @@
|
||||
<entry>rules</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><link linkend="view-pg-seclabels"><structname>pg_seclabels</structname></link></entry>
|
||||
<entry>security labels</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><link linkend="view-pg-settings"><structname>pg_settings</structname></link></entry>
|
||||
<entry>parameter settings</entry>
|
||||
@ -6791,6 +6872,97 @@
|
||||
|
||||
</sect1>
|
||||
|
||||
<sect1 id="view-pg-seclabels">
|
||||
<title><structname>pg_seclabels</structname></title>
|
||||
|
||||
<indexterm zone="view-pg-seclabels">
|
||||
<primary>pg_seclabels</primary>
|
||||
</indexterm>
|
||||
|
||||
<para>
|
||||
The view <structname>pg_seclabels</structname> provides information about
|
||||
security labels. It as an easier-to-query version of the
|
||||
<link linkend="catalog-pg-seclabel"><structname>pg_seclabel</></> catalog.
|
||||
</para>
|
||||
|
||||
<table>
|
||||
<title><structname>pg_seclabels</> Columns</title>
|
||||
|
||||
<tgroup cols="4">
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Name</entry>
|
||||
<entry>Type</entry>
|
||||
<entry>References</entry>
|
||||
<entry>Description</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><structfield>objoid</structfield></entry>
|
||||
<entry><type>oid</type></entry>
|
||||
<entry>any OID column</entry>
|
||||
<entry>The OID of the object this security label pertains to</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><structfield>classoid</structfield></entry>
|
||||
<entry><type>oid</type></entry>
|
||||
<entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.oid</literal></entry>
|
||||
<entry>The OID of the system catalog this object appears in</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><structfield>objsubid</structfield></entry>
|
||||
<entry><type>int4</type></entry>
|
||||
<entry></entry>
|
||||
<entry>
|
||||
For a security label on a table column, this is the column number (the
|
||||
<structfield>objoid</> and <structfield>classoid</> refer to
|
||||
the table itself). For all other object types, this column is
|
||||
zero.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><structfield>objtype</structfield></entry>
|
||||
<entry><type>text</type></entry>
|
||||
<entry></entry>
|
||||
<entry>
|
||||
The type of object to which this label applies, as text.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><structfield>objnamespace</structfield></entry>
|
||||
<entry><type>oid</type></entry>
|
||||
<entry><literal><link linkend="catalog-pg-namespace"><structname>pg_namespace</structname></link>.oid</literal></entry>
|
||||
<entry>
|
||||
The OID of the namespace for this object, if applicable;
|
||||
otherwise NULL.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><structfield>objname</structfield></entry>
|
||||
<entry><type>text</type></entry>
|
||||
<entry></entry>
|
||||
<entry>
|
||||
The name of the object to which this label applies, as text.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><structfield>provider</structfield></entry>
|
||||
<entry><type>text</type></entry>
|
||||
<entry><literal><link linkend="catalog-pg-seclabel"><structname>pg_seclabel</structname></link>.provider</literal></entry>
|
||||
<entry>The label provider associated with this label.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><structfield>label</structfield></entry>
|
||||
<entry><type>text</type></entry>
|
||||
<entry><literal><link linkend="catalog-pg-seclabel"><structname>pg_seclabel</structname></link>.label</literal></entry>
|
||||
<entry>The security label applied to this object.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="view-pg-settings">
|
||||
<title><structname>pg_settings</structname></title>
|
||||
|
||||
|
@ -132,6 +132,7 @@ Complete list of usable sgml source files in this directory.
|
||||
<!entity rollbackPrepared system "rollback_prepared.sgml">
|
||||
<!entity rollbackTo system "rollback_to.sgml">
|
||||
<!entity savepoint system "savepoint.sgml">
|
||||
<!entity securityLabel system "security_label.sgml">
|
||||
<!entity select system "select.sgml">
|
||||
<!entity selectInto system "select_into.sgml">
|
||||
<!entity set system "set.sgml">
|
||||
|
@ -778,6 +778,16 @@ PostgreSQL documentation
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--security-label</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
With this option, it also outputs security labels of database
|
||||
objects to be dumped, if labeled.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
@ -493,6 +493,15 @@ PostgreSQL documentation
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--security-label</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
With this option, it also outputs security labels of database
|
||||
objects to be dumped, if labeled.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
@ -328,6 +328,16 @@
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--no-security-label</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Do not output commands to restore security labels,
|
||||
even if the archive contains them.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-P <replaceable class="parameter">function-name(argtype [, ...])</replaceable></option></term>
|
||||
<term><option>--function=<replaceable class="parameter">function-name(argtype [, ...])</replaceable></option></term>
|
||||
|
194
doc/src/sgml/ref/security_label.sgml
Normal file
194
doc/src/sgml/ref/security_label.sgml
Normal file
@ -0,0 +1,194 @@
|
||||
<!--
|
||||
$PostgreSQL$
|
||||
PostgreSQL documentation
|
||||
-->
|
||||
|
||||
<refentry id="SQL-SECURITY-LABEL">
|
||||
<refmeta>
|
||||
<refentrytitle>SECURITY LABEL</refentrytitle>
|
||||
<manvolnum>7</manvolnum>
|
||||
<refmiscinfo>SQL - Language Statements</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>SECURITY LABEL</refname>
|
||||
<refpurpose>define or change a security label applied to an object</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<indexterm zone="sql-security-label">
|
||||
<primary>SECURITY LABEL</primary>
|
||||
</indexterm>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
SECURITY LABEL [ FOR <replaceable class="PARAMETER">provider</replaceable> ] ON
|
||||
{
|
||||
TABLE <replaceable class="PARAMETER">object_name</replaceable> |
|
||||
COLUMN <replaceable class="PARAMETER">table_name</replaceable>.<replaceable class="PARAMETER">column_name</replaceable> |
|
||||
AGGREGATE <replaceable class="PARAMETER">agg_name</replaceable> (<replaceable class="PARAMETER">agg_type</replaceable> [, ...] ) |
|
||||
DOMAIN <replaceable class="PARAMETER">object_name</replaceable> |
|
||||
FUNCTION <replaceable class="PARAMETER">function_name</replaceable> ( [ [ <replaceable class="parameter">argmode</replaceable> ] [ <replaceable class="parameter">argname</replaceable> ] <replaceable class="parameter">argtype</replaceable> [, ...] ] ) |
|
||||
LARGE OBJECT <replaceable class="PARAMETER">large_object_oid</replaceable> |
|
||||
[ PROCEDURAL ] LANGUAGE <replaceable class="PARAMETER">object_name</replaceable> |
|
||||
SCHEMA <replaceable class="PARAMETER">object_name</replaceable> |
|
||||
SEQUENCE <replaceable class="PARAMETER">object_name</replaceable> |
|
||||
TYPE <replaceable class="PARAMETER">object_name</replaceable> |
|
||||
VIEW <replaceable class="PARAMETER">object_name</replaceable>
|
||||
} IS '<replaceable class="PARAMETER">label</replaceable>'
|
||||
</synopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>
|
||||
<command>SECURITY LABEL</command> applies a security label to a database
|
||||
object. An arbitrary number of security labels, one per label provider, can
|
||||
be associated with a given database object. Label providers are loadable
|
||||
modules which register themselves by using the function
|
||||
<function>register_label_provider</>.
|
||||
</para>
|
||||
|
||||
<note>
|
||||
<para>
|
||||
<function>register_label_provider</> is not an SQL function; it can
|
||||
only be called from C code loaded into the backend.
|
||||
</para>
|
||||
</note>
|
||||
|
||||
<para>
|
||||
The label provider determines whether a given a label is valid and whether
|
||||
it is permissible to assign that label to a given object. The meaning of a
|
||||
given label is likewise at the discretion of the label provider.
|
||||
<productname>PostgreSQL</> places no restrictions on whether or how a
|
||||
label provider must interpret security labels; it merely provides a
|
||||
mechanism for storing them. In practice, this facility is intended to allow
|
||||
integration with label-based mandatory access control (MAC) systems such as
|
||||
<productname>SE-Linux</>. Such systems make all access control decisions
|
||||
based on object labels, rather than traditional discretionary access control
|
||||
(DAC) concepts such as users and groups.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Parameters</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">object_name</replaceable></term>
|
||||
<term><replaceable class="parameter">table_name.column_name</replaceable></term>
|
||||
<term><replaceable class="parameter">agg_name</replaceable></term>
|
||||
<term><replaceable class="parameter">function_name</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The name of the object to be commented. Names of tables,
|
||||
aggregates, domains, functions, sequences, types, and views can
|
||||
be schema-qualified.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">provider</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The name of the provider with which this label is to be associated. The
|
||||
named provider must be loaded and must consent to the proposed labeling
|
||||
operation. If exactly one provider is loaded, the provider name may be
|
||||
omitted for brevity.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">argmode</replaceable></term>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
The mode of a function argument: <literal>IN</>, <literal>OUT</>,
|
||||
<literal>INOUT</>, or <literal>VARIADIC</>.
|
||||
If omitted, the default is <literal>IN</>.
|
||||
Note that <command>COMMENT ON FUNCTION</command> does not actually pay
|
||||
any attention to <literal>OUT</> arguments, since only the input
|
||||
arguments are needed to determine the function's identity.
|
||||
So it is sufficient to list the <literal>IN</>, <literal>INOUT</>,
|
||||
and <literal>VARIADIC</> arguments.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">argname</replaceable></term>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
The name of a function argument.
|
||||
Note that <command>COMMENT ON FUNCTION</command> does not actually pay
|
||||
any attention to argument names, since only the argument data
|
||||
types are needed to determine the function's identity.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">argtype</replaceable></term>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
The data type(s) of the function's arguments (optionally
|
||||
schema-qualified), if any.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">large_object_oid</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The OID of the large object.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>PROCEDURAL</literal></term>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
This is a noise word.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">label</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The new security label, written as a string literal; or <literal>NULL</>
|
||||
to drop the security label.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>
|
||||
The following example shows how the security label of a table might
|
||||
be changed.
|
||||
|
||||
<programlisting>
|
||||
SECURITY LABEL FOR selinux ON TABLE mytable IS 'system_u:object_r:sepgsql_table_t:s0';
|
||||
</programlisting>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Compatibility</title>
|
||||
<para>
|
||||
There is no <command>SECURITY LABEL</command> command in the SQL standard.
|
||||
</para>
|
||||
</refsect1>
|
||||
</refentry>
|
@ -160,6 +160,7 @@
|
||||
&rollbackPrepared;
|
||||
&rollbackTo;
|
||||
&savepoint;
|
||||
&securityLabel;
|
||||
&select;
|
||||
&selectInto;
|
||||
&set;
|
||||
|
Reference in New Issue
Block a user