Re: server authentication over Unix-domain sockets - Mailing list pgsql-hackers

From KaiGai Kohei
Subject Re: server authentication over Unix-domain sockets
Date
Msg-id 4C2005AF.7090300@ak.jp.nec.com
Whole thread Raw
In response to server authentication over Unix-domain sockets  (Peter Eisentraut <peter_e@gmx.net>)
Responses Re: server authentication over Unix-domain sockets  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-hackers
I've checked on this patch.

As you described at the source code comments as follows,
it is not portable except for Linux due to the getsockopt() API.

+               // TODO: currently Linux-only code, needs to be made
+               // portable; see backend/libpq/auth.c

I expect it shall be fixed (using the code come from ident_unix()?)
before committing.


I'd like to point out one other point.
It uses getpwuid() to translate a user identifier into a user name,
but it returns a pointer of the static variable within glibc.
So, it is not thread-safe. I recommend to use getpwnam_r() instead.

Except for the issue, it looks to me fine.

* The patch can be applied on the head of the git repository.
* We can build the code without any warnings/errors.
* It works as described in the documentation.
 [kaigai@saba ~]$ php -r 'pg_connect("dbname=postgres requirepeer=xxxx");' PHP Warning:  pg_connect(): Unable to
connectto PostgreSQL server: invalid connection option "requirepeer" in Command line code on line 1
 
=> Existing library, so not supported.
 [kaigai@saba ~]$ env LD_LIBRARY_PATH=/usr/local/pgsql/lib/ \                  php -r 'pg_connect("dbname=postgres
requirepeer=xxxx");'PHP Warning:  pg_connect(): Unable to connect to PostgreSQL server: requirepeer failed (actual:
kaigai!= required: xxxx) in Command line code on line 1 LOG:  incomplete startup packet
 
=> Patched library, so it prevent unexpected user-id of server process
 [kaigai@saba ~]$ env LD_LIBRARY_PATH=/usr/local/pgsql/lib/ \                  php -r 'pg_connect("dbname=postgres
requirepeer=kaigai");'
=> Patched library, so it does not prevent anything for the expected user-id.
 [kaigai@saba ~]$ env LD_LIBRARY_PATH=/usr/local/pgsql/lib/ \                  php -r 'pg_connect("dbname=postgres");'
=> No "requirepeer", so it does not prevent anything.
 [kaigai@saba ~]$ env LD_LIBRARY_PATH=/usr/local/pgsql/lib/ \                  env PGREQUIREPEER=xyz php -r
'pg_connect("dbname=postgres");'PHP Warning:  pg_connect(): Unable to connect to PostgreSQL server: requirepeer failed
(actual:kaigai != required: xyz) in Command line code on line 1 LOG:  incomplete startup packet
 
=> PGREQUIREPEER environment variable, instead of "requirepeer" option. Same result.
 [kaigai@saba ~]$ env LD_LIBRARY_PATH=/usr/local/pgsql/lib/ \                  env PGREQUIREPEER=kaigai php -r
'pg_connect("dbname=postgres");'
=> PGREQUIREPEER environment variable, instead of "requirepeer" option. Same result.

Thanks,

(2010/05/30 20:00), Peter Eisentraut wrote:
> It has been discussed several times in the past that there is no way for
> a client to authenticate a server over Unix-domain sockets.  So
> depending on circumstances, a local user could easily insert his own
> server and collect passwords and data.  Suggestions for possible
> remedies included:
> 
> You can put the socket file in a sufficiently write-protected directory.
> But that would strongly deviate from the default setup, and anyway the
> client still cannot readily verify that the server is the right one.
> 
> You can also run SSL over Unix-domain sockets.  This is currently
> disabled in the code, but it would work just fine.  But it's obviously
> kind of awkward, and the connection overhead was noticeable in tests.
> 
> Then it was suggested to use the local "ident" mechanism in reverse, so
> the client could verify what user the server runs under.  I have
> implemented a prototype of this.  You can put, e.g.,
> 
> requirepeer=postgres
> 
> into the connection parameters, and the connection will be rejected
> unless the process at the other end of the socket is running as
> postgres.
> 
> The patch needs some portability work and possible refactoring because
> of that, but before I embark on that, comments on the concept?
> 
> 
> 
> 
> 


-- 
KaiGai Kohei <kaigai@ak.jp.nec.com>


pgsql-hackers by date:

Previous
From: gabrielle
Date:
Subject: Re: Explicit psqlrc
Next
From: Robert Haas
Date:
Subject: Re: Explicit psqlrc