Re: [GENERAL] I'm in need of something that should be there

2008-03-07 Thread Ralph Smith

SUPER Eric!  Very explanatory!

Thank you!

Ralph Smith
=



On Mar 6, 2008, at 10:17 AM, Erik Jones wrote:



On Mar 6, 2008, at 11:52 AM, Ralph Smith wrote:


Ralph Smith wrote:

 And should be easier to find in the manual!

 I've looked in many related chapters of the 8.2 manual for a way  
to

 find out
 WHY a specific user has access to a database.

 Chapter 5Data Definition
 Chapter 18  Database Roles  Privileges
 Chapter 20  Client Authorization


 postgres=# select * from pg_roles;
   rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb  
| rolcatupdate | rolcanlogin | rolconnlimit | rolpassword |  
rolvaliduntil | rolconfig |  oid
 --+--++---+- 
+--+-+--+- 
+---+---+---

 lines removed
   smithrn  | f| f  | t | t
| f| t   |   -1 | |  
infinity  |   | 16393


 This user can connect via his .pgpass or manually since he's in a
 netID range that requires a password.
 But he can create and drop tables in any database!!!

 Why is that?
 How can I find out what he can do?
 The GRANT and REVOKE sections say nothing about which pg_  
tables

 to query, and I've been lookin'!


 Thank you!

 Ralph Smith

 =

http://www.postgresql.org/docs/8.3/interactive/sql-grant.html

Depending on the type of object, the initial default privileges  
might
include granting some privileges to PUBLIC. The default is ...   
CONNECT

privilege and TEMP table creation privilege for databases

http://www.postgresql.org/docs/8.3/interactive
/ddl-schemas.html#DDL-SCHEMAS-PUBLIC

Note that by default, everyone has CREATE and USAGE privileges on  
the schema
public. This allows all users that are able to connect to a given  
database
to create objects in its public schema. If you do not want to  
allow that,

you can revoke that privilege:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;


Ralph's followup.

So am I to assume that there is no way to query just what privs a  
user/role has on an object, anything, from a DB to an index?


Well, the different database objects have the permissions that have  
been granted to them in columns in the catalog tables,  
pg_database.datacl, pg_class.relacl, and pg_proc.procacl for  
databases, relations, and functions, respectively.  That gives  
postgres the ability to answer the question Does this user have a  
given access permission for this object?  So, what you could do is  
much the same: for a given object, search through its *acl entry and  
determine if the given role is there with the pertinent permission,  
or if any group* roles in which the given role has membership does.   
Note for group role memberships that if the given role was not  
created with the INHERIT keyword then they won't have the group role  
permissions directly but, given that they do have the ability to  
change to the given group role, for your purposes, you could  
probably consider that a yes.  Also, note that you'd need to follow  
the role memberships up any role chains, for example where role  
John is in role Billing which is in role Admin or some such.


* Here I use the term group simply to denote a role in which other  
roles have membership.



Erik Jones

DBA | Emma®
[EMAIL PROTECTED]
800.595.4401 or 615.292.5888
615.292.0777 (fax)

Emma helps organizations everywhere communicate  market in style.
Visit us online at http://www.myemma.com






--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] I'm in need of something that should be there

2008-03-06 Thread Ralph Smith

Ralph Smith wrote:

 And should be easier to find in the manual!

 I've looked in many related chapters of the 8.2 manual for a way to
 find out
 WHY a specific user has access to a database.

 Chapter 5Data Definition
 Chapter 18  Database Roles  Privileges
 Chapter 20  Client Authorization


 postgres=# select * from pg_roles;
   rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb |  
rolcatupdate | rolcanlogin | rolconnlimit | rolpassword |  
rolvaliduntil | rolconfig |  oid
 --+--++---+- 
+--+-+--+- 
+---+---+---

 lines removed
   smithrn  | f| f  | t | t   |  
f| t   |   -1 | |  
infinity  |   | 16393


 This user can connect via his .pgpass or manually since he's in a
 netID range that requires a password.
 But he can create and drop tables in any database!!!

 Why is that?
 How can I find out what he can do?
 The GRANT and REVOKE sections say nothing about which pg_ tables
 to query, and I've been lookin'!


 Thank you!

 Ralph Smith

 =

