Permisos de usuario de PostgreSQL

En este tutorial explicaré cómo administrar usuarios y permisos en PostgreSQL.

En PostgreSQL, todo se basa en el concepto depapel.

Al instalar PostgreSQL por primera vez en macOS, el scriptcreó un rol con su nombre de usuario de macOS, con una lista de permisos otorgados.

No hay usuarios en PostgreSQL, solo roles.

Mediante la ejecuciónpsql postgresen su terminal, iniciará sesión automáticamente con su nombre de usuario de macOS en PostgreSQL, accediendo así al rol creado.

En mi caso elflaviocopesse creó el rol, y puedo verlo usando el\dumando:

¿Ver? Tengo lo siguienteatributos de rolespor defecto:

  • Superuser
  • Create role
  • Create DB
  • Replication
  • Bypass RLS

y no soy miembro de ningún otro rol (más sobre esto más adelante)

Creando un nuevo rol

Se crea un nuevo rol usando elCREATE ROLEmando:

CREATE ROLE <role>;

Por ejemplo:

CREATE ROLE testing;

Conseguimos un nuevo rol, con elCannot loginatributo de rol. Nuestro usuario recién creado no podrá iniciar sesión.

Puede probar escribiendo el\qcomando, y luegopsql postgres -U testing, pero verá este error:

Para solucionar este problema debemos agregar elLOGINatributo de rol en la creación:

CREATE ROLE <role> WITH LOGIN;

Si eliminamos ese rol usando:

DROP ROLE <role>;

y añadirWITH LOGINesta vez:

DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;

Podemos ver que eltestingrol puede iniciar sesión, porque no tenemos elCannot loginatributo de rol esta vez:

Intente agregando el comando\qpara dejar de fumar, y luegopsql postgres -U testing:

Note que elinmediatocambiaron desde=#a=>porque no tenemos elSuperuseratributo de rol ahora.

Agregar una contraseña a un rol

En el anteriorCREATE ROLEcomando creamos un rol sin contraseña. Por supuesto, es muy importante tener contraseñas (seguras). Puede agregar una contraseña usando elPASSWORDpalabra clave:

CREATE ROLE <role> WITH LOGIN PASSWORD '<password>';

CREAR USUARIO

Una forma alternativa de definir roles con elLOGINatributo agregado automáticamente (creando efectivamente usuarios que pueden iniciar sesión) es usarCREATE USER:

CREATE USER <role> PASSWORD '<password>';

Agregar un atributo de rol a un rol

Un atributo de rol se puede agregar más adelante a un rol usando elALTER ROLEmando.

Supongamos que creamos un rol sin el atributo LOGIN:

CREATE ROLE <username> PASSWORD '<password>';

Podemos agregarlo usando:

ALTER ROLE <role> WITH LOGIN;

Atributos de rol integrados

Vimos elLOGINrol atributo ya, para permitir que un rol inicie sesión.

Pero, ¿qué otros atributos de rol incorporados podemos usar?

  • LOGIN/NOLOGIN: permitir (o no) iniciar sesión en PostgreSQL
  • SUPERUSER/NOSUPERUSER: permitir (o no) permisos de superusuario. Un superusuario de la base de datos pasará por alto otras comprobaciones de permisos, exceptoLOGIN(debe otorgarse por separado).
  • CREATEDB/NOCREATEDB: permitir (o no) la capacidad de crear nuevas bases de datos
  • CREATEROLE/NOCREATEROLE: permitir (o no) la capacidad de crear nuevos roles
  • CREATEUSER/NOCREATEUSER: permitir (o no) la posibilidad de crear nuevos usuarios
  • INHERIT/NOINHERIT: permitir (o no) la capacidad de hacer que los privilegios sean heredables
  • REPLICATION/NOREPLICATION: otorgar (o no) permisos de replicación (un tema avanzado que no cubriremos)

Roles de grupo

En PostgreSQL, no hay grupos de usuarios.

En su lugar, puede crear roles con ciertos permisos y luego otorgar esos roles a otros roles.

Los roles heredarán los permisos de los roles que se les otorguen, si esos roles tienen el atributo INHERIT.

Crea un rol de grupo

Para crear un rol de grupo, escriba

CREATE ROLE <groupname>;

La sintaxis es la misma que la de crear un rol.

Una vez que se crea el rol de grupo, puede agregar roles al rol de grupo usandoGRANT:

GRANT <groupname> TO <role>

Por ejemplo, podemos crear unflaviorol de usuario, un rol de grupo de "empleado", y asigne al usuario el rol de grupo:

CREATE USER flavio PASSWORD 'superSecret123
;CREAR PAPELempleado;CONCEDERempleadoAflavio;

Puede eliminar un rol de un rol de grupo usando:

REVOKE <groupname> FROM <username>

Ejemplo:

REVOKE employee FROM flavio;

Atributos de roles de grupo

De forma predeterminada, agregar un rol a un rol de gruponohacer que el rol herede atributos (permisos) del rol de grupo.

Necesita crear el rol de grupo con elINHERITatributo.

Suponga que crea el rol de grupo de empleados y le asigna elCREATEDBatributo:

CREATE ROLE employee WITH CREATEDB INHERIT;

Ahora cree un nuevo rol usandoINHERIT:

CREATE ROLE flavio;
GRANT employee TO flavio;


Más tutoriales de bases de datos: