Re: pgsql: Add support for GSSAPI authentication. - Mailing list pgsql-committers
| From | Magnus Hagander |
|---|---|
| Subject | Re: pgsql: Add support for GSSAPI authentication. |
| Date | |
| Msg-id | 4693BF63.8020105@hagander.net Whole thread Raw |
| In response to | Re: pgsql: Add support for GSSAPI authentication. (Tom Lane <tgl@sss.pgh.pa.us>) |
| Responses |
Re: pgsql: Add support for GSSAPI authentication.
|
| List | pgsql-committers |
Tom Lane wrote:
> mha@postgresql.org (Magnus Hagander) writes:
>> Add support for GSSAPI authentication.
>
> I looked over this patch and have a few comments, mostly stylistic:
Thanks!
> + /* errmsg_internal, since translation of the first part must be
> + * done before calling this function anyway. */
> + ereport(severity,
> + (errmsg_internal("%s:%s\n%s", text, localmsg1, localmsg2)));
>
> Newlines in errmsg texts are generally a bad idea; you shouldn't be
> trying to impose formatting that way. Perhaps localmsg2 needs to be an
> errdetail, instead? It's not real clear what any of the three parts
> are supposed to be ... perhaps you should choose more helpful variable
> names.
I'll look into exactly how it is. The docs I've looked at so far haven't
really been forthcoming into what goes where either :-S
> + ereport(DEBUG4,
> + (errmsg_internal("Processing received GSS token of length: %u",
> + gbuf.length)));
>
> The standard locution for purely-internal debugging messages is
> elog(DEBUGn, "msg", ...) --- ereport is just useless notational
> complexity for this. (Quite a few places besides here)
Ok. Want it changed for the lot of them, or just for future ref?
> + ereport(DEBUG1,
> + (errmsg("GSSAPI authenticated name: %s", (char *)gbuf.value)));
>
> Should this still be here? In fact, how much of this logging do we want
> in the production version at all? I'm a bit worried about exposing
> security-sensitive info in the log.
It's on DEBUG, so it wouldn't be in production, no? I think it makes
sense to keep it there, since the gssapi name can be different from the
specified username... (both in content and case)
> + ereport(ERROR,
> + (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
> + errmsg("provided username and GSSAPI username don't match"),
> + errdetail("provided: %s, GSSAPI: %s",
> + port->user_name, (char *)gbuf.value)));
>
> Same here: this is definitely exposing more information to the client side
> than we think appropriate for any other auth type. Normally the return
> to the client should be no more than "GSSAPI authentication failed", and
> it should not be coming out from this level of the code.
Hm, it's all just information that the client provided, but I take it
you're worried about cases where a server (say a web server) is
reporting the error directly to a client that's not supposed to know it?
But it's certainly data you'd want in your server logs - it's going to
be impossible to debug otherwise. So what'd be the best way to get that
in there while not sending it back to the client?
> if (MyProcPort != NULL)
> {
> + #ifdef ENABLE_GSS
> + OM_uint32 min_s;
> + /* Shutdown GSSAPI layer */
> + if (MyProcPort->gss->ctx)
> + gss_delete_sec_context(&min_s, MyProcPort->gss->ctx, NULL);
> +
> + if (MyProcPort->gss->cred)
> + gss_release_cred(&min_s, MyProcPort->gss->cred);
> + #endif
> +
> /* Cleanly shut down SSL layer */
> secure_close(MyProcPort);
>
> Why is this delayed until here? AFAICS we don't need the GSSAPI
> infrastructure anymore after the auth cycle is done.
It was in the original patch, so I left it there. The main reason is
that if/when we implement GSSAPI encryption, we will need the
infrastructure until this point.
> + /*
> + * Allocate GSSAPI specific state struct
> + */
> + #ifdef ENABLE_GSS
> + port->gss = (pg_gssinfo *)calloc(1, sizeof(pg_gssinfo));
> + #endif
>
> This is pretty horrid --- what if calloc fails? Why not use palloc0?
Wow. Can't beleive I missed that one :-S
Will fix.
The reason for not using palloc0 - well, I was modeling it on the call
to allocate the actual port structure, which uses calloc. Is that wrong?
> + /*
> + * We can be called repeatedly for the same buffer.
> + * Avoid re-allocating the buffer in this case -
> + * just re-use the old buffer.
> + */
> + if (llen != conn->ginbuf.length)
> + {
> + if (conn->ginbuf.value)
> + free(conn->ginbuf.value);
> +
> + conn->ginbuf.length = llen;
> + conn->ginbuf.value = malloc(llen);
> + }
>
> Again, lacking any check for malloc failure; though on this side you
> have to handle the failure yourself.
Gah. I actually had code that checked for that error in a different copy
of the patch (the win32 branch) :-( Missed to sync it in.
(Will commit fixes to these once I'm back at the box where I can test
that it doesn't break things)
//Magnus
pgsql-committers by date: