> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Administrar cuentas de servicio de base de datos

> Esta página describe cómo los administradores pueden añadir cuentas de servicio de base de datos

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.

<div id="overview">
  ## Descripción general
</div>

[SET ROLE](/docs/es/reference/statements/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:

1. Diseñe roles que definan los límites permitidos (`read_only`, `maintenance`, etc.)
2. Concédaselos a la cuenta de servicio
3. 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

<div id="setup-service-roles">
  ## Configurar un rol de servicio
</div>

<Steps>
  <Step title="Conceder roles a la cuenta de servicio" id="grant-roles-to-service-account">
    Primero, cree roles con los privilegios/la configuración que desee y, a continuación, concédalos a la cuenta de servicio.

    ```sql theme={null}
    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;
    ```
  </Step>

  <Step title="Usar SET ROLE para definir los límites de la sesión" id="define-permission-boundaries">
    Al inicio de una sesión, la cuenta de servicio elige qué roles están activos:

    ```sql theme={null}
    -- Solo comportamiento de solo lectura para esta sesión
    SET ROLE read_only_role;
    ```

    o:

    ```sql theme={null}
    -- 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:

    ```sql theme={null}
    SET ROLE NONE;
    ```

    o activar varios roles:

    ```sql theme={null}
    SET ROLE read_only_role, maint_role;
    ```

    Los roles activos actualmente se pueden consultar mediante `system.current_roles`.
  </Step>

  <Step title="Establecer roles predeterminados para la cuenta de servicio" id="set-default-role">
    Para garantizar que la cuenta de servicio siempre se inicie en un modo restringido, configure los roles predeterminados:

    ```sql theme={null}
    SET DEFAULT ROLE read_only_role TO service_user;
    ```

    o

    ```sql theme={null}
    SET DEFAULT ROLE ALL EXCEPT maint_role TO service_user;
    ```
  </Step>

  <Step title="Uso de SET ROLE mediante HTTP / de forma programática" id="use-set-role-programmatically">
    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:

    ```shell theme={null}
    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.
  </Step>
</Steps>
