Listar los privilegios de la base de datos usando psql

144

Estoy en medio de una migración del servidor de base de datos y no puedo imaginar (después de buscar en Google y buscar aquí) ¿cómo puedo enumerar los privilegios de la base de datos (o todos los privilegios en todo el servidor) en PostgreSQL usando la psqlherramienta de línea de comandos?

Estoy en Ubuntu 11.04 y mi versión de PostgreSQL es 8.2.x.

pedrosanta
fuente

Respuestas:

117
postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

Los documentos sobreGRANT dan una explicación de cómo interpretar la salida. Para obtener privilegios específicos en una tabla de la base de datos actual, use \z myTable.

DrColossos
fuente
55
\z myTablees perfecto para garantizar que hayas otorgado acceso a alguien con éxito y evitar parecer un idiota cuando dices "¿está bien, funciona ahora? ¿no? "
ijoseph
109

tal vez te refieres a enumerar a los usuarios y sus privilegios para una base de datos. No puedo deducir de la pregunta:

postgres=> \du
                             List of roles
    Role name    |  Attributes  |                    Member of
-----------------+--------------+------------------------------------------------
 dba             | Create role  | {util_user,helpdesk_user,helpdesk_admin}
 helpdesk_admin  | Cannot login | {helpdesk_user}
 helpdesk_user   | Cannot login | {helpdesk_reader}
 jack            |              | {helpdesk_admin}
 postgres        | Superuser    | {}
                 : Create role
                 : Create DB
Jack Douglas
fuente
No, quería una manera de enumerar los privilegios de una base de datos específica, pero ya lo descubrí. El propietario de la base de datos siempre tiene todos los privilegios, ¿verdad? Y luego podemos agregar más privilegios en la base de datos a otros usuarios / grupos. Esos se enumeran con el comando \ l. Pero muchas gracias de todos modos.
pedrosanta
80

Puedes hacerlo siguiendo:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

Esto le da este tipo de salida:

mail=# select grantee, privilege_type from information_schema.role_table_grants where table_name='aliases';
   grantee    |  privilege_type
--------------+-----------------
 mailreader   |  INSERT
 mailreader   |  SELECT
 mailreader   |  UPDATE
 mailreader   |  DELETE
 mailreader   |  TRUNCATE
 mailreader   |  REFERENCES
 mailreader   |  TRIGGER
(7 rows)

mail=#
Himanshu Chauhan
fuente
10
Bienvenido al sitio! Una pequeña pregunta: ¿por qué insertó la salida como una captura de pantalla? Utilice el texto normal con la mayor frecuencia posible.
dezso
1
¿Hay alguna manera de ver el permiso para las secuencias? Esto solo da información de la tabla
curioso el
Tenga en cuenta que (como mínimo en Postgres 9.4) lo anterior no funcionará para vistas materializadas.
SeldomNeedy
@HimanshuChauhan si agrego un nuevo rol 'new_role' usando el rol 'mailreader', ¿la lista information_schema.role_table_grants incluirá también new_role?
Anand
15

Usando psqlmetacomandos:

https://www.postgresql.org/docs/current/static/app-psql.html

Revisar la página con Ctrl + F da:

\ddp [ pattern ] Enumera la configuración predeterminada de privilegios de acceso.

\dp [ pattern ] Enumera tablas, vistas y secuencias con sus privilegios de acceso asociados.

\l[+] [ pattern ] Listar las bases de datos en el servidor y mostrar .... privilegios de acceso.

También se menciona anteriormente, pero no se encuentra con la palabra "privilegios" en la página del manual:

\du+para roles con inicio de sesión y \dg+para roles sin: tendrá un archivo "Member of"donde encontrará roles otorgados a roles.

Deliberadamente omito los privilegios de función y lenguaje aquí, que se encuentran en el psqlmanual como apenas manipulados (y si usa esos privilegios, no vendrá aquí para recibir un consejo). lo mismo para los tipos definidos por el usuario, dominios, etc., usando "+" después del metacomando le mostrará privilegios si corresponde.


Una pequeña forma extrema de verificar los privilegios es dejar caer al usuario en la transacción, por ejemplo:

s=# begin; drop user x;
BEGIN
Time: 0.124 ms
ERROR:  role "x" cannot be dropped because some objects depend on it
DETAIL:  privileges for type "SO dT"
privileges for sequence so
privileges for schema bin
privileges for table xx
privileges for table "csTest"
privileges for table tmp_x
privileges for table s1
privileges for table test
Time: 0.211 ms
s=# rollback;
ROLLBACK
Time: 0.150 ms

Cuando la lista es más larga que N, (al menos en 9.3), la advertencia con la lista de privilegios se contrae, pero aún puede encontrarla llena en los registros ...

Vao Tsun
fuente
12

Undercovers psql utiliza la siguiente consulta cuando emite el \ducomando.

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
Dennis
fuente
es este estándar sql?
ribamar
`" ERROR: la columna r.rolbypassrls no existe \ n \ nLINE 9:, r.rolbypassrls \ n \ n ^ \ n ",` desafortunadamente no funciona
ribamar
10

Un paso adicional (posiblemente obvio) es convertirse en el usuario de postgres, de lo contrario, puede obtener errores sobre roles que no existen.

sudo su - postgres
psql -l

o

psql
postgres=> \l
Adam Shostack
fuente
2
Meta: Estoy agregando esto porque esta pregunta está altamente calificada en la consulta de Google "roles de lista de postgres" y pasé un poco de tiempo en resultados clasificados mucho más bajos antes de encontrar lo que buscaba, así que estoy memorizando la información adicional.
Adam Shostack
-1
-- file: src/sql/pgsql/list-table-priviledges.sql
-- usage:
-- alias psql="PGPASSWORD=${postgres_db_useradmin_pw:-} psql -v -q -t -X -w -U ${postgres_db_useradmin:-}"
-- psql -d dev_qto < src/sql/pgsql/list-table-priviledges.sql | less
SELECT grantee, table_name , privilege_type
FROM information_schema.role_table_grants
WHERE 1=1
AND grantee = 'usrqtoapp'
AND table_name='readme_doc'
;

-- purpose:
-- list the priveledges per user or for user in a database
-- eof file: src/sql/pgsql/list-table-priviledges.sql

salida

usrqtoapp | readme_doc | INSERT
usrqtoapp | readme_doc | SELECT
usrqtoapp | readme_doc | UPDATE
usrqtoapp | readme_doc | DELETE
Yordan Georgiev
fuente