sql >> Base de Datos >  >> RDS >> PostgreSQL

Administrar roles y atributos de roles en PostgreSQL


Introducción

PostgreSQL utiliza varios mecanismos para implementar la autenticación, la autorización y la propiedad de objetos dentro de los clústeres de bases de datos. El núcleo de estos es el concepto de roles.

Los roles de PostgreSQL son una combinación de las ideas de usuarios y grupos en una sola entidad flexible. Son la personalidad que adoptan los usuarios dentro del sistema de base de datos, son la entidad por la cual el sistema de autenticación acepta o deniega las conexiones y están sujetos a las reglas de gestión de privilegios de todos los ámbitos.

Esta guía cubrirá qué son los roles y cómo administrarlos dentro de un clúster de base de datos de PostgreSQL. Más específicamente, esta guía cubrirá la gestión de roles en lo que respecta a los atributos de los roles. Para obtener una descripción general más amplia de cómo encajan los roles en el panorama general, consulte la introducción a la guía de autenticación y autorización. Para saber cómo cambiar los privilegios de funciones en objetos específicos de la base de datos, consulte nuestra guía sobre otorgamiento de funciones.



¿Qué son los roles?

En PostgreSQL, un rol es una agrupación de un conjunto específico de capacidades, permisos y entidades "propietarias". En lugar de tener conceptos distintos de "usuarios" y "grupos", PostgreSQL usa roles para representar ambas ideas. Un rol puede corresponder a una persona individual en el mundo real, o puede operar como un grupo con cierto acceso del que otros roles pueden convertirse en miembros.

Los roles son el punto de anclaje dentro de PostgreSQL que determina a quién se aplican las políticas de autenticación y autorización. Cualquier política que no se aplique universalmente requiere una noción de identidad para definir a quién restringir ya quién permitir. En PostgreSQL, esta identidad está representada por roles.

El sistema de autenticación de PostgreSQL tiene varios componentes diferentes, cada uno de los cuales está vinculado a roles. Para poder usarse para la conexión inicial al clúster de la base de datos, los roles primero deben tener el LOGIN conjunto de atributos Las propias reglas de autenticación se definen en el archivo de configuración basado en host llamado pg_hba.conf . Cada regla define métodos de autenticación que se pueden aplicar al rol individual. Para los roles que están configurados para la autenticación de contraseña, debe tener un atributo de contraseña establecido para que el sistema pueda validar la contraseña de usuario proporcionada.

En términos de autorización, los roles se definen a nivel de clúster de base de datos, lo que en PostgreSQL significa que se comparten entre bases de datos. Dado que los roles abarcan las bases de datos, el sistema de autorización controla el nivel de acceso que tiene cada rol a cada entidad de la base de datos. Dado que los roles pueden representar grupos de personas, existe una gran flexibilidad en la configuración del acceso.

Los roles también son esenciales para el concepto de propiedad de objetos dentro de PostgreSQL. Cada base de datos y tabla, por ejemplo, tiene exactamente un rol configurado como propietario. Aparte de superusers , la función de propietario es la única función que puede modificar o eliminar el objeto real.

En resumen, los roles son el núcleo de la mayoría de las operaciones prácticas de bases de datos. Su flexibilidad les permite actuar como identificadores de usuarios y clases de usuarios. Cada acción dentro del clúster de la base de datos se compara con los privilegios del rol y el éxito de cada conexión al clúster de la base de datos está determinado por el rol en el que uno se autentica. Es importante tener un buen manejo de la gestión de funciones debido a su importancia dentro de tantas operaciones principales.



Atributos de rol

Los atributos de función son marcas en la propia función que determinan algunos de los privilegios básicos que tiene en el nivel de clúster de la base de datos. Estos se pueden configurar cuando se crea inicialmente el rol, o se pueden cambiar en cualquier momento por cualquier rol con los atributos apropiados (SUPERUSER o CREATEROLE en este caso).

