1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-17 17:02:08 +03:00

Allow group access on PGDATA

Allow the cluster to be optionally init'd with read access for the
group.

This means a relatively non-privileged user can perform a backup of the
cluster without requiring write privileges, which enhances security.

The mode of PGDATA is used to determine whether group permissions are
enabled for directory and file creates.  This method was chosen as it's
simple and works well for the various utilities that write into PGDATA.

Changing the mode of PGDATA manually will not automatically change the
mode of all the files contained therein.  If the user would like to
enable group access on an existing cluster then changing the mode of all
the existing files will be required.  Note that pg_upgrade will
automatically change the mode of all migrated files if the new cluster
is init'd with the -g option.

Tests are included for the backend and all the utilities which operate
on the PG data directory to ensure that the correct mode is set based on
the data directory permissions.

Author: David Steele <david@pgmasters.net>
Reviewed-By: Michael Paquier, with discussion amongst many others.
Discussion: https://postgr.es/m/ad346fe6-b23e-59f1-ecb7-0e08390ad629%40pgmasters.net
This commit is contained in:
Stephen Frost
2018-04-07 17:45:39 -04:00
parent da9b580d89
commit c37b3d08ca
32 changed files with 661 additions and 127 deletions

View File

@ -8144,6 +8144,23 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
</listitem>
</varlistentry>
<varlistentry id="guc-data-directory-mode" xreflabel="data_directory_mode">
<term><varname>data_directory_mode</varname> (<type>integer</type>)
<indexterm>
<primary><varname>data_directory_mode</varname> configuration parameter</primary>
</indexterm>
</term>
<listitem>
<para>
On Unix systems this parameter reports the permissions of the data
directory defined by (<xref linkend="guc-data-directory"/>) at startup.
(On Microsoft Windows this parameter will always display
<literal>0700</literal>). See
<xref linkend="app-initdb-allow-group-access"/> for more information.
</para>
</listitem>
</varlistentry>
<varlistentry id="guc-debug-assertions" xreflabel="debug_assertions">
<term><varname>debug_assertions</varname> (<type>boolean</type>)
<indexterm>

View File

@ -76,6 +76,14 @@ PostgreSQL documentation
to do so.)
</para>
<para>
For security reasons the new cluster created by <command>initdb</command>
will only be accessible by the cluster owner by default. The
<option>--allow-group-access</option> option allows any user in the same
group as the cluster owner to read files in the cluster. This is useful
for performing backups as a non-privileged user.
</para>
<para>
<command>initdb</command> initializes the database cluster's default
locale and character set encoding. The character set encoding,
@ -188,6 +196,17 @@ PostgreSQL documentation
</listitem>
</varlistentry>
<varlistentry id="app-initdb-allow-group-access" xreflabel="group access">
<term><option>-g</option></term>
<term><option>--allow-group-access</option></term>
<listitem>
<para>
Allows users in the same group as the cluster owner to read all cluster
files created by <command>initdb</command>.
</para>
</listitem>
</varlistentry>
<varlistentry id="app-initdb-data-checksums" xreflabel="data checksums">
<term><option>-k</option></term>
<term><option>--data-checksums</option></term>

View File

@ -737,6 +737,12 @@ PostgreSQL documentation
or later.
</para>
<para>
<application>pg_basebackup</application> will preserve group permissions in
both the <literal>plain</literal> and <literal>tar</literal> formats if group
permissions are enabled on the source cluster.
</para>
</refsect1>
<refsect1>

View File

@ -425,6 +425,12 @@ PostgreSQL documentation
not keep up with fetching the WAL data.
</para>
<para>
<application>pg_receivewal</application> will preserve group permissions on
the received WAL files if group permissions are enabled on the source
cluster.
</para>
</refsect1>
<refsect1>

View File

@ -399,6 +399,17 @@ PostgreSQL documentation
</para>
</refsect1>
<refsect1>
<title>Notes</title>
<para>
<application>pg_recvlogical</application> will preserve group permissions on
the received WAL files if group permissions are enabled on the source
cluster.
</para>
</refsect1>
<refsect1>
<title>Examples</title>

View File

@ -137,7 +137,22 @@ postgres$ <userinput>initdb -D /usr/local/pgsql/data</userinput>
database, it is essential that it be secured from unauthorized
access. <command>initdb</command> therefore revokes access
permissions from everyone but the
<productname>PostgreSQL</productname> user.
<productname>PostgreSQL</productname> user, and optionally, group.
Group access, when enabled, is read-only. This allows an unprivileged
user in the same group as the cluster owner to take a backup of the
cluster data or perform other operations that only require read access.
</para>
<para>
Note that enabling or disabling group access on an existing cluster requires
the cluster to be shut down and the appropriate mode to be set on all
directories and files before restarting
<productname>PostgreSQL</productname>. Otherwise, a mix of modes might
exist in the data directory. For clusters that allow access only by the
owner, the appropriate modes are <literal>0700</literal> for directories
and <literal>0600</literal> for files. For clusters that also allow
reads by the group, the appropriate modes are <literal>0750</literal>
for directories and <literal>0640</literal> for files.
</para>
<para>
@ -2194,6 +2209,15 @@ pg_dumpall -p 5432 | psql -d postgres -p 5433
member of the group that has access to those certificate and key files.
</para>
<para>
If the data directory allows group read access then certificate files may
need to be located outside of the data directory in order to conform to the
security requirements outlined above. Generally, group access is enabled
to allow an unprivileged user to backup the database, and in that case the
backup software will not be able to read the certificate files and will
likely error.
</para>
<para>
If the private key is protected with a passphrase, the
server will prompt for the passphrase and will not start until it has