¿Qué hace exactamente GRANT USAGE ON SCHEMA?
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"?
GRANT
Las imágenes de diferentes objetos están separadas. GRANT
Trabajar en una base de datos no otorga GRANT
derechos sobre el esquema que contiene. De manera similar, GRANT
trabajar en un esquema no otorga derechos sobre las tablas que contiene.
Si tiene derechos para SELECT
acceder 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 public
esquema tiene por defecto GRANT
todos 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 USAGE
un esquema para usar objetos dentro de él, pero tener USAGE
un 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 somedir
con un archivo somefile
dentro, 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-x
el 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 USAGE
derechos de esquema como derechos de objeto para realizar una acción en un objeto, como SELECT
desde 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 SELECT
directamente 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.)
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 ;