Only superuser can set sslcert/sslkey in postgres_fdw user mappings
authorAndrew Dunstan <andrew@dunslane.net>
Mon, 13 Jan 2020 07:38:09 +0000 (18:08 +1030)
committerAndrew Dunstan <andrew@dunslane.net>
Mon, 13 Jan 2020 07:38:09 +0000 (18:08 +1030)
Othrwise there is a security risk.

Discussion: https://postgr.es/m/20200109103014.GA4192@msg.df7cb.de

contrib/postgres_fdw/expected/postgres_fdw.out
contrib/postgres_fdw/option.c
contrib/postgres_fdw/sql/postgres_fdw.sql
doc/src/sgml/postgres-fdw.sgml

index 0912d6cd5e41766304c17232fccfd67f2009492c..84fd3ad2e0c0e9f7238c6361f0b4d58bf0ef8868 100644 (file)
@@ -8898,6 +8898,15 @@ SELECT * FROM ft1_nopw LIMIT 1;
  1111 |  2 |    |    |    |    | ft1        | 
 (1 row)
 
+-- unpriv user also cannot set sslcert / sslkey on the user mapping
+-- first set password_required so we see the right error messages
+ALTER USER MAPPING FOR CURRENT_USER SERVER loopback_nopw OPTIONS (SET password_required 'true');
+ALTER USER MAPPING FOR CURRENT_USER SERVER loopback_nopw OPTIONS (ADD sslcert 'foo.crt');
+ERROR:  sslcert and sslkey are superuser-only
+HINT:  User mappings with the sslcert or sslkey options set may only be created or modified by the superuser
+ALTER USER MAPPING FOR CURRENT_USER SERVER loopback_nopw OPTIONS (ADD sslkey 'foo.key');
+ERROR:  sslcert and sslkey are superuser-only
+HINT:  User mappings with the sslcert or sslkey options set may only be created or modified by the superuser
 -- We're done with the role named after a specific user and need to check the
 -- changes to the public mapping.
 DROP USER MAPPING FOR CURRENT_USER SERVER loopback_nopw;
index 4a26056db08fe8d4bdea52e1956b4f7d20c6fc68..c442af5bb96bddd0df61f302fe8530de7f93d289 100644 (file)
@@ -159,6 +159,16 @@ postgres_fdw_validator(PG_FUNCTION_ARGS)
                         errmsg("password_required=false is superuser-only"),
                         errhint("User mappings with the password_required option set to false may only be created or modified by the superuser")));
        }
+       else if (strcmp(def->defname, "sslcert") == 0 ||
+                strcmp(def->defname, "sslkey") == 0)
+       {
+           /* similarly for sslcert / sslkey on user mapping */
+           if (catalog == UserMappingRelationId && !superuser())
+               ereport(ERROR,
+                       (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                        errmsg("sslcert and sslkey are superuser-only"),
+                        errhint("User mappings with the sslcert or sslkey options set may only be created or modified by the superuser")));
+       }
    }
 
    PG_RETURN_VOID();
index f2a4089e9d371cf495e7698140917940d083e622..acd7275c7294c6bef709217a8209206cf8dce7e2 100644 (file)
@@ -2567,6 +2567,7 @@ SELECT * FROM ft1_nopw LIMIT 1;
 -- Unpriv user cannot make the mapping passwordless
 ALTER USER MAPPING FOR CURRENT_USER SERVER loopback_nopw OPTIONS (ADD password_required 'false');
 
+
 SELECT * FROM ft1_nopw LIMIT 1;
 
 RESET ROLE;
@@ -2579,6 +2580,12 @@ SET ROLE regress_nosuper;
 -- Should finally work now
 SELECT * FROM ft1_nopw LIMIT 1;
 
+-- unpriv user also cannot set sslcert / sslkey on the user mapping
+-- first set password_required so we see the right error messages
+ALTER USER MAPPING FOR CURRENT_USER SERVER loopback_nopw OPTIONS (SET password_required 'true');
+ALTER USER MAPPING FOR CURRENT_USER SERVER loopback_nopw OPTIONS (ADD sslcert 'foo.crt');
+ALTER USER MAPPING FOR CURRENT_USER SERVER loopback_nopw OPTIONS (ADD sslkey 'foo.key');
+
 -- We're done with the role named after a specific user and need to check the
 -- changes to the public mapping.
 DROP USER MAPPING FOR CURRENT_USER SERVER loopback_nopw;
index 812e62cb36368519e1d62ddffc1495e9a4a92dce..94992be4272fd6b3ffea50587b827843873deea4 100644 (file)
      </listitem>
      <listitem>
       <para>
-       <literal>sslkey</literal> and <literal>sslpassword</literal> - these may
+       <literal>sslkey</literal> and <literal>sslcert</literal> - these may
        appear in <emphasis>either or both</emphasis> a connection and a user
        mapping. If both are present, the user mapping setting overrides the
        connection setting.
     </itemizedlist>
    </para>
 
+   <para>
+    Only superusers may create or modify user mappings with the
+    <literal>sslcert</literal> or <literal>sslkey</literal> settings.
+   </para>
    <para>
     Only superusers may connect to foreign servers without password
     authentication, so always specify the <literal>password</literal> option