http://www.postgresql.org/docs/8.3/interactive/sql-grant.html

Depending on the type of object, the initial default privileges might
include granting some privileges to PUBLIC. The default is ...   
CONNECT

privilege and TEMP table creation privilege for databases

http://www.postgresql.org/docs/8.3/interactive
/ddl-schemas.html#DDL-SCHEMAS-PUBLIC

Note that by default, everyone has CREATE and USAGE privileges on  
the schema
public. This allows all users that are able to connect to a given  
database
to create objects in its public schema. If you do not want to allow  
that,

you can revoke that privilege:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;


Ralph's followup.

So am I to assume that there is no way to query just what privs a user/ 
role has on an object, anything, from a DB to an index?



Thank you again,
Ralph Smith


---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

  http://www.postgresql.org/docs/faq


Re: [GENERAL] I'm in need of something that should be there

2008-03-06 Thread Richard Huxton

Ralph Smith wrote:
So am I to assume that there is no way to query just what privs a 
user/role has on an object, anything, from a DB to an index?


Well, obviously you can see what permissions an object has - \dp from 
psql. See the manual for details. Run psql with -E if you want to see 
the SQL that's being run.


I don't know of a shortcut to see what's been granted/revoked from a 
particular role. Hmm - given inheritence of permissions I'm not sure 
that's be the most useful approach anyway.


If you want to test a particular privilege, you can use the system 
functions of course.

http://www.postgresql.org/docs/8.3/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE


--
  Richard Huxton
  Archonet Ltd

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

  http://archives.postgresql.org/


Re: [GENERAL] I'm in need of something that should be there

2008-03-06 Thread Erik Jones


On Mar 6, 2008, at 11:52 AM, Ralph Smith wrote:


Ralph Smith wrote:

 And should be easier to find in the manual!

 I've looked in many related chapters of the 8.2 manual for a way to
 find out
 WHY a specific user has access to a database.

 Chapter 5Data Definition
 Chapter 18  Database Roles  Privileges
 Chapter 20  Client Authorization


 postgres=# select * from pg_roles;
   rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb  
| rolcatupdate | rolcanlogin | rolconnlimit | rolpassword |  
rolvaliduntil | rolconfig |  oid
 --+--++---+- 
+--+-+--+- 
+---+---+---

 lines removed
   smithrn  | f| f  | t | t
| f| t   |   -1 | |  
infinity  |   | 16393


 This user can connect via his .pgpass or manually since he's in a
 netID range that requires a password.
 But he can create and drop tables in any database!!!

 Why is that?
 How can I find out what he can do?
 The GRANT and REVOKE sections say nothing about which pg_  
tables

 to query, and I've been lookin'!


 Thank you!

 Ralph Smith

 =

http://www.postgresql.org/docs/8.3/interactive/sql-grant.html

Depending on the type of object, the initial default privileges  
might
include granting some privileges to PUBLIC. The default is ...   
CONNECT

privilege and TEMP table creation privilege for databases

http://www.postgresql.org/docs/8.3/interactive
/ddl-schemas.html#DDL-SCHEMAS-PUBLIC

Note that by default, everyone has CREATE and USAGE privileges on  
the schema
public. This allows all users that are able to connect to a given  
database
to create objects in its public schema. If you do not want to allow  
that,

you can revoke that privilege:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;


Ralph's followup.

So am I to assume that there is no way to query just what privs a  
user/role has on an object, anything, from a DB to an index?


Well, the different database objects have the permissions that have  
been granted to them in columns in the catalog tables,  
pg_database.datacl, pg_class.relacl, and pg_proc.procacl for  
databases, relations, and functions, respectively.  That gives  
postgres the ability to answer the question Does this user have a  
given access permission for this object?  So, what you could do is  
much the same: for a given object, search through its *acl entry and  
determine if the given role is there with the pertinent permission, or  
if any group* roles in which the given role has membership does.  Note  
for group role memberships that if the given role was not created with  
the INHERIT keyword then they won't have the group role permissions  
directly but, given that they do have the ability to change to the  
given group role, for your purposes, you could probably consider that  
a yes.  Also, note that you'd need to follow the role memberships up  
any role chains, for example where role John is in role Billing  
which is in role Admin or some such.


* Here I use the term group simply to denote a role in which other  
roles have membership.



