Las cuentas de servicio de base de datos pueden ser tan simples como un usuario con una contraseña independiente o un certificado para la autenticación. Los usuarios más avanzados quizá quieran configurar cuentas cuyo alcance de permisos pueda cambiarse dinámicamente con SET ROLE, para cambiar rápidamente entre perfiles sin cerrar sesión ni recargar el contenido.
Descripción general
SET ROLE puede utilizarse para delimitar dinámicamente los permisos de una cuenta de servicio durante una sesión. Para ello, limita los permisos efectivos de un usuario únicamente a los concedidos por los roles activados. Este enfoque tiene varias ventajas:
- A las cuentas de servicio se les pueden asignar varios roles, pero activar solo el necesario para una consulta concreta.
- Si la cuenta de servicio se ve comprometida, los atacantes solo podrán usar los permisos del rol activo.
- Una sola cuenta puede realizar tareas diversas cambiando de rol, en lugar de requerir credenciales distintas para cada tarea.
- Los permisos pueden actualizarse para toda una clase de cuentas de servicio modificando un único rol, en lugar de actualizar usuarios individuales.
- Los logs pueden registrar qué rol concreto estaba activo durante una consulta, lo que aporta un contexto más claro para las auditorías de seguridad.
En la práctica:
- Diseñe roles que definan los límites permitidos (
read_only,maintenance, etc.) - Concédaselos a la cuenta de servicio
- Al establecer la conexión, elija el rol o los roles activos mediante
SET ROLE(o el parámetro de rol), restringiendo así lo que esa sesión puede hacer
Configurar un rol de servicio
Conceder roles a la cuenta de servicio
Primero, cree roles con los privilegios/la configuración que desee y, a continuación, concédalos a la cuenta de servicio.
CREATE ROLE read_only_role;
GRANT SELECT ON db1.* TO read_only_role;
CREATE ROLE maint_role;
GRANT SELECT, INSERT, ALTER on db1.* TO maint_role;
GRANT read_only_role, maint_role TO service_user;Usar SET ROLE para definir los límites de la sesión
Al inicio de una sesión, la cuenta de servicio elige qué roles están activos:
-- Solo comportamiento de solo lectura para esta sesión
SET ROLE read_only_role;o:
-- Usar todos los roles concedidos (acceso completo)
SET ROLE ALL;SET ROLE activa roles para el usuario actual; los privilegios efectivos son la unión de todos los roles activos más los concedidos directamente al usuario.
También puede desactivar todos los roles:
SET ROLE NONE;o activar varios roles:
SET ROLE read_only_role, maint_role;Los roles activos actualmente se pueden consultar mediante system.current_roles.
Establecer roles predeterminados para la cuenta de servicio
Para garantizar que la cuenta de servicio siempre se inicie en un modo restringido, configure los roles predeterminados:
SET DEFAULT ROLE read_only_role TO service_user;o
SET DEFAULT ROLE ALL EXCEPT maint_role TO service_user;Uso de SET ROLE mediante HTTP / de forma programática
Si la cuenta de servicio se conecta mediante HTTP, no puede enviar SET ROLE; SELECT … como una sentencia múltiple. En su lugar, pase el rol como parámetro de consulta:
curl "https://host:8123?user=service_user&password=...&role=read_only_role" \
--data-binary "SELECT * FROM db1.table1"?role=… equivale a ejecutar SET ROLE read_only_role antes de la sentencia. Varios parámetros de rol se comportan como SET ROLE role 1, role 2.
Algunos drivers (p. ej., ClickHouse Connect para Python) también exponen una configuración de rol que se envía con cada solicitud y que el server usa como rol de la sesión.