Re: dblink: Add SCRAM pass-through authentication

From: Jacob Champion <jacob(dot)champion(at)enterprisedb(dot)com>
To: Matheus Alcantara <matheusssilv97(at)gmail(dot)com>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Peter Eisentraut <peter(at)eisentraut(dot)org>
Subject: Re: dblink: Add SCRAM pass-through authentication
Date: 2025-02-19 23:19:10
Message-ID: CAOYmi+moFGQ2jdF6pk-gwaTVqct-PHoDFdb6OG_HQpF4OAg+bw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Feb 19, 2025 at 12:02 PM Matheus Alcantara
<matheusssilv97(at)gmail(dot)com> wrote:
> > Hardcoding to scram-sha-256 would also prohibit the use of GSS or
> > standard password auth, now that I think about it. The docs currently
> > have a note about being able to choose... Should we add the other
> > permitted authentication types, i.e. `password,md5,scram-sha-256,gss`?
> > Or should we prohibit the use of other auth types if you've set
> > use_scram_passthrough? Or maybe there's an easier way to enforce the
> > use of the SCRAM keys, that better matches the current logic in
> > dblink_security_check?
> >
> But would it be possible to use SCRAM pass-through feature using another auth
> method?

No, but if you want the same foreign server to be accessible by users
who log in with different authentication types, forcing a single
require_auth setting will defeat that. I don't have a strong opinion
about how important maintaining that functionality is, but the code
seems to allow it today.

--

Some thoughts on v2-0001:

I like the conceptual simplification of get_connect_string().

> + /* first time, allocate or get the custom wait event */
> + if (dblink_we_connect == 0)
> + dblink_we_connect = WaitEventExtensionNew("DblinkConnectPgServer");

Replacing two existing wait events with one new one is a user-facing
change (see the documented list of events at [1]). Maybe we want that,
but it hasn't been explained. I think that change should be made
independently of a refactoring patch (or else defended in the commit
message).

> + if (foreign_server)
> + {
> + serverid = foreign_server->serverid;
> + user_mapping = GetUserMapping(userid, serverid);
> +
> + connstr = get_connect_string(foreign_server, user_mapping);
> + }

Is there any other valid value for user_mapping that a caller can
choose? If not, I'd like to see the GetUserMapping call pushed back
down into get_connect_string(), unless there's another reason for
pulling it up that I'm missing.

> + static const PQconninfoOption *options = NULL;
> +
> + /*
> + * Get list of valid libpq options.
> + *
> + * To avoid unnecessary work, we get the list once and use it throughout
> + * the lifetime of this backend process. We don't need to care about
> + * memory context issues, because PQconndefaults allocates with malloc.
> + */
> + if (!options)
> + {
> + options = PQconndefaults();
> + if (!options) /* assume reason for failure is OOM */
> + ereport(ERROR,
> + (errcode(ERRCODE_FDW_OUT_OF_MEMORY),
> + errmsg("out of memory"),
> + errdetail("Could not get libpq's default connection options.")));
> + }

It looks like `options` might be an unused variable in connect_pg_server()?

> - if (PQstatus(conn) == CONNECTION_BAD)
> + if (!conn || PQstatus(conn) != CONNECTION_OK)

I don't think this should be changed in a refactoring patch.
PQstatus() can handle a NULL conn pointer.

> - if (rconn)
> - pfree(rconn);

Looks like this code in dblink_connect() was dropped.

Thanks!
--Jacob

[1] https://www.postgresql.org/docs/current/dblink.html

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Michael Paquier 2025-02-19 23:55:51 Re: Proposal to CREATE FOREIGN TABLE LIKE
Previous Message Daniel Gustafsson 2025-02-19 23:12:50 Re: Serverside SNI support in libpq