mirror of https://github.com/postgres/postgres
reference page to new configuration system. Big update to administrator's guide, chapters Runtime environment, Client authentication, and User management, the latter two were part of the old Security chapter.REL7_1_STABLE
parent
b4e906f191
commit
2c0edb3c86
@ -0,0 +1,502 @@ |
||||
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/client-auth.sgml,v 1.1 2000/06/18 21:24:51 petere Exp $ --> |
||||
|
||||
<chapter id="client-authentication"> |
||||
<title>Client Authentication</title> |
||||
|
||||
<para> |
||||
User names from the operating system and from a |
||||
<productname>Postgres</productname> database installation are |
||||
logically separate. When a client application connects, it specifies |
||||
which database user name it wants to connect as, similar to how one |
||||
logs into a Unix computer. Within the SQL environment the active |
||||
database user name determines various access privileges to database |
||||
objects -- see <xref linkend="user-manag"> for more information |
||||
about that. It is therefore obviously essential to restrict what |
||||
database user name a given client can connect as. |
||||
</para> |
||||
|
||||
<para> |
||||
<firstterm>Authentication</firstterm> is the process by which the |
||||
database server establishes the identity of the client, and by |
||||
extension determines whether the client application (or the user |
||||
which runs the client application) is permitted to connect with the |
||||
user name that was requested. |
||||
</para> |
||||
|
||||
<para> |
||||
<productname>Postgres</productname> offers client authentication by |
||||
(client) host and by database, with a number of different |
||||
authentication methods available. |
||||
</para> |
||||
|
||||
<sect1 id="pg-hba.conf"> |
||||
<title>The <filename>pg_hba.conf</filename> file</title> |
||||
|
||||
<para> |
||||
Client authentication is controlled by the file |
||||
<filename>pg_hba.conf</filename> in the data directory, e.g., |
||||
<filename>/usr/local/pgsql/data/pg_hba.conf</filename>. (HBA = |
||||
host-based authentication) A default file is installed when the |
||||
data area is initialized by <application>initdb</application>. |
||||
</para> |
||||
|
||||
<para> |
||||
The general format of the <filename>pg_hba.conf</filename> file is |
||||
of a set of records, one per line. Blank lines and lines beginning |
||||
with a hash character (<quote>#</quote>) are ignored. A record is |
||||
made up of a number of fields which are separated by spaces and/or |
||||
tabs. |
||||
</para> |
||||
|
||||
<para> |
||||
A record may have one of the two formats |
||||
<synopsis> |
||||
local <replaceable>database</replaceable> <replaceable>authentication-method</replaceable> [ <replaceable>authentication-option</replaceable> ] |
||||
host <replaceable>database</replaceable> <replaceable>IP-address</replaceable> <replaceable>IP-mask</replaceable> <replaceable>authentication-method</replaceable> [ <replaceable>authentication-option</replaceable> ] |
||||
</synopsis> |
||||
The meaning of the fields is as follows: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><literal>local</literal></term> |
||||
<listitem> |
||||
<para> |
||||
This record pertains to connection attempts over Unix domain |
||||
sockets. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><literal>host</literal></term> |
||||
<listitem> |
||||
<para> |
||||
This record pertains to connection attempts over TCP/IP |
||||
networks. Note that TCP/IP connections are completely disabled |
||||
unless the server is started with the <option>-i</option> or |
||||
the equivalent configuration parameter is set. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><replaceable>database</replaceable></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the database that this record applies to. The value |
||||
<literal>all</literal> specifies that it applies to all |
||||
databases. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><replaceable>IP address</replaceable></term> |
||||
<term><replaceable>IP mask</replaceable></term> |
||||
<listitem> |
||||
<para> |
||||
These two fields control to which hosts a |
||||
<literal>host</literal> record applies, based on their IP |
||||
address. (Of course IP addresses can be spoofed but this |
||||
consideration is beyond the scope of |
||||
<productname>Postgres</productname>.) The precise logic is that |
||||
<blockquote> |
||||
<informalfigure> |
||||
<programlisting>(<replaceable>actual-IP-address</replaceable> xor <replaceable>IP-address-field</replaceable>) and <replaceable>IP-mask-field</replaceable></programlisting> |
||||
</informalfigure> |
||||
</blockquote> |
||||
must be zero for the record to match. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><replaceable>authentication method</replaceable></term> |
||||
<listitem> |
||||
<para> |
||||
Specifies the method a user must use to authenticate themselves |
||||
when connecting to that database. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term><replaceable>authentication option</replaceable></term> |
||||
<listitem> |
||||
<para> |
||||
This field is interpreted differently depending on the |
||||
authentication method. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
|
||||
The first record that matches a connection attempt is used. Note |
||||
that there is no <quote>fall-through</quote> or |
||||
<quote>backup</quote>, that is, if one record is chosen and the |
||||
authentication fails, the following records are not considered. If |
||||
no record matches, the access will be denied. |
||||
</para> |
||||
|
||||
<para> |
||||
The <filename>pg_hba.conf</filename> file is re-read before each |
||||
connection attempt. It is therefore easily possible to modify |
||||
access permissions while the server is running. |
||||
</para> |
||||
|
||||
<para> |
||||
An example of a <filename>pg_hba.conf</filename> file is shown in |
||||
<xref linkend="example-pg-hba.conf">. See below for details on the |
||||
different authentication methods. |
||||
|
||||
<example id="example-pg-hba.conf"> |
||||
<title>An example <filename>pg_hba.conf</filename> file</title> |
||||
<programlisting> |
||||
# Trust any connection via Unix domain sockets. |
||||
local trust |
||||
# Trust any connection via TCP/IP from this machine. |
||||
host all 127.0.0.1 255.255.255.255 trust |
||||
# We don't like this machine. |
||||
host all 192.168.0.10 255.255.255.0 reject |
||||
# This machine can't encrypt so we ask for passwords in clear. |
||||
host all 192.168.0.3 255.255.255.0 password |
||||
# The rest of this group of machines should provide encrypted passwords. |
||||
host all 192.168.0.0 255.255.255.0 crypt |
||||
# Authenticate these networks using ident |
||||
host all 192.168.1.0 255.255.255.0 ident usermap |
||||
host all 192.168.2.0 255.255.255.0 ident othermap |
||||
</programlisting> |
||||
</example> |
||||
</para> |
||||
</sect1> |
||||
|
||||
<sect1 id="auth-methods"> |
||||
<title>Authentication methods</title> |
||||
<para> |
||||
The following authentication methods are supported. They are |
||||
descibed in detail below. |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term>trust</term> |
||||
<listitem> |
||||
<para> |
||||
The connection is allowed unconditionally. This method allows |
||||
any user that has login access to the client host to connect as |
||||
any user whatsoever. Use with care. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>reject</term> |
||||
<listitem> |
||||
<para> |
||||
The connection is rejected unconditionally. This is mostly |
||||
useful to <quote>filter out</quote> certain hosts from a group. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>password</term> |
||||
<listitem> |
||||
<para> |
||||
The client is required to supply a password for the connection |
||||
attempt which is required to match the password that was set up |
||||
for the user. (These passwords are separate from any operating |
||||
sytem password.) |
||||
</para> |
||||
<para> |
||||
An optional password file may be specified after the |
||||
<literal>password</literal> keyword to obtain the password from |
||||
that file rather than the pg_shadow system catalog. |
||||
</para> |
||||
<para> |
||||
The password is sent over the wire in clear text. For better |
||||
protection, use the <literal>crypt</literal> method. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>crypt</term> |
||||
<listitem> |
||||
<para> |
||||
Like the <literal>password</literal> method, but the password |
||||
is sent over the wire encrypted using a simple |
||||
challenge-response protocol. Note that this is still not |
||||
cryptographically secure but it protects against incidental |
||||
wire-sniffing. Interestingly enough, the |
||||
<literal>crypt</literal> does not support secondary password |
||||
files. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>krb4</term> |
||||
<listitem> |
||||
<para> |
||||
Kerberos V4 is used to authenticate the user. This is only |
||||
available for TCP/IP connections. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>krb5</term> |
||||
<listitem> |
||||
<para> |
||||
Kerberos V5 is used to authenticate the user. This is only |
||||
available for TCP/IP connections. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>ident</term> |
||||
<listitem> |
||||
<para> |
||||
The ident server on the client host is asked for the identity |
||||
of the connecting user. <productname>Postgres</productname> |
||||
then verifies whether the so identified operating system user |
||||
is allowed to connect as the database user that is requested. |
||||
The <replaceable>authentication option</replaceable> following |
||||
the <literal>ident</> keyword specifies the name of an |
||||
<firstterm>ident map</firstterm> that specifies which operating |
||||
system users equate with which database users. See below for |
||||
details. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
</para> |
||||
|
||||
<sect2> |
||||
<title>Password authentication</title> |
||||
<para> |
||||
Ordinarily, the password for each database user is stored in the |
||||
pg_shadow system catalog table. Passwords can be managed with the |
||||
query language commands <command>CREATE USER</command> and |
||||
<command>ALTER USER</command>, e.g., <userinput>CREATE USER foo |
||||
WITH PASSWORD 'secret';</userinput>. By default, that is, if no |
||||
password has explicitly been set up, the stored password is |
||||
<quote>NULL</quote> and password authentication will always fail |
||||
for that user. |
||||
</para> |
||||
|
||||
<para> |
||||
Secondary password files can be used if a given set of passwords |
||||
should only apply to a particular database or set thereof. |
||||
Secondary password files have a format similar to the standard |
||||
Unix password file <filename>/etc/passwd</filename>, that is, |
||||
<synopsis> |
||||
<replaceable>username</replaceable>:<replaceable>password</replaceable> |
||||
</synopsis> |
||||
Any extra colon separated fields following the password are |
||||
ignored. The password is expected to be encrypted using the |
||||
system's <function>crypt()</function> function. The utility |
||||
program <application>pg_passwd</application> that is installed |
||||
with <productname>Postgres</productname> can be used to manage |
||||
these password files. |
||||
</para> |
||||
|
||||
<para> |
||||
Secondary password files can also be used to restrict certain |
||||
users from connecting to certain databases at all. This is |
||||
currently not possible to achieve using the normal password |
||||
mechanism (because users and passwords are global across all |
||||
databases). If a user is not listed in the applicable password |
||||
file the connection will be refused. |
||||
</para> |
||||
|
||||
<para> |
||||
Note that using secondary password files means that one can no |
||||
longer use <command>ALTER USER</command> to change one's password. |
||||
It will still appear to work but the password one is actually |
||||
changing is not the password that the system will end up using. |
||||
</para> |
||||
</sect2> |
||||
|
||||
<sect2> |
||||
<title>Kerberos authentication</title> |
||||
|
||||
<para> |
||||
<productname>Kerberos</productname> is an industry-standard secure |
||||
authentication system suitable for distributed computing over a |
||||
public network. A description of the |
||||
<productname>Kerberos</productname> system is far beyond the scope |
||||
of this document; in all generality it can be quite complex. The |
||||
<ulink url="http://www.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html">Kerberos <acronym>FAQ</></ulink> |
||||
can be a good starting point for exploration. |
||||
</para> |
||||
|
||||
<para> |
||||
In order to use <productname>Kerberos</>, support for it must be |
||||
enable at build time. Both Kerberos 4 and 5 are supported. |
||||
</para> |
||||
|
||||
<para> |
||||
<productname>Postgres</> should operate like a normal Kerberos |
||||
service. The name of the service principal is normally |
||||
<literal>postgres</literal>, unless it was changed during the |
||||
build. Make sure that your server keytab file is readable (and |
||||
preferrably only readable) by the Postgres server account (see |
||||
<xref linkend="postgres-user">). The location of the keytab file |
||||
is specified at build time. By default it is |
||||
<filename>/etc/srvtab</filename> in Kerberos 4 and |
||||
<filename>FILE:/usr/local/postgres/krb5.keytab</filename> in |
||||
Kerberos 5. |
||||
</para> |
||||
<!-- Note from Peter E.: Some of the Kerberos usage information is |
||||
still in config.sgml and some in doc/README.kerberos. It should be |
||||
integrated here. --> |
||||
</sect2> |
||||
|
||||
<sect2> |
||||
<title>Ident-based authentication</title> |
||||
|
||||
<para> |
||||
The <quote>Identification Protocol</quote> is described in |
||||
<citetitle>RFC 1413</citetitle>. Virtually every Unix-like |
||||
operating systems ships with an ident server that listens on TCP |
||||
port 113 by default. The basic functionality of the ident server |
||||
is to answer questions like <quote>What user initiated the |
||||
connection that goes out of your port <replaceable>X</replaceable> |
||||
and connects to my port <replaceable>Y</replaceable>?</quote>. |
||||
Since both <replaceable>X</replaceable> and |
||||
<replaceable>Y</replaceable> are known, |
||||
<productname>Postgres</productname> could theoretically determine |
||||
the operating system user for any given connection this way. |
||||
</para> |
||||
|
||||
<para> |
||||
The drawback of this procedure is that it depends on the integrity |
||||
of the client: if the client machine is untrusted or compromised |
||||
an attacker could run just about any program on port 113 and |
||||
return any user name he chooses. This authentication method is |
||||
therefore only appropriate for closed networks where each client |
||||
machine is under tight control and where the database and system |
||||
administrators operate in close contact. Heed the warning: |
||||
<blockquote> |
||||
<attribution>RFC 1413</attribution> |
||||
<para> |
||||
The Identification Protocol is not intended as an authorization |
||||
or access control protocol. |
||||
</para> |
||||
</blockquote> |
||||
</para> |
||||
|
||||
<para> |
||||
When using ident-based authentication, after having determined the |
||||
operating system user that initiated the connection, |
||||
<productname>Postgres</productname> determines as what database |
||||
system user he may connect. This is controlled by the ident map |
||||
argument that follows the <literal>ident</> keyword in the |
||||
<filename>pg_hba.conf</filename> file. The simplest ident map is |
||||
<literal>sameuser</literal>, which allows any operating system |
||||
user to connect as the database user of the same name (if the |
||||
latter exists). Other maps must be created manually. |
||||
</para> |
||||
|
||||
<para> |
||||
Ident maps are held in the file <filename>pg_ident.conf</filename> |
||||
in the data directory, which contains lines of the general form: |
||||
<synopsis> |
||||
<replaceable>map-name</> <replaceable>ident-username</> <replaceable>database-username</> |
||||
</synopsis> |
||||
Comments and whitespace are handled in the usual way. |
||||
The <replaceable>map-name</> is an arbitrary name that will be |
||||
used to refer to this mapping in <filename>pg_hba.conf</filename>. |
||||
The other two fields specify which operating system user is |
||||
allowed to connect as which database user. The same |
||||
<replaceable>map-name</> can be used repeatedly to specify more |
||||
user-mappings. There is also no restriction regarding how many |
||||
database users a given operating system may correspond to and vice |
||||
versa. |
||||
</para> |
||||
|
||||
<para> |
||||
A <filename>pg_ident.conf</filename> file that could be used in |
||||
conjunction with the <filename>pg_hba.conf</> file in <xref |
||||
linkend="example-pg-hba.conf"> is shown in <xref |
||||
linkend="example-pg-ident.conf">. In that example setup, anyone |
||||
logged in to a machine on the 192.168.1 network that does not have |
||||
the a user name joe, robert, or ann would not be granted access. |
||||
Unix user robert would only be allowed access when he tries to |
||||
connect as <quote>bob</quote>, not as <quote>robert</quote> or |
||||
anyone else. <quote>ann</quote> and <quote>joe</quote> would only |
||||
be allowed to connect <quote>as themselves</quote>. On the |
||||
192.168.2 network, however, a user <quote>ann</quote> would not be |
||||
allowed to connect at all, only the user <quote>bob</> can connect |
||||
as <quote>bob</> and some user <quote>karl</> can connect as |
||||
<quote>joe</> as well. |
||||
</para> |
||||
|
||||
<example id="example-pg-ident.conf"> |
||||
<title>An example <filename>pg_ident.conf</> file</title> |
||||
<programlisting> |
||||
usermap joe joe |
||||
# bob has username robert on these machines |
||||
usermap robert bob |
||||
usermap ann ann |
||||
|
||||
othermap joe joe |
||||
othermap bob bob |
||||
othermap karl joe |
||||
</programlisting> |
||||
</example> |
||||
</sect2> |
||||
</sect1> |
||||
|
||||
<sect1 id="client-authentication-problems"> |
||||
<title>Authentication problems</title> |
||||
|
||||
<para> |
||||
Genuine authentication failures and related problems generally |
||||
manifest themselves through error messages like the following. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
No pg_hba.conf entry for host 123.123.123.123, user joeblow, database testdb |
||||
</ProgramListing> |
||||
This is what you are most likely to get if you succeed in |
||||
contacting the server, but it doesn't want to talk to you. As the |
||||
message suggests, the server refused the connection request |
||||
because it found no authorizing entry in its <filename>pg_hba.conf</filename> |
||||
configuration file. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
Password authentication failed for user 'joeblow' |
||||
</ProgramListing> |
||||
Messages like this indicate that you contacted the server, and |
||||
it's willing to talk to you, but not until you pass the |
||||
authorization method specified in the |
||||
<filename>pg_hba.conf</filename> file. Check the password you're |
||||
providing, or check your Kerberos or IDENT software if the |
||||
complaint mentions one of those authentication types. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
FATAL 1: SetUserId: user 'joeblow' is not in 'pg_shadow' |
||||
</ProgramListing> |
||||
This is the fancy way of saying that the user doesn't exist at all. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
FATAL 1: Database testdb does not exist in pg_database |
||||
</ProgramListing> |
||||
The database you're trying to connect to doesn't exist. Note that |
||||
if you don't specify a database name, it defaults to the database |
||||
user name, which may or may not be the right thing. |
||||
</para> |
||||
</sect1> |
||||
|
||||
</chapter> |
||||
|
@ -1,240 +0,0 @@ |
||||
<!-- |
||||
$Header: /cvsroot/pgsql/doc/src/sgml/Attic/pg_options.sgml,v 1.5 2000/03/31 03:27:41 thomas Exp $ |
||||
--> |
||||
|
||||
<Chapter Id="pg-options-dev"> |
||||
<DocInfo> |
||||
<AuthorGroup> |
||||
<Author> |
||||
<FirstName>Massimo</FirstName> |
||||
<Surname>Dal Zotto</Surname> |
||||
</Author> |
||||
</AuthorGroup> |
||||
<Date>Transcribed 1998-10-16</Date> |
||||
</DocInfo> |
||||
|
||||
<Title>pg_options</Title> |
||||
|
||||
<Para> |
||||
<Note> |
||||
<Para> |
||||
Contributed by <ULink url="mailto:dz@cs.unitn.it">Massimo Dal Zotto</ULink> |
||||
</Para> |
||||
</Note> |
||||
</para> |
||||
<Para> |
||||
The optional file <filename>data/pg_options</filename> contains runtime |
||||
options used by the backend to control trace messages and other backend |
||||
tunable parameters. |
||||
What makes this file interesting is the fact that it is re-read by a backend |
||||
when it receives a SIGHUP signal, making thus possible to change run-time |
||||
options on the fly without needing to restart |
||||
<productname>Postgres</productname>. |
||||
The options specified in this file may be debugging flags used by the trace |
||||
package (<filename>backend/utils/misc/trace.c</filename>) or numeric |
||||
parameters which can be used by the backend to control its behaviour. |
||||
New options and parameters must be defined in |
||||
<filename>backend/utils/misc/trace.c</filename> and |
||||
<filename>backend/include/utils/trace.h</filename>. |
||||
</para> |
||||
<Para> |
||||
For example suppose we want to add conditional trace messages and a tunable |
||||
numeric parameter to the code in file <filename>foo.c</filename>. |
||||
All we need to do is to add the constant TRACE_FOO and OPT_FOO_PARAM into |
||||
<filename>backend/include/utils/trace.h</filename>: |
||||
|
||||
<programlisting> |
||||
/* file trace.h */ |
||||
enum pg_option_enum { |
||||
... |
||||
TRACE_FOO, /* trace foo functions */ |
||||
OPT_FOO_PARAM, /* foo tunable parameter */ |
||||
|
||||
NUM_PG_OPTIONS /* must be the last item of enum */ |
||||
}; |
||||
</programlisting> |
||||
|
||||
and a corresponding line in <filename>backend/utils/misc/trace.c</filename>: |
||||
|
||||
<programlisting> |
||||
/* file trace.c */ |
||||
static char *opt_names[] = { |
||||
... |
||||
"foo", /* trace foo functions */ |
||||
"fooparam" /* foo tunable parameter */ |
||||
}; |
||||
</programlisting> |
||||
|
||||
Options in the two files must be specified in exactly the same order. |
||||
In the foo source files we can now reference the new flags with: |
||||
|
||||
<programlisting> |
||||
/* file foo.c */ |
||||
#include "trace.h" |
||||
#define foo_param pg_options[OPT_FOO_PARAM] |
||||
|
||||
int |
||||
foo_function(int x, int y) |
||||
{ |
||||
TPRINTF(TRACE_FOO, "entering foo_function, foo_param=%d", foo_param); |
||||
if (foo_param > 10) { |
||||
do_more_foo(x, y); |
||||
} |
||||
} |
||||
</programlisting> |
||||
</para> |
||||
<para> |
||||
Existing files using private trace flags can be changed by simply adding |
||||
the following code: |
||||
|
||||
<programlisting> |
||||
#include "trace.h" |
||||
/* int my_own_flag = 0; -- removed */ |
||||
#define my_own_flag pg_options[OPT_MY_OWN_FLAG] |
||||
</programlisting> |
||||
</para> |
||||
<para> |
||||
All pg_options are initialized to zero at backend startup. If we need a |
||||
different default value we must add some initialization code at the beginning |
||||
of <function>PostgresMain</function>. |
||||
|
||||
Now we can set the foo_param and enable foo trace by writing values into the |
||||
<filename>data/pg_options</filename> file: |
||||
|
||||
<programlisting> |
||||
# file pg_options |
||||
... |
||||
foo=1 |
||||
fooparam=17 |
||||
</programlisting> |
||||
</para> |
||||
<para> |
||||
The new options will be read by all new backends when they are started. |
||||
To make effective the changes for all running backends we need to send a |
||||
SIGHUP to the postmaster. The signal will be automatically sent to all the |
||||
backends. We can also activate the changes only for a specific backend by |
||||
sending the SIGHUP directly to it. |
||||
</para> |
||||
<para> |
||||
pg_options can also be specified with the <option>-T</option> switch of |
||||
<productname>Postgres</productname>: |
||||
|
||||
<programlisting> |
||||
postgres <replaceable>options</replaceable> -T "verbose=2,query,hostlookup-" |
||||
</programlisting> |
||||
</para> |
||||
<Para> |
||||
The functions used for printing errors and debug messages can now make use |
||||
of the <citetitle>syslog(2)</citetitle> facility. Message printed to stdout |
||||
or stderr are prefixed by a timestamp containing also the backend pid: |
||||
|
||||
<programlisting> |
||||
#timestamp #pid #message |
||||
980127.17:52:14.173 [29271] StartTransactionCommand |
||||
980127.17:52:14.174 [29271] ProcessUtility: drop table t; |
||||
980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full |
||||
980127.17:52:14.186 [29286] Async_NotifyHandler |
||||
980127.17:52:14.186 [29286] Waking up sleeping backend process |
||||
980127.19:52:14.292 [29286] Async_NotifyFrontEnd |
||||
980127.19:52:14.413 [29286] Async_NotifyFrontEnd done |
||||
980127.19:52:14.466 [29286] Async_NotifyHandler done |
||||
</programlisting> |
||||
</para> |
||||
<para> |
||||
This format improves readability of the logs and allows people to understand |
||||
exactly which backend is doing what and at which time. It also makes |
||||
easier to write simple awk or perl scripts which monitor the log to |
||||
detect database errors or problem, or to compute transaction time statistics. |
||||
</para> |
||||
<para> |
||||
Messages printed to syslog use the log facility LOG_LOCAL0. |
||||
The use of syslog can be controlled with the syslog pg_option. |
||||
Unfortunately many functions call directly <function>printf()</function> |
||||
to print their messages to stdout or stderr and this output can't be |
||||
redirected to syslog or have timestamps in it. |
||||
It would be advisable that all calls to printf would be replaced with the |
||||
PRINTF macro and output to stderr be changed to use EPRINTF instead so that |
||||
we can control all output in a uniform way. |
||||
</Para> |
||||
|
||||
<Para> |
||||
The new pg_options mechanism is more convenient than defining new backend |
||||
option switches because: |
||||
|
||||
<ItemizedList Mark="bullet" Spacing="compact"> |
||||
<ListItem> |
||||
<Para> |
||||
we don't have to define a different switch for each thing we want to control. |
||||
All options are defined as keywords in an external file stored in the data |
||||
directory. |
||||
</Para> |
||||
</ListItem> |
||||
|
||||
<ListItem> |
||||
<Para> |
||||
we don't have to restart <productname>Postgres</productname> to change |
||||
the setting of some option. |
||||
Normally backend options are specified to the postmaster and passed to each |
||||
backend when it is started. Now they are read from a file. |
||||
</Para> |
||||
</ListItem> |
||||
|
||||
<ListItem> |
||||
<Para> |
||||
we can change options on the fly while a backend is running. We can thus |
||||
investigate some problem by activating debug messages only when the problem |
||||
appears. We can also try different values for tunable parameters. |
||||
</Para> |
||||
</ListItem> |
||||
</ItemizedList> |
||||
|
||||
The format of the <filename>pg_options</filename> file is as follows: |
||||
|
||||
<programlisting> |
||||
# <replaceable>comment</replaceable> |
||||
<replaceable>option</replaceable>=<replaceable class="parameter">integer_value</replaceable> # set value for <replaceable>option</replaceable> |
||||
<replaceable>option</replaceable> # set <replaceable>option</replaceable> = 1 |
||||
<replaceable>option</replaceable>+ # set <replaceable>option</replaceable> = 1 |
||||
<replaceable>option</replaceable>- # set <replaceable>option</replaceable> = 0 |
||||
</programlisting> |
||||
|
||||
Note that <replaceable class="parameter">keyword</replaceable> can also be |
||||
an abbreviation of the option name defined in |
||||
<filename>backend/utils/misc/trace.c</filename>. |
||||
</Para> |
||||
|
||||
<para> |
||||
Refer to <citetitle>The Administrator's Guide</citetitle> chapter |
||||
on runtime options for a complete list of currently supported |
||||
options. |
||||
</para> |
||||
|
||||
<Para> |
||||
Some of the existing code using private variables and option switches has |
||||
been changed to make use of the pg_options feature, mainly in |
||||
<filename>postgres.c</filename>. It would be advisable to modify |
||||
all existing code |
||||
in this way, so that we can get rid of many of the switches on |
||||
the <productname>Postgres</productname> command line |
||||
and can have more tunable options |
||||
with a unique place to put option values. |
||||
</Para> |
||||
|
||||
</Chapter> |
||||
|
||||
<!-- Keep this comment at the end of the file |
||||
Local variables: |
||||
mode:sgml |
||||
sgml-omittag:nil |
||||
sgml-shorttag:t |
||||
sgml-minimize-attributes:nil |
||||
sgml-always-quote-attributes:t |
||||
sgml-indent-step:1 |
||||
sgml-indent-data:t |
||||
sgml-parent-document:nil |
||||
sgml-default-dtd-file:"./reference.ced" |
||||
sgml-exposed-tags:nil |
||||
sgml-local-catalogs:("/usr/lib/sgml/catalog") |
||||
sgml-local-ecat-files:nil |
||||
End: |
||||
--> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,53 @@ |
||||
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/set_constraints.sgml,v 1.1 2000/06/18 21:24:54 petere Exp $ --> |
||||
<refentry id="SQL-SET-CONSTRAINTS"> |
||||
<refmeta> |
||||
<refentrytitle id="SQL-SET-CONSTRAINTS-title">SET CONSTRAINTS</refentrytitle> |
||||
<refmiscinfo>SQL - Language Statements</refmiscinfo> |
||||
</refmeta> |
||||
<refnamediv> |
||||
<refname>SET CONSTRAINTS</refname> |
||||
<refpurpose>Set the constraint mode of the current SQL-transaction</refpurpose> |
||||
</refnamediv> |
||||
<refsynopsisdiv> |
||||
<refsynopsisdivinfo> |
||||
<date>2000-06-01</date> |
||||
</refsynopsisdivinfo> |
||||
<synopsis> |
||||
SET CONSTRAINTS { ALL | <replaceable class="parameter">constraint</replaceable> [, ...] } { DEFERRED | IMMEDIATE } |
||||
</synopsis> |
||||
</refsynopsisdiv> |
||||
|
||||
<refsect1> |
||||
<title>Description</title> |
||||
|
||||
<para> |
||||
<command>SET CONSTRAINTS</command> sets the behavior of constraint |
||||
evaluation in the current transaction. In |
||||
<option>IMMEDIATE</option> mode, constraints are checked at the end |
||||
of each statement. In <option>DEFERRED</option> mode, constraints |
||||
are not checked until transaction commit. |
||||
</para> |
||||
|
||||
<para> |
||||
Upon creation, a constraint is always give one of three |
||||
characteristics: <option>INITIALLY DEFERRED</option>, |
||||
<option>INITIALLY IMMEDIATE DEFERRABLE</option>, or |
||||
<option>INITIALLY IMMEDIATE NOT DEFERRABLE</option>. The third |
||||
class is not affected by the <command>SET CONSTRAINTS</command> |
||||
command. |
||||
</para> |
||||
|
||||
<para> |
||||
Currently, only foreign key constraints are affected by this |
||||
setting. Check and unique constraints are always effectively |
||||
initially immediate not deferrable. |
||||
</para> |
||||
</refsect1> |
||||
|
||||
<refsect1> |
||||
<title>Compatibility</title> |
||||
<para> |
||||
SQL92, SQL99 |
||||
</para> |
||||
</refsect1> |
||||
</refentry> |
@ -0,0 +1,93 @@ |
||||
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/set_transaction.sgml,v 1.1 2000/06/18 21:24:54 petere Exp $ --> |
||||
<refentry id="SQL-SET-TRANSACTION"> |
||||
<refmeta> |
||||
<refentrytitle id="SQL-SET-TRANSACTION-title">SET TRANSACTION</refentrytitle> |
||||
<refmiscinfo>SQL - Language Statements</refmiscinfo> |
||||
</refmeta> |
||||
<refnamediv> |
||||
<refname>SET TRANSACTION</refname> |
||||
<refpurpose>Set the characteristics of the current SQL-transaction</refpurpose> |
||||
</refnamediv> |
||||
<refsynopsisdiv> |
||||
<refsynopsisdivinfo> |
||||
<date>2000-06-01</date> |
||||
</refsynopsisdivinfo> |
||||
<synopsis> |
||||
SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } |
||||
</synopsis> |
||||
</refsynopsisdiv> |
||||
|
||||
<refsect1> |
||||
<title>Description</title> |
||||
|
||||
<para> |
||||
The <command>SET TRANSACTION</command> command sets the |
||||
characteristics for the current SQL-transaction. It has no effect |
||||
on any subsequent transactions. This command cannot be used after |
||||
the first DML statement (<command>SELECT</command>, |
||||
<command>INSERT</command>, <command>DELETE</command>, |
||||
<command>UPDATE</command>, <command>FETCH</command>, |
||||
<command>COPY</command>) of a transaction has been executed. |
||||
</para> |
||||
|
||||
<para> |
||||
The isolation level of a transaction determines what data the |
||||
transaction can see when other transactions are running concurrently. |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term>READ COMMITTED</term> |
||||
<listitem> |
||||
<para> |
||||
A statement can only see rows committed before it began. This |
||||
is the default. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>SERIALIZABLE</term> |
||||
<listitem> |
||||
<para> |
||||
The current transaction can only see rows committed before |
||||
first DML statement was executed in this transaction. |
||||
</para> |
||||
<tip> |
||||
<para> |
||||
Intuitively, serializable means that two concurrent |
||||
transactions will leave the database in the same state as if |
||||
the two has been executed strictly after one another in either |
||||
order. |
||||
</para> |
||||
</tip> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
</para> |
||||
</refsect1> |
||||
|
||||
<refsect1> |
||||
<title>Compatibility</title> |
||||
|
||||
<para> |
||||
SQL92, SQL99 |
||||
</para> |
||||
|
||||
<para> |
||||
SERIALIZABLE is the default level in <acronym>SQL</acronym>. |
||||
Postgres does not provide the isolation levels <option>READ |
||||
UNCOMMITTED</option> and <option>REPEATABLE READ</option>. Because |
||||
of multi-version concurrency control, the serializable level is not |
||||
truly serializable. See the <citetitle>User's Guide</citetitle> for |
||||
details. |
||||
</para> |
||||
|
||||
<para> |
||||
In <acronym>SQL</acronym> there are two other transaction |
||||
characteristics that can be set with this command: whether the |
||||
transaction is read-only and the size of the diagnostics area. |
||||
Neither of these concepts are supported in Postgres. |
||||
</para> |
||||
</refsect1> |
||||
</refentry> |
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,627 +0,0 @@ |
||||
<!-- |
||||
$Header: /cvsroot/pgsql/doc/src/sgml/Attic/security.sgml,v 1.9 2000/05/25 15:32:03 momjian Exp $ |
||||
--> |
||||
|
||||
<chapter id="security"> |
||||
<Title>Security</Title> |
||||
|
||||
<Para> |
||||
Database security is addressed at several levels: |
||||
|
||||
<itemizedlist> |
||||
<listitem> |
||||
<para> |
||||
Data base file protection. All files stored within the database |
||||
are protected from reading by any account other than the |
||||
<productname>Postgres</productname> superuser account. |
||||
</para> |
||||
</listitem> |
||||
<listitem> |
||||
<para> |
||||
Connections from a client to the database server are, by |
||||
default, allowed only via a local Unix socket, not via TCP/IP |
||||
sockets. The backend must be started with the |
||||
<literal>-i</literal> option to allow non-local clients to connect. |
||||
</para> |
||||
</listitem> |
||||
<listitem> |
||||
<para> |
||||
Client connections can be restricted by IP address and/or user |
||||
name via the <filename>pg_hba.conf</filename> file in <envar>PG_DATA</envar>. |
||||
</para> |
||||
</listitem> |
||||
<listitem> |
||||
<para> |
||||
Client connections may be authenticated via other external packages. |
||||
</para> |
||||
</listitem> |
||||
<listitem> |
||||
<para> |
||||
Each user in <productname>Postgres</productname> is assigned a |
||||
username and (optionally) a password. By default, users do not |
||||
have write access to databases they did not create. |
||||
</para> |
||||
</listitem> |
||||
<listitem> |
||||
<para> |
||||
Users may be assigned to <firstterm>groups</firstterm>, and |
||||
table access may be restricted based on group privileges. |
||||
</para> |
||||
</listitem> |
||||
</itemizedlist> |
||||
</para> |
||||
|
||||
<Sect1> |
||||
<Title>User Authentication</Title> |
||||
|
||||
<Para> |
||||
<firstterm>Authentication</firstterm> |
||||
is the process by which the backend server and |
||||
<application>postmaster</application> |
||||
ensure that the user requesting access to data is in fact who he/she |
||||
claims to be. |
||||
All users who invoke <Productname>Postgres</Productname> are checked against the |
||||
contents of the <literal>pg_user</literal> class to ensure that they are |
||||
authorized to do so. However, verification of the user's actual |
||||
identity is performed in a variety of ways: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term> |
||||
From the user shell |
||||
</term> |
||||
<listitem> |
||||
<para> |
||||
A backend server started from a user shell notes the user's (effective) |
||||
user-id before performing a |
||||
<function>setuid</function> |
||||
to the user-id of user <replaceable>postgres</replaceable>. |
||||
The effective user-id is used |
||||
as the basis for access control checks. No other authentication is |
||||
conducted. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term> |
||||
From the network |
||||
</term> |
||||
<listitem> |
||||
<para> |
||||
If the <Productname>Postgres</Productname> system is built as distributed, |
||||
access to the Internet TCP port of the |
||||
<application>postmaster</application> |
||||
process is available to anyone. The DBA configures the pg_hba.conf file |
||||
in the PGDATA directory to specify what authentication system is to be used |
||||
according to the host making the connection and which database it is |
||||
connecting to. See <citetitle>pg_hba.conf(5)</citetitle> |
||||
for a description of the authentication |
||||
systems available. Of course, host-based authentication is not fool-proof in |
||||
Unix, either. It is possible for determined intruders to also |
||||
masquerade the origination host. Those security issues are beyond the |
||||
scope of <Productname>Postgres</Productname>. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
</para> |
||||
|
||||
<Sect2> |
||||
<Title>Host-Based Access Control</Title> |
||||
|
||||
<Para> |
||||
<firstterm>Host-based access control</firstterm> |
||||
is the name for the basic controls PostgreSQL |
||||
exercises on what clients are allowed to access a database and how |
||||
the users on those clients must authenticate themselves. |
||||
</para> |
||||
|
||||
<para> |
||||
Each database system contains a file named |
||||
<filename>pg_hba.conf</filename>, in its <envar>PGDATA</envar> |
||||
directory, which controls who can connect to each database. |
||||
</para> |
||||
|
||||
<para> |
||||
Every client accessing a database |
||||
<emphasis>must</emphasis> |
||||
be covered by one of |
||||
the entries in <filename>pg_hba.conf</filename>. |
||||
Otherwise all attempted connections from that |
||||
client will be rejected with a "User authentication failed" error |
||||
message. |
||||
</para> |
||||
|
||||
<para> |
||||
The general format of the <filename>pg_hba.conf</filename> |
||||
file is of a set of records, one per |
||||
line. Blank lines and lines beginning with a hash character |
||||
("#") are ignored. A record is |
||||
made up of a number of fields which are separated by spaces and/or tabs. |
||||
</para> |
||||
|
||||
<para> |
||||
Connections from clients can be made using Unix domain sockets or Internet |
||||
domain sockets (ie. TCP/IP). Connections made using Unix domain sockets |
||||
are controlled using records of the following format: |
||||
|
||||
<synopsis> |
||||
local <replaceable>database</replaceable> <replaceable>authentication method</replaceable> |
||||
</synopsis> |
||||
|
||||
where |
||||
|
||||
<simplelist> |
||||
<member> |
||||
<replaceable>database</replaceable> |
||||
specifies the database that this record applies to. The value |
||||
<literal>all</literal> |
||||
specifies that it applies to all databases. |
||||
</member> |
||||
<member> |
||||
<replaceable>authentication method</replaceable> |
||||
specifies the method a user must use to authenticate themselves when |
||||
connecting to that database using Unix domain sockets. The different methods |
||||
are described below. |
||||
</member> |
||||
</simplelist> |
||||
</para> |
||||
|
||||
<para> |
||||
Connections made using Internet domain sockets are controlled using records |
||||
of the following format. |
||||
|
||||
<synopsis> |
||||
host <replaceable>database</replaceable> <replaceable>TCP/IP address</replaceable> <replaceable>TCP/IP mask</replaceable> <replaceable>authentication method</replaceable> |
||||
</synopsis> |
||||
</para> |
||||
|
||||
<para> |
||||
The <replaceable>TCP/IP address</replaceable> |
||||
is logically anded to both the specified |
||||
<replaceable>TCP/IP mask</replaceable> |
||||
and the TCP/IP address |
||||
of the connecting client. |
||||
If the two resulting values are equal then the |
||||
record is used for this connection. If a connection matches more than one |
||||
record then the earliest one in the file is used. |
||||
Both the |
||||
<replaceable>TCP/IP address</replaceable> |
||||
and the |
||||
<replaceable>TCP/IP mask</replaceable> |
||||
are specified in dotted decimal notation. |
||||
</para> |
||||
|
||||
<para> |
||||
If a connection fails to match any record then the |
||||
<firstterm>reject</firstterm> |
||||
authentication method is applied (see below). |
||||
</para> |
||||
|
||||
<sect3> |
||||
<title>Authentication Methods</title> |
||||
|
||||
<para> |
||||
The following authentication methods are supported for both Unix and TCP/IP |
||||
domain sockets: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term>trust</term> |
||||
<listitem> |
||||
<para> |
||||
The connection is allowed unconditionally. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>reject</term> |
||||
<listitem> |
||||
<para> |
||||
The connection is rejected unconditionally. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>crypt</term> |
||||
<listitem> |
||||
<para> |
||||
The client is asked for a password for the user. This is sent encrypted |
||||
(using <citetitle>crypt(3)</citetitle>) |
||||
and compared against the password held in the |
||||
<filename>pg_shadow</filename> table. |
||||
If the passwords match, the connection is allowed. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>password</term> |
||||
<listitem> |
||||
<para> |
||||
The client is asked for a password for the user. This is sent in clear |
||||
and compared against the password held in the |
||||
<filename>pg_shadow</filename> table. |
||||
If the passwords match, the connection is allowed. An optional password file |
||||
may be specified after the |
||||
<literal>password</literal> |
||||
keyword which is used to match the supplied password rather than the pg_shadow |
||||
table. See |
||||
<citerefentry><refentrytitle>pg_passwd</refentrytitle></citerefentry>. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
</para> |
||||
|
||||
<para> |
||||
The following authentication methods are supported for TCP/IP |
||||
domain sockets only: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term>krb4</term> |
||||
<listitem> |
||||
<para> |
||||
Kerberos V4 is used to authenticate the user. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>krb5</term> |
||||
<listitem> |
||||
<para> |
||||
Kerberos V5 is used to authenticate the user. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>ident</term> |
||||
<listitem> |
||||
<para> |
||||
The ident server on the client is used to authenticate the user (RFC 1413). |
||||
An optional map name may be specified after the |
||||
<literal>ident</literal> |
||||
keyword which allows ident user names to be mapped onto |
||||
<productname>Postgres</productname> user names. |
||||
Maps are held in the file |
||||
<filename>$<envar>PGDATA</envar>/pg_ident.conf</filename>. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
</para> |
||||
</sect3> |
||||
|
||||
<sect3> |
||||
<title>Examples</title> |
||||
|
||||
<para> |
||||
<programlisting> |
||||
# Trust any connection via Unix domain sockets. |
||||
local trust |
||||
# Trust any connection via TCP/IP from this machine. |
||||
host all 127.0.0.1 255.255.255.255 trust |
||||
# We don't like this machine. |
||||
host all 192.168.0.10 255.255.255.0 reject |
||||
# This machine can't encrypt so we ask for passwords in clear. |
||||
host all 192.168.0.3 255.255.255.0 password |
||||
# The rest of this group of machines should provide encrypted passwords. |
||||
host all 192.168.0.0 255.255.255.0 crypt |
||||
</programlisting> |
||||
</para> |
||||
</sect3> |
||||
</sect2> |
||||
</sect1> |
||||
|
||||
<sect1> |
||||
<title>User Names and Groups</title> |
||||
|
||||
<para> |
||||
To define a new user, run the |
||||
<application>createuser</application> utility program. |
||||
</para> |
||||
|
||||
<para> |
||||
To assign a user or set of users to a new group, one must |
||||
define the group itself, and assign users to that group. In |
||||
<application>Postgres</application> these steps are not currently |
||||
supported with a <command>create group</command> command. Instead, |
||||
the groups are defined by inserting appropriate values into the |
||||
<literal>pg_group</literal> system table, and then using the |
||||
<command>grant</command> command to assign privileges to the |
||||
group. |
||||
</para> |
||||
|
||||
<sect2> |
||||
<title>Creating Users</title> |
||||
|
||||
<para> |
||||
</para> |
||||
</sect2> |
||||
|
||||
<sect2> |
||||
<title>Creating Groups</title> |
||||
|
||||
<para> |
||||
Currently, there is no easy interface to set up user groups. You |
||||
have to explicitly insert/update the <literal>pg_group table</literal>. |
||||
For example: |
||||
|
||||
<programlisting> |
||||
jolly=> insert into pg_group (groname, grosysid, grolist) |
||||
jolly=> values ('posthackers', '1234', '{5443, 8261}'); |
||||
INSERT 548224 |
||||
jolly=> grant insert on foo to group posthackers; |
||||
CHANGE |
||||
jolly=> |
||||
</programlisting> |
||||
</para> |
||||
|
||||
<para> |
||||
The fields in <filename>pg_group</filename> are: |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term>groname</term> |
||||
<listitem> |
||||
<para> |
||||
The group name. This a name and should be purely |
||||
alphanumeric. Do not include underscores or other punctuation. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>grosysid</term> |
||||
<listitem> |
||||
<para> |
||||
The group id. This is an int4. This should be unique for |
||||
each group. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>grolist</term> |
||||
<listitem> |
||||
<para> |
||||
The list of pg_user id's that belong in the group. This |
||||
is an int4[]. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
</para> |
||||
</sect2> |
||||
|
||||
<sect2> |
||||
<title>Assigning Users to Groups</title> |
||||
|
||||
<para> |
||||
</para> |
||||
</sect2> |
||||
|
||||
</sect1> |
||||
|
||||
<Sect1> |
||||
<Title>Access Control</Title> |
||||
|
||||
<Para> |
||||
<Productname>Postgres</Productname> provides mechanisms to allow users |
||||
to limit the access to their data that is provided to other users. |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term> |
||||
Database superusers |
||||
</term> |
||||
<listitem> |
||||
<para> |
||||
Database super-users (i.e., users who have <literal>pg_user.usesuper</literal> |
||||
set) silently bypass all of the access controls described below with |
||||
two exceptions: manual system catalog updates are not permitted if the |
||||
user does not have <literal>pg_user.usecatupd</literal> set, and destruction of |
||||
system catalogs (or modification of their schemas) is never allowed. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term> |
||||
Access Privilege |
||||
</term> |
||||
<listitem> |
||||
<para> |
||||
The use of access privilege to limit reading, writing and setting |
||||
of rules on classes is covered in |
||||
<citetitle>grant/revoke(l)</citetitle>. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term> |
||||
Class removal and schema modification |
||||
</term> |
||||
<listitem> |
||||
<para> |
||||
Commands that destroy or modify the structure of an existing class, |
||||
such as <command>alter</command>, |
||||
<command>drop table</command>, |
||||
and |
||||
<command>drop index</command>, |
||||
only operate for the owner of the class. As mentioned above, these |
||||
operations are <emphasis>never</emphasis> |
||||
permitted on system catalogs. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
</para> |
||||
</sect1> |
||||
|
||||
<Sect1> |
||||
<Title>Functions and Rules</Title> |
||||
|
||||
<Para> |
||||
Functions and rules allow users to insert code into the backend server |
||||
that other users may execute without knowing it. Hence, both |
||||
mechanisms permit users to <firstterm>trojan horse</firstterm> |
||||
others with relative impunity. The only real protection is tight |
||||
control over who can define functions (e.g., write to relations with |
||||
SQL fields) and rules. Audit trails and alerters on |
||||
<literal>pg_class</literal>, <literal>pg_user</literal> |
||||
and <literal>pg_group</literal> are also recommended. |
||||
</para> |
||||
|
||||
<Sect2> |
||||
<Title>Functions</Title> |
||||
|
||||
<Para> |
||||
Functions written in any language except SQL |
||||
run inside the backend server |
||||
process with the permissions of the user <replaceable>postgres</replaceable> (the |
||||
backend server runs with its real and effective user-id set to |
||||
<replaceable>postgres</replaceable>. It is possible for users to change the server's |
||||
internal data structures from inside of trusted functions. Hence, |
||||
among many other things, such functions can circumvent any system |
||||
access controls. This is an inherent problem with user-defined C functions. |
||||
</para> |
||||
</sect2> |
||||
|
||||
<Sect2> |
||||
<Title>Rules</Title> |
||||
|
||||
<Para> |
||||
Like SQL functions, rules always run with the identity and |
||||
permissions of the user who invoked the backend server. |
||||
</para> |
||||
</sect2> |
||||
|
||||
<sect2> |
||||
<title>Caveats</title> |
||||
|
||||
<para> |
||||
There are no plans to explicitly support encrypted data inside of |
||||
<Productname>Postgres</Productname> |
||||
(though there is nothing to prevent users from encrypting |
||||
data within user-defined functions). There are no plans to explicitly |
||||
support encrypted network connections, either, pending a total rewrite |
||||
of the frontend/backend protocol. |
||||
</para> |
||||
<para> |
||||
User names, group names and associated system identifiers (e.g., the |
||||
contents of <literal>pg_user.usesysid</literal>) are assumed to be unique |
||||
throughout a database. Unpredictable results may occur if they are |
||||
not. |
||||
</para> |
||||
</sect2> |
||||
</sect1> |
||||
|
||||
<sect1> |
||||
<title>Secure TCP/IP Connection</title> |
||||
|
||||
<para> |
||||
<note> |
||||
<title>Author</title> |
||||
<para> |
||||
From e-mail by |
||||
<ulink url="selkovjr@mcs.anl.gov">Gene Selkov, Jr.</ulink> |
||||
written on 1999-09-08 in response to a |
||||
question from Eric Marsden. |
||||
</para> |
||||
</note> |
||||
</para> |
||||
|
||||
<para> |
||||
One can use <productname>ssh</productname> to encrypt the network |
||||
connection between clients and a |
||||
<productname>Postgres</productname> server. Done properly, this |
||||
should lead to an adequately secure network connection. |
||||
</para> |
||||
|
||||
<para> |
||||
The documentation for <productname>ssh</productname> provides most |
||||
of the information to get started. |
||||
Please refer to |
||||
<ulink url="http://www.heimhardt.de/htdocs/ssh.html">http://www.heimhardt.de/htdocs/ssh.html</ulink> |
||||
for better insight. |
||||
</para> |
||||
|
||||
<para> |
||||
A step-by-step explanation can be done in just two steps. |
||||
</para> |
||||
|
||||
<procedure> |
||||
<title>Running a secure tunnel via ssh</title> |
||||
|
||||
<para> |
||||
A step-by-step explanation can be done in just two steps. |
||||
</para> |
||||
|
||||
<step performance="required" id="establish-tunnel"> |
||||
<para> |
||||
Establish a tunnel to the backend machine, like this: |
||||
|
||||
<programlisting> |
||||
ssh -L 3333:wit.mcs.anl.gov:5432 postgres@wit.mcs.anl.gov |
||||
</programlisting> |
||||
|
||||
The first number in the -L argument, 3333, is the port number of |
||||
your end of the tunnel. The second number, 5432, is the remote |
||||
end of the tunnel -- the port number your backend is using. The |
||||
name or the address in between the port numbers belongs to the |
||||
server machine, as does the last argument to ssh that also includes |
||||
the optional user name. Without the user name, ssh will try the |
||||
name you are currently logged on as on the client machine. You can |
||||
use any user name the server machine will accept, not necessarily |
||||
those related to postgres. |
||||
</para> |
||||
</step> |
||||
|
||||
<step performance="required"> |
||||
<para> |
||||
Now that you have a running ssh session, you can connect a |
||||
postgres client to your local host at the port number you |
||||
specified in the previous step. If it's |
||||
<application>psql</application>, you will need another shell |
||||
because the shell session you used in |
||||
<xref linkend="establish-tunnel"> is now occupied with |
||||
<application>ssh</application>. |
||||
|
||||
<programlisting> |
||||
psql -h localhost -p 3333 -d mpw |
||||
</programlisting> |
||||
|
||||
Note that you have to specify the <option>-h</option> argument |
||||
to cause your client to use the TCP socket instead of the Unix |
||||
socket. You can omit the port argument if you chose 5432 as your |
||||
end of the tunnel. |
||||
</para> |
||||
</step> |
||||
</procedure> |
||||
</sect1> |
||||
</chapter> |
||||
|
||||
<!-- Keep this comment at the end of the file |
||||
Local variables: |
||||
mode:sgml |
||||
sgml-omittag:nil |
||||
sgml-shorttag:t |
||||
sgml-minimize-attributes:nil |
||||
sgml-always-quote-attributes:t |
||||
sgml-indent-step:1 |
||||
sgml-indent-data:t |
||||
sgml-parent-document:nil |
||||
sgml-default-dtd-file:"./reference.ced" |
||||
sgml-exposed-tags:nil |
||||
sgml-local-catalogs:("/usr/lib/sgml/catalog") |
||||
sgml-local-ecat-files:nil |
||||
End: |
||||
--> |
@ -1,266 +0,0 @@ |
||||
<chapter id="signals"> |
||||
<DocInfo> |
||||
<AuthorGroup> |
||||
<Author> |
||||
<FirstName>Massimo</FirstName> |
||||
<Surname>Dal Zotto</Surname> |
||||
</Author> |
||||
</AuthorGroup> |
||||
<Date>Transcribed 1998-10-16</Date> |
||||
</DocInfo> |
||||
|
||||
<title><productname>Postgres</productname> Signals</title> |
||||
|
||||
<Para> |
||||
<Note> |
||||
<Para> |
||||
Contributed by <ULink url="mailto:dz@cs.unitn.it">Massimo Dal Zotto</ULink> |
||||
</Para> |
||||
</Note> |
||||
</para> |
||||
|
||||
<para> |
||||
<productname>Postgres</productname> uses the following signals for |
||||
communication between the postmaster and backends: |
||||
</para> |
||||
|
||||
<para> |
||||
<table tocentry="1"> |
||||
<title><productname>Postgres</productname> Signals</title> |
||||
<titleabbrev>Signals</titleabbrev> |
||||
|
||||
<tgroup cols="2"> |
||||
<thead> |
||||
<row> |
||||
<entry> |
||||
Signal |
||||
</entry> |
||||
<entry> |
||||
<application>postmaster</application> Action |
||||
</entry> |
||||
<entry> |
||||
Server Action |
||||
</entry> |
||||
</row> |
||||
</thead> |
||||
|
||||
<tbody> |
||||
<row> |
||||
<entry> |
||||
SIGHUP |
||||
</entry> |
||||
<entry> |
||||
kill(*,sighup) |
||||
</entry> |
||||
<entry> |
||||
read_pg_options |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGINT |
||||
</entry> |
||||
<entry> |
||||
die |
||||
</entry> |
||||
<entry> |
||||
cancel query |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGQUIT |
||||
</entry> |
||||
<entry> |
||||
kill(*,sigterm) |
||||
</entry> |
||||
<entry> |
||||
handle_warn |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGTERM |
||||
</entry> |
||||
<entry> |
||||
kill(*,sigterm), kill(*,9), die |
||||
</entry> |
||||
<entry> |
||||
die |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGPIPE |
||||
</entry> |
||||
<entry> |
||||
ignored |
||||
</entry> |
||||
<entry> |
||||
die |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGUSR1 |
||||
</entry> |
||||
<entry> |
||||
kill(*,sigusr1), die |
||||
</entry> |
||||
<entry> |
||||
quickdie |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGUSR2 |
||||
</entry> |
||||
<entry> |
||||
kill(*,sigusr2) |
||||
</entry> |
||||
<entry> |
||||
async notify (SI flush) |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGCHLD |
||||
</entry> |
||||
<entry> |
||||
reaper |
||||
</entry> |
||||
<entry> |
||||
ignored (alive test) |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGTTIN |
||||
</entry> |
||||
<entry> |
||||
ignored |
||||
</entry> |
||||
<entry> |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGTTOU |
||||
</entry> |
||||
<entry> |
||||
ignored |
||||
</entry> |
||||
<entry> |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGCONT |
||||
</entry> |
||||
<entry> |
||||
dumpstatus |
||||
</entry> |
||||
<entry> |
||||
</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry> |
||||
SIGFPE |
||||
</entry> |
||||
<entry> |
||||
</entry> |
||||
<entry> |
||||
FloatExceptionHandler |
||||
</entry> |
||||
</row> |
||||
|
||||
</tbody> |
||||
</tgroup> |
||||
</table> |
||||
|
||||
<note> |
||||
<para> |
||||
"<literal>kill(*,signal)</literal>" means sending a signal to all backends. |
||||
</para> |
||||
</note> |
||||
</para> |
||||
|
||||
<para> |
||||
The main changes to the old signal handling are the use of SIGQUIT instead |
||||
of SIGHUP to handle warns, SIGHUP to re-read the pg_options file and the |
||||
redirection to all active backends of SIGHUP, SIGTERM, SIGUSR1 and SIGUSR2 |
||||
sent to the postmaster. |
||||
In this way these signals sent to the postmaster can be sent |
||||
automatically to all the backends without need to know their pids. |
||||
To shut down postgres one needs only to send a SIGTERM to postmaster |
||||
and it will stop automatically all the backends. |
||||
</para> |
||||
|
||||
<para> |
||||
The SIGUSR2 signal is also used to prevent SI cache table overflow |
||||
which happens when some backend doesn't process SI cache for a long period. |
||||
When a backend detects the SI table full at 70% it simply sends a signal |
||||
to the postmaster which will wake up all idle backends and make them flush |
||||
the cache. |
||||
</para> |
||||
|
||||
<para> |
||||
The typical use of signals by programmers could be the following: |
||||
|
||||
<programlisting> |
||||
# stop postgres |
||||
kill -TERM $postmaster_pid |
||||
</programlisting> |
||||
|
||||
<programlisting> |
||||
# kill all the backends |
||||
kill -QUIT $postmaster_pid |
||||
</programlisting> |
||||
|
||||
<programlisting> |
||||
# kill only the postmaster |
||||
kill -INT $postmaster_pid |
||||
</programlisting> |
||||
|
||||
<programlisting> |
||||
# change pg_options |
||||
cat new_pg_options > $DATA_DIR/pg_options |
||||
kill -HUP $postmaster_pid |
||||
</programlisting> |
||||
|
||||
<programlisting> |
||||
# change pg_options only for a backend |
||||
cat new_pg_options > $DATA_DIR/pg_options |
||||
kill -HUP $backend_pid |
||||
cat old_pg_options > $DATA_DIR/pg_options |
||||
</programlisting> |
||||
</para> |
||||
</chapter> |
||||
|
||||
<!-- Keep this comment at the end of the file |
||||
Local variables: |
||||
mode:sgml |
||||
sgml-omittag:nil |
||||
sgml-shorttag:t |
||||
sgml-minimize-attributes:nil |
||||
sgml-always-quote-attributes:t |
||||
sgml-indent-step:1 |
||||
sgml-indent-data:t |
||||
sgml-parent-document:nil |
||||
sgml-default-dtd-file:"./reference.ced" |
||||
sgml-exposed-tags:nil |
||||
sgml-local-catalogs:("/usr/lib/sgml/catalog") |
||||
sgml-local-ecat-files:nil |
||||
End: |
||||
--> |
@ -1,289 +0,0 @@ |
||||
<!-- |
||||
$Header: /cvsroot/pgsql/doc/src/sgml/Attic/trouble.sgml,v 2.6 2000/04/08 23:32:34 tgl Exp $ |
||||
--> |
||||
|
||||
<Chapter Id="trouble"> |
||||
<Title>Troubleshooting</Title> |
||||
|
||||
<sect1> |
||||
<title>Postmaster Startup Failures</title> |
||||
|
||||
<para> |
||||
There are several common reasons for the postmaster to fail to start up. |
||||
Check the postmaster's log file, or start it by hand (without redirecting |
||||
standard output or standard error) to see what complaint messages appear. |
||||
Some of the possible error messages are reasonably self-explanatory, |
||||
but here are some that are not: |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
FATAL: StreamServerPort: bind() failed: Address already in use |
||||
Is another postmaster already running on that port? |
||||
</ProgramListing> |
||||
This usually means just what it suggests: you accidentally started a |
||||
second postmaster on the same port where one is already running. |
||||
However, if the kernel error |
||||
message is not "Address already in use" or some variant of that wording, |
||||
there may be a different problem. For example, trying to start a |
||||
postmaster on a reserved port number may draw something like |
||||
<ProgramListing> |
||||
$ postmaster -i -p 666 |
||||
FATAL: StreamServerPort: bind() failed: Permission denied |
||||
Is another postmaster already running on that port? |
||||
</ProgramListing> |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
IpcMemoryCreate: shmget failed (Invalid argument) key=5440001, size=83918612, permission=600 |
||||
FATAL 1: ShmemCreate: cannot create region |
||||
</ProgramListing> |
||||
A message like this probably means that your kernel's limit on the size |
||||
of shared memory areas is smaller than the buffer area that Postgres |
||||
is trying to create. (Or it could mean that you don't have SysV-style |
||||
shared memory support configured into your kernel at all.) As a temporary |
||||
workaround, you can try starting the postmaster with a smaller-than-normal |
||||
number of buffers (-B switch). You will eventually want to reconfigure |
||||
your kernel to increase the allowed shared memory size, however. |
||||
You may see this message when trying to start multiple postmasters on |
||||
the same machine, if their total space requests exceed the kernel limit. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
IpcSemaphoreCreate: semget failed (No space left on device) key=5440026, num=16, permission=600 |
||||
</ProgramListing> |
||||
A message like this does <emphasis>not</emphasis> mean that you've run out |
||||
of disk space; it means that your kernel's limit on the number of SysV |
||||
semaphores is smaller than the number Postgres wants to create. As above, |
||||
you may be able to work around the problem by starting the postmaster with |
||||
a reduced number of backend processes (-N switch), but you'll eventually |
||||
want to increase the kernel limit. |
||||
</para> |
||||
|
||||
</sect1> |
||||
|
||||
<sect1> |
||||
<title>Client Connection Problems</title> |
||||
|
||||
<para> |
||||
Once you have a running postmaster, trying to connect to it with |
||||
client applications can fail for a variety of reasons. The sample |
||||
error messages shown here are for clients based on recent versions |
||||
of libpq --- clients based on other interface libraries may produce |
||||
other messages with more or less information. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
connectDB() -- connect() failed: Connection refused |
||||
Is the postmaster running (with -i) at 'server.joe.com' and accepting connections on TCP/IP port '5432'? |
||||
</ProgramListing> |
||||
This is the generic "I couldn't find a postmaster to talk to" failure. |
||||
It looks like the above when TCP/IP communication is attempted, or like |
||||
this when attempting Unix-socket communication to a local postmaster: |
||||
<ProgramListing> |
||||
connectDB() -- connect() failed: No such file or directory |
||||
Is the postmaster running at 'localhost' and accepting connections on Unix socket '5432'? |
||||
</ProgramListing> |
||||
The last line is useful in verifying that the client is trying to connect |
||||
where it is supposed to. If there is in fact no postmaster |
||||
running there, the kernel error message will typically be either |
||||
"Connection refused" or "No such file or directory", as illustrated. |
||||
(It is particularly important to realize that "Connection refused" in |
||||
this context does <emphasis>not</emphasis> mean that the postmaster |
||||
got your connection request and rejected it --- that case will produce |
||||
a different message, as shown below.) |
||||
Other error messages such as "Connection timed out" may indicate more |
||||
fundamental problems, like lack of network connectivity. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
No pg_hba.conf entry for host 123.123.123.123, user joeblow, database testdb |
||||
</ProgramListing> |
||||
This is what you are most likely to get if you succeed in contacting |
||||
a postmaster, but it doesn't want to talk to you. As the message |
||||
suggests, the postmaster refused the connection request because it |
||||
found no authorizing entry in its pg_hba.conf configuration file. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
Password authentication failed for user 'joeblow' |
||||
</ProgramListing> |
||||
Messages like this indicate that you contacted the postmaster, and it's |
||||
willing to talk to you, but not until you pass the authorization method |
||||
specified in the pg_hba.conf file. Check the password you're providing, |
||||
or check your Kerberos or IDENT software if the complaint mentions |
||||
one of those authentication types. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
FATAL 1: SetUserId: user 'joeblow' is not in 'pg_shadow' |
||||
</ProgramListing> |
||||
This is another variant of authentication failure: no Postgres create_user |
||||
command has been executed for the given username. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
FATAL 1: Database testdb does not exist in pg_database |
||||
</ProgramListing> |
||||
There's no database by that name under the control of this postmaster. |
||||
Note that if you don't specify a database name, it defaults to your |
||||
Postgres username, which may or may not be the right thing. |
||||
</para> |
||||
|
||||
<para> |
||||
<ProgramListing> |
||||
NOTICE: Unrecognized variable client_encoding |
||||
</ProgramListing> |
||||
This isn't an error; in fact, it's quite harmless. You'll see this |
||||
message at startup if you use a client compiled with MULTIBYTE support |
||||
to connect to a server compiled without it. (The client is trying |
||||
to tell the server what character set encoding it wants, but the |
||||
server has no idea what it's talking about.) If the message bothers |
||||
you, use a client compiled with the same options as the server. |
||||
</para> |
||||
|
||||
</sect1> |
||||
|
||||
<sect1> |
||||
<title>Debugging Messages</title> |
||||
|
||||
<para> |
||||
The <Application>postmaster</Application> occasionally prints out |
||||
messages which |
||||
are often helpful during troubleshooting. If you wish |
||||
to view debugging messages from the <Application>postmaster</Application>, |
||||
you can |
||||
start it with the -d option and redirect the output to |
||||
the log file: |
||||
|
||||
<ProgramListing> |
||||
% postmaster -d > pm.log 2>&1 & |
||||
</ProgramListing> |
||||
|
||||
If you do not wish to see these messages, you can type |
||||
<ProgramListing> |
||||
% postmaster -S |
||||
</ProgramListing> |
||||
and the <Application>postmaster</Application> will be "S"ilent. |
||||
No ampersand ("&") is required in this case, since the postmaster |
||||
automatically detaches from the terminal when -S is specified. |
||||
</Para> |
||||
|
||||
<sect2 Id="pg-options-trouble"> |
||||
<Title>pg_options</Title> |
||||
|
||||
<Para> |
||||
<Note> |
||||
<Para> |
||||
Contributed by <ULink url="mailto:dz@cs.unitn.it">Massimo Dal Zotto</ULink> |
||||
</Para> |
||||
</Note> |
||||
</para> |
||||
<Para> |
||||
The optional file <filename>data/pg_options</filename> contains runtime |
||||
options used by the backend to control trace messages and other backend |
||||
tunable parameters. |
||||
What makes this file interesting is the fact that it is re-read by a backend |
||||
when it receives a SIGHUP signal, making thus possible to change run-time |
||||
options on the fly without needing to restart |
||||
<productname>Postgres</productname>. |
||||
The options specified in this file may be debugging flags used by the trace |
||||
package (<filename>backend/utils/misc/trace.c</filename>) or numeric |
||||
parameters which can be used by the backend to control its behaviour. |
||||
New options and parameters must be defined in |
||||
<filename>backend/utils/misc/trace.c</filename> and |
||||
<filename>backend/include/utils/trace.h</filename>. |
||||
</para> |
||||
|
||||
<para> |
||||
pg_options can also be specified with the <option>-T</option> switch of |
||||
<productname>Postgres</productname>: |
||||
|
||||
<programlisting> |
||||
postgres <replaceable>options</replaceable> -T "verbose=2,query,hostlookup-" |
||||
</programlisting> |
||||
</para> |
||||
|
||||
<Para> |
||||
The functions used for printing errors and debug messages can now make use |
||||
of the <citetitle>syslog(2)</citetitle> facility. Message printed to stdout |
||||
or stderr are prefixed by a timestamp containing also the backend pid: |
||||
|
||||
<programlisting> |
||||
#timestamp #pid #message |
||||
980127.17:52:14.173 [29271] StartTransactionCommand |
||||
980127.17:52:14.174 [29271] ProcessUtility: drop table t; |
||||
980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full |
||||
980127.17:52:14.186 [29286] Async_NotifyHandler |
||||
980127.17:52:14.186 [29286] Waking up sleeping backend process |
||||
980127.19:52:14.292 [29286] Async_NotifyFrontEnd |
||||
980127.19:52:14.413 [29286] Async_NotifyFrontEnd done |
||||
980127.19:52:14.466 [29286] Async_NotifyHandler done |
||||
</programlisting> |
||||
</para> |
||||
|
||||
<para> |
||||
This format improves readability of the logs and allows people to understand |
||||
exactly which backend is doing what and at which time. It also makes |
||||
easier to write simple awk or perl scripts which monitor the log to |
||||
detect database errors or problem, or to compute transaction time statistics. |
||||
</para> |
||||
|
||||
<para> |
||||
Messages printed to syslog use the log facility LOG_LOCAL0. |
||||
The use of syslog can be controlled with the syslog pg_option. |
||||
Unfortunately many functions call directly <function>printf()</function> |
||||
to print their messages to stdout or stderr and this output can't be |
||||
redirected to syslog or have timestamps in it. |
||||
It would be advisable that all calls to printf would be replaced with the |
||||
PRINTF macro and output to stderr be changed to use EPRINTF instead so that |
||||
we can control all output in a uniform way. |
||||
</Para> |
||||
|
||||
<para> |
||||
The format of the <filename>pg_options</filename> file is as follows: |
||||
|
||||
<programlisting> |
||||
# <replaceable>comment</replaceable> |
||||
<replaceable>option</replaceable>=<replaceable class="parameter">integer_value</replaceable> # set value for <replaceable>option</replaceable> |
||||
<replaceable>option</replaceable> # set <replaceable>option</replaceable> = 1 |
||||
<replaceable>option</replaceable>+ # set <replaceable>option</replaceable> = 1 |
||||
<replaceable>option</replaceable>- # set <replaceable>option</replaceable> = 0 |
||||
</programlisting> |
||||
|
||||
Note that <replaceable class="parameter">keyword</replaceable> can also be |
||||
an abbreviation of the option name defined in |
||||
<filename>backend/utils/misc/trace.c</filename>. |
||||
</Para> |
||||
|
||||
<Para> |
||||
Refer to <xref linkend="pg-options-title" endterm="pg-options-title"> |
||||
for a complete list of option keywords and possible values. |
||||
</para> |
||||
</sect2> |
||||
</sect1> |
||||
</Chapter> |
||||
|
||||
<!-- Keep this comment at the end of the file |
||||
Local variables: |
||||
mode:sgml |
||||
sgml-omittag:nil |
||||
sgml-shorttag:t |
||||
sgml-minimize-attributes:nil |
||||
sgml-always-quote-attributes:t |
||||
sgml-indent-step:1 |
||||
sgml-indent-data:t |
||||
sgml-parent-document:nil |
||||
sgml-default-dtd-file:"./reference.ced" |
||||
sgml-exposed-tags:nil |
||||
sgml-local-catalogs:("/usr/lib/sgml/catalog") |
||||
sgml-local-ecat-files:nil |
||||
End: |
||||
--> |
@ -0,0 +1,202 @@ |
||||
<Chapter id="user-manag"> |
||||
<title>Database User and Permission Management</title> |
||||
|
||||
<para> |
||||
Managing database users and their privileges is in concept similar |
||||
to that of Unix operating systems, but then again not identical |
||||
enough to not warrant explanation. |
||||
</para> |
||||
|
||||
<sect1> |
||||
<title>Database Users</title> |
||||
|
||||
<para> |
||||
Database users are conceptually completely separate from any |
||||
operating system users. In practice it might be convenient to |
||||
maintain a correspondence, but this is not required. Database user |
||||
names are global across a database cluster installation (and not |
||||
per individual database). To create a user use the <command>CREATE |
||||
USER</command> SQL command: |
||||
<synopsis> |
||||
CREATE USER <replaceable>name</replaceable> |
||||
</synopsis> |
||||
<replaceable>name</replaceable> follows the rules for SQL |
||||
identifiers: either unadorned without special characters, or |
||||
double-quoted. To remove an existing user, use the analog |
||||
<command>DROP USER</command> command. |
||||
</para> |
||||
|
||||
<para> |
||||
For convenience, the shell scripts <filename>createuser</filename> |
||||
and <filename>dropuser</filename> are wrappers around these SQL |
||||
commands. |
||||
</para> |
||||
|
||||
<para> |
||||
In order to bootstrap the database system, a freshly initialized |
||||
system always contains one predefined user. This user will have |
||||
the same name as the operating system user that initialized the |
||||
area (and is presumably being used as the user that runs the |
||||
server). Thus, often an initial user <quote>postgres</quote> |
||||
exists. In order to create more users you have to first connect as |
||||
this initial user. |
||||
</para> |
||||
|
||||
<para> |
||||
The user name to use for a particular database connection is |
||||
indicated by the client that is initiating the connection request |
||||
in an application-specific fashion. For example, the |
||||
<command>psql</command> program uses the <option>-U</option> |
||||
command line option to indicate the user to connect as. The set of |
||||
database users a given client connection may connect as is |
||||
determined by the client authentication setup, as explained in |
||||
<xref linkend="client-authentication">. (Thus, a client is not |
||||
necessarily limited to connect as the user with the same name as |
||||
its operating system user in the same way a person is not |
||||
constrained in its login name by her real name.) |
||||
</para> |
||||
|
||||
<sect2> |
||||
<title>User attributes</title> |
||||
|
||||
<para> |
||||
A database user may have a number of attributes that define its |
||||
privileges and interact with the client authentication system. |
||||
|
||||
<variablelist> |
||||
<varlistentry> |
||||
<term>superuser</term> |
||||
<listitem> |
||||
<para> |
||||
A database superuser bypasses all permission checks. Also, |
||||
only a superuser can create new users. To create a database |
||||
superuser, use <literal>CREATE USER name |
||||
CREATEUSER</literal>. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>database creation</term> |
||||
<listitem> |
||||
<para> |
||||
A user must be explicitly given permission to create databases |
||||
(except for superusers, since those bypass all permission |
||||
checks). To create such a user, use <literal>CREATE USER name |
||||
CREATEDB</literal>. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
|
||||
<varlistentry> |
||||
<term>password</term> |
||||
<listitem> |
||||
<para> |
||||
A password is only significant if password authentication is |
||||
used for client authentication. Database passwords a separate |
||||
from any operating system passwords. Specify a password upon |
||||
user creating as in <literal>CREATE USER name WITH PASSWORD |
||||
'string'</literal>. |
||||
</para> |
||||
</listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
|
||||
See the reference pages for <command>CREATE USER</command> and |
||||
<command>ALTER USER</command> for details. |
||||
</para> |
||||
</sect2> |
||||
</sect1> |
||||
|
||||
<sect1> |
||||
<title>Groups</title> |
||||
|
||||
<para> |
||||
As in Unix, groups are a way of logically grouping users. To create |
||||
a group, use |
||||
<synopsis> |
||||
CREATE GROUP <replaceable>name</replaceable> |
||||
</synopsis> |
||||
To add users to or remove users from a group, respectively, user |
||||
<synopsis> |
||||
ALTER GROUP <replaceable>name</replaceable> ADD USER <replaceable>uname1</replaceable>, ... |
||||
ALTER GROUP <replaceable>name</replaceable> DROP USER <replaceable>uname1</replaceable>, ... |
||||
</synopsis> |
||||
</para> |
||||
</sect1> |
||||
|
||||
<sect1> |
||||
<title>Privileges</title> |
||||
|
||||
<para> |
||||
When a database object is created, it is assigned an owner. The |
||||
owner is the user that executed the creation statement. There is |
||||
currenty no polished interface for changing the owner of a database |
||||
object. By default, only an owner (or a superuser) can do anything |
||||
with the object. In order to allow other users to use it, |
||||
<firstterm>privileges</firstterm> must be granted. |
||||
</para> |
||||
|
||||
<para> |
||||
Currently, there are four different privileges: select (read), |
||||
insert (append), and update/delete (write), as well as |
||||
<literal>RULE</literal>, the permission to create a rewrite rule on |
||||
a table. The right to modify or destroy an object is always the |
||||
privilege of the owner only. To assign privileges, the |
||||
<command>GRANT</command> command is used. So, if |
||||
<literal>joe</literal> is an existing user, and |
||||
<literal>accounts</literal> is an existing table, write access can |
||||
be granted with |
||||
<programlisting> |
||||
GRANT UPDATE ON accounts TO joe; |
||||
</programlisting> |
||||
The user executing this command must be the owner of the table. To |
||||
grant a privilege to a group, use |
||||
<programlisting> |
||||
GRANT SELECT ON accounts TO GROUP staff; |
||||
</programlisting> |
||||
The special <quote>user</quote> name <literal>PUBLIC</literal> can |
||||
be used to grant a privilege to every user on the system. Using |
||||
<literal>ALL</literal> in place of a privilege specifies that all |
||||
privileges will be granted. |
||||
</para> |
||||
|
||||
<para> |
||||
To revoke a privilege, use the fittingly named |
||||
<command>REVOKE</command> command: |
||||
<programlisting> |
||||
REVOKE ALL ON accounts FROM PUBLIC; |
||||
</programlisting> |
||||
The set of privileges held by the table owner is always implicit |
||||
and is never revokable. |
||||
</para> |
||||
</sect1> |
||||
|
||||
<sect1> |
||||
<title>Functions and Triggers</title> |
||||
|
||||
<para> |
||||
Functions and triggers allow users to insert code into the backend |
||||
server that other users may execute without knowing it. Hence, both |
||||
mechanisms permit users to <firstterm>trojan horse</firstterm> |
||||
others with relative impunity. The only real protection is tight |
||||
control over who can define functions (e.g., write to relations |
||||
with SQL fields) and triggers. Audit trails and alerters on the |
||||
system catalogs <literal>pg_class</literal>, |
||||
<literal>pg_user</literal> and <literal>pg_group</literal> are also |
||||
possible. |
||||
</para> |
||||
|
||||
<para> |
||||
Functions written in any language except SQL run inside the backend |
||||
server process with the operating systems permissions of the |
||||
database server daemon process. It is possible to change the |
||||
server's internal data structures from inside of trusted functions. |
||||
Hence, among many other things, such functions can circumvent any |
||||
system access controls. This is an inherent problem with |
||||
user-defined C functions. |
||||
</para> |
||||
|
||||
</sect1> |
||||
|
||||
</Chapter> |
Loading…
Reference in new issue