.3. Authentication Methods
The following subsections describe the authentication methods in more detail.
There are several password-based authentication methods. These methods operate similarly but differ in how the users’ passwords are stored on the server and how the password provided by a client is sent across the connection.
PostgreSQL database passwords are separate from operating system user passwords. The password for each database user is stored in the pg_authid
system catalog. Passwords can be managed with the SQL commands CREATE USER and ALTER ROLE, e.g., CREATE USER foo WITH PASSWORD 'secret'
, or the psql command password
. If no password has been set up for a user, the stored password is null and password authentication will always fail for that user.
The availability of the different password-based authentication methods depends on how a user’s password on the server is encrypted (or hashed, more accurately). This is controlled by the configuration parameter password_encryption at the time the password is set. If a password was encrypted using the scram-sha-256
setting, then it can be used for the authentication methods scram-sha-256
and password
(but password transmission will be in plain text in the latter case). The authentication method specification md5
will automatically switch to using the scram-sha-256
method in this case, as explained above, so it will also work. If a password was encrypted using the md5
setting, then it can be used only for the md5
and password
authentication method specifications (again, with the password transmitted in plain text in the latter case). (Previous PostgreSQL releases supported storing the password on the server in plain text. This is no longer possible.) To check the currently stored password hashes, see the system catalog pg_authid
.
To upgrade an existing installation from md5
to scram-sha-256
, after having ensured that all client libraries in use are new enough to support SCRAM, set password_encryption = 'scram-sha-256'
in postgresql.conf
, make all users set new passwords, and change the authentication method specifications in pg_hba.conf
to scram-sha-256
.
GSSAPI is an industry-standard protocol for secure authentication defined in RFC 2743. PostgreSQL supports GSSAPI with Kerberos authentication according to RFC 1964. GSSAPI 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 sent unencrypted unless SSL is used.
GSSAPI support has to be enabled when PostgreSQL is built; see Chapter 16 for more information.
When GSSAPI uses Kerberos, it uses a standard principal in the format
. The PostgreSQL server will accept any principal that is included in the keytab used by the server, but care needs to be taken to specify the correct principal details when making the connection from the client using the servicename
/hostname
@realm
krbsrvname
connection parameter. (See also Section 33.1.2.) The installation default can be changed from the default postgres
at build time using ./configure --with-krb-srvnam=
whatever
. In most environments, this parameter never needs to be changed. Some Kerberos implementations might require a different service name, such as Microsoft Active Directory which requires the service name to be in upper case (POSTGRES
).
hostname
is the fully qualified host name of the server machine. The service principal’s realm is the preferred realm of the server machine.
Client principals can be mapped to different PostgreSQL database user names with pg_ident.conf
. For example, pgusername@realm
could be mapped to just pgusername
. Alternatively, you can use the full username@realm
principal as the role name in PostgreSQL without any mapping.
PostgreSQL also supports a parameter to strip the realm from the principal. This method is supported for backwards compatibility and is strongly discouraged as it is then impossible to distinguish different users with the same user name but coming from different realms. To enable this, set include_realm
to 0. For simple single-realm installations, doing that combined with setting the krb_realm
parameter (which checks that the principal’s realm matches exactly what is in the krb_realm
parameter) is still secure; but this is a less capable approach compared to specifying an explicit mapping in pg_ident.conf
.
Make sure that your server keytab file is readable (and preferably only readable, not writable) by the PostgreSQL server account. (See also Section 18.1.) The location of the key file is specified by the krb_server_keyfile configuration parameter. The default is /usr/local/pgsql/etc/krb5.keytab
(or whatever directory was specified as sysconfdir
at build time). For security reasons, it is recommended to use a separate keytab just for the PostgreSQL server rather than opening up permissions on the system keytab file.
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:
kadmin%
ank -randkey postgres/server.my.domain.org
kadmin%
ktadd -k krb5.keytab postgres/server.my.domain.org
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 fred
, principal fred@EXAMPLE.COM
would be able to connect. To also allow principal fred/users.example.com@EXAMPLE.COM
, use a user name map, as described in Section 20.2.
The following configuration options are supported for GSSAPI:
include_realm
If set to 0, the realm name from the authenticated user principal is stripped off before being passed through the user name mapping (Section 20.2). This is discouraged and is primarily available for backwards compatibility, as it is not secure in multi-realm environments unless
krb_realm
is also used. It is recommended to leaveinclude_realm
set to the default (1) and to provide an explicit mapping inpg_ident.conf
to convert principal names to PostgreSQL user names.map
Allows for mapping between system and database user names. See Section 20.2 for details. For a GSSAPI/Kerberos principal, such as
username@EXAMPLE.COM
(or, less commonly,username/hostbased@EXAMPLE.COM
), the user name used for mapping isusername@EXAMPLE.COM
(orusername/hostbased@EXAMPLE.COM
, respectively), unlessinclude_realm
has been set to 0, in which caseusername
(orusername/hostbased
) is what is seen as the system user name when mapping.krb_realm
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 user name mapping is done.
SSPI is a Windows technology for secure authentication with single sign-on. PostgreSQL will use SSPI in negotiate
mode, which will use Kerberos when possible and automatically fall back to NTLM in other cases. SSPI authentication only works when both server and client are running Windows, or, on non-Windows platforms, when GSSAPI is available.
When using Kerberos authentication, SSPI works the same way GSSAPI does; see Section 20.3.3 for details.
The following configuration options are supported for SSPI:
include_realm
If set to 0, the realm name from the authenticated user principal is stripped off before being passed through the user name mapping (Section 20.2). This is discouraged and is primarily available for backwards compatibility, as it is not secure in multi-realm environments unless
krb_realm
is also used. It is recommended to leaveinclude_realm
set to the default (1) and to provide an explicit mapping inpg_ident.conf
to convert principal names to PostgreSQL user names.compat_realm
If set to 1, the domain’s SAM-compatible name (also known as the NetBIOS name) is used for the
include_realm
option. This is the default. If set to 0, the true realm name from the Kerberos user principal name is used.Do not disable this option unless your server runs under a domain account (this includes virtual service accounts on a domain member system) and all clients authenticating through SSPI are also using domain accounts, or authentication will fail.
upn_username
If this option is enabled along with
compat_realm
, the user name from the Kerberos UPN is used for authentication. If it is disabled (the default), the SAM-compatible user name is used. By default, these two names are identical for new user accounts.Note that libpq uses the SAM-compatible name if no explicit user name is specified. If you use libpq or a driver based on it, you should leave this option disabled or explicitly specify user name in the connection string.
map
Allows for mapping between system and database user names. See Section 20.2 for details. For a SSPI/Kerberos principal, such as
username@EXAMPLE.COM
(or, less commonly,username/hostbased@EXAMPLE.COM
), the user name used for mapping isusername@EXAMPLE.COM
(orusername/hostbased@EXAMPLE.COM
, respectively), unlessinclude_realm
has been set to 0, in which caseusername
(orusername/hostbased
) is what is seen as the system user name when mapping.krb_realm
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 user name mapping is done.
This authentication method operates similarly to password
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.
LDAP authentication can operate in two modes. In the first mode, which we will call the simple bind mode, the server will bind to the distinguished name constructed as prefix
username
suffix
. Typically, the prefix
parameter is used to specify cn=
, or DOMAIN
in an Active Directory environment.
suffix
is used to specify the remaining part of the DN in a non-Active Directory environment.
In the second mode, which we will call the search bind mode, the server first binds to the LDAP directory with a fixed user name and password, specified with ldapbinddn
and ldapbindpasswd
, 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 ldapbasedn
, and will try to do an exact match of the attribute specified in ldapsearchattribute
. 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 mode is the same as that used by LDAP authentication schemes in other software, such as Apache mod_authnz_ldap
and pam_ldap
. 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.
The following configuration options are used in both modes:
The following options are used in simple bind mode only:
The following options are used in search bind mode only:
ldapbasedn
Root DN to begin the search for the user in, when doing search bind authentication.
ldapbinddn
DN of user to bind to the directory with to perform the search when doing search bind authentication.
ldapbindpasswd
Password for user to bind to the directory with to perform the search when doing search bind authentication.
ldapsearchattribute
Attribute to match against the user name in the search when doing search bind authentication. If no attribute is specified, the
uid
attribute will be used.ldapurl
An RFC 4516 LDAP URL. This is an alternative way to write some of the other LDAP options in a more compact and standard form. The format is
ldap://
host
[:port
]/basedn
[?[attribute
][?[scope
]]]scope
must be one ofbase
,one
,sub
, typically the latter. Only one attribute is used, and some other components of standard LDAP URLs such as filters and extensions are not supported.For non-anonymous binds,
ldapbinddn
andldapbindpasswd
must be specified as separate options.To use encrypted LDAP connections, the
ldaptls
option has to be used in addition toldapurl
. Theldaps
URL scheme (direct SSL connection) is not supported.LDAP URLs are currently only supported with OpenLDAP, not on Windows.
It is an error to mix configuration options for simple bind with options for search bind.
Here is an example for a simple-bind LDAP configuration:
host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
When a connection to the database server as database user someuser
is requested, PostgreSQL will attempt to bind to the LDAP server using the DN cn=someuser, dc=example, dc=net
and the password provided by the client. If that connection succeeds, the database access is granted.
Here is an example for a search bind configuration:
host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchattribute=uid
When a connection to the database server as database user someuser
is requested, PostgreSQL will attempt to bind anonymously (since ldapbinddn
was not specified) to the LDAP server, perform a search for (uid=someuser)
under the specified base DN. If an entry is found, it will then attempt to bind using that found information and the password supplied by the client. If that second connection succeeds, the database access is granted.
Here is the same search bind configuration written as a URL:
host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"
Some other software that supports authentication against LDAP uses the same URL format, so it will be easier to share the configuration.
This authentication method operates similarly to password
except that it uses RADIUS as the password verification method. RADIUS is used only to validate the user name/password pairs. Therefore the user must already exist in the database before RADIUS can be used for authentication.
When using RADIUS authentication, an Access Request message will be sent to the configured RADIUS server. This request will be of type Authenticate Only
, and include parameters for user name
, password
(encrypted) and NAS Identifier
. The request will be encrypted using a secret shared with the server. The RADIUS server will respond to this request with either Access Accept
or Access Reject
. There is no support for RADIUS accounting.
Multiple RADIUS servers can be specified, in which case they will be tried sequentially. If a negative response is received from a server, the authentication will fail. If no response is received, the next server in the list will be tried. To specify multiple servers, separate the server names with commas and surround the list with double quotes. If multiple servers are specified, the other RADIUS options can also be given as comma-separated lists, to provide individual values for each server. They can also be specified as a single value, in which case that value will apply to all servers.
The following configuration options are supported for RADIUS:
If it is necessary to have a comma or whitespace in a RADIUS parameter value, that can be done by putting double quotes around the value, but it is tedious because two layers of double-quoting are now required. An example of putting whitespace into RADIUS secret strings is:
host ... radius radiusservers="server1,server2" radiussecrets="""secret one"",""secret two"""
Postgresql : документация: 12: 20.13. аутентификация pam
Данный метод аутентификации работает подобно методу password
, но использует в качестве механизма проверки подлинности PAM (Pluggable Authentication Modules, Подключаемые модули аутентификации). По умолчанию имя службы PAM — postgresql
. PAM используется только для проверки пар «имя пользователя/пароль» и может дополнительно проверять имя или IP-адрес удалённого компьютера. Поэтому пользователь должен уже существовать в базе данных, чтобы PAM можно было использовать для аутентификации. За дополнительной информацией о PAM обратитесь к Странице описания Linux-PAM.
Для аутентификации PAM доступны следующие параметры конфигурации: