¿Por qué un nuevo usuario puede crear tablas en PostgreSQL?

13

Seguí dos tutoriales para crear una base de datos con:

  1. un enlace de usuario totalmente privilegiado
  2. un enlace de usuario de solo lectura

Luego recibí un consejo del tutorial de CJ Estel que decía que "es posible que haya heredado la capacidad de crear tablas a pesar de que nunca se lo dimos explícitamente a nuestro nuevo usuario". ¡Efectivamente, el usuario de solo lectura puede crear y poseer tablas!

CJ Estel ha señalado muy bien la causa raíz, es decir, una base de datos de plantilla. Pero la capacidad de crear tablas socava la mayoría de los tutoriales que obtienes al buscar en Google "postgres de usuario de solo lectura", incluido uno alojado en postgresql.org . ¡Su usuario tiene más que privilegios de solo lectura!

¿Por qué un nuevo usuario tiene esta capacidad? Después de revocar este privilegio, ¿la base de datos es realmente de solo lectura para ese usuario?

Jesvin Jose
fuente

Respuestas:

13

TL; DR: los nuevos usuarios pueden crear tablas en el publicesquema porque las personas se quejaron de que era demasiado difícil cuando no podían.

Si no le gustan los valores predeterminados, probablemente debería crear una nueva base de datos de plantilla con la configuración inicial que desee. Por ejemplo, podrías:

DROP SCHEMA public;

o

REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;

en tu plantilla

Si desea que el publicusuario no tenga derechos sobre una base de datos, también debe:

REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;

para que el publicusuario no pueda crear esquemas o usar tablas temporales.


Personalmente, si estuviera diseñando esto, les daría a los usuarios el TEMPderecho en la base de datos de forma predeterminada, pero no CREATE(esquemas en la base de datos) oCREATE (tablas en el publicesquema). Los reservaría para el dueño.

Sin embargo, son elecciones que se tomaron hace mucho tiempo, y ahora es bastante difícil cambiarlas.


Tal como está, hay quejas regulares de que es demasiado difícil comenzar con PostgreSQL porque tiene que crear una cuenta de usuario y, a menudo, también desea crear una base de datos. ¿Por qué no simplemente los creamos automáticamente y por defecto tenemos "confianza" como modo de autenticación para que sea más fácil? ¿Por qué el postgresusuario no tiene la contraseña por defecto?postgres ? ¿Por qué no creamos usuarios automáticamente si existen en el sistema operativo? etc.

Hay algunos problemas de usabilidad genuinos para los nuevos usuarios, en particular, la mayoría de las personas no tienen idea de qué peeres la autenticación, o por qué solo ejecutar psqldespués de instalar PostgreSQL les dice que no hay ningún usuario con el nombre con el que están conectados.

También es desordenado que pg_hba.confsea ​​un archivo de configuración, pero los usuarios se crean a nivel SQL. Esta división confunde a los usuarios.

Sin embargo, muchas cosas son compromisos entre valores predeterminados seguros y valores predeterminados fáciles en los que el proyecto nunca hará felices a todos.

Craig Ringer
fuente
Entonces, ejecuto revoke create on database [databasename] from [username];y la base de datos ahora es realmente de solo lectura para [nombre de usuario]. ¿Derecho? Volveré a esta respuesta nuevamente cuando haya leído un buen libro de Postgres :)
Jesvin Jose
2
En respuesta al comentario anterior, es un no.
Jesvin Jose