mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
1472 lines
57 KiB
Plaintext
1472 lines
57 KiB
Plaintext
<!-- $PostgreSQL: pgsql/doc/src/sgml/client-auth.sgml,v 1.127 2010/01/26 06:45:31 petere Exp $ -->
|
|
|
|
<chapter id="client-authentication">
|
|
<title>Client Authentication</title>
|
|
|
|
<indexterm zone="client-authentication">
|
|
<primary>client authentication</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
When a client application connects to the database server, it
|
|
specifies which <productname>PostgreSQL</productname> database user name it
|
|
wants to connect as, much the same way one logs into a Unix computer
|
|
as a particular user. Within the SQL environment the active database
|
|
user name determines access privileges to database objects — see
|
|
<xref linkend="user-manag"> for more information. Therefore, it is
|
|
essential to restrict which database users can connect.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
As explained in <xref linkend="user-manag">,
|
|
<productname>PostgreSQL</productname> actually does privilege
|
|
management in terms of <quote>roles</>. In this chapter, we
|
|
consistently use <firstterm>database user</> to mean <quote>role with the
|
|
<literal>LOGIN</> privilege</quote>.
|
|
</para>
|
|
</note>
|
|
|
|
<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
|
|
who runs the client application) is permitted to connect with the
|
|
database user name that was requested.
|
|
</para>
|
|
|
|
<para>
|
|
<productname>PostgreSQL</productname> offers a number of different
|
|
client authentication methods. The method used to authenticate a
|
|
particular client connection can be selected on the basis of
|
|
(client) host address, database, and user.
|
|
</para>
|
|
|
|
<para>
|
|
<productname>PostgreSQL</productname> database user names are logically
|
|
separate from user names of the operating system in which the server
|
|
runs. If all the users of a particular server also have accounts on
|
|
the server's machine, it makes sense to assign database user names
|
|
that match their operating system user names. However, a server that
|
|
accepts remote connections might have many database users who have no local operating system
|
|
account, and in such cases there need be no connection between
|
|
database user names and OS user names.
|
|
</para>
|
|
|
|
<sect1 id="auth-pg-hba-conf">
|
|
<title>The <filename>pg_hba.conf</filename> file</title>
|
|
|
|
<indexterm zone="auth-pg-hba-conf">
|
|
<primary>pg_hba.conf</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
Client authentication is controlled by a configuration file,
|
|
which traditionally is named
|
|
<filename>pg_hba.conf</filename> and is stored in the database
|
|
cluster's data directory.
|
|
(<acronym>HBA</> stands for host-based authentication.) A default
|
|
<filename>pg_hba.conf</filename> file is installed when the data
|
|
directory is initialized by <command>initdb</command>. It is
|
|
possible to place the authentication configuration file elsewhere,
|
|
however; see the <xref linkend="guc-hba-file"> configuration parameter.
|
|
</para>
|
|
|
|
<para>
|
|
The general format of the <filename>pg_hba.conf</filename> file is
|
|
a set of records, one per line. Blank lines are ignored, as is any
|
|
text after the <literal>#</literal> comment character. A record is made
|
|
up of a number of fields which are separated by spaces and/or tabs.
|
|
Fields can contain white space if the field value is quoted. Records
|
|
cannot be continued across lines.
|
|
</para>
|
|
|
|
<para>
|
|
Each record specifies a connection type, a client IP address range
|
|
(if relevant for the connection type), a database name, a user name,
|
|
and the authentication method to be used for connections matching
|
|
these parameters. The first record with a matching connection type,
|
|
client address, requested database, and user name is used to perform
|
|
authentication. There is no <quote>fall-through</> or
|
|
<quote>backup</>: if one record is chosen and the authentication
|
|
fails, subsequent records are not considered. If no record matches,
|
|
access is denied.
|
|
</para>
|
|
|
|
<para>
|
|
A record can have one of the seven formats
|
|
<synopsis>
|
|
local <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-options</replaceable></optional>
|
|
host <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>CIDR-address</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-options</replaceable></optional>
|
|
hostssl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>CIDR-address</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-options</replaceable></optional>
|
|
hostnossl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>CIDR-address</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-options</replaceable></optional>
|
|
host <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>IP-address</replaceable> <replaceable>IP-mask</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-options</replaceable></optional>
|
|
hostssl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>IP-address</replaceable> <replaceable>IP-mask</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-options</replaceable></optional>
|
|
hostnossl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>IP-address</replaceable> <replaceable>IP-mask</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-options</replaceable></optional>
|
|
</synopsis>
|
|
The meaning of the fields is as follows:
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>local</literal></term>
|
|
<listitem>
|
|
<para>
|
|
This record matches connection attempts using Unix-domain
|
|
sockets. Without a record of this type, Unix-domain socket
|
|
connections are disallowed.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>host</literal></term>
|
|
<listitem>
|
|
<para>
|
|
This record matches connection attempts made using TCP/IP.
|
|
<literal>host</literal> records match either
|
|
<acronym>SSL</acronym> or non-<acronym>SSL</acronym> connection
|
|
attempts.
|
|
</para>
|
|
<note>
|
|
<para>
|
|
Remote TCP/IP connections will not be possible unless
|
|
the server is started with an appropriate value for the
|
|
<xref linkend="guc-listen-addresses"> configuration parameter,
|
|
since the default behavior is to listen for TCP/IP connections
|
|
only on the local loopback address <literal>localhost</>.
|
|
</para>
|
|
</note>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>hostssl</literal></term>
|
|
<listitem>
|
|
<para>
|
|
This record matches connection attempts made using TCP/IP,
|
|
but only when the connection is made with <acronym>SSL</acronym>
|
|
encryption.
|
|
</para>
|
|
|
|
<para>
|
|
To make use of this option the server must be built with
|
|
<acronym>SSL</acronym> support. Furthermore,
|
|
<acronym>SSL</acronym> must be enabled at server start time
|
|
by setting the <xref linkend="guc-ssl"> configuration parameter (see
|
|
<xref linkend="ssl-tcp"> for more information).
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>hostnossl</literal></term>
|
|
<listitem>
|
|
<para>
|
|
This record type has the opposite logic to <literal>hostssl</>:
|
|
it only matches connection attempts made over
|
|
TCP/IP that do not use <acronym>SSL</acronym>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>database</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specifies which database name(s) this record matches. The value
|
|
<literal>all</literal> specifies that it matches all databases.
|
|
The value <literal>sameuser</> specifies that the record
|
|
matches if the requested database has the same name as the
|
|
requested user. The value <literal>samerole</> specifies that
|
|
the requested user must be a member of the role with the same
|
|
name as the requested database. (<literal>samegroup</> is an
|
|
obsolete but still accepted spelling of <literal>samerole</>.)
|
|
The value <literal>replication</> specifies that the record
|
|
matches if streaming replication is requested.
|
|
Otherwise, this is the name of
|
|
a specific <productname>PostgreSQL</productname> database.
|
|
Multiple database names can be supplied by separating them with
|
|
commas. A separate file containing database names can be specified by
|
|
preceding the file name with <literal>@</>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>user</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specifies which database user name(s) this record
|
|
matches. The value <literal>all</literal> specifies that it
|
|
matches all users. Otherwise, this is either the name of a specific
|
|
database user, or a group name preceded by <literal>+</>.
|
|
(Recall that there is no real distinction between users and groups
|
|
in <productname>PostgreSQL</>; a <literal>+</> mark really means
|
|
<quote>match any of the roles that are directly or indirectly members
|
|
of this role</>, while a name without a <literal>+</> mark matches
|
|
only that specific role.)
|
|
Multiple user names can be supplied by separating them with commas.
|
|
A separate file containing user names can be specified by preceding the
|
|
file name with <literal>@</>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>CIDR-address</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specifies the client machine IP address range that this record
|
|
matches. This field contains an IP address in standard dotted decimal
|
|
notation and a CIDR mask length. (IP addresses can only be
|
|
specified numerically, not as domain or host names.) The mask
|
|
length indicates the number of high-order bits of the client
|
|
IP address that must match. Bits to the right of this must
|
|
be zero in the given IP address.
|
|
There must not be any white space between the IP address, the
|
|
<literal>/</literal>, and the CIDR mask length.
|
|
</para>
|
|
|
|
<para>
|
|
Instead of a <replaceable>CIDR-address</replaceable>, you can write
|
|
<literal>samehost</literal> to match any of the server's own IP
|
|
addresses, or <literal>samenet</literal> to match any address in any
|
|
subnet that the server is directly connected to.
|
|
</para>
|
|
|
|
<para>
|
|
Typical examples of a <replaceable>CIDR-address</replaceable> are
|
|
<literal>172.20.143.89/32</literal> for a single host, or
|
|
<literal>172.20.143.0/24</literal> for a small network, or
|
|
<literal>10.6.0.0/16</literal> for a larger one.
|
|
To specify a single host, use a CIDR mask of 32 for IPv4 or
|
|
128 for IPv6. In a network address, do not omit trailing zeroes.
|
|
</para>
|
|
|
|
<para>
|
|
An IP address given in IPv4 format will match IPv6 connections that
|
|
have the corresponding address, for example <literal>127.0.0.1</>
|
|
will match the IPv6 address <literal>::ffff:127.0.0.1</>. An entry
|
|
given in IPv6 format will match only IPv6 connections, even if the
|
|
represented address is in the IPv4-in-IPv6 range. Note that entries
|
|
in IPv6 format will be rejected if the system's C library does not have
|
|
support for IPv6 addresses.
|
|
</para>
|
|
|
|
<para>
|
|
This field only applies to <literal>host</literal>,
|
|
<literal>hostssl</literal>, and <literal>hostnossl</> records.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>IP-address</replaceable></term>
|
|
<term><replaceable>IP-mask</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
These fields can be used as an alternative to the
|
|
<replaceable>CIDR-address</replaceable> notation. Instead of
|
|
specifying the mask length, the actual mask is specified in a
|
|
separate column. For example, <literal>255.0.0.0</> represents an IPv4
|
|
CIDR mask length of 8, and <literal>255.255.255.255</> represents a
|
|
CIDR mask length of 32.
|
|
</para>
|
|
|
|
<para>
|
|
These fields only apply to <literal>host</literal>,
|
|
<literal>hostssl</literal>, and <literal>hostnossl</> records.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>auth-method</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specifies the authentication method to use when a connection matches
|
|
this record. The possible choices are summarized here; details
|
|
are in <xref linkend="auth-methods">.
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>trust</></term>
|
|
<listitem>
|
|
<para>
|
|
Allow the connection unconditionally. This method
|
|
allows anyone that can connect to the
|
|
<productname>PostgreSQL</productname> database server to login as
|
|
any <productname>PostgreSQL</productname> user they like,
|
|
without the need for a password. See <xref
|
|
linkend="auth-trust"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>reject</></term>
|
|
<listitem>
|
|
<para>
|
|
Reject the connection unconditionally. This is useful for
|
|
<quote>filtering out</> certain hosts from a group.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>md5</></term>
|
|
<listitem>
|
|
<para>
|
|
Require the client to supply an MD5-encrypted password for
|
|
authentication.
|
|
See <xref linkend="auth-password"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>password</></term>
|
|
<listitem>
|
|
<para>
|
|
Require the client to supply an unencrypted password for
|
|
authentication.
|
|
Since the password is sent in clear text over the
|
|
network, this should not be used on untrusted networks.
|
|
See <xref linkend="auth-password"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>gss</></term>
|
|
<listitem>
|
|
<para>
|
|
Use GSSAPI to authenticate the user. This is only
|
|
available for TCP/IP connections. See <xref
|
|
linkend="gssapi-auth"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>sspi</></term>
|
|
<listitem>
|
|
<para>
|
|
Use SSPI to authenticate the user. This is only
|
|
available on Windows. See <xref
|
|
linkend="sspi-auth"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>krb5</></term>
|
|
<listitem>
|
|
<para>
|
|
Use Kerberos V5 to authenticate the user. This is only
|
|
available for TCP/IP connections. See <xref
|
|
linkend="kerberos-auth"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>ident</></term>
|
|
<listitem>
|
|
<para>
|
|
Obtain the operating system user name of the client (for
|
|
TCP/IP connections by contacting the ident server on the
|
|
client, for local connections by getting it from the
|
|
operating system) and check if it matches the requested
|
|
database user name.
|
|
See <xref linkend="auth-ident"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>ldap</></term>
|
|
<listitem>
|
|
<para>
|
|
Authenticate using an LDAP server. See <xref
|
|
linkend="auth-ldap"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>cert</></term>
|
|
<listitem>
|
|
<para>
|
|
Authenticate using SSL client certificates. See
|
|
<xref linkend="auth-cert"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>pam</></term>
|
|
<listitem>
|
|
<para>
|
|
Authenticate using the Pluggable Authentication Modules
|
|
(PAM) service provided by the operating system. See <xref
|
|
linkend="auth-pam"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>auth-options</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
After the <replaceable>auth-method</> field, there can be field(s) of
|
|
the form <replaceable>name</><literal>=</><replaceable>value</> that
|
|
specify options for the authentication method. Details about which
|
|
options are available for which authentication method appear below.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<para>
|
|
Files included by <literal>@</> constructs are read as lists of names,
|
|
which can be separated by either whitespace or commas. Comments are
|
|
introduced by <literal>#</literal>, just as in
|
|
<filename>pg_hba.conf</filename>, and nested <literal>@</> constructs are
|
|
allowed. Unless the file name following <literal>@</> is an absolute
|
|
path, it is taken to be relative to the directory containing the
|
|
referencing file.
|
|
</para>
|
|
|
|
<para>
|
|
Since the <filename>pg_hba.conf</filename> records are examined
|
|
sequentially for each connection attempt, the order of the records is
|
|
significant. Typically, earlier records will have tight connection
|
|
match parameters and weaker authentication methods, while later
|
|
records will have looser match parameters and stronger authentication
|
|
methods. For example, one might wish to use <literal>trust</>
|
|
authentication for local TCP/IP connections but require a password for
|
|
remote TCP/IP connections. In this case a record specifying
|
|
<literal>trust</> authentication for connections from 127.0.0.1 would
|
|
appear before a record specifying password authentication for a wider
|
|
range of allowed client IP addresses.
|
|
</para>
|
|
|
|
<para>
|
|
The <filename>pg_hba.conf</filename> file is read on start-up and when
|
|
the main server process receives a
|
|
<systemitem>SIGHUP</systemitem><indexterm><primary>SIGHUP</primary></indexterm>
|
|
signal. If you edit the file on an
|
|
active system, you will need to signal the server
|
|
(using <literal>pg_ctl reload</> or <literal>kill -HUP</>) to make it
|
|
re-read the file.
|
|
</para>
|
|
|
|
<tip>
|
|
<para>
|
|
To connect to a particular database, a user must not only pass the
|
|
<filename>pg_hba.conf</filename> checks, but must have the
|
|
<literal>CONNECT</> privilege for the database. If you wish to
|
|
restrict which users can connect to which databases, it's usually
|
|
easier to control this by granting/revoking <literal>CONNECT</> privilege
|
|
than to put the rules into <filename>pg_hba.conf</filename> entries.
|
|
</para>
|
|
</tip>
|
|
|
|
<para>
|
|
Some examples of <filename>pg_hba.conf</filename> entries are shown in
|
|
<xref linkend="example-pg-hba.conf">. See the next section for details on the
|
|
different authentication methods.
|
|
</para>
|
|
|
|
<example id="example-pg-hba.conf">
|
|
<title>Example <filename>pg_hba.conf</filename> entries</title>
|
|
<programlisting>
|
|
# Allow any user on the local system to connect to any database under
|
|
# any database user name using Unix-domain sockets (the default for local
|
|
# connections).
|
|
#
|
|
# TYPE DATABASE USER CIDR-ADDRESS METHOD
|
|
local all all trust
|
|
|
|
# The same using local loopback TCP/IP connections.
|
|
#
|
|
# TYPE DATABASE USER CIDR-ADDRESS METHOD
|
|
host all all 127.0.0.1/32 trust
|
|
|
|
# The same as the previous line, but using a separate netmask column
|
|
#
|
|
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
|
|
host all all 127.0.0.1 255.255.255.255 trust
|
|
|
|
# Allow any user from any host with IP address 192.168.93.x to connect
|
|
# to database "postgres" as the same user name that ident reports for
|
|
# the connection (typically the Unix user name).
|
|
#
|
|
# TYPE DATABASE USER CIDR-ADDRESS METHOD
|
|
host postgres all 192.168.93.0/24 ident
|
|
|
|
# Allow any user from host 192.168.12.10 to connect to database
|
|
# "postgres" if the user's password is correctly supplied.
|
|
#
|
|
# TYPE DATABASE USER CIDR-ADDRESS METHOD
|
|
host postgres all 192.168.12.10/32 md5
|
|
|
|
# In the absence of preceding "host" lines, these two lines will
|
|
# reject all connections from 192.168.54.1 (since that entry will be
|
|
# matched first), but allow Kerberos 5 connections from anywhere else
|
|
# on the Internet. The zero mask means that no bits of the host IP
|
|
# address are considered so it matches any host.
|
|
#
|
|
# TYPE DATABASE USER CIDR-ADDRESS METHOD
|
|
host all all 192.168.54.1/32 reject
|
|
host all all 0.0.0.0/0 krb5
|
|
|
|
# Allow users from 192.168.x.x hosts to connect to any database, if
|
|
# they pass the ident check. If, for example, ident says the user is
|
|
# "bryanh" and he requests to connect as PostgreSQL user "guest1", the
|
|
# connection is allowed if there is an entry in pg_ident.conf for map
|
|
# "omicron" that says "bryanh" is allowed to connect as "guest1".
|
|
#
|
|
# TYPE DATABASE USER CIDR-ADDRESS METHOD
|
|
host all all 192.168.0.0/16 ident map=omicron
|
|
|
|
# If these are the only three lines for local connections, they will
|
|
# allow local users to connect only to their own databases (databases
|
|
# with the same name as their database user name) except for administrators
|
|
# and members of role "support", who can connect to all databases. The file
|
|
# $PGDATA/admins contains a list of names of administrators. Passwords
|
|
# are required in all cases.
|
|
#
|
|
# TYPE DATABASE USER CIDR-ADDRESS METHOD
|
|
local sameuser all md5
|
|
local all @admins md5
|
|
local all +support md5
|
|
|
|
# The last two lines above can be combined into a single line:
|
|
local all @admins,+support md5
|
|
|
|
# The database column can also use lists and file names:
|
|
local db1,db2,@demodbs all md5
|
|
</programlisting>
|
|
</example>
|
|
</sect1>
|
|
|
|
<sect1 id="auth-username-maps">
|
|
<title>Username maps</title>
|
|
|
|
<indexterm zone="auth-username-maps">
|
|
<primary>Username maps</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
When using an external authentication system like Ident or GSSAPI,
|
|
the name of the operating system user that initiated the connection
|
|
might not be the same as the database user he needs to connect as.
|
|
In this case, a user name map can be applied to map the operating system
|
|
username to a database user. To use username mapping, specify
|
|
<literal>map</literal>=<replaceable>map-name</replaceable>
|
|
in the options field in <filename>pg_hba.conf</filename>. This option is
|
|
supported for all authentication methods that receive external usernames.
|
|
Since different mappings might be needed for different connections,
|
|
the name of the map to be used is specified in the
|
|
<replaceable>map-name</replaceable> parameter in <filename>pg_hba.conf</filename>
|
|
to indicate which map to use for each individual connection.
|
|
</para>
|
|
|
|
<para>
|
|
Username maps are defined in the ident map file, which by default is named
|
|
<filename>pg_ident.conf</><indexterm><primary>pg_ident.conf</primary></indexterm>
|
|
and is stored in the
|
|
cluster's data directory. (It is possible to place the map file
|
|
elsewhere, however; see the <xref linkend="guc-ident-file">
|
|
configuration parameter.)
|
|
The ident map file contains lines of the general form:
|
|
<synopsis>
|
|
<replaceable>map-name</> <replaceable>system-username</> <replaceable>database-username</>
|
|
</synopsis>
|
|
Comments and whitespace are handled in the same way as in
|
|
<filename>pg_hba.conf</>. 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 an operating system user name and a matching
|
|
database user name. The same <replaceable>map-name</> can be
|
|
used repeatedly to specify multiple user-mappings within a single map.
|
|
</para>
|
|
<para>
|
|
There is no restriction regarding how many database users a given
|
|
operating system user can correspond to, nor vice versa. Thus, entries
|
|
in a map should be thought of as meaning <quote>this operating system
|
|
user is allowed to connect as this database user</quote>, rather than
|
|
implying that they are equivalent. The connection will be allowed if
|
|
there is any map entry that matches the user name obtained from the
|
|
external authentication system to the database user name that the
|
|
user has requested to connect as.
|
|
</para>
|
|
<para>
|
|
If the <replaceable>system-username</> field starts with a slash (<literal>/</>),
|
|
the remainder of the field is treated as a regular expression.
|
|
(See <xref linkend="posix-syntax-details"> for details of
|
|
<productname>PostgreSQL</>'s regular expression syntax.
|
|
Regular expressions in username maps are always treated as being
|
|
<quote>advanced</> flavor.) The regular
|
|
expression can include a single capture, or parenthesized subexpression,
|
|
which can then be referenced in the <replaceable>database-username</>
|
|
field as <literal>\1</> (backslash-one). This allows the mapping of
|
|
multiple usernames in a single line, which is particularly useful for
|
|
simple syntax substitutions. For example, these entries
|
|
<programlisting>
|
|
mymap /^(.*)@mydomain\.com$ \1
|
|
mymap /^(.*)@otherdomain\.com$ guest
|
|
</programlisting>
|
|
will remove the domain part for users with system usernames that end with
|
|
<literal>@mydomain.com</>, and allow any user whose system name ends with
|
|
<literal>@otherdomain.com</> to log in as <literal>guest</>.
|
|
</para>
|
|
|
|
<tip>
|
|
<para>
|
|
Keep in mind that by default, a regular expression can match just part of
|
|
a string. It's usually wise to use <literal>^</> and <literal>$</>, as
|
|
shown in the above example, to force the match to be to the entire
|
|
system username.
|
|
</para>
|
|
</tip>
|
|
|
|
<para>
|
|
The <filename>pg_ident.conf</filename> file is read on start-up and
|
|
when the main server process receives a
|
|
<systemitem>SIGHUP</systemitem><indexterm><primary>SIGHUP</primary></indexterm>
|
|
signal. If you edit the file on an
|
|
active system, you will need to signal the server
|
|
(using <literal>pg_ctl reload</> or <literal>kill -HUP</>) to make it
|
|
re-read the file.
|
|
</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 this example setup, anyone
|
|
logged in to a machine on the 192.168 network that does not have the
|
|
Unix user name <literal>bryanh</>, <literal>ann</>, or
|
|
<literal>robert</> would not be granted access. Unix user
|
|
<literal>robert</> would only be allowed access when he tries to
|
|
connect as <productname>PostgreSQL</> user <literal>bob</>, not
|
|
as <literal>robert</> or anyone else. <literal>ann</> would
|
|
only be allowed to connect as <literal>ann</>. User
|
|
<literal>bryanh</> would be allowed to connect as either
|
|
<literal>bryanh</> himself or as <literal>guest1</>.
|
|
</para>
|
|
|
|
<example id="example-pg-ident.conf">
|
|
<title>An example <filename>pg_ident.conf</> file</title>
|
|
<programlisting>
|
|
# MAPNAME SYSTEM-USERNAME PG-USERNAME
|
|
|
|
omicron bryanh bryanh
|
|
omicron ann ann
|
|
# bob has user name robert on these machines
|
|
omicron robert bob
|
|
# bryanh can also connect as guest1
|
|
omicron bryanh guest1
|
|
</programlisting>
|
|
</example>
|
|
</sect1>
|
|
|
|
<sect1 id="auth-methods">
|
|
<title>Authentication methods</title>
|
|
<para>
|
|
The following subsections describe the authentication methods in more detail.
|
|
</para>
|
|
|
|
<sect2 id="auth-trust">
|
|
<title>Trust authentication</title>
|
|
|
|
<para>
|
|
When <literal>trust</> authentication is specified,
|
|
<productname>PostgreSQL</productname> assumes that anyone who can
|
|
connect to the server is authorized to access the database with
|
|
whatever database user name they specify (even superuser names).
|
|
Of course, restrictions made in the <literal>database</> and
|
|
<literal>user</> columns still apply.
|
|
This method should only be used when there is adequate
|
|
operating-system-level protection on connections to the server.
|
|
</para>
|
|
|
|
<para>
|
|
<literal>trust</> authentication is appropriate and very
|
|
convenient for local connections on a single-user workstation. It
|
|
is usually <emphasis>not</> appropriate by itself on a multiuser
|
|
machine. However, you might be able to use <literal>trust</> even
|
|
on a multiuser machine, if you restrict access to the server's
|
|
Unix-domain socket file using file-system permissions. To do this, set the
|
|
<varname>unix_socket_permissions</varname> (and possibly
|
|
<varname>unix_socket_group</varname>) configuration parameters as
|
|
described in <xref linkend="runtime-config-connection">. Or you
|
|
could set the <varname>unix_socket_directory</varname>
|
|
configuration parameter to place the socket file in a suitably
|
|
restricted directory.
|
|
</para>
|
|
|
|
<para>
|
|
Setting file-system permissions only helps for Unix-socket connections.
|
|
Local TCP/IP connections are not restricted by file-system permissions.
|
|
Therefore, if you want to use file-system permissions for local security,
|
|
remove the <literal>host ... 127.0.0.1 ...</> line from
|
|
<filename>pg_hba.conf</>, or change it to a
|
|
non-<literal>trust</> authentication method.
|
|
</para>
|
|
|
|
<para>
|
|
<literal>trust</> authentication is only suitable for TCP/IP connections
|
|
if you trust every user on every machine that is allowed to connect
|
|
to the server by the <filename>pg_hba.conf</> lines that specify
|
|
<literal>trust</>. It is seldom reasonable to use <literal>trust</>
|
|
for any TCP/IP connections other than those from <systemitem>localhost</> (127.0.0.1).
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="auth-password">
|
|
<title>Password authentication</title>
|
|
|
|
<indexterm>
|
|
<primary>MD5</>
|
|
</indexterm>
|
|
<indexterm>
|
|
<primary>password</primary>
|
|
<secondary>authentication</secondary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
The password-based authentication methods are <literal>md5</>
|
|
and <literal>password</>. These methods operate
|
|
similarly except for the way that the password is sent across the
|
|
connection: respectively, MD5-hashed and clear-text.
|
|
</para>
|
|
|
|
<para>
|
|
If you are at all concerned about password
|
|
<quote>sniffing</> attacks then <literal>md5</> is preferred.
|
|
Plain <literal>password</> should always be avoided if possible.
|
|
However, <literal>md5</> cannot be used with the <xref
|
|
linkend="guc-db-user-namespace"> feature. If the connection is
|
|
protected by SSL encryption then <literal>password</> can be used
|
|
safely (though SSL certificate authentication might be a better
|
|
choice if one is depending on using SSL).
|
|
</para>
|
|
|
|
<para>
|
|
<productname>PostgreSQL</productname> database passwords are
|
|
separate from operating system user passwords. The password for
|
|
each database user is stored in the <literal>pg_authid</> system
|
|
catalog. Passwords can be managed with the SQL commands
|
|
<xref linkend="sql-createuser" endterm="sql-createuser-title"> and
|
|
<xref linkend="sql-alteruser" endterm="sql-alteruser-title">,
|
|
e.g., <userinput>CREATE USER foo WITH PASSWORD 'secret';</userinput>.
|
|
By default, that is, if no password has been set up, the stored password
|
|
is null and password authentication will always fail for that user.
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="gssapi-auth">
|
|
<title>GSSAPI authentication</title>
|
|
|
|
<indexterm zone="gssapi-auth">
|
|
<primary>GSSAPI</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
<productname>GSSAPI</productname> is an industry-standard protocol
|
|
for secure authentication defined in RFC 2743.
|
|
<productname>PostgreSQL</productname> supports
|
|
<productname>GSSAPI</productname> with <productname>Kerberos</productname>
|
|
authentication according to RFC 1964. <productname>GSSAPI</productname>
|
|
provides automatic authentication (single sign-on) for systems
|
|
that support it. The authentication itself is secure, but the
|
|
data sent over the database connection will be in clear unless
|
|
<acronym>SSL</acronym> is used.
|
|
</para>
|
|
|
|
<para>
|
|
When <productname>GSSAPI</productname> uses
|
|
<productname>Kerberos</productname>, it uses a standard principal
|
|
in the format
|
|
<literal><replaceable>servicename</>/<replaceable>hostname</>@<replaceable>realm</></literal>. For information about the parts of the principal, and
|
|
how to set up the required keys, see <xref linkend="kerberos-auth">.
|
|
GSSAPI support has to be enabled when <productname>PostgreSQL</> is built;
|
|
see <xref linkend="installation"> for more information.
|
|
</para>
|
|
|
|
<para>
|
|
The following configuration options are supported for <productname>GSSAPI</productname>:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>map</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Allows for mapping between system and database usernames. See
|
|
<xref linkend="auth-username-maps"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>include_realm</literal></term>
|
|
<listitem>
|
|
<para>
|
|
If set to <literal>1</>, the realm name from the authenticated user
|
|
principal is included in the system user name that's passed through
|
|
username mapping (<xref linkend="auth-username-maps">). This is
|
|
useful for handling users from multiple realms.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>krb_realm</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Sets the realm to match user principal names against. If this parameter
|
|
is set, only users of that realm will be accepted. If it is not set,
|
|
users of any realm can connect, subject to whatever username mapping
|
|
is done.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="sspi-auth">
|
|
<title>SSPI authentication</title>
|
|
|
|
<indexterm zone="sspi-auth">
|
|
<primary>SSPI</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
<productname>SSPI</productname> is a <productname>Windows</productname>
|
|
technology for secure authentication with single sign-on.
|
|
<productname>PostgreSQL</productname> will use SSPI in
|
|
<literal>negotiate</literal> mode, which will use
|
|
<productname>Kerberos</productname> when possible and automatically
|
|
fall back to <productname>NTLM</productname> in other cases.
|
|
<productname>SSPI</productname> authentication only works when both
|
|
server and client are running <productname>Windows</productname>.
|
|
</para>
|
|
|
|
<para>
|
|
When using <productname>Kerberos</productname> authentication,
|
|
<productname>SSPI</productname> works the same way
|
|
<productname>GSSAPI</productname> does. See <xref linkend="gssapi-auth">
|
|
for details.
|
|
</para>
|
|
|
|
<para>
|
|
The following configuration options are supported for <productname>SSPI</productname>:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>map</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Allows for mapping between system and database usernames. See
|
|
<xref linkend="auth-username-maps"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>include_realm</literal></term>
|
|
<listitem>
|
|
<para>
|
|
If set to <literal>1</>, the realm name from the authenticated user
|
|
principal is included in the system user name that's passed through
|
|
username mapping (<xref linkend="auth-username-maps">). This is
|
|
useful for handling users from multiple realms.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>krb_realm</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Sets the realm to match user principal names against. If this parameter
|
|
is set, only users of that realm will be accepted. If it is not set,
|
|
users of any realm can connect, subject to whatever username mapping
|
|
is done.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="kerberos-auth">
|
|
<title>Kerberos authentication</title>
|
|
|
|
<indexterm zone="kerberos-auth">
|
|
<primary>Kerberos</primary>
|
|
</indexterm>
|
|
|
|
<note>
|
|
<para>
|
|
Native Kerberos authentication has been deprecated and should be used
|
|
only for backward compatibility. New and upgraded installations are
|
|
encouraged to use the industry-standard <productname>GSSAPI</productname>
|
|
authentication (see <xref linkend="gssapi-auth">) instead.
|
|
</para>
|
|
</note>
|
|
|
|
<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 full generality it can be
|
|
quite complex (yet powerful). The
|
|
<ulink url="http://www.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html">
|
|
Kerberos <acronym>FAQ</></ulink> or
|
|
<ulink url="http://web.mit.edu/kerberos/www/">MIT Kerberos page</ulink>
|
|
can be good starting points for exploration.
|
|
Several sources for <productname>Kerberos</> distributions exist.
|
|
<productname>Kerberos</productname> provides secure authentication but
|
|
does not encrypt queries or data passed over the network; for that
|
|
use <acronym>SSL</acronym>.
|
|
</para>
|
|
|
|
<para>
|
|
<productname>PostgreSQL</> supports Kerberos version 5. Kerberos
|
|
support has to be enabled when <productname>PostgreSQL</> is built;
|
|
see <xref linkend="installation"> for more information.
|
|
</para>
|
|
|
|
<para>
|
|
<productname>PostgreSQL</> operates like a normal Kerberos service.
|
|
The name of the service principal is
|
|
<literal><replaceable>servicename</>/<replaceable>hostname</>@<replaceable>realm</></literal>.
|
|
</para>
|
|
|
|
<para>
|
|
<replaceable>servicename</> can be set on the server side using the
|
|
<xref linkend="guc-krb-srvname"> configuration parameter, and on the
|
|
client side using the <literal>krbsrvname</> connection parameter. (See
|
|
also <xref linkend="libpq-connect">.) The installation default can be
|
|
changed from the default <literal>postgres</literal> at build time using
|
|
<literal>./configure --with-krb-srvnam=</><replaceable>whatever</>.
|
|
In most environments,
|
|
this parameter never needs to be changed. However, to support multiple
|
|
<productname>PostgreSQL</> installations on the same host it is necessary.
|
|
Some Kerberos implementations might also require a different service name,
|
|
such as Microsoft Active Directory which requires the service name
|
|
to be in uppercase (<literal>POSTGRES</literal>).
|
|
</para>
|
|
|
|
<para>
|
|
<replaceable>hostname</> is the fully qualified host name of the
|
|
server machine. The service principal's realm is the preferred realm
|
|
of the server machine.
|
|
</para>
|
|
|
|
<para>
|
|
Client principals must have their <productname>PostgreSQL</> database user
|
|
name as their first component, for example
|
|
<literal>pgusername@realm</>. Alternatively, you can use a username
|
|
mapping to map from the first component of the principal name to the
|
|
database user name. By default, the realm of the client is
|
|
not checked by <productname>PostgreSQL</>. If you have cross-realm
|
|
authentication enabled and need to verify the realm, use the
|
|
<literal>krb_realm</> parameter, or enable <literal>include_realm</>
|
|
and use username mapping to check the realm.
|
|
</para>
|
|
|
|
<para>
|
|
Make sure that your server keytab file is readable (and preferably
|
|
only readable) by the <productname>PostgreSQL</productname> server
|
|
account. (See also <xref linkend="postgres-user">.) The location
|
|
of the key file is specified by the <xref
|
|
linkend="guc-krb-server-keyfile"> configuration
|
|
parameter. The default is
|
|
<filename>/usr/local/pgsql/etc/krb5.keytab</> (or whichever
|
|
directory was specified as <varname>sysconfdir</> at build time).
|
|
</para>
|
|
|
|
<para>
|
|
The keytab file is generated by the Kerberos software; see the
|
|
Kerberos documentation for details. The following example is
|
|
for MIT-compatible Kerberos 5 implementations:
|
|
<screen>
|
|
<prompt>kadmin% </><userinput>ank -randkey postgres/server.my.domain.org</>
|
|
<prompt>kadmin% </><userinput>ktadd -k krb5.keytab postgres/server.my.domain.org</>
|
|
</screen>
|
|
</para>
|
|
|
|
<para>
|
|
When connecting to the database make sure you have a ticket for a
|
|
principal matching the requested database user name. For example, for
|
|
database user name <literal>fred</>, both principal
|
|
<literal>fred@EXAMPLE.COM</> and
|
|
<literal>fred/users.example.com@EXAMPLE.COM</> could be used to
|
|
authenticate to the database server.
|
|
</para>
|
|
|
|
<para>
|
|
If you use <ulink url="http://modauthkerb.sf.net">
|
|
<application>mod_auth_kerb</application></ulink>
|
|
and <application>mod_perl</application> on your
|
|
<productname>Apache</productname> web server, you can use
|
|
<literal>AuthType KerberosV5SaveCredentials</literal> with a
|
|
<application>mod_perl</application> script. This gives secure
|
|
database access over the web, no extra passwords required.
|
|
</para>
|
|
|
|
<para>
|
|
The following configuration options are supported for
|
|
<productname>Kerberos</productname>:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>map</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Allows for mapping between system and database usernames. See
|
|
<xref linkend="auth-username-maps"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>include_realm</literal></term>
|
|
<listitem>
|
|
<para>
|
|
If set to <literal>1</>, the realm name from the authenticated user
|
|
principal is included in the system user name that's passed through
|
|
username mapping (<xref linkend="auth-username-maps">). This is
|
|
useful for handling users from multiple realms.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>krb_realm</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Sets the realm to match user principal names against. If this parameter
|
|
is set, only users of that realm will be accepted. If it is not set,
|
|
users of any realm can connect, subject to whatever username mapping
|
|
is done.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><literal>krb_server_hostname</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Sets the host name part of the service principal.
|
|
This, combined with <varname>krb_srvname</>, is used to generate
|
|
the complete service principal, that is
|
|
<varname>krb_srvname</><literal>/</><varname>krb_server_hostname</><literal>@</>REALM.
|
|
If not set, the default is the server host name.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="auth-ident">
|
|
<title>Ident-based authentication</title>
|
|
|
|
<indexterm>
|
|
<primary>ident</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
The ident authentication method works by obtaining the client's
|
|
operating system user name and using it as the allowed database user
|
|
name (with an optional username mapping).
|
|
The determination of the client's
|
|
user name is the security-critical point, and it works differently
|
|
depending on the connection type.
|
|
</para>
|
|
|
|
<para>
|
|
The following configuration options are supported for <productname>ident</productname>:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>map</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Allows for mapping between system and database usernames. See
|
|
<xref linkend="auth-username-maps"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<sect3>
|
|
<title>Ident Authentication over TCP/IP</title>
|
|
|
|
<para>
|
|
The <quote>Identification Protocol</quote> is described in
|
|
RFC 1413. Virtually every Unix-like
|
|
operating system ships with an ident server that listens on TCP
|
|
port 113 by default. The basic functionality of an 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 <productname>PostgreSQL</> knows both <replaceable>X</> and
|
|
<replaceable>Y</> when a physical connection is established, it
|
|
can interrogate the ident server on the host of the connecting
|
|
client and 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. In other words, you must
|
|
trust the machine running the ident server.
|
|
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>
|
|
Some ident servers have a nonstandard option that causes the returned
|
|
user name to be encrypted, using a key that only the originating
|
|
machine's administrator knows. This option <emphasis>must not</> be
|
|
used when using the ident server with <productname>PostgreSQL</>,
|
|
since <productname>PostgreSQL</> does not have any way to decrypt the
|
|
returned string to determine the actual user name.
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Ident Authentication over Local Sockets</title>
|
|
|
|
<para>
|
|
On systems supporting <symbol>SO_PEERCRED</symbol> requests for
|
|
Unix-domain sockets (currently <systemitem
|
|
class="osname">Linux</>, <systemitem class="osname">FreeBSD</>,
|
|
<systemitem class="osname">NetBSD</>, <systemitem class="osname">OpenBSD</>,
|
|
<systemitem class="osname">BSD/OS</>, and <systemitem class="osname">Solaris</systemitem>), ident authentication can also
|
|
be applied to local connections. In this case, no security risk is added by
|
|
using ident authentication; indeed it is a preferable choice for
|
|
local connections on such systems.
|
|
</para>
|
|
|
|
<para>
|
|
On systems without <symbol>SO_PEERCRED</> requests, ident
|
|
authentication is only available for TCP/IP connections. As a
|
|
work-around, it is possible to specify the <systemitem
|
|
class="systemname">localhost</> address <systemitem
|
|
class="systemname">127.0.0.1</> and make connections to this
|
|
address. This method is trustworthy to the extent that you trust
|
|
the local ident server.
|
|
</para>
|
|
</sect3>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="auth-ldap">
|
|
<title>LDAP authentication</title>
|
|
|
|
<indexterm zone="auth-ldap">
|
|
<primary>LDAP</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
This authentication method operates similarly to
|
|
<literal>password</literal> except that it uses LDAP
|
|
as the password verification method. LDAP is used only to validate
|
|
the user name/password pairs. Therefore the user must already
|
|
exist in the database before LDAP can be used for
|
|
authentication.
|
|
</para>
|
|
|
|
<para>
|
|
LDAP authentication can operate in two modes. In the first mode,
|
|
the server will bind to the distinguished name constructed as
|
|
<replaceable>prefix</> <replaceable>username</> <replaceable>suffix</>.
|
|
Typically, the <replaceable>prefix</> parameter is used to specify
|
|
<literal>cn=</>, or <replaceable>DOMAIN</><literal>\</> in an Active
|
|
Directory environment. <replaceable>suffix</> is used to specify the
|
|
remaining part of the DN in a non-Active Directory environment.
|
|
</para>
|
|
|
|
<para>
|
|
In the second mode, the server first binds to the LDAP directory with
|
|
a fixed username and password, specified with <replaceable>ldapbinduser</>
|
|
and <replaceable>ldapbinddn</>, and performs a search for the user trying
|
|
to log in to the database. If no user and password is configured, an
|
|
anonymous bind will be attempted to the directory. The search will be
|
|
performed over the subtree at <replaceable>ldapbasedn</>, and will try to
|
|
do an exact match of the attribute specified in
|
|
<replaceable>ldapsearchattribute</>. If no attribute is specified, the
|
|
<literal>uid</> attribute will be used. Once the user has been found in
|
|
this search, the server disconnects and re-binds to the directory as
|
|
this user, using the password specified by the client, to verify that the
|
|
login is correct. This method allows for significantly more flexibility
|
|
in where the user objects are located in the directory, but will cause
|
|
two separate connections to the LDAP server to be made.
|
|
</para>
|
|
|
|
<para>
|
|
The following configuration options are supported for LDAP:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>ldapserver</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Name or IP of LDAP server to connect to.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldapport</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Port number on LDAP server to connect to. If no port is specified,
|
|
the default port in the LDAP library will be used.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldaptls</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Set to <literal>1</> to make the connection between PostgreSQL and the
|
|
LDAP server use TLS encryption. Note that this only encrypts
|
|
the traffic to the LDAP server — the connection to the client
|
|
will still be unencrypted unless SSL is used.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldapprefix</literal></term>
|
|
<listitem>
|
|
<para>
|
|
String to prepend to the username when forming the DN to bind as,
|
|
when doing simple bind authentication.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldapsuffix</literal></term>
|
|
<listitem>
|
|
<para>
|
|
String to append to the username when forming the DN to bind as,
|
|
when doing simple bind authentication.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldapbasedn</literal></term>
|
|
<listitem>
|
|
<para>
|
|
DN to root the search for the user in, when doing search+bind
|
|
authentication.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldapbinddn</literal></term>
|
|
<listitem>
|
|
<para>
|
|
DN of user to bind to the directory with to perform the search when
|
|
doing search+bind authentication.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldapbindpasswd</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Password for user to bind to the directory with to perform the search
|
|
when doing search+bind authentication.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><literal>ldapsearchattribute</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Attribute to match against the username in the search when doing
|
|
search+bind authentication.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
Since LDAP often uses commas and spaces to separate the different
|
|
parts of a DN, it is often necessary to use double-quoted parameter
|
|
values when configuring LDAP options, for example:
|
|
</para>
|
|
</note>
|
|
<synopsis>
|
|
ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
|
|
</synopsis>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="auth-cert">
|
|
<title>Certificate authentication</title>
|
|
|
|
<indexterm zone="auth-cert">
|
|
<primary>Certificate</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
This authentication method uses SSL client certificates to perform
|
|
authentication. It is therefore only available for SSL connections.
|
|
When using this authentication method, the server will require that
|
|
the client provide a valid certificate. No password prompt will be sent
|
|
to the client. The <literal>cn</literal> attribute of the certificate
|
|
will be compared to the requested database username, and if they match
|
|
the login will be allowed. Username mapping can be used to allow
|
|
<literal>cn</literal> to be different from the database username.
|
|
</para>
|
|
|
|
<para>
|
|
The following configuration options are supported for SSL certificate
|
|
authentication:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>map</literal></term>
|
|
<listitem>
|
|
<para>
|
|
Allows for mapping between system and database usernames. See
|
|
<xref linkend="auth-username-maps"> for details.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="auth-pam">
|
|
<title>PAM authentication</title>
|
|
|
|
<indexterm zone="auth-pam">
|
|
<primary>PAM</primary>
|
|
</indexterm>
|
|
|
|
<para>
|
|
This authentication method operates similarly to
|
|
<literal>password</literal> except that it uses PAM (Pluggable
|
|
Authentication Modules) as the authentication mechanism. The
|
|
default PAM service name is <literal>postgresql</literal>.
|
|
PAM is used only to validate user name/password pairs.
|
|
Therefore the user must already exist in the database before PAM
|
|
can be used for authentication. For more information about
|
|
PAM, please read the <ulink url="http://www.kernel.org/pub/linux/libs/pam/">
|
|
<productname>Linux-PAM</> Page</ulink>
|
|
and the <ulink url="http://www.sun.com/software/solaris/pam/">
|
|
<systemitem class="osname">Solaris</> PAM Page</ulink>.
|
|
</para>
|
|
|
|
<para>
|
|
The following configuration options are supported for PAM:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><literal>pamservice</literal></term>
|
|
<listitem>
|
|
<para>
|
|
PAM service name.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
If PAM is set up to read <filename>/etc/shadow</>, authentication
|
|
will fail because the PostgreSQL server is started by a non-root
|
|
user. However, this is not an issue when PAM is configured to use
|
|
LDAP or other authentication methods.
|
|
</para>
|
|
</note>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="client-authentication-problems">
|
|
<title>Authentication problems</title>
|
|
|
|
<para>
|
|
Authentication failures and related problems generally
|
|
manifest themselves through error messages like the following:
|
|
</para>
|
|
|
|
<para>
|
|
<programlisting>
|
|
FATAL: no pg_hba.conf entry for host "123.123.123.123", user "andym", database "testdb"
|
|
</programlisting>
|
|
This is what you are most likely to get if you succeed in contacting
|
|
the server, but it does not want to talk to you. As the message
|
|
suggests, the server refused the connection request because it found
|
|
no matching entry in its <filename>pg_hba.conf</filename>
|
|
configuration file.
|
|
</para>
|
|
|
|
<para>
|
|
<programlisting>
|
|
FATAL: Password authentication failed for user "andym"
|
|
</programlisting>
|
|
Messages like this indicate that you contacted the server, and it is
|
|
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 are providing, or check your Kerberos or ident
|
|
software if the complaint mentions one of those authentication
|
|
types.
|
|
</para>
|
|
|
|
<para>
|
|
<programlisting>
|
|
FATAL: user "andym" does not exist
|
|
</programlisting>
|
|
The indicated database user name was not found.
|
|
</para>
|
|
|
|
<para>
|
|
<programlisting>
|
|
FATAL: database "testdb" does not exist
|
|
</programlisting>
|
|
The database you are trying to connect to does not exist. Note that
|
|
if you do not specify a database name, it defaults to the database
|
|
user name, which might or might not be the right thing.
|
|
</para>
|
|
|
|
<tip>
|
|
<para>
|
|
The server log might contain more information about an
|
|
authentication failure than is reported to the client. If you are
|
|
confused about the reason for a failure, check the log.
|
|
</para>
|
|
</tip>
|
|
</sect1>
|
|
|
|
</chapter>
|