Обсуждение: dissallowing access to databases

Поиск
Список
Период
Сортировка

dissallowing access to databases

От
zaor@sky.pl (Pawel Zaorski)
Дата:
Hello.

How can I prevent user from connecting to certain databases?

For example:

user1 has database user1. But he can easily do '\c otherdb' to connect
to a database own by other user.
And what scares me most, he cat create his own tables in this
database(!!)

In my pg_hba.conf I have a line:

local        all                                           crypt

which (IMO) means that any user can connect to any database. How to
change this to allow users connect *only* to their db?

PS. Forgive, if the question is obvious. Just point me to the right
explanation in the doc/faq.

--
greetings,
Pawel Zaorski
http://sky.pl

Re: dissallowing access to databases

От
Tomas Berndtsson
Дата:
zaor@sky.pl (Pawel Zaorski) writes:

> Hello.
>
> How can I prevent user from connecting to certain databases?
>
> For example:
>
> user1 has database user1. But he can easily do '\c otherdb' to connect
> to a database own by other user.
> And what scares me most, he cat create his own tables in this
> database(!!)
>
> In my pg_hba.conf I have a line:
>
> local        all                                           crypt
>
> which (IMO) means that any user can connect to any database. How to
> change this to allow users connect *only* to their db?

That the user can connect to other databases, indicates that you have
created that user as a superuser, i.e. he have permission to create
new postgres users. If the user is not a superuser, he shouldn't be
able to connect to other databases, than the ones he own or have
explicit permission to.


Tomas

Re: dissallowing access to databases

От
KuroiNeko
Дата:
 Pawel,

> How can I prevent user from connecting to certain databases?

 IIRC, users are server-wide, so there's no way to. To protect your tables,
you normally do something like:

create table blabla(
<...>
);

revoke all on blabla from public;
grant select on blabla to blabla_user;

 As long as data  dictionary is also kept in relations,  you should be able
to protect it  that way, too. It  seems that only DB  superusers and owners
have insert/delete rights on data dictionary.

 Ed



---
 Well I tried to be meek
  And I have tried to be mild
 But I spat like a woman
  And I sulked like a child
 I have lived behind the walls
  That have made me alone
 Striven for peace
  Which I never have known

 Dire Straits, Brothers In Arms, The Man's Too Strong (Knopfler)


Re: dissallowing access to databases

От
KuroiNeko
Дата:
> That the user can connect to other databases, indicates that you have
> created that user as a superuser

 Works perfectly for a simple mortal here. Moreof, a user can create his
tables:

copl=# select * from pg_shadow where usename = 'cdl_user';
usename     | cdl_user
usesysid    | 307
usecreatedb | f
usetrace    | f
usesuper    | f
usecatupd   | f
passwd      |
valuntil    |

copl=# \c copl cdl_user
You are now connected to database copl as user cdl_user.
copl=> \dt
Name  | copl_global
Type  | table
Owner | root
------+------------
Name  | ours_hints
Type  | table
Owner | root
------+------------
Name  | ours_refs
Type  | table
Owner | root
------+------------
Name  | ours_users
Type  | table
Owner | root

copl=> select * from copl_global;
ERROR:  copl_global: Permission denied.
copl=> create table test( id int4 );
CREATE
copl=> drop table test;
DROP
copl=> \c mailarch cdl_user
You are now connected to database mailarch as user cdl_user.
mailarch=> \dt
Name  | messages
Type  | table
Owner | root

mailarch=> select * from messages;
ERROR:  messages: Permission denied.
mailarch=> create table test( id int4 );
CREATE
mailarch=> drop table test;
DROP

 Am I missing something?

 TIA

 Ed


---
 Well I tried to be meek
  And I have tried to be mild
 But I spat like a woman
  And I sulked like a child
 I have lived behind the walls
  That have made me alone
 Striven for peace
  Which I never have known

 Dire Straits, Brothers In Arms, The Man's Too Strong (Knopfler)


Re: dissallowing access to databases

От
Tom Lane
Дата:
CREATE TABLE is not considered to be an access violation; we have no
concept of read-only access to a whole database, only to individual
tables.

If you want to restrict each user to connect only to his own database,
there's an option for that in pg_hba.conf:

#   host DBNAME IP_ADDRESS ADDRESS_MASK AUTHTYPE [AUTH_ARGUMENT]
#
# DBNAME is the name of a PostgreSQL database, "all" to indicate all
# databases, or "sameuser" to restrict a user's access to a database with
# the same user name.

If that's not flexible enough for you, allowing a particular subset of
users to connect to a particular database is possible but tedious.
One way is to set up a separate password file for each such DB, and use
password authentication that specifies the alternate password file ---
ie, a separate pg_hba.conf line for each such DB, with the allowed users
listed in a separate file per DB.  Another way is to use ident
authentication, specifying a separate "ident map name" for each DB,
and listing the allowed users for each DB under that map name.
This could stand to be improved; there's no comparable facility for
Kerberos auth methods.

            regards, tom lane

Re: dissallowing access to databases

От
zaor@sky.pl (Pawel Zaorski)
Дата:
Sun, Oct 15, 2000 at 11:56:01AM -0400, Tom Lane wrote:
>
> If you want to restrict each user to connect only to his own database,
> there's an option for that in pg_hba.conf:
>

Thanks, that solves my problem.
I missunderstood the option 'sameuser'.

--
greets,
Pawel Zaorski
http://sky.pl