Thread: FINAL: Multi-User PostgreSQL usage SECURITY

FINAL: Multi-User PostgreSQL usage SECURITY

From
"Mike Rogers"
Date:
Greets all;
    So this issue was raised quite some time ago by many many people and
seems to contantly be asked by new PostgreSQL users.  I never seem to find
any real answers for it.

    I am running a multi-user system and wish to have 10 user accounts with
10 different corresponding databases.  I do not want user 'a' to be able to
access user 'b's database-  Only their own 'a' database.  It really
shouldn't be this difficult.  I realize that I can revoke access to all
users on the 'a' tables, but then user B can still create tables within user
A's database.
    There has to be an easy solution.  As a hosting solutions provider for a
small number of clients, I have always steered in the direction of MySQL for
this feature, but I am seeing some demand for PostgreSQL.  I do not have the
resources to run each user with their own copy of PostgreSQL.

    I have tried chaning pg_hba.conf to add the database field to the user,
but that doesn't seem to help at all.

Any thoughts?  If it makes a difference, i can make the databases the same
name as the username if I must.

Please let me know if anyone knows of a way to do this.

Thanks in advance;
--
Mike

Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
Tom Lane
Date:
"Mike Rogers" <temp6453@hotmail.com> writes:
>     I have tried chaning pg_hba.conf to add the database field to the user,
> but that doesn't seem to help at all.

Make the database field "sameuser", and then the line only allows
connection to one's own database.  You will need an escape hatch to
allow you as superuser to get into everyone's db (else you can't run
pg_dumpall).  The escape hatch should be a second line in pg_hba.conf
with a tighter authorization method (eg, a secondary password file
with an entry only for you).

            regards, tom lane

Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
Stephan Szabo
Date:
On Fri, 7 Sep 2001, Mike Rogers wrote:

>     So this issue was raised quite some time ago by many many people and
> seems to contantly be asked by new PostgreSQL users.  I never seem to find
> any real answers for it.
>
>     I am running a multi-user system and wish to have 10 user accounts with
> 10 different corresponding databases.  I do not want user 'a' to be able to
> access user 'b's database-  Only their own 'a' database.  It really
> shouldn't be this difficult.  I realize that I can revoke access to all
> users on the 'a' tables, but then user B can still create tables within user
> A's database.
>     There has to be an easy solution.  As a hosting solutions provider for a
> small number of clients, I have always steered in the direction of MySQL for
> this feature, but I am seeing some demand for PostgreSQL.  I do not have the
> resources to run each user with their own copy of PostgreSQL.
>
>     I have tried chaning pg_hba.conf to add the database field to the user,
> but that doesn't seem to help at all.
>
> Any thoughts?  If it makes a difference, i can make the databases the same
> name as the username if I must.

IIRC, with dbnames same as user names you can use something like:
host sameuser <ip> <addressmask> password
to make the connections only to their own.

Otherwise, I think you can use separate external password files for the
different databases on different lines of the conf file...
#   password:   Authentication is done by matching a password supplied
#               in clear by the host. If AUTH_ARGUMENT is specified then
#               the password is compared with the user's entry in that
#               file (in the $PGDATA directory).  These per-host password
#               files can be maintained with the pg_passwd(1) utility.
#               If no AUTH_ARGUMENT appears then the password is compared
#               with the user's entry in the pg_shadow table.


Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
"Henshall, Stuart - WCP"
Date:
    If you want them with the ability to alter the schema within there
own database you could create them with createdb enable, create their db and
then remove that privilidge, or create the db and change the db owner.
    I'm not sure how you'd grant them rights to create users. Maybe with
an external C function that would check that who was doing what was allowed
then update stuff appropriatly (maybe connecting to a special db storing any
extra user info you need, probably which owner controls which user/group,
although you might be able to do this by having a group for each db with all
users a member and a special user for a db which all groups have as a
member).
- Stuart

