¿Qué hace exactamente GRANT USAGE ON SCHEMA?

Resuelto Marco Sulla asked hace 11 años • 4 respuestas

Estoy intentando crear una base de datos Postgres por primera vez.

Asigné permisos básicos de solo lectura al rol de base de datos que debe acceder a la base de datos desde mis scripts PHP y tengo una curiosidad: si ejecuto

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

¿Hay alguna necesidad de ejecutar esto también?

GRANT USAGE ON SCHEMA schema TO role;

De la documentación :

USO: Para esquemas, permite el acceso a objetos contenidos en el esquema especificado (suponiendo que también se cumplan los requisitos de privilegios propios de los objetos). Básicamente, esto permite al beneficiario "buscar" objetos dentro del esquema.

Creo que si puedo seleccionar o manipular cualquier dato contenido en el esquema, puedo acceder a cualquier objeto del esquema mismo. ¿Me equivoco? Si no, GRANT USAGE ON SCHEMA¿para qué se utiliza? ¿Y qué significa exactamente la documentación con "suponer que también se cumplen los propios requisitos de privilegios de los objetos"?

Marco Sulla avatar Jun 27 '13 15:06 Marco Sulla
Aceptado

GRANTLas imágenes de diferentes objetos están separadas. GRANTTrabajar en una base de datos no otorga GRANTderechos sobre el esquema que contiene. De manera similar, GRANTtrabajar en un esquema no otorga derechos sobre las tablas que contiene.

Si tiene derechos para SELECTacceder a una tabla, pero no para verla en el esquema que la contiene, entonces no podrá acceder a la tabla.

Las pruebas de derechos se realizan en orden:

Do you have `USAGE` on the schema? 
    No:  Reject access. 
    Yes: Do you also have the appropriate rights on the table? 
        No:  Reject access. 
        Yes: Check column privileges.

Su confusión puede surgir del hecho de que el publicesquema tiene por defecto GRANTtodos los derechos sobre el rol public, del cual cada usuario/grupo es miembro. Entonces todo el mundo ya tiene uso de ese esquema.

La frase:

(suponiendo que también se cumplan los requisitos de privilegios propios de los objetos)

Está diciendo que debe tener USAGEun esquema para usar objetos dentro de él, pero tener USAGEun esquema no es por sí solo suficiente para usar los objetos dentro del esquema, también debe tener derechos sobre los objetos mismos.

Es como un árbol de directorios. Si crea un directorio somedircon un archivo somefiledentro, configúrelo para que solo su propio usuario pueda acceder al directorio o al archivo (modo rwx------en el directorio, modo rw-------en el archivo), entonces nadie más podrá enumerar el directorio para ver que el archivo existe.

Si otorgara derechos de lectura mundial sobre el archivo (modo rw-r--r--) pero no cambiara los permisos del directorio, no haría ninguna diferencia. Nadie pudo ver el archivo para leerlo porque no tiene los derechos para enumerar el directorio.

Si, en cambio, configura rwx-r-xr-xel directorio, configurándolo para que las personas puedan enumerar y recorrer el directorio pero sin cambiar los permisos del archivo, las personas podrían enumerar el archivo pero no podrían leerlo porque no tendrían acceso al archivo.

Debe configurar ambos permisos para que las personas puedan ver el archivo.

Lo mismo en la pág. Necesita tanto USAGEderechos de esquema como derechos de objeto para realizar una acción en un objeto, como SELECTdesde una tabla.

(La analogía se reduce un poco en el sentido de que PostgreSQL aún no tiene seguridad a nivel de fila, por lo que el usuario aún puede "ver" que la tabla existe en el esquema ingresando SELECTdirectamente pg_class. No pueden interactuar con ella de ninguna manera. , por lo que es sólo la parte de "lista" la que no es exactamente lo mismo.)

Craig Ringer avatar Jun 27 '2013 23:06 Craig Ringer

Para un sistema de producción, puede utilizar esta configuración:

--ACCESS DB
REVOKE CONNECT ON DATABASE nova FROM PUBLIC;
GRANT  CONNECT ON DATABASE nova  TO user;

--ACCESS SCHEMA
REVOKE ALL     ON SCHEMA public FROM PUBLIC;
GRANT  USAGE   ON SCHEMA public  TO user;

--ACCESS TABLES
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ;
GRANT SELECT                         ON ALL TABLES IN SCHEMA public TO read_only ;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ;
GRANT ALL                            ON ALL TABLES IN SCHEMA public TO admin ;
bilelovitch avatar Mar 04 '2015 08:03 bilelovitch