21.2. Atributos de los roles #

Un rol de base de datos puede tener varios atributos que definen sus privilegios e interactúan con el sistema de autenticación de clientes.

privilegio de login

Sólo los roles que tienen el atributo LOGIN se pueden usar como el nombre de rol inicial para una conexión de base de datos. Un rol con el atributo LOGIN se puede considerar equivalente a un usuario de base de datos. Para crear un rol con privilegio de inicio de sesión (login), utiliza cualquiera de los dos:

CREATE ROLE name LOGIN;
CREATE USER name;

(CREATE USER es equivalente a CREATE ROLE excepto que CREATE USER incluye LOGIN por defecto, mientras que CREATE ROLE no lo hace).

estado de superusuario

Un superusuario de la base de datos evade todos los controles de permisos, excepto el derecho a iniciar sesión. Este es un privilegio peligroso y no debe usarse a la ligera; lo mejor es hacer la mayor parte de tu trabajo como un rol que no sea superusuario. Para crear un nuevo superusuario de base de datos, utiliza CREATE ROLE name SUPERUSER. Debes hacer esto como un rol que ya sea superusuario.

creación de bases de datos

A un rol se le debe otorgar explícitamente permiso para crear bases de datos (excepto a los superusuarios, ya que estos evaden todos los controles de permisos). Para crear un rol de este tipo, utiliza CREATE ROLE name CREATEDB.

creación de roles

A un rol se le debe otorgar explícitamente permiso para crear más roles (excepto a los superusuarios, ya que estos evaden todos los controles de permisos). Para crear un rol de este tipo, utiliza CREATE ROLE name CREATEROLE. Un rol con el privilegio CREATEROLE puede alterar y eliminar roles que le hayan sido otorgados al usuario con CREATEROLE con la opción ADMIN. Dicha concesión ocurre automáticamente cuando un usuario con CREATEROLE que no es superusuario crea un nuevo rol, de modo que, por defecto, un usuario con CREATEROLE puede alterar y eliminar los roles que ha creado. Alterar un rol incluye la mayoría de los cambios que se pueden hacer usando ALTER ROLE, incluyendo, por ejemplo, cambiar contraseñas. También incluye las modificaciones a un rol que se pueden hacer usando los comandos COMMENT y SECURITY LABEL.

Sin embargo, CREATEROLE no otorga la capacidad de crear roles SUPERUSER, ni otorga ningún poder sobre los roles SUPERUSER que ya existen. Además, CREATEROLE no otorga el poder de crear usuarios de REPLICATION, ni la capacidad de otorgar o revocar el privilegio REPLICATION, ni la capacidad de modificar las propiedades de rol de dichos usuarios. Sin embargo, sí permite usar ALTER ROLE ... SET y ALTER ROLE ... RENAME en roles de REPLICATION, así como el uso de COMMENT ON ROLE, SECURITY LABEL ON ROLE y DROP ROLE. Finalmente, CREATEROLE no confiere la capacidad de otorgar o revocar el privilegio BYPASSRLS.

iniciar replicación

A un rol se le debe otorgar explícitamente permiso para iniciar la replicación en flujo (streaming replication) (excepto a los superusuarios, ya que estos evaden todos los controles de permisos). Un rol utilizado para la replicación en flujo también debe tener el permiso LOGIN. Para crear un rol de este tipo, utiliza CREATE ROLE name REPLICATION LOGIN.

contraseña

Una contraseña sólo es significativa si el método de autenticación del cliente requiere que el usuario proporcione una contraseña al conectarse a la base de datos. Los métodos de autenticación password y md5 hacen uso de contraseñas. Las contraseñas de la base de datos son independientes de las contraseñas del sistema operativo. Especifica una contraseña al crear el rol con CREATE ROLE name PASSWORD 'string'.

herencia de privilegios

Por defecto, un rol hereda los privilegios de los roles de los que es miembro. Sin embargo, para crear un rol que no herede privilegios por defecto, utiliza CREATE ROLE name NOINHERIT. Alternativamente, la herencia se puede anular para concesiones individuales utilizando WITH INHERIT TRUE o WITH INHERIT FALSE.

evadir seguridad a nivel de fila

A un rol se le debe otorgar explícitamente permiso para evadir todas las políticas de seguridad a nivel de fila (RLS) (excepto a los superusuarios, ya que estos evaden todos los controles de permisos). Para crear un rol de este tipo, utiliza CREATE ROLE name BYPASSRLS como superusuario.

límite de conexiones

El límite de conexiones puede especificar cuántas conexiones concurrentes puede realizar un rol. -1 (el valor por defecto) significa que no hay límite. Especifica el límite de conexiones al crear el rol con CREATE ROLE name CONNECTION LIMIT 'integer'.

Los atributos de un rol se pueden modificar después de su creación con ALTER ROLE. Consulta las páginas de referencia de los comandos CREATE ROLE y ALTER ROLE para más detalles.

Un rol también puede tener valores por defecto específicos para muchas de las configuraciones de tiempo de ejecución descritas en Chapter 19. Por ejemplo, si por alguna razón deseas desactivar los escaneos de índices (consejo: no es una buena idea) cada vez que te conectas, puedes usar:

ALTER ROLE myname SET enable_indexscan TO off;

Esto guardará la configuración (pero no la establecerá inmediatamente). En las conexiones posteriores de este rol, parecerá como si se hubiera ejecutado SET enable_indexscan TO off justo antes de que comenzara la sesión. Aún puedes alterar esta configuración durante la sesión; sólo será el valor por defecto. Para eliminar una configuración por defecto específica de un rol, utiliza ALTER ROLE rolename RESET varname. Ten en cuenta que las configuraciones por defecto específicas de roles sin el privilegio LOGIN son bastante inútiles, ya que nunca se invocarán.

Cuando un no superusuario crea un rol utilizando el privilegio CREATEROLE, el rol creado se otorga automáticamente de vuelta al usuario creador, tal como si el superusuario inicial hubiera ejecutado el comando GRANT created_user TO creating_user WITH ADMIN TRUE, SET FALSE, INHERIT FALSE. Dado que un usuario con CREATEROLE sólo puede ejercer privilegios especiales con respecto a un rol existente si tiene ADMIN OPTION sobre él, esta concesión es suficiente para permitir que un usuario con CREATEROLE administre los roles que creó. Sin embargo, debido a que se crea con INHERIT FALSE, SET FALSE, el usuario con CREATEROLE no hereda los privilegios del rol creado, ni puede acceder a los privilegios de ese rol usando SET ROLE. Sin embargo, dado que cualquier usuario que tenga ADMIN OPTION en un rol puede otorgar la pertenencia en ese rol a cualquier otro usuario, el usuario con CREATEROLE puede obtener acceso al rol creado simplemente otorgándose ese rol a sí mismo con las opciones INHERIT y/o SET. Por lo tanto, el hecho de que los privilegios no se hereden por defecto ni se otorgue SET ROLE por defecto es una salvaguarda contra accidentes, no una característica de seguridad. Ten en cuenta también que, debido a que esta concesión automática es otorgada por el superusuario inicial, no puede ser eliminada o cambiada por el usuario con CREATEROLE; sin embargo, cualquier superusuario podría revocarla, modificarla y/o emitir concesiones adicionales a otros usuarios con CREATEROLE. Aquellos usuarios con CREATEROLE que tengan ADMIN OPTION sobre un rol en cualquier momento dado pueden administrarlo.