From c1257d4c5c9f9632eda42a8660af587bf9712a3a Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Tue, 21 Nov 2000 20:44:32 +0000 Subject: [PATCH] Improve comments in pg_hba.conf.sample and the associated SGML documentation. --- doc/src/sgml/client-auth.sgml | 154 ++++++++++++++------------ src/backend/libpq/pg_hba.conf.sample | 157 ++++++++++++++++----------- 2 files changed, 179 insertions(+), 132 deletions(-) diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index 616867fbd38..af603a62e83 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -1,25 +1,24 @@ -<!-- $Header: /cvsroot/pgsql/doc/src/sgml/client-auth.sgml,v 1.8 2000/10/21 01:08:34 petere Exp $ --> +<!-- $Header: /cvsroot/pgsql/doc/src/sgml/client-auth.sgml,v 1.9 2000/11/21 20:44:31 tgl 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 + When a client application connects to the database server, it specifies which + <productname>Postgres</productname> 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 - about that. It is therefore obviously essential to restrict what - database user name a given client can connect as. + about that. It is therefore obviously essential to restrict which + database user name(s) 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 + who runs the client application) is permitted to connect with the user name that was requested. </para> @@ -29,14 +28,26 @@ authentication methods available. </para> + <para> + <productname>Postgres</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 Unix user ids. 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 usernames and Unix + usernames. + </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 + <filename>pg_hba.conf</filename> in the $PGDATA directory, e.g., + <filename>/usr/local/pgsql/data/pg_hba.conf</filename>. (HBA stands + for host-based authentication.) A default <filename>pg_hba.conf</filename> + file is installed when the data area is initialized by <application>initdb</application>. </para> @@ -84,7 +95,7 @@ hostssl <replaceable>database</replaceable> <replaceable>IP-address</replaceable <term><literal>hostssl</literal></term> <listitem> <para> - This record pertains to connection attemps with SSL over + This record pertains to connection attempts with 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 <option>-l</> option or equivalent configuration @@ -99,8 +110,10 @@ hostssl <replaceable>database</replaceable> <replaceable>IP-address</replaceable <para> Specifies the database that this record applies to. The value <literal>all</literal> specifies that it applies to all - databases, the value <literal>sameuser</> identifies the - database with the same name as the connecting user. + databases, while the value <literal>sameuser</> identifies the + database with the same name as the connecting user. Otherwise, + this is the name of a specific <productname>Postgres</productname> + database. </para> </listitem> </varlistentry> @@ -140,7 +153,7 @@ hostssl <replaceable>database</replaceable> <replaceable>IP-address</replaceable <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. + any <productname>Postgres</productname> user whatsoever. </para> </listitem> </varlistentry> @@ -246,17 +259,18 @@ hostssl <replaceable>database</replaceable> <replaceable>IP-address</replaceable </varlistentry> </variablelist> - The first record that matches a connection attempt is used. There - is no <quote>fall-through</> or <quote>backup</>, that means, if + The first record that matches a connection attempt's client IP address + and requested database name is used to do the authentication step. + There is no <quote>fall-through</> or <quote>backup</>: 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. + The <filename>pg_hba.conf</filename> file is re-read during each + connection attempt. It is therefore trivial to modify access + permissions while the server is running: just edit the file. </para> <para> @@ -267,42 +281,44 @@ hostssl <replaceable>database</replaceable> <replaceable>IP-address</replaceable <example id="example-pg-hba.conf"> <title>An example <filename>pg_hba.conf</filename> file</title> <programlisting> -#TYPE DATABASE IP-ADDRESS MASK AUTHTYPE ARG - -# Allow any user on the local system to connect to any database under -# any user name. -# -host 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 "template1" as the same user name that ident on that -# host identifies him as (typically his Unix user name). -# -host template1 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 in pg_shadow is supplied. -# -host template1 192.168.12.10 255.255.255.255 crypt - -# In absence of the other records, this would allow anyone anywhere -# except from 192.168.54.1 to connect to any database under any user -# name. -# -host all 192.168.54.1 255.255.255.255 reject -host all 0.0.0.0 0.0.0.0 trust - -# Allow users from 192.168.77.x hosts to connect to any database, but if, -# for example, ident says the user is "bryanh" and he requests to -# connect as PostgreSQL user "guest1", the connection is only allowed if -# there is an entry for map "omicron" in `pg_ident.conf' that says -# "bryanh" is allowed to connect as "guest1". -# -host all 192.168.77.0 255.255.255.0 ident omicron - -# Allow all users to connect to all databases via Unix sockets. -# -local all trust +# TYPE DATABASE IP_ADDRESS MASK AUTHTYPE MAP + +# Allow any user on the local system to connect to any +# database under any username, but only via an IP connection: + +host all 127.0.0.1 255.255.255.255 trust + +# The same, over Unix-socket connections: + +local all trust + +# Allow any user from any host with IP address 192.168.93.x to +# connect to database "template1" as the same username that ident on that +# host identifies him as (typically his Unix username): + +host template1 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 in pg_shadow is correctly supplied: + +host template1 192.168.12.10 255.255.255.255 crypt + +# 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 192.168.54.1 255.255.255.255 reject +host 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 192.168.0.0 255.255.0.0 ident omicron </programlisting> </example> </para> @@ -324,7 +340,7 @@ local all trust <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> + been set up, the stored password is <literal>NULL</literal> and password authentication will always fail for that user. </para> @@ -336,12 +352,12 @@ local all trust file after the <literal>password</> or <literal>crypt</> keyword, respectively, in <filename>pg_hba.conf</>. If you do not use this feature, then any user that is known to the database system can - connect to any database (as long as he passes password + connect to any database (so long as he passes password authentication, of course). </para> <para> - These files can also be used a apply a different set of passwords + These files can also be used to apply a different set of passwords to a particular database or set thereof. In that case, the files have a format similar to the standard Unix password file <filename>/etc/passwd</filename>, that is, @@ -401,7 +417,7 @@ local all trust <para> In order to use <productname>Kerberos</>, support for it must be - enable at build time. Both Kerberos 4 and 5 are supported + enabled at build time. Both Kerberos 4 and 5 are supported (<literal>./configure --with-krb4</> or <literal>./configure --with-krb5</> respectively). </para> @@ -411,7 +427,7 @@ local all trust service. The name of the service principal is normally <literal>postgres</literal>, unless it was changed during the build. Make sure that your server key file is readable (and - preferrably only readable) by the Postgres server account (see + preferably only readable) by the Postgres server account (see <xref linkend="postgres-user">). The location of the key file is specified with the <varname>krb_server_keyfile</> run time configuration parameter. (See also <xref linkend="runtime-config">.) @@ -553,13 +569,13 @@ local all trust 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.77 network that does not have - the a user name bryanh, ann, or robert would not be granted access. + 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 bryanh, ann, or robert 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> would only be allowed to connect - <quote>as herself</>. User bryanh would be allowed to connect as either + connect as Postgres user <quote>bob</quote>, not as <quote>robert</quote> + or anyone else. <quote>ann</quote> would only be allowed to connect as + <quote>ann</>. User bryanh would be allowed to connect as either <quote>bryanh</> himself or as <quote>guest1</>. </para> diff --git a/src/backend/libpq/pg_hba.conf.sample b/src/backend/libpq/pg_hba.conf.sample index 44010c7b9c5..66b0252c0f1 100644 --- a/src/backend/libpq/pg_hba.conf.sample +++ b/src/backend/libpq/pg_hba.conf.sample @@ -1,28 +1,23 @@ # -# # PostgreSQL HOST ACCESS CONTROL FILE # # # This file controls what hosts are allowed to connect to what databases -# and specifies some options on how users on a particular host are -# identified. It is read each time a host tries to make a connection to a -# database. +# and specifies how users on a particular host are identified. It is read +# by the PostgreSQL postmaster each time a host tries to make a connection +# to a database. # # Each line (terminated by a newline character) is a record. A record # cannot be continued across two lines. # # There are 3 kinds of records: -# # 1) comment: Starts with #. -# # 2) empty: Contains nothing excepting spaces and tabs. -# # 3) record: anything else. -# # Only record lines are significant. # # A record consists of tokens separated by spaces or tabs. Spaces and -# tabs at the beginning and end of a record are ignored as are extra +# tabs at the beginning and end of a record are ignored, as are extra # spaces and tabs between two tokens. # # The first token in a record is the record type. The interpretation of @@ -33,21 +28,29 @@ # ------------------ # # This record identifies a set of network hosts that are permitted to -# connect to databases. No network hosts are permitted to connect except -# as specified by a "host" record. See the record type "local" to specify -# permitted connections for local users via UNIX domain sockets. +# connect to databases via IP connections. No hosts are permitted to connect +# over IP except as specified by a "host" record. # # Format: # -# host DBNAME IP_ADDRESS ADDRESS_MASK AUTHTYPE [AUTH_ARGUMENT] +# host DBNAME IP_ADDRESS ADDRESS_MASK AUTHTYPE [AUTH_ARGUMENT] # -# DBNAME is the name of a PostgreSQL database, "all" to indicate all +# DBNAME is the name of a PostgreSQL database, or "all" to indicate all # databases, or "sameuser" to restrict a user's access to a database with -# the same user name. +# the same name as the user. # # IP_ADDRESS and ADDRESS_MASK are a standard dotted decimal IP address # and mask to identify a set of hosts. These hosts are allowed to connect -# to Database DBNAME. There is a separate section about AUTHTYPE below. +# to the database(s) identified by DBNAME. Note that the IP address must +# be specified numerically, not as a domain name. +# +# AUTHTYPE and AUTH_ARGUMENT are described below. +# +# There can be multiple "host" records, possibly with overlapping sets of +# host addresses. The postmaster scans to find the first entry that matches +# the connecting host IP address and the requested database name. This +# entry's AUTHTYPE will then be used to verify or reject the connection. +# If no entry matches the host+database, the connection is rejected. # Record type "hostssl" @@ -55,26 +58,31 @@ # # The format of this record is identical to that of "host". # -# This record identifies the authentication to use when connecting to a -# particular database via TCP/IP sockets over SSL. Note that normal -# "host" records are also matched - "hostssl" records can be used to -# require a SSL connection. This keyword is only available if the server -# is compiled with SSL support enabled. +# This record identifies a set of network hosts that are permitted to +# connect to databases over secure SSL IP connections. Note that a "host" +# record will also allow SSL connections; write "hostssl" if you want to +# accept *only* SSL-secured connections from this host or hosts. +# +# This keyword is only available if the server was compiled with SSL +# support enabled. # Record type "local" # ------------------ # -# This record identifies the authentication to use when connecting to a -# particular database via a local UNIX socket. +# This record identifies the authentication to use when connecting to +# the server via a local UNIX socket. UNIX-socket connections will be +# allowed only if this record type appears. # # Format: # -# local DBNAME AUTHTYPE [AUTH_ARGUMENT] +# local DBNAME AUTHTYPE [AUTH_ARGUMENT] # # The format is the same as that of the "host" record type except that -# the IP_ADDRESS and ADDRESS_MASK are omitted. Local supports only -# AUTHTYPEs "trust", "password", "crypt", and "reject". +# the IP_ADDRESS and ADDRESS_MASK are omitted. +# +# As with "host" records, the first "local" record matching the requested +# database name controls whether the connection is allowed. # Authentication Types (AUTHTYPE) @@ -82,7 +90,8 @@ # # AUTHTYPE is a keyword indicating the method used to authenticate the # user, i.e. to determine that the user is authorized to connect under -# the PostgreSQL username supplied in his connection parameters. +# the PostgreSQL username supplied in the connection request. A +# different AUTHTYPE can be specified for each record in the file. # # trust: No authentication is done. Trust that the user has the # authority to use whatever username he specifies. @@ -90,68 +99,90 @@ # password: Authentication is done by matching a password supplied # in clear by the host. If AUTH_ARGUMENT is specified then # the password is compared with the user's entry in that -# file (in the $PGDATA directory). See pg_passwd(1). If it -# is omitted then the password is compared with the user's -# entry in the pg_shadow table. +# file (in the $PGDATA directory). These per-host password +# files can be maintained with the pg_passwd(1) utility. +# If no AUTH_ARGUMENT appears then the password is compared +# with the user's entry in the pg_shadow table. # # crypt: Same as 'password', but authentication is done by # encrypting the password sent over the network. # # ident: Authentication is done by the ident server on the remote -# host, via the ident (RFC 1413) protocol. AUTH_ARGUMENT, -# if specified, is a map name to be found in the -# pg_ident.conf file. That table maps from ident usernames -# to PostgreSQL usernames. The special map name "sameuser" -# indicates an implied map (not found in pg_ident.conf) -# that maps every ident username to the identical -# PostgreSQL username. +# host, via the ident (RFC 1413) protocol. An AUTH_ARGUMENT +# is required: it is a map name to be found in the +# $PGDATA/pg_ident.conf file. The connection is accepted +# if pg_ident.conf contains an entry for this map name with +# the ident-supplied username and the requested PostgreSQL +# username. The special map name "sameuser" indicates an +# implied map (not sought in pg_ident.conf) that maps every +# ident username to the identical PostgreSQL username. # # krb4: Kerberos V4 authentication is used. # # krb5: Kerberos V5 authentication is used. # # reject: Reject the connection. +# +# Local (UNIX socket) connections support only AUTHTYPEs "trust", +# "password", "crypt", and "reject". # Examples # -------- # -# TYPE DATABASE IP_ADDRESS MASK AUTHTYPE MAP +# TYPE DATABASE IP_ADDRESS MASK AUTHTYPE MAP # -#host all 127.0.0.1 255.255.255.255 trust -# -# The above allows any user on the local system to connect to any -# database under any username. +# Allow any user on the local system to connect to any +# database under any username, but only via an IP connection: # -#host template1 192.168.93.0 255.255.255.0 ident sameuser -# -# The above allows any user from any host with IP address 192.168.93.x to -# connect to database template1 as the same username that ident on that -# host identifies him as (typically his Unix username). +# host all 127.0.0.1 255.255.255.255 trust +# +# The same, over Unix-socket connections: +# +# local all trust +# +# Allow any user from any host with IP address 192.168.93.x to +# connect to database "template1" as the same username that ident on that +# host identifies him as (typically his Unix username): # -#host template1 192.168.12.10 255.255.255.255 crypt +# host template1 192.168.93.0 255.255.255.0 ident sameuser # -# The above allows a user from host 192.168.12.10 to connect to -# database template1 if the user's password in pg_shadow is -# supplied. User passwords are optionally assigned when a -# user is created. +# Allow a user from host 192.168.12.10 to connect to database "template1" +# if the user's password in pg_shadow is correctly supplied: # -#host all 192.168.54.1 255.255.255.255 reject -#host all 0.0.0.0 0.0.0.0 trust +# host template1 192.168.12.10 255.255.255.255 crypt # -# The above would allow anyone anywhere except from 192.168.54.1 to -# connect to any database under any username. +# 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 192.168.77.0 255.255.255.0 ident omicron +# host all 192.168.54.1 255.255.255.255 reject +# host all 0.0.0.0 0.0.0.0 krb5 # -# The above would allow users from 192.168.77.x hosts to connect to any -# database, but if Ident says the user is "bryanh" and he requests to -# connect as PostgreSQL user "guest1", the connection is only allowed if -# there is an entry for map "omicron" in pg_ident.conf that says "bryanh" -# is allowed to connect as "guest1". +# 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 192.168.0.0 255.255.0.0 ident omicron +# + + +# Put your actual configuration here +# ---------------------------------- +# This default configuration allows any local user to connect as any +# PostgreSQL username, over either UNIX domain sockets or IP: -# By default, allow anything over UNIX domain sockets and localhost. local all trust host all 127.0.0.1 255.255.255.255 trust + +# If you want to allow non-local connections, you will need to add more +# "host" records (and don't forget to start the postmaster with "-i"!). + +# CAUTION: if you are on a multiple-user machine, the above default +# configuration is probably too liberal for you --- change it to use +# something other than "trust" authentication. -- GitLab