Los privilegios públicos son aquellos privilegios por defecto que se aplican sobre una conexión cuando no se especifica un usuario. Este artículo explica cómo revocarlos.
En Postgres, la palabra clave PUBLIC
indica que cierto privilegio aplica a todos los roles, incluyendo aquellos que aún no han sido creados. Puede pensarse como un grupo implícito que siempre incluye a todos los roles. De esta forma, cada rol en particular tendrá la suma de todos los privilegios otorgados directamente a él, todos los privilegios otorgados a un rol al que es miembro, y todos los privilegios otorgados a PUBLIC
.
PostgreSQL asigna privilegios por defecto a PUBLIC
sobre ciertos tipos de objetos, excepto tablas, columnas, schemas y tablespaces. Para el resto de los objetos, los privilegios otorgados por defecto a PUBLIC
son: CONNECT
y CREATE TEMP TABLE
para las bases de datos; EXECUTE
para funciones; y USAGE
para lenguajes.
Veamos un ejemplo. La base de datos "db18" posee los siguientes privilegios de acceso:
postgres=# \l db18 List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ------+----------+----------+-------------+-------------+--------------------------- db18 | postgres | UTF8 | es_AR.UTF-8 | es_AR.UTF-8 | =Tc/postgres + | | | | | postgres=CTc/postgres + | | | | | role_develop=CTc/postgres+ | | | | | linuxito=Tc/postgres (1 row) postgres=#
En esta ACL en particular, se observa el siguiente privilegio por defecto para PUBLIC
:
=Tc/postgres
El cual indica que, para todo usuario no especificado, se accede como el rol "postgres" y sólo se posee el permiso de conexión a la base de datos. Esto significa que cualquier usuario se puede conectar a la base de datos.
Para maximizar la seguridad de una base de datos, es posible revocar todos los privilegios otorgados a PUBLIC
, ya sea de forma explícita como implícita (por defecto).
Entonces, para eliminar todos los privilegios (incluyendo CONNECT
) que aplican a todos los usuarios no especificados sobre una base de datos, se debe ejecutar la sentencia SQL REVOKE ALL PRIVILEGES ON DATABASE db FROM PUBLIC
. Por ejemplo:
postgres=# revoke all privileges on database db18 from public; REVOKE postgres=#
Al listar nuevamente es posible comprobar que ha desaparecido el privilegio para usuarios no especificados, y sólo quedan los privilegios para los roles "postgres", "role_develop" y "linuxito":
postgres=# \l db18 List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ------+----------+----------+-------------+-------------+--------------------------- db18 | postgres | UTF8 | es_AR.UTF-8 | es_AR.UTF-8 | postgres=CTc/postgres + | | | | | role_develop=CTc/postgres+ | | | | | linuxito=Tc/postgres (1 row) postgres=#
Referencias