Los atributos que se pueden aplicar a un rol incluyen:

  • LOGIN :permite a los usuarios conectarse inicialmente al clúster de la base de datos utilizando este rol. El CREATE USER El comando agrega automáticamente este atributo, mientras que CREATE ROLE el comando no.
  • SUPERUSER :permite que el rol omita todas las verificaciones de permisos, excepto el derecho a iniciar sesión. Solo otros SUPERUSER roles pueden crear roles con este atributo.
  • CREATEDB :permite que el rol cree nuevas bases de datos.
  • CREATEROLE :permite que el rol cree, modifique y elimine otros roles. Este atributo también permite que el rol asigne o modifique la membresía del rol. Una excepción es que un rol con CREATEROLE el atributo no puede alterar SUPERUSER roles sin tener también el SUPERUSER atributo.
  • REPLICATION :permite que el rol inicie la replicación de transmisión. Los roles con este atributo también deben tener el LOGIN atributo.
  • PASSWORD :Asigna una contraseña al rol que se usará con password o md5 mecanismos de autenticación. Este atributo toma una contraseña entre comillas como argumento directamente después de la palabra clave del atributo.
  • INHERIT :determina si el rol hereda los privilegios de los roles de los que es miembro. Sin INHERIT , los miembros deben usar SET ROLE cambiar al otro rol para acceder a esos privilegios exclusivos. Este atributo se establece para los nuevos roles de forma predeterminada.

Puede obtener más información sobre los atributos de roles consultando la documentación de PostgreSQL sobre los atributos de roles y CREATE ROLE comando.



Qué es un superuser papel?

Como se mencionó brevemente anteriormente, un privilegio especial llamado superuser permite el acceso administrativo sin restricciones al clúster de la base de datos. Esto es similar a la root cuenta en sistemas operativos Linux y similares a Unix, pero a nivel de base de datos.

Siempre debe haber al menos un rol con superuser privilegios en cada clúster de base de datos. El superuser inicial La cuenta se crea durante el proceso de instalación. El nombre del superuser inicial la cuenta puede variar según el proceso de instalación, pero la mayoría de las veces, esta cuenta se llama postgres .

No se recomienda realizar su trabajo diario utilizando una cuenta con superuser privilegios, tanto por su potencial para acciones destructivas como también para minimizar la posibilidad de comprometer una cuenta con amplio acceso. En su lugar, la mayoría de las veces, los usuarios deben usar cuentas dedicadas a funciones u objetos de datos específicos con los que están trabajando, solo usando el superuser cuentas cuando se requiere un acceso más poderoso.



Comprobando los atributos de rol existentes

Ahora que tiene una idea amplia de qué son los atributos de roles y qué tipos de privilegios permiten, debe aprender cómo encontrar los atributos que se aplican a los roles en todo PostgreSQL. Esta sección le mostrará algunos comandos para ayudarlo a encontrar los atributos establecidos en los roles en general y en su propio rol actual específicamente.


Lista de todos los roles de la base de datos y sus atributos

Hay algunas formas diferentes de verificar los atributos aplicados a los roles en todo el sistema.

Si está utilizando psql cliente de línea de comandos, puede aprovechar algunos metacomandos útiles que le permiten obtener información de atributos de roles sin una consulta.

El \du El meta-comando muestra todos los roles y sus atributos:

\du
                                   List of roles Role name |                         Attributes                         | Member of-----------+------------------------------------------------------------+----------- postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

En este caso, el postgres rol es el rol predeterminado con superuser privilegios configurados para este clúster de base de datos.

El SQL equivalente para listar roles (detectable pasando -E o --echo-hidden bandera al iniciar psql ) es:

SELECT r.rolname, r.rolsuper, r.rolinherit,  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,  r.rolconnlimit, r.rolvaliduntil,  ARRAY(SELECT b.rolname        FROM pg_catalog.pg_auth_members m        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)        WHERE m.member = r.oid) as memberof, r.rolreplication, r.rolbypassrlsFROM pg_catalog.pg_roles rWHERE r.rolname !~ '^pg_'ORDER BY 1;

A continuación, se incluye una consulta similar que proporciona información sobre los atributos del rol (sin el componente de pertenencia al rol). Usamos el psql meta-comando \x on para mostrar los resultados verticalmente para una mejor legibilidad aquí:

-- turn on vertical display\x onSELECT * FROM pg_roles WHERE rolname !~ '^pg_';-- turn off vertical display\x off
-[ RECORD 1 ]--+---------rolname        | postgresrolsuper       | trolinherit     | trolcreaterole  | trolcreatedb    | trolcanlogin    | trolreplication | trolconnlimit   | -1rolpassword    | ********rolvaliduntil  | rolbypassrls   | trolconfig      | oid            | 10

Si solo te interesa ver que roles tiene el superuser atributo, puede solicitar una lista explícitamente:

SELECT rolname FROM pg_roles WHERE rolsuper;
 rolname---------- postgres(1 row)

Alternativamente, puede enumerar todos los usuarios y su superuser estado para una imagen más completa:

SELECT usename,usesuper FROM pg_user;
 usename  | usesuper----------+---------- postgres | t user1    | f(2 rows)

La misma información se puede recuperar usando el paradigma de "rol" de PostgreSQL en lugar de su (a veces ambigua) superposición de "usuario" con esta consulta un poco más larga en su lugar:

SELECT rolname,rolsuper FROM pg_roles WHERE rolname !~ '^pg_';
 rolname  | rolsuper----------+---------- postgres | t user1    | f(2 rows)


Enumerar sus propios atributos

Si desea encontrar los atributos del rol que está utilizando actualmente, puede filtrar fácilmente la salida.

Al usar psql meta-comandos, puede usar el USER variable, que será sustituida por el rol conectado actual. psql usa los dos puntos (: ) para interpolar variables:

\du :USER
                                   List of roles Role name |                         Attributes                         | Member of-----------+------------------------------------------------------------+----------- postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

Para obtener una lista que muestre los valores de todos los atributos de roles posibles, puede usar una consulta que compare el nombre del rol con el valor devuelto por CURRENT_ROLE Función PostgreSQL. Nuevamente, estamos usando la salida vertical para mejorar la legibilidad:

-- First, turn on vertical output\x onSELECT * FROM pg_roles WHERE rolename = CURRENT_ROLE;-- Change back to normal output\x off
-[ RECORD 1 ]--+---------rolname        | postgresrolsuper       | trolinherit     | trolcreaterole  | trolcreatedb    | trolcanlogin    | trolreplication | trolconnlimit   | -1rolpassword    | ********rolvaliduntil  |rolbypassrls   | trolconfig      |oid            | 10

Para comprobar si su rol actual tiene superuser privilegios, puede escribir:

SHOW is_superuser;
 is_superuser-------------- on(1 row)


Compruebe si tiene privilegios de administración de roles

Para crear, modificar o eliminar funciones, debe tener superuser o CREATEROLE privilegios.

Para verificar qué roles dentro del sistema tienen privilegios de administración de roles, escriba:

SELECT rolname as "Users who can manage roles" FROM pg_roles WHERE rolsuper OR rolcreaterole;
 Users who can manage roles---------------------------- postgres(1 rows)

Si solo desea saber si su rol actual tiene privilegios de administración de roles, puede usar:

SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
 Can I manage roles?--------------------- Yes(1 row)



Creando roles

Una vez que haya verificado que tiene privilegios de administración de roles, puede comenzar a crear, modificar o eliminar roles dentro de PostgreSQL.

Una opción para establecer atributos de rol es declararlos en el momento de crear el rol. Esto le permite establecer las condiciones iniciales para el rol, pero aún puede modificarlas después si desea cambiar el nivel de acceso del rol. Puede encontrar más información sobre CREATE ROLE comando que usaremos para familiarizarse con la sintaxis básica.

Una forma de crear un rol es desde la línea de comandos. PostgreSQL incluye un createuser comando que creará un rol dentro del clúster de la base de datos con LOGIN privilegios.

La sintaxis general es:

createuser <options> <rolename>

Por ejemplo, para crear un rol llamado admin con superuser privilegios mientras se le solicita una contraseña, puede escribir:

createuser --superuser admin

Entonces podrá iniciar sesión usando el admin cuenta de acuerdo con los métodos de autenticación descritos en pg_hba.conf archivo.

Para crear roles usando SQL , la sintaxis general se ve así:

CREATE ROLE <role>;

Los atributos se pueden definir especificándolos después del nombre del rol usando WITH :

CREATE ROLE <role> WITH <options>;

Por ejemplo, para crear un rol llamado user1 que puede iniciar sesión con la contraseña secretpassword , podría escribir:

CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';

Para crear en su lugar un rol con superuser privilegios (también debe ser un superuser para ejecutar con éxito este comando) que no puede iniciar sesión (el usuario debe usar SET ROLE para cambiar a este rol), puede escribir:

CREATE ROLE "user2" WITH SUPERUSER;


Cambiando roles existentes

Para modificar los atributos de los roles existentes, puede usar ALTER ROLE comando en su lugar. Al igual que con la creación de funciones, su función actual también debe tener superuser o CREATEROLE privilegios Los usuarios que no tienen esos privilegios solo pueden usar el ALTER ROLE comando para cambiar su propia contraseña.

Alterar roles le permite cambiar los atributos asignados a un rol después de la creación. Los mismos atributos mencionados en la sección de creación de roles se pueden usar con ALTER ROLE sintaxis. Una diferencia es que cada tipo de atributo se puede negar agregando NO prefijo. Por ejemplo, para permitir que un rol inicie sesión en el clúster de la base de datos, puede asignarle el LOGIN atributo. Para eliminar esa capacidad, modificaría el rol especificando NOLOGIN .

El ALTER ROLE El comando solo cambia los atributos que son los mencionados explícitamente. En otras palabras, el ALTER ROLE el comando especifica cambios a los atributos, no a un conjunto completo de nuevos atributos.

Para permitir que el user2 rol para iniciar sesión en el clúster de la base de datos, puede escribir:

ALTER ROLE "user2" WITH LOGIN;

Tenga en cuenta que si bien esto habilita la capacidad de iniciar sesión, los métodos de autenticación permitidos aún están controlados por pg_hba.conf archivo.

Si quieres user2 para poder iniciar sesión, crear roles y crear bases de datos en su lugar, puede especificar esos tres atributos, separados por espacios:

ALTER ROLE "user2" WITH LOGIN CREATEROLE CREATEDB;

Para revocar superuser estado de un rol (solo puede ejecutar este comando usando otro superuser función), escriba:

ALTER ROLE "user2" WITH NOSUPERUSER;

Para cambiar la contraseña de una función, puede escribir lo siguiente (todas las funciones deberían poder ejecutar este comando en su propia función, independientemente de CREATEROLE o superuser privilegios):

ALTER ROLE <role> WITH PASSWORD '<password>';

Aunque el comando anterior funciona, si es posible, es una mejor idea usar el psql meta-comando para cambiar contraseñas. El psql El comando solicita automáticamente una contraseña y la cifra antes de enviarla al servidor. Esto ayuda a evitar la filtración de datos confidenciales en los registros.

Puede cambiar la contraseña de un rol con psql escribiendo lo siguiente

-- To change your own password\password-- To change the password for another role\password <role>

También puede usar el ALTER ROLE comando para cambiar el nombre de un rol:

ALTER ROLE <role> RENAME TO <newrole>

Tenga en cuenta que no puede cambiar el nombre de su rol de sesión actual.



Eliminar roles

La eliminación de un rol existente sigue un patrón similar al de los comandos anteriores. Nuevamente, debe tener CREATEROLE o superuser privilegios para ejecutar estos comandos.

Un factor que complica las cosas es que los roles no pueden ser eliminados si todavía son referenciados por objetos dentro de la base de datos. Esto significa que debe eliminar o transferir la propiedad de los objetos que posee el rol. Posteriormente, también debe revocar cualquier privilegio adicional que tenga el rol sobre los objetos de la base de datos.

Erwin Brandstetter proporciona una explicación detallada de cómo reasignar y quitar privilegios de manera adecuada en el sitio de Stack Exchange para administradores de bases de datos. Este mismo proceso se utiliza a continuación.

Primero, puede reasignar todos los objetos de propiedad del rol utilizando el REASSIGNED OWNED dominio. Por ejemplo, si se está preparando para eliminar el user2 rol, puede asignar sus objetos a postgres rol escribiendo:

REASSIGN OWNED BY "user2" TO "postgres";

Ahora los objetos son propiedad de postgres , podemos usar el DROP OWNED comando para revocar todos los demás privilegios que se nos han otorgado sobre los objetos. Este comando también elimina todos los objetos que poseemos, pero dado que los acabamos de transferir a postgres rol, el user2 el rol ya no tiene ningún objeto de propiedad. Debido a esto, el comando solo revocará cualquiera de los privilegios adicionales del rol:

DROP OWNED BY "user2";

Sin el DROP OWNED acceso directo anterior, tendría que ejecutar REVOKE ALL PRIVILEGES en cada objeto individual o tipo de objeto sobre el que el rol tiene privilegios.

Una vez que haya revocado todos los privilegios asociados, puede eliminar el rol escribiendo:

DROP ROLE "user2";


Iniciar sesión usando psql

Una vez que haya configurado un nuevo rol y haya configurado los detalles de autenticación usando el pg_hba.conf archivo, puede iniciar sesión en el clúster de la base de datos utilizando su nuevo rol. El psql El cliente de línea de comandos proporciona una manera fácil de hacer esto.

Por defecto, psql asume que desea conectarse usando un rol que coincida con el nombre de usuario de su sistema operativo. Entonces, si ha iniciado sesión en su computadora como john , psql asumirá que desea intentar conectarse a la base de datos usando un rol que también se llama john .

Para anular este comportamiento, puede pasar el -U o --username= opción. Por ejemplo, si desea iniciar sesión en un rol llamado kerry , puede escribir:

psql -U kerry

El éxito del psql el comando dependerá de la existencia del kerry función, la accesibilidad del servidor al que intenta conectarse y las reglas de autenticación definidas en el servidor.



Cambiar a un rol diferente durante una sesión

En ocasiones, es posible que desee adoptar temporalmente los privilegios y la identidad de otro rol al que tenga acceso. Por ejemplo, esto es necesario si desea obtener los privilegios de un rol del que es miembro si su rol actual no tiene INHERIT atributo.

Para comprender cómo funciona esto, debe conocer la terminología que utiliza PostgreSQL para clasificar los roles activos:

  • Rol de sesión :Un rol de sesión es el rol con el que inició sesión durante su conexión inicial al clúster de base de datos de PostgreSQL. Establece sus privilegios iniciales y determina su acceso al sistema. Este rol debe tener el LOGIN atributo.
  • Función actual :Por el contrario, el rol actual es el rol en el que estás actuando actualmente. Los privilegios asociados con el rol actual, ya sea que se establezcan directamente o se hereden de otros roles, determinan las acciones que puede realizar y los objetos a los que tiene acceso.

Puede ver su sesión y los valores de su rol actual escribiendo:

SELECT SESSION_USER, CURRENT_USER;
 current_user | session_user--------------+-------------- postgres     | postgres(1 row)

Si bien la única forma de cambiar su rol de sesión es iniciar una nueva conexión usando un rol diferente, puede cambiar su rol actual usando SET ROLE dominio. El SET ROLE El comando se utiliza para actuar temporalmente como un rol diferente. El comando también toma opcionalmente los siguientes modificadores:

  • SESSION :La configuración predeterminada. Esto hace que SET ROLE comando para afectar a toda la sesión de la base de datos.
  • LOCAL :Este modificador hará que el comando cambie el rol solo para la transacción actual.

Para cambiar el rol actual a user2 rol (para el resto de la sesión), escriba:

SET ROLE "user2";

Si revisa su sesión y los valores de su rol actual, verá que el valor del rol actual ha cambiado:

SELECT SESSION_USER, CURRENT_USER;
 current_user | session_user--------------+-------------- user2        | postgres(1 row)

Todas sus acciones ahora usarán el user2 papel como su contexto.

Para volver al rol de sesión que había estado usando anteriormente, puede escribir:

SET ROLE NONE;

Una alternativa que logra el mismo resultado es:

RESET ROLE;


Conclusión

El sistema de roles, atributos de roles, concesiones y autenticación de PostgreSQL crea un sistema flexible que permite a los administradores administrar de manera efectiva los permisos y el acceso a la base de datos. Esta guía describió qué son exactamente los roles y cómo abarcan una amplia gama de casos de uso. También cubrió cómo crear, modificar y eliminar roles y administrar los atributos de roles que determinan sus capacidades globales. Es necesario comprender cómo administrar estas identidades para proteger sus bases de datos y proporcionar acceso utilizable a sus usuarios legítimos.