Chapter 4. Client Authentication

Table of Contents
4.1. The pg_hba.conf file
4.2. Authentication methods
4.2.1. Trust authentication
4.2.2. Password authentication
4.2.3. Kerberos authentication
4.2.4. Ident-based authentication
4.3. Authentication problems

When a client application connects to the database server, it specifies which PostgreSQL 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 Chapter 7 for more information. Therefore, it is essential to restrict which database users can connect.

Authentication 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 user name that was requested.

PostgreSQL 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.

PostgreSQL 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 may have many users who have no local account, and in such cases there need be no connection between database user names and OS user names.

4.1. The pg_hba.conf file

Client authentication is controlled by the file pg_hba.conf in the data directory, e.g., /usr/local/pgsql/data/pg_hba.conf. (HBA stands for host-based authentication.) A default pg_hba.conf file is installed when the data directory is initialized by initdb.

The general format of the pg_hba.conf file is of a set of records, one per line. Blank lines are ignored, as is any text after the "#" 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.

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 "fall-through" or "backup": if one record is chosen and the authentication fails, subsequent records are not considered. If no record matches, access is denied.

A record may have one of the three formats

    local   database user authentication-method [ authentication-option ]
    host    database user IP-address IP-mask authentication-method
    hostssl database user IP-address IP-mask authentication-method
        

The meaning of the fields is as follows:

local

This record applies to connection attempts using Unix domain sockets.

host

This record applied to connection attempts using TCP/IP networks. Note that TCP/IP connections are disabled unless the server is started with the -i option or the tcpip_socket postgresql.conf configuration parameter is enabled.

hostssl

This record applies to connection attempts using SSL over TCP/IP. To make use of this option the server must be built with SSL support enabled. Furthermore, SSL must be enabled with the -l option or equivalent configuration setting when the server is started. (Note: host records will match either SSL or non-SSL connection attempts, but hostssl records require SSL connections.)

database

Specifies the database for this record. The value all specifies that it applies to all databases, while the value sameuser identifies the database with the same name as the connecting user. The value samegroup identifies a group with the same name as the database name. Only members of this group can connect to the database. Otherwise, this is the name of a specific PostgreSQL database. Multiple database names can be supplied by separating them with commas. A file containing database names can be specified by preceding the file name with @. The file must be in the same directory as pg_hba.conf.

user

Specifies the user for this record. The value all specifies that it applies to all users. Otherwise, this is the name of a specific PostgreSQL user. Multiple user names can be supplied by separating them with commas. Group names can be specified by preceding the group name with +. A file containing user names can be specified by preceding the file name with @. The file must be in the same directory as pg_hba.conf.

IP address
IP mask

These two fields specify the client machine IP addresses (host or hostssl) for this record. (Of course IP addresses can be spoofed but this consideration is beyond the scope of PostgreSQL.) The precise logic is that

    (actual-IP-address xor IP-address-field) and IP-mask-field

must be zero for the record to match.

authentication method

Specifies the authentication method to use when connecting via this record. The possible choices are summarized here; details are in Section 4.2.

trust

The connection is allowed unconditionally. This method allows anyone that can connect to the PostgreSQL database to login as any PostgreSQL user they like, without the need for a password.

reject

The connection is rejected unconditionally. This is useful for "filtering out" certain hosts from a group.

md5

Requires the client to supply an MD5 encrypted password for authentication. This is the only method that allows encrypted passwords to be stored in pg_shadow.

crypt

Like md5 method but uses older crypt encryption, which is needed for pre-7.2 clients. md5 is preferred for 7.2 and later clients.

password

Same as "md5", but the password is sent in cleartext over the network. This should not be used on untrusted networks.

krb4

Kerberos V4 is used to authenticate the user. This is only available for TCP/IP connections.

krb5

Kerberos V5 is used to authenticate the user. This is only available for TCP/IP connections.

ident

For TCP/IP connections, authentication is done by contacting the ident server on the client host. This is only as secure as the client machine. You must specify the map name after the 'ident' keyword. It determines how to map remote user names to PostgreSQL user names. If you use "sameuser", the user names are assumed to be identical. If not, the map name is looked up in the $PGDATA/pg_ident.conf file. The connection is accepted if that file contains an entry for this map name with the ident-supplied user name and the requested PostgreSQL user name.

On machines that support unix-domain socket credentials (currently Linux, FreeBSD, NetBSD, and BSD/OS), ident allows reliable authentication of 'local' connections without ident running on the local machine.

On systems without SO_PEERCRED requests, ident authentication is only available for TCP/IP connections. As a work around, it is possible to specify the localhost address 127.0.0.1 and make connections to this address.

Following the ident keyword, an ident map name should be supplied which specifies which operating system users equate with which database users. See below for details.

pam

This authentication type operates similarly to password except that it uses PAM (Pluggable Authentication Modules) as the authentication mechanism. The default PAM service name is postgresql. You can optionally supply you own service name after the pam keyword in the file. For more information about PAM, please read the Linux-PAM Page and the Solaris PAM Page.

Since the pg_hba.conf 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 trust authentication for local TCP connections but require a password for remote TCP connections. In this case a record specifying 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.

The pg_hba.conf file is read on start-up and when the postmaster receives a SIGHUP signal. If you edit the file on an active system, you will need to signal the postmaster (using pg_ctl reload or kill -HUP) to make it re-read the file.

An example of a pg_hba.conf file is shown in Example 4-1. See below for details on the different authentication methods.

Example 4-1. An example pg_hba.conf file

    # TYPE       DATABASE    USER       IP_ADDRESS    MASK               AUTHTYPE
    
    # Allow any user on the local system to connect to any
    # database under any user name, but only via an IP connection:
    
    host         all         all        127.0.0.1     255.255.255.255    trust     
    
    # The same, over Unix-socket connections:
    
    local        all         all                                         trust
    
    # Allow any user from any host with IP address 192.168.93.x to
    # connect to database "template1" as the same user name that ident on that
    # host identifies him as (typically his Unix user name):
    
    host         template1   all        192.168.93.0  255.255.255.0      ident sameuser
    
    # Allow a user from host 192.168.12.10 to connect to database "template1"
    # if the user's password is correctly supplied:
    
    host         template1   all        192.168.12.10 255.255.255.255    md5
    
    # In the absence of preceding "host" lines, these two lines will reject
    # all connection attempts from 192.168.54.1 (since that entry will be
    # matched first), but allow Kerberos V5-validated 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:
    
    host         all        all         192.168.54.1   255.255.255.255    reject
    host         all        all         0.0.0.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":
    
    host         all        all         192.168.0.0    255.255.0.0        ident omicron
    
    # If these are the only two lines for local connections, they will allow
    # local users to connect only to their own databases (database named the
    # same as the user name), except for administrators who may connect to
    # all databases.  The file $PGDATA/admins lists the user names who are
    # permitted to connect to all databases.  Passwords are required in all
    # cases.  (If you prefer to use ident authorization, an ident map can
    # serve a parallel purpose to the password list file used here.)
    
    local        sameuser   all                                            md5
    local        all        @admins                                        md5