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


Tal vez pueda interesarte


Compartí este artículo