> -----Original Message-----
> From:    Mike Rogers [SMTP:temp6453@hotmail.com]
> Sent:    Friday, September 07, 2001 11:08 PM
> To:    pgsql-admin@postgresql.org
> Subject:    FINAL: Multi-User PostgreSQL usage SECURITY
>
> Greets all;
>     So this issue was raised quite some time ago by many many people and
> seems to contantly be asked by new PostgreSQL users.  I never seem to find
> any real answers for it.
>
>     I am running a multi-user system and wish to have 10 user accounts
> with
> 10 different corresponding databases.  I do not want user 'a' to be able
> to
> access user 'b's database-  Only their own 'a' database.  It really
> shouldn't be this difficult.  I realize that I can revoke access to all
> users on the 'a' tables, but then user B can still create tables within
> user
> A's database.
>     There has to be an easy solution.  As a hosting solutions provider for
> a
> small number of clients, I have always steered in the direction of MySQL
> for
> this feature, but I am seeing some demand for PostgreSQL.  I do not have
> the
> resources to run each user with their own copy of PostgreSQL.
>
>     I have tried chaning pg_hba.conf to add the database field to the
> user,
> but that doesn't seem to help at all.
>
> Any thoughts?  If it makes a difference, i can make the databases the same
> name as the username if I must.
>
> Please let me know if anyone knows of a way to do this.
>
> Thanks in advance;
> --
> Mike

Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
jkm@patriot.net (Kevin McFadden)
Date:
""Mike Rogers"" <temp6453@hotmail.com> wrote in message news:OE658VnurbAMeMfHUye00004188@hotmail.com...
> Greets all;
>     So this issue was raised quite some time ago by many many people and
> seems to contantly be asked by new PostgreSQL users.  I never seem to find
> any real answers for it.
>
>     I am running a multi-user system and wish to have 10 user accounts with
> 10 different corresponding databases.  I do not want user 'a' to be able to
> access user 'b's database-  Only their own 'a' database.  It really
> shouldn't be this difficult.  I realize that I can revoke access to all
> users on the 'a' tables, but then user B can still create tables within user
> A's database.

Hi Mike,

I've just spent the last  hour trying to figure this out for myself.
Coming from Oracle, user management in PG is quite a mess, but when
they add the schema stuff in it should be easier.

I'm not really sure why no one has posted a concise answer in the past
(half of those 60 minutes were mostly spent searching groups.google),
so I hope this does what everyone has been hoping for.

What I tried to accomplish was to deny users the ability to enter
other databases and to also deny them access to template1 (why should
general non-admin users have access to this in the first place?)  It
should also allow the postgres user access to all (for backups,
etc...)

------------------------------------------------------
pg_hba.conf:

local   all                                     reject
local   sameuser                                password
host    sameuser  127.0.0.1   255.255.255.255   password
host    all       127.0.0.1   255.255.255.255   ident postgres

pg_ident.conf:

#MAP       IDENT    POSTGRES USERNAME
postgres    postgres  postgres
-------------------------------------------------------

- The first line restricts all local access.  It may not be necessary,
but it shouldn't hurt.
- The second line allows userA to connect to DB userA.
- The third line provides tcp/ip access.
- The fourth line provides the backdoor Tom Lane has mentioned.  It
also allows access to template1 for postgres.  It requires that identd
is running check inetd.conf or xinetd.d/identd.  MS users may be SOL.)
 It also requires you to set PGHOST=localhost in your environment.
(You can't do identd checking with local, unfortunately.)

Kevin

PS Users were created with the CREATEDB option which was removed once
the database was created.

Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
jkm@patriot.net (Kevin McFadden)
Date:
""Mike Rogers"" <temp6453@hotmail.com> wrote in message news:OE658VnurbAMeMfHUye00004188@hotmail.com...
> Greets all;
>     So this issue was raised quite some time ago by many many people and
> seems to contantly be asked by new PostgreSQL users.  I never seem to find
> any real answers for it.
>
>     I am running a multi-user system and wish to have 10 user accounts with
> 10 different corresponding databases.  I do not want user 'a' to be able to
> access user 'b's database-  Only their own 'a' database.  It really
> shouldn't be this difficult.  I realize that I can revoke access to all
> users on the 'a' tables, but then user B can still create tables within user
> A's database.

Hi Mike,

I've just spent the last  hour trying to figure this out for myself.
Coming from Oracle, user management in PG is quite a mess, but when
they add the schema stuff in it should be easier.

I'm not really sure why no one has posted a concise answer in the past
(half of those 60 minutes were mostly spent searching groups.google),
so I hope this does what everyone has been hoping for.

What I tried to accomplish was to deny users the ability to enter
other databases and to also deny them access to template1 (why should
general non-admin users have access to this in the first place?)  It
should also allow the postgres user access to all (for backups,
etc...)

------------------------------------------------------
pg_hba.conf:

local   all                                     reject
local   sameuser                                password
host    sameuser  127.0.0.1   255.255.255.255   password
host    all       127.0.0.1   255.255.255.255   ident postgres

pg_ident.conf:

#MAP       IDENT    POSTGRES USERNAME
postgres    postgres  postgres
-------------------------------------------------------

- The first line restricts all local access.  It may not be necessary,
but it shouldn't hurt.
- The second line allows userA to connect to DB userA.
- The third line provides tcp/ip access.
- The fourth line provides the backdoor Tom Lane has mentioned.  It
also allows access to template1 for postgres.  It requires that identd
is running check inetd.conf or xinetd.d/identd.  MS users may be SOL.)
 It also requires you to set PGHOST=localhost in your environment.
(You can't do identd checking with local, unfortunately.)

Kevin

PS Users were created with the CREATEDB option which was removed once
the database was created.

Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
jkm@patriot.net (Kevin McFadden)
Date:
""Mike Rogers"" <temp6453@hotmail.com> wrote in message news:OE658VnurbAMeMfHUye00004188@hotmail.com...
> Greets all;
>     So this issue was raised quite some time ago by many many people and
> seems to contantly be asked by new PostgreSQL users.  I never seem to find
> any real answers for it.
>
>     I am running a multi-user system and wish to have 10 user accounts with
> 10 different corresponding databases.  I do not want user 'a' to be able to
> access user 'b's database-  Only their own 'a' database.  It really
> shouldn't be this difficult.  I realize that I can revoke access to all
> users on the 'a' tables, but then user B can still create tables within user
> A's database.

Hi Mike,

I've just spent the last  hour trying to figure this out for myself.
Coming from Oracle, user management in PG is quite a mess, but when
they add the schema stuff in it should be easier.

I'm not really sure why no one has posted a concise answer in the past
(half of those 60 minutes were mostly spent searching groups.google),
so I hope this does what everyone has been hoping for.

What I tried to accomplish was to deny users the ability to enter
other databases and to also deny them access to template1 (why should
general non-admin users have access to this in the first place?)  It
should also allow the postgres user access to all (for backups,
etc...)

------------------------------------------------------
pg_hba.conf:

local   all                                     reject
local   sameuser                                password
host    sameuser  127.0.0.1   255.255.255.255   password
host    all       127.0.0.1   255.255.255.255   ident postgres

pg_ident.conf:

#MAP       IDENT    POSTGRES USERNAME
postgres    postgres  postgres
-------------------------------------------------------

- The first line restricts all local access.  It may not be necessary,
but it shouldn't hurt.
- The second line allows userA to connect to DB userA.
- The third line provides tcp/ip access.
- The fourth line provides the backdoor Tom Lane has mentioned.  It
also allows access to template1 for postgres.  It requires that identd
is running check inetd.conf or xinetd.d/identd.  MS users may be SOL.)
 It also requires you to set PGHOST=localhost in your environment.
(You can't do identd checking with local, unfortunately.)

Kevin

PS Users were created with the CREATEDB option which was removed once
the database was created.

Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
"Mike Krieger"
Date:
Is there any way I can make any user that _LOGS IN_ as postgres (using crypt
passwords) from localhost or through sockets, access to _ALL_ databases.
Currently I have all of my lines set as sameuser.  I have tried using ident
but it doesn't work, as the user that tries to connect varries from my
username, to that of the web server, etc.

    Anyway, is there anyway to force a user to be able to access ALL
databases on the server as opposed to just the sameuser without using IDENT?

Cheers;
--
Mike

----- Original Message -----
From: "Kevin McFadden" <jkm@patriot.net>
To: <pgsql-admin@postgresql.org>
Sent: Friday, September 14, 2001 5:22 PM
Subject: Re: [ADMIN] FINAL: Multi-User PostgreSQL usage SECURITY


> ""Mike Rogers"" <temp6453@hotmail.com> wrote in message
news:OE658VnurbAMeMfHUye00004188@hotmail.com...
> > Greets all;
> >     So this issue was raised quite some time ago by many many people and
> > seems to contantly be asked by new PostgreSQL users.  I never seem to
find
> > any real answers for it.
> >
> >     I am running a multi-user system and wish to have 10 user accounts
with
> > 10 different corresponding databases.  I do not want user 'a' to be able
to
> > access user 'b's database-  Only their own 'a' database.  It really
> > shouldn't be this difficult.  I realize that I can revoke access to all
> > users on the 'a' tables, but then user B can still create tables within
user
> > A's database.
>
> Hi Mike,
>
> I've just spent the last  hour trying to figure this out for myself.
> Coming from Oracle, user management in PG is quite a mess, but when
> they add the schema stuff in it should be easier.
>
> I'm not really sure why no one has posted a concise answer in the past
> (half of those 60 minutes were mostly spent searching groups.google),
> so I hope this does what everyone has been hoping for.
>
> What I tried to accomplish was to deny users the ability to enter
> other databases and to also deny them access to template1 (why should
> general non-admin users have access to this in the first place?)  It
> should also allow the postgres user access to all (for backups,
> etc...)
>
> ------------------------------------------------------
> pg_hba.conf:
>
> local   all                                     reject
> local   sameuser                                password
> host    sameuser  127.0.0.1   255.255.255.255   password
> host    all       127.0.0.1   255.255.255.255   ident postgres
>
> pg_ident.conf:
>
> #MAP       IDENT    POSTGRES USERNAME
> postgres    postgres  postgres
> -------------------------------------------------------
>
> - The first line restricts all local access.  It may not be necessary,
> but it shouldn't hurt.
> - The second line allows userA to connect to DB userA.
> - The third line provides tcp/ip access.
> - The fourth line provides the backdoor Tom Lane has mentioned.  It
> also allows access to template1 for postgres.  It requires that identd
> is running check inetd.conf or xinetd.d/identd.  MS users may be SOL.)
>  It also requires you to set PGHOST=localhost in your environment.
> (You can't do identd checking with local, unfortunately.)
>
> Kevin
>
> PS Users were created with the CREATEDB option which was removed once
> the database was created.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org
>

Re: FINAL: Multi-User PostgreSQL usage SECURITY

From
Felipe Nascimento
Date:

Guys,

In my case, I wanted a user to access only database A, with limited privileges, and I wanted to keeep users passwords encrypted (users passwords are not encrypted in pg_shadow table.):

1. I loged in template1 with user postgres.
        > psql template1 postgres
2. I created a user named dbowner with CREATEDB and CREATEUSER options
        template1=# create user dbowner with createdb createuser;
3. I quit and then accessed db template1 with user dbowner
        > psql template1 dbowner
4. I created database A, so dbowner is the owner of db A.
        template1=# create database A;
5. I created a user to be the one with limited privileges, and then granted the privileges a wanted to the tables and sequences I wanted him to have access.

        A=> create user dbguest;
        A=> grant select,insert,update,delete on table1 to dbguest
6. I used the tool pg_passwd to create a file of passwords that postgresql is gona use to authenticate the users. I named this file pgpasswords

        $ cd /var/lib/pgsql/data
        $ pg_passwd pgpasswords
        File "pgpasswords" does not exist.  Create? (y/n):y
        Username: dbguest
        New password:
        Re-enter new password:
7. I created a passord to user postgres as well:
        $ pg_passwd pgpasswords
        Username:posgres
        New password:
        Re-enter new password:
8. Now I edit the pg_hba.conf file to use this arquive of passwords:
        $ vi pg_hba.conf
        local        all                                   password pgpasswords
        host         A   127.0.0.1     255.255.255.255     password pgpasswords

If you want to give access to database B to another user, and don´t want this new user to access database A, create another file of passwords with pg_passwd, and put another line in the pg_hba.conf:

        host         B   127.0.0.1     255.255.255.255     password pgpasswordsB

Helpfull?????

See ya...

Felipe

-----Original Message-----
From: Mike Krieger [mailto:temp6453@hotmail.com]
Sent: Thursday, September 20, 2001 12:01 PM
To: Kevin McFadden; pgsql-admin@postgresql.org
Subject: Re: [ADMIN] FINAL: Multi-User PostgreSQL usage SECURITY

Is there any way I can make any user that _LOGS IN_ as postgres (using crypt
passwords) from localhost or through sockets, access to _ALL_ databases.
Currently I have all of my lines set as sameuser.  I have tried using ident
but it doesn't work, as the user that tries to connect varries from my
username, to that of the web server, etc.

    Anyway, is there anyway to force a user to be able to access ALL
databases on the server as opposed to just the sameuser without using IDENT?

Cheers;
--
Mike

----- Original Message -----
From: "Kevin McFadden" <jkm@patriot.net>
To: <pgsql-admin@postgresql.org>
Sent: Friday, September 14, 2001 5:22 PM
Subject: Re: [ADMIN] FINAL: Multi-User PostgreSQL usage SECURITY

> ""Mike Rogers"" <temp6453@hotmail.com> wrote in message
news:OE658VnurbAMeMfHUye00004188@hotmail.com...
> > Greets all;
> >     So this issue was raised quite some time ago by many many people and
> > seems to contantly be asked by new PostgreSQL users.  I never seem to
find
> > any real answers for it.
> >
> >     I am running a multi-user system and wish to have 10 user accounts
with
> > 10 different corresponding databases.  I do not want user 'a' to be able
to
> > access user 'b's database-  Only their own 'a' database.  It really
> > shouldn't be this difficult.  I realize that I can revoke access to all
> > users on the 'a' tables, but then user B can still create tables within
user
> > A's database.
>
> Hi Mike,
>
> I've just spent the last  hour trying to figure this out for myself.
> Coming from Oracle, user management in PG is quite a mess, but when
> they add the schema stuff in it should be easier.
>
> I'm not really sure why no one has posted a concise answer in the past
> (half of those 60 minutes were mostly spent searching groups.google),
> so I hope this does what everyone has been hoping for.
>
> What I tried to accomplish was to deny users the ability to enter
> other databases and to also deny them access to template1 (why should
> general non-admin users have access to this in the first place?)  It
> should also allow the postgres user access to all (for backups,
> etc...)
>
> ------------------------------------------------------
> pg_hba.conf:
>
> local   all                                     reject
> local   sameuser                                password
> host    sameuser  127.0.0.1   255.255.255.255   password
> host    all       127.0.0.1   255.255.255.255   ident postgres
>
> pg_ident.conf:
>
> #MAP       IDENT    POSTGRES USERNAME
> postgres    postgres  postgres
> -------------------------------------------------------
>
> - The first line restricts all local access.  It may not be necessary,
> but it shouldn't hurt.
> - The second line allows userA to connect to DB userA.
> - The third line provides tcp/ip access.
> - The fourth line provides the backdoor Tom Lane has mentioned.  It
> also allows access to template1 for postgres.  It requires that identd
> is running check inetd.conf or xinetd.d/identd.  MS users may be SOL.)
>  It also requires you to set PGHOST=localhost in your environment.
> (You can't do identd checking with local, unfortunately.)
>
> Kevin
>
> PS Users were created with the CREATEDB option which was removed once
> the database was created.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org
>

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org