Erik Jones

DBA | Emma®
[EMAIL PROTECTED]
800.595.4401 or 615.292.5888
615.292.0777 (fax)

Emma helps organizations everywhere communicate  market in style.
Visit us online at http://www.myemma.com




---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] so that your
  message can get through to the mailing list cleanly


Re: [GENERAL] I'm in need of something that should be there

2008-03-06 Thread John Koller
Ralph Smith wrote:

 Ralph Smith wrote:

  And should be easier to find in the manual!
 
  I've looked in many related chapters of the 8.2 manual for a way to
  find out
  WHY a specific user has access to a database.
 
  Chapter 5Data Definition
  Chapter 18  Database Roles  Privileges
  Chapter 20  Client Authorization


  postgres=# select * from pg_roles;
rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb |
 rolcatupdate | rolcanlogin | rolconnlimit | rolpassword |
 rolvaliduntil | rolconfig |  oid
  --+--++---+-
 +--+-+--+-
 +---+---+---
  lines removed
smithrn  | f| f  | t | t   |
 f| t   |   -1 | |
 infinity  |   | 16393
 
  This user can connect via his .pgpass or manually since he's in a
  netID range that requires a password.
  But he can create and drop tables in any database!!!
 
  Why is that?
  How can I find out what he can do?
  The GRANT and REVOKE sections say nothing about which pg_ tables
  to query, and I've been lookin'!
 
 
  Thank you!
 
  Ralph Smith
 
  =

 http://www.postgresql.org/docs/8.3/interactive/sql-grant.html

 Depending on the type of object, the initial default privileges might
 include granting some privileges to PUBLIC. The default is ...
 CONNECT
 privilege and TEMP table creation privilege for databases

 http://www.postgresql.org/docs/8.3/interactive
 /ddl-schemas.html#DDL-SCHEMAS-PUBLIC

 Note that by default, everyone has CREATE and USAGE privileges on
 the schema
 public. This allows all users that are able to connect to a given
 database
 to create objects in its public schema. If you do not want to allow
 that,
 you can revoke that privilege:

 REVOKE CREATE ON SCHEMA public FROM PUBLIC;
 
 Ralph's followup.
 
 So am I to assume that there is no way to query just what privs a user/
 role has on an object, anything, from a DB to an index?
 
 
 Thank you again,
 Ralph Smith
 
You could also query information_schema.table_privileges for information
about table grants.

http://www.postgresql.org/docs/8.3/interactive/infoschema-table-privileges.html


-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: [GENERAL] I'm in need of something that should be there

2008-03-05 Thread John Koller
Ralph Smith wrote:

 And should be easier to find in the manual!
 
 I've looked in many related chapters of the 8.2 manual for a way to
 find out
 WHY a specific user has access to a database.
 
 Chapter 5Data Definition
 Chapter 18  Database Roles  Privileges
 Chapter 20  Client Authorization

 
 postgres=# select * from pg_roles;
   rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb |
 rolcatupdate | rolcanlogin | rolconnlimit | rolpassword |
 rolvaliduntil | rolconfig |  oid
 --+--++---+-
 +--+-+--+-
 +---+---+---
 lines removed
   smithrn  | f| f  | t | t   |
 f| t   |   -1 | |
 infinity  |   | 16393
 
 This user can connect via his .pgpass or manually since he's in a
 netID range that requires a password.
 But he can create and drop tables in any database!!!
 
 Why is that?
 How can I find out what he can do?
 The GRANT and REVOKE sections say nothing about which pg_ tables
 to query, and I've been lookin'!
 
 
 Thank you!
 
 Ralph Smith
 
 =

http://www.postgresql.org/docs/8.3/interactive/sql-grant.html

Depending on the type of object, the initial default privileges might
include granting some privileges to PUBLIC. The default is ...  CONNECT
privilege and TEMP table creation privilege for databases

http://www.postgresql.org/docs/8.3/interactive
/ddl-schemas.html#DDL-SCHEMAS-PUBLIC

Note that by default, everyone has CREATE and USAGE privileges on the schema
public. This allows all users that are able to connect to a given database
to create objects in its public schema. If you do not want to allow that,
you can revoke that privilege:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;



---(end of broadcast)---
TIP 6: explain analyze is your friend