From 1b4e729eaa97b6169e08abc70e84709cea2cd00a Mon Sep 17 00:00:00 2001 From: Magnus Hagander <magnus@hagander.net> Date: Fri, 9 Jan 2009 10:13:19 +0000 Subject: [PATCH] Make krb_realm and krb_server_hostname be pg_hba options only, and remove their GUCs. In passing, noted that the pg_hba options for krb5 authentication weren't listed at all - so add this. --- doc/src/sgml/client-auth.sgml | 71 ++++++++++++++----- doc/src/sgml/config.sgml | 36 +--------- src/backend/libpq/auth.c | 53 ++++---------- src/backend/utils/misc/guc.c | 21 +----- src/backend/utils/misc/postgresql.conf.sample | 3 - 5 files changed, 72 insertions(+), 112 deletions(-) diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index f5cc4729101..029bfd45661 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/client-auth.sgml,v 1.117 2009/01/07 13:09:21 mha Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/client-auth.sgml,v 1.118 2009/01/09 10:13:18 mha Exp $ --> <chapter id="client-authentication"> <title>Client Authentication</title> @@ -801,18 +801,8 @@ omicron bryanh guest1 <term>krb_realm</term> <listitem> <para> - Overrides the <xref linkend="guc-krb-realm"> parameter, setting which realm - to verify the authenticated user principal against. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>krb_server_hostname</term> - <listitem> - <para> - Overrides the <xref linkend="guc-krb-server-hostname"> parameter, setting which - hostname will be used for the server principal when using Kerberos. + Sets the realm to match user principal names against. If this parameter + is not set, the realm of the user will be ignored. </para> </listitem> </varlistentry> @@ -874,8 +864,8 @@ omicron bryanh guest1 <term>krb_realm</term> <listitem> <para> - Overrides the <xref linkend="guc-krb-realm"> parameter, setting which realm - to verify the authenticated user principal against. + Sets the realm to match user principal names against. If this parameter + is not set, the realm of the user will be ignored. </para> </listitem> </varlistentry> @@ -953,7 +943,7 @@ omicron bryanh guest1 <literal>pgusername@realm</>. 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 - <xref linkend="guc-krb-realm"> parameter. + krb_realm parameter in <filename>pg_hba.conf</>. </para> <para> @@ -996,6 +986,55 @@ omicron bryanh guest1 database access over the web, no extra passwords required. </para> + <para> + The following configuration options are supported for <productname>Kerberos</productname>: + <variablelist> + <varlistentry> + <term>map</term> + <listitem> + <para> + Allows for mapping between system and database usernames. See + <xref linkend="auth-username-maps"> for details. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>include_realm</term> + <listitem> + <para> + Include the realm name from the authenticated user principal. This is useful + in combination with Username maps (See <xref linkend="auth-username-maps"> + for details), especially with regular expressions, to map users from + multiple realms. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>krb_realm</term> + <listitem> + <para> + Sets the realm to match user principal names against. If this parameter + is not set, the realm of the user will be ignored. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>krb_server_hostname</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"> diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 564e5c0236c..0d8cf0a84cb 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.203 2009/01/07 22:40:48 tgl Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.204 2009/01/09 10:13:18 mha Exp $ --> <chapter Id="runtime-config"> <title>Server Configuration</title> @@ -612,22 +612,6 @@ SET ENABLE_SEQSCAN TO OFF; </listitem> </varlistentry> - <varlistentry id="guc-krb-realm" xreflabel="krb_realm"> - <term><varname>krb_realm</varname> (<type>string</type>)</term> - <indexterm> - <primary><varname>krb_realm</> configuration parameter</primary> - </indexterm> - <listitem> - <para> - Sets the realm to match Kerberos, GSSAPI and SSPI user names against. - See <xref linkend="kerberos-auth">, <xref linkend="gssapi-auth"> or - <xref linkend="sspi-auth"> for details. This parameter can only be - set in the <filename>postgresql.conf</> file or on the server - command line. - </para> - </listitem> - </varlistentry> - <varlistentry id="guc-krb-server-keyfile" xreflabel="krb_server_keyfile"> <term><varname>krb_server_keyfile</varname> (<type>string</type>)</term> <indexterm> @@ -657,24 +641,6 @@ SET ENABLE_SEQSCAN TO OFF; </listitem> </varlistentry> - <varlistentry id="guc-krb-server-hostname" xreflabel="krb_server_hostname"> - <term><varname>krb_server_hostname</varname> (<type>string</type>)</term> - <indexterm> - <primary><varname>krb_server_hostname</> configuration parameter</primary> - </indexterm> - <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. See <xref linkend="kerberos-auth"> - for details. This parameter can only be set in the <filename>postgresql.conf</> - file or on the server command line. - </para> - </listitem> - </varlistentry> - <varlistentry id="guc-krb-caseins-users" xreflabel="krb_caseins_users"> <term><varname>krb_caseins_users</varname> (<type>boolean</type>)</term> <indexterm> diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index 4b5773ab881..f0561a5b969 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.177 2009/01/07 13:09:21 mha Exp $ + * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.178 2009/01/09 10:13:18 mha Exp $ * *------------------------------------------------------------------------- */ @@ -129,8 +129,6 @@ static int CheckCertAuth(Port *port); char *pg_krb_server_keyfile; char *pg_krb_srvnam; bool pg_krb_caseins_users; -char *pg_krb_server_hostname = NULL; -char *pg_krb_realm = NULL; /*---------------------------------------------------------------- @@ -645,10 +643,7 @@ pg_krb5_init(Port *port) * If no hostname was specified, pg_krb_server_hostname is already NULL. * If it's set to blank, force it to NULL. */ - if (port->hba->krb_server_hostname) - khostname = port->hba->krb_server_hostname; - else - khostname = pg_krb_server_hostname; + khostname = port->hba->krb_server_hostname; if (khostname && khostname[0] == '\0') khostname = NULL; @@ -694,7 +689,6 @@ pg_krb5_recvauth(Port *port) krb5_ticket *ticket; char *kusername; char *cp; - char *realmmatch; if (get_role_line(port->user_name) == NULL) return STATUS_ERROR; @@ -740,11 +734,6 @@ pg_krb5_recvauth(Port *port) return STATUS_ERROR; } - if (port->hba->krb_realm) - realmmatch = port->hba->krb_realm; - else - realmmatch = pg_krb_realm; - cp = strchr(kusername, '@'); if (cp) { @@ -757,19 +746,19 @@ pg_krb5_recvauth(Port *port) *cp = '\0'; cp++; - if (realmmatch != NULL && strlen(realmmatch)) + if (port->hba->krb_realm != NULL && strlen(port->hba->krb_realm)) { /* Match realm against configured */ if (pg_krb_caseins_users) - ret = pg_strcasecmp(realmmatch, cp); + ret = pg_strcasecmp(port->hba->krb_realm, cp); else - ret = strcmp(realmmatch, cp); + ret = strcmp(port->hba->krb_realm, cp); if (ret) { elog(DEBUG2, "krb5 realm (%s) and configured realm (%s) don't match", - cp, realmmatch); + cp, port->hba->krb_realm); krb5_free_ticket(pg_krb5_context, ticket); krb5_auth_con_free(pg_krb5_context, auth_context); @@ -777,7 +766,7 @@ pg_krb5_recvauth(Port *port) } } } - else if (realmmatch && strlen(realmmatch)) + else if (port->hba->krb_realm&& strlen(port->hba->krb_realm)) { elog(DEBUG2, "krb5 did not return realm but realm matching was requested"); @@ -874,7 +863,6 @@ pg_GSS_recvauth(Port *port) int ret; StringInfoData buf; gss_buffer_desc gbuf; - char *realmmatch; /* * GSS auth is not supported for protocol versions before 3, because it @@ -1034,11 +1022,6 @@ pg_GSS_recvauth(Port *port) gettext_noop("retrieving GSS user name failed"), maj_stat, min_stat); - if (port->hba->krb_realm) - realmmatch = port->hba->krb_realm; - else - realmmatch = pg_krb_realm; - /* * Split the username at the realm separator */ @@ -1055,28 +1038,28 @@ pg_GSS_recvauth(Port *port) *cp = '\0'; cp++; - if (realmmatch != NULL && strlen(realmmatch)) + if (port->hba->krb_realm != NULL && strlen(port->hba->krb_realm)) { /* * Match the realm part of the name first */ if (pg_krb_caseins_users) - ret = pg_strcasecmp(realmmatch, cp); + ret = pg_strcasecmp(port->hba->krb_realm, cp); else - ret = strcmp(realmmatch, cp); + ret = strcmp(port->hba->krb_realm, cp); if (ret) { /* GSS realm does not match */ elog(DEBUG2, "GSSAPI realm (%s) and configured realm (%s) don't match", - cp, realmmatch); + cp, port->hba->krb_realm); gss_release_buffer(&lmin_s, &gbuf); return STATUS_ERROR; } } } - else if (realmmatch && strlen(realmmatch)) + else if (port->hba->krb_realm && strlen(port->hba->krb_realm)) { elog(DEBUG2, "GSSAPI did not return realm but realm matching was requested"); @@ -1140,7 +1123,6 @@ pg_SSPI_recvauth(Port *port) SID_NAME_USE accountnameuse; HMODULE secur32; QUERY_SECURITY_CONTEXT_TOKEN_FN _QuerySecurityContextToken; - char *realmmatch; /* * SSPI auth is not supported for protocol versions before 3, because it @@ -1353,18 +1335,13 @@ pg_SSPI_recvauth(Port *port) * Compare realm/domain if requested. In SSPI, always compare case * insensitive. */ - if (port->hba->krb_realm) - realmmatch = port->hba->krb_realm; - else - realmmatch = pg_krb_realm; - - if (realmmatch && strlen(realmmatch)) + if (port->hba->krb_realm && strlen(port->hba->krb_realm)) { - if (pg_strcasecmp(realmmatch, domainname)) + if (pg_strcasecmp(port->hba->krb_realm, domainname)) { elog(DEBUG2, "SSPI domain (%s) and configured domain (%s) don't match", - domainname, realmmatch); + domainname, port->hba->krb_realm); return STATUS_ERROR; } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 22cfbff6105..8d927ae1387 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.491 2009/01/07 22:40:49 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.492 2009/01/09 10:13:18 mha Exp $ * *-------------------------------------------------------------------- */ @@ -2130,16 +2130,6 @@ static struct config_string ConfigureNamesString[] = "$libdir", NULL, NULL }, - { - {"krb_realm", PGC_SIGHUP, CONN_AUTH_SECURITY, - gettext_noop("Sets realm to match Kerberos and GSSAPI users against."), - NULL, - GUC_SUPERUSER_ONLY - }, - &pg_krb_realm, - NULL, NULL, NULL - }, - { {"krb_server_keyfile", PGC_SIGHUP, CONN_AUTH_SECURITY, gettext_noop("Sets the location of the Kerberos server key file."), @@ -2159,15 +2149,6 @@ static struct config_string ConfigureNamesString[] = PG_KRB_SRVNAM, NULL, NULL }, - { - {"krb_server_hostname", PGC_SIGHUP, CONN_AUTH_SECURITY, - gettext_noop("Sets the hostname of the Kerberos server."), - NULL - }, - &pg_krb_server_hostname, - NULL, NULL, NULL - }, - { {"bonjour_name", PGC_POSTMASTER, CONN_AUTH_SETTINGS, gettext_noop("Sets the Bonjour broadcast service name."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index d53861511ae..ffa5055b768 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -81,10 +81,7 @@ # Kerberos and GSSAPI #krb_server_keyfile = '' #krb_srvname = 'postgres' # (Kerberos only) -#krb_server_hostname = '' # empty string matches any keytab entry - # (Kerberos only) #krb_caseins_users = off -#krb_realm = '' # - TCP Keepalives - # see "man 7 tcp" for details -- GitLab