Gestionar permisos en PostgreSQL
Es importante comprender que en PostgreSQL los usuarios no existen como tal y toda esta gestión cae sobre el concepto de los roles. Al principio esto puede ser difícil de comprender pero poco a poco te acostumbrarás. Realmente se hace login con un rol como si se tratase de un usuario. Es este rol el que tiene asignados los permisos necesarios para poder realizar ciertas acciones.
Ejecutando el comando \du
en la terminal de PostgreSQL, se listaran los usuarios con sus correspondientes permisos:
En la imagen se puede observar mi usuario junto con los permisos asignados. Verás más adelante que significa cada uno. También has
podido observar que aparece Member of
. Básicamente se refiere a que un rol puede pertenecer a grupos con roles y heredar sus permisos.
Gestión de permisos por rol
Crear un nuevo rol
Crear un nuevo rol es tan fácil como ejecutar el siguiente comando:
CREATE ROLE <role>;
Ejemplo:
CREATE ROLE backend_services;
y ejecutando de nuevo el comando \du
para listar los roles, encontramos nuestro nuevo rol. Eso sí, sin ningún permiso asociado.
Este role no podrá hacer nada. Ni tan solo iniciar sesión.
Aunque más adelante verás como añadir roles y lo que significa cada uno, te dejo una variante del comando anterior para añadir roles directamente en la creación.
CREATE ROLE backend_services_2 WITH LOGIN;
y como ves ahora si puede hacer login porque tiene ese permiso.
y por supuesto, algo imprescindible es poder crear un rol con contraseña
CREATE ROLE <role> WITH LOGIN PASSWORD '<password>';
Borrar un rol existente
Comando:
DROP ROLE <role>;
Ejemplo:
DROP ROLE backend_services;
Resultado:
Añadir permisos a roles
ALTER ROLE <role> WITH LOGIN;
Ejemplo:
ALTER ROLE backend_services_2 WITH LOGIN;
Resultado:
Permisos disponibles
- LOGIN/ NOLOGIN: permitir (o no) iniciar sesión en PostgreSQL.
- SUPERUSER/ NOSUPERUSER: permite (o no) permisos de superusuario (*).
- CREATEDB/ NOCREATEDB: permite (o no) la capacidad de crear nuevas bases de datos.
- CREATEROLE/ NOCREATEROLE: permite (o no) la capacidad de crear nuevos roles.
- CREATEUSER/ NOCREATEUSER: permite (o no) la capacidad de crear nuevos usuarios.
- INHERIT/ NOINHERIT: permite (o no) la capacidad de hacer que los privilegios se pueda heredar.
- REPLICATION/ NOREPLICATION: concede (o no) permisos de replica.
(*) Un superusuario de la base de datos omitirá otras verificaciones de permisos, excepto LOGIN(debe otorgarse por separado).
Gestión de permisos por roles grupales
Como leíste al inicio de este artículo, los roles puedes pertenecer a grupos de roles que tienen sus propios permisos y,
de esa forma, heredar los permisos del grupo al que pertenecen. Debes saber que los roles heredarán los permisos de los
grupos a los que pertenecen solo si esos roles tienen el atributo INHERIT
. Podría decirse que por defecto un role cuenta
con permiso NOINHERIT
Crear un rol grupal
Comando:
CREATE ROLE <groupname>;
Ejemplo:
CREATE ROLE developers WITH SUPERUSER;
Resultado:
Asignar un grupo a un rol
Comando:
GRANT <groupname> TO <role>
Ejemplo:
GRANT developers TO backend_services_2;
Resultado:
Eliminar un grupo a un rol
Comando:
REVOKE <groupname> FROM <role>
Ejemplo:
REVOKE developers FROM backend_services_2;
Resultado: