TL; DR: los nuevos usuarios pueden crear tablas en el public
esquema 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 public
usuario 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 public
usuario no pueda crear esquemas o usar tablas temporales.
Personalmente, si estuviera diseñando esto, les daría a los usuarios el TEMP
derecho en la base de datos de forma predeterminada, pero no CREATE
(esquemas en la base de datos) oCREATE
(tablas en el public
esquema). 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 postgres
usuario 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é peer
es la autenticación, o por qué solo ejecutar psql
despué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.conf
sea 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.
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 :)