Ir al contenido

Aprovisionamiento SAML SSO y SCIM

Configura el inicio de sesión único SAML y el aprovisionamiento de usuarios SCIM para Rhombus mediante la API: integra Okta, Azure AD, Google Workspace, OneLogin y otros IdP.

En esta página

Descripción general

Rhombus soporta SAML 2.0 para que tus empleados puedan iniciar sesión en la Consola de Rhombus con su identidad corporativa existente (Okta, Azure AD / Microsoft Entra, Google Workspace, OneLogin y cualquier IdP compatible con SAML), y SCIM 2.0 para que los cambios en el ciclo de vida de los usuarios en tu IdP se propaguen automáticamente a Rhombus.

Esta guía cubre la superficie de la API para configurar ambos. Úsala cuando necesites:

  • Gestionar Rhombus como infraestructura como código (Terraform, Pulumi, scripts de CI internos)
  • Rotar los certificados de firma del IdP con una cadencia programada
  • Incorporar muchas organizaciones de Rhombus desde el plano de control de un partner o MSP
  • Auditar o comparar la configuración de identidad entre entornos
  • Poner en marcha un nuevo tenant de principio a fin sin hacer clic en la Consola

Si solo necesitas configurar SSO una vez para una sola organización, la Consola de Rhombus tiene una interfaz para todo lo que aparece en esta guía, pero todo lo que la interfaz puede hacer está expuesto a través de la API.

Arquitectura de un vistazo

Dos flujos independientes comparten tu IdP, pero por lo demás no dependen el uno del otro:

Cargando el diagrama…
  • SAML SSO autentica a los usuarios en el momento del inicio de sesión. Tu IdP envía una aserción SAML a Rhombus; Rhombus la valida contra el XML de metadatos del IdP que subiste.
  • SCIM propaga los eventos del ciclo de vida de los usuarios (creación, actualización, desactivación) desde tu IdP a Rhombus de forma continua, sin requerir que los usuarios inicien sesión primero.

Puedes ejecutar cualquiera de los dos por sí solo, pero la mayoría de las implementaciones ejecutan ambos: SAML para el inicio de sesión, SCIM para el aprovisionamiento.

Antes de comenzar

Información

Antes de comenzar, asegúrate de tener:

  • Una clave de API de Rhombus con permisos de administrador de organización (generada en la Consola de Rhombus en Configuración → Integraciones y recursos para desarrolladores → Tokens de API)
  • Un proveedor de identidad que soporte SAML 2.0 y (para el aprovisionamiento) SCIM 2.0
  • El XML de metadatos del IdP de tu aplicación SAML, ya sea como archivo o como URL
  • Una cuenta de usuario de recuperación con una contraseña que omita SAML; consulta acceso break-glass antes de habilitar SSO

Parte 1: SAML SSO

Dos endpoints cubren todo el ciclo de vida de la configuración SAML:

EndpointPropósito
POST /api/org/getSAMLSettingsV2Leer la configuración SAML actual de la organización
POST /api/org/updateSAMLSettingsV2Reemplazar la configuración SAML

Leer la configuración SAML actual

Obtén la configuración actual para poder compararla con la que pretendes enviar, o para confirmar que una actualización anterior se aplicó.

import requests

headers = {
    "x-auth-scheme": "api-token",
    "x-auth-apikey": "YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.post(
    "https://api2.rhombussystems.com/api/org/getSAMLSettingsV2",
    headers=headers,
    json={},
)

for setting in response.json().get("samlSettings", []):
    print(f"team={setting.get('teamName')} enabled={setting.get('enabled')} "
          f"jit={setting.get('justInTimeAccountProvisioningEnabled')}")

La respuesta contiene un array samlSettings. La mayoría de las organizaciones tienen una sola entrada; una segunda entrada existe únicamente para implementaciones que abarcan tanto el dominio rhombus.com como rhombussystems.com.

Configurar SAML

POST /api/org/updateSAMLSettingsV2 reemplaza la configuración SAML de la organización. Incluye las entradas que quieres que existan después de la llamada; los campos omitidos dentro de una entrada vuelven a sus valores predeterminados.

Los campos de OrgSamlSettingsType

CampoTipoDescripción
enabledbooleanActiva o desactiva el inicio de sesión SAML. Establécelo en false para deshabilitar SSO sin perder tus metadatos.
idpMetaDataXmlstringEl XML de metadatos SAML sin procesar de tu IdP (descriptor de entidad, certificado de firma, URLs de SSO).
justInTimeAccountProvisioningEnabledbooleanSi es true, se crea automáticamente un usuario de Rhombus la primera vez que alguien inicia sesión vía SAML. Consulta JIT vs SCIM más abajo.
enabledForRhombusKeybooleanRequerir SAML también para la aplicación de acceso móvil Rhombus Key.
addUsersOnRoleMismatchbooleanSi es true, el inicio de sesión tiene éxito incluso cuando el rol declarado por el IdP no coincide con un rol de Rhombus; el usuario se agrega con un rol predeterminado.
teamNamestringEtiqueta de visualización usada en la Consola.
domainenumRHOMBUS_COM o RHOMBUS_SYSTEMS_COM. La mayoría de los clientes usan RHOMBUS_COM.
rhombusKeyAppSettingsobjectConmutadores por aplicación para la app móvil Rhombus Key (desbloqueo remoto, omisión de SAML para móvil, etc.).

Subir los metadatos del IdP

import requests

# Read your IdP's federation metadata XML
with open("idp-metadata.xml", "r") as f:
    idp_metadata_xml = f.read()

headers = {
    "x-auth-scheme": "api-token",
    "x-auth-apikey": "YOUR_API_KEY",
    "Content-Type": "application/json",
}

body = {
    "samlSettings": [
        {
            "enabled": True,
            "idpMetaDataXml": idp_metadata_xml,
            "justInTimeAccountProvisioningEnabled": True,
            "enabledForRhombusKey": True,
            "addUsersOnRoleMismatch": False,
            "teamName": "Acme Corp",
            "domain": "RHOMBUS_COM",
        }
    ]
}

response = requests.post(
    "https://api2.rhombussystems.com/api/org/updateSAMLSettingsV2",
    headers=headers,
    json=body,
)
response.raise_for_status()
print("SAML configuration updated.")
Advertencia

updateSAMLSettingsV2 es una operación de reemplazo. Para cambiar un solo campo (por ejemplo, teamName), lee primero la configuración actual, modifica la entrada que quieras y vuelve a enviar el array completo. Omitir una entrada que existía previamente la elimina.

JIT vs SCIM

Tienes dos opciones para incorporar usuarios a Rhombus:

OpciónQué haceCuándo elegirla
JIT (justInTimeAccountProvisioningEnabled: true)Se crea un registro de usuario de Rhombus la primera vez que una persona inicia sesión vía SAML.Equipos pequeños, baja rotación, SCIM no disponible en el nivel de tu IdP.
SCIM (Parte 2)Tu IdP envía eventos de creación, actualización y desactivación a Rhombus a medida que ocurren.Organizaciones más grandes, requisitos de desaprovisionamiento por cumplimiento, cambios de rol que deben propagarse de inmediato.

Puedes habilitar ambos: JIT gestiona a cualquier usuario que inicie sesión antes de que SCIM lo sincronice, y SCIM mantiene el directorio coherente a partir de entonces. La mayoría de las implementaciones en producción ejecutan ambos.

Rotar los metadatos del IdP

Los certificados de firma del IdP rotan. Crea un trabajo programado que obtenga metadatos actualizados de tu IdP y los envíe a Rhombus; Rhombus sigue aceptando aserciones firmadas con el certificado antiguo hasta que reemplaces los metadatos.

Python
import requests

def rotate_saml_metadata(api_key: str, new_metadata_xml: str) -> None:
    """Fetch current SAML settings, swap in new IdP metadata, push back."""
    headers = {
        "x-auth-scheme": "api-token",
        "x-auth-apikey": api_key,
        "Content-Type": "application/json",
    }

    # 1. Read current settings
    current = requests.post(
        "https://api2.rhombussystems.com/api/org/getSAMLSettingsV2",
        headers=headers,
        json={},
    ).json()

    settings = current.get("samlSettings") or []
    if not settings:
        raise RuntimeError("No existing SAML settings to rotate.")

    # 2. Replace the metadata XML on each entry; leave other fields untouched
    for entry in settings:
        entry["idpMetaDataXml"] = new_metadata_xml

    # 3. Push back
    response = requests.post(
        "https://api2.rhombussystems.com/api/org/updateSAMLSettingsV2",
        headers=headers,
        json={"samlSettings": settings},
    )
    response.raise_for_status()
Consejo

Programa la rotación con bastante antelación a que el certificado de tu IdP realmente caduque. Verifica un inicio de sesión real inmediatamente después de la rotación, antes de cerrar la ventana de mantenimiento: una actualización de XML mal formada puede impedir los inicios de sesión hasta que reviertas.

Acceso break-glass

Antes de habilitar SAML, asegúrate de que al menos un usuario administrador tenga una contraseña nativa de Rhombus y pueda omitir SAML. De lo contrario, una configuración incorrecta bloquea a todos y la única vía de recuperación es el Soporte de Rhombus.

Cada registro de usuario de Rhombus tiene un booleano bypassSaml. Mantén una o dos cuentas de administrador con bypassSaml: true como vía de recuperación. Estas cuentas deberían:

  • Usar contraseñas fuertes y únicas almacenadas en tu gestor de secretos
  • Tener MFA habilitado
  • Auditarse con regularidad: trátalas como credenciales de root
Advertencia

Nunca deshabilites SAML y elimines todas las cuentas break-glass en el mismo cambio. Prueba tu vía de recuperación al menos una vez por trimestre.


Parte 2: Aprovisionamiento SCIM

SCIM (System for Cross-domain Identity Management) permite que tu IdP envíe eventos del ciclo de vida de los usuarios directamente a Rhombus, sin necesidad de iniciar sesión.

Cinco endpoints cubren SCIM de principio a fin:

EndpointPropósito
POST /api/org/getScimDisplayInfoObtener las URLs del endpoint SCIM para entregarlas a tu IdP
POST /api/org/setupSCIMAccessForOrgConfiguración inicial de SCIM; devuelve un bearer token
POST /api/org/findSCIMSettingsForOrgLeer la configuración SCIM actual
POST /api/org/updateSCIMSettingsForOrgCambiar las opciones de SCIM (correos de bienvenida, comportamiento de roles, etc.)
POST /api/org/revokeSCIMAccessForOrgInvalidar el bearer token SCIM actual

Obtener las URLs del endpoint SCIM

Tu IdP necesita dos datos para conectarse: la URL del endpoint y un bearer token. La URL del endpoint proviene de getScimDisplayInfo:

import requests

response = requests.post(
    "https://api2.rhombussystems.com/api/org/getScimDisplayInfo",
    headers={
        "x-auth-scheme": "api-token",
        "x-auth-apikey": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={},
)

info = response.json()
print("Standard SCIM endpoint:", info["scimEndpointUrl"])
print("Azure AD SCIM endpoint:", info["azureScimEndpointUrl"])

La mayoría de los IdP usan scimEndpointUrl. Azure AD / Entra requiere la variante específica de Azure debido a peculiaridades del esquema propias de Microsoft.

Configuración inicial de SCIM

La primera llamada aprovisiona un bearer token. Este token se muestra una sola vez y no se puede recuperar después: captúralo de inmediato en tu gestor de secretos.

import requests

response = requests.post(
    "https://api2.rhombussystems.com/api/org/setupSCIMAccessForOrg",
    headers={
        "x-auth-scheme": "api-token",
        "x-auth-apikey": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "sendWelcomeEmailToNewUsers": True,
        "sendWelcomeEmailToNewRhombusKeyUsers": True,
        "addUsersOnRoleMismatch": False,
    },
)

data = response.json()
if data.get("scimAccessAlreadySetupFailure"):
    raise RuntimeError("SCIM is already set up — revoke first or use update.")

scim_bearer_token = data["token"]
# Store scim_bearer_token in your secrets manager immediately.
# Paste it into your IdP's SCIM provisioning settings as the bearer token.
Advertencia

El bearer token SCIM se muestra una sola vez. Perderlo significa revocar el acceso actual y configurar de nuevo, y tu IdP pierde la sincronización hasta que se actualice su token.

Opciones de configuración

CampoTipoDescripción
sendWelcomeEmailToNewUsersbooleanEnviar un correo a los nuevos usuarios cuando SCIM crea su cuenta de Rhombus.
sendWelcomeEmailToNewRhombusKeyUsersbooleanLo mismo, pero para los usuarios agregados a la app de acceso móvil Rhombus Key.
addUsersOnRoleMismatchbooleanCrear el usuario de todos modos si el rol declarado por el IdP no se mapea correctamente.
rhombusKeyAppSettingsobjectConmutadores por aplicación para el aprovisionamiento de Rhombus Key.

Leer la configuración SCIM actual

findSCIMSettingsForOrg devuelve el registro SCIMSettingsType completo, incluyendo la configuración de formato de roles, que importa para la compatibilidad con el IdP:

response = requests.post(
    "https://api2.rhombussystems.com/api/org/findSCIMSettingsForOrg",
    headers=headers,
    json={},
)

settings = response.json().get("scimSettings", {})
print("rolesFormat:", settings.get("rolesFormat"))  # LIST_OF_STRINGS or LIST_OF_MULTI_VALUED_ATTRIBUTES
print("welcome emails:", settings.get("sendWelcomeEmailToNewUsers"))

Compatibilidad de formato de roles

Rhombus acepta aserciones de roles SCIM en dos formas mediante rolesFormat:

ValorFormaIdP típico
LIST_OF_STRINGS"roles": ["admin", "viewer"]Okta, OneLogin, Google
LIST_OF_MULTI_VALUED_ATTRIBUTES"roles": [{"value": "admin"}, {"value": "viewer"}]Azure AD / Entra

Si los usuarios se están creando pero sus roles no se asignan correctamente, verifica esta configuración contra lo que tu IdP envía realmente.

Actualizar la configuración SCIM

updateSCIMSettingsForOrg cambia el comportamiento de SCIM sin volver a emitir el bearer token:

Python
response = requests.post(
    "https://api2.rhombussystems.com/api/org/updateSCIMSettingsForOrg",
    headers=headers,
    json={
        "sendWelcomeEmailToNewUsers": False,
        "sendWelcomeEmailToNewRhombusKeyUsers": True,
        "addUsersOnRoleMismatch": True,
    },
)
response.raise_for_status()

Rotar o revocar el bearer token SCIM

Para rotar: revoca y luego vuelve a configurar. Tu IdP debe actualizarse con el nuevo token en la misma ventana de mantenimiento o el aprovisionamiento fallará.

# 1. Revoke current access
requests.post(
    "https://api2.rhombussystems.com/api/org/revokeSCIMAccessForOrg",
    headers=headers,
    json={},
).raise_for_status()

# 2. Issue a new token with the same options as before
new = requests.post(
    "https://api2.rhombussystems.com/api/org/setupSCIMAccessForOrg",
    headers=headers,
    json={
        "sendWelcomeEmailToNewUsers": True,
        "sendWelcomeEmailToNewRhombusKeyUsers": True,
        "addUsersOnRoleMismatch": False,
    },
).json()

new_token = new["token"]
# 3. Push new_token into your IdP's SCIM bearer-token field.
Advertencia

Revocar SCIM detiene de inmediato la sincronización de usuarios desde tu IdP. Los usuarios existentes de Rhombus no se ven afectados: siguen activos y pueden seguir iniciando sesión vía SAML, pero cualquier cambio del IdP (nuevas contrataciones, usuarios desaprovisionados) no se propagará hasta que se restaure SCIM.


Notas de configuración específicas por IdP

Las llamadas a la API anteriores son las mismas en todos los IdP. Lo que cambia es dónde pegar los valores de Rhombus en la consola de tu IdP. Estas notas recogen lo que los clientes necesitan con más frecuencia.

Okta

SAML. Crea una nueva aplicación SAML 2.0. Para la SSO URL y la Audience URI, usa los valores del SAML ACS de Rhombus de tu organización (visible en la Consola en Settings → SSO / SAML). Descarga el XML de metadatos del IdP de Okta desde la pestaña Sign On de la aplicación y pásalo a updateSAMLSettingsV2 como idpMetaDataXml.

SCIM. En la pestaña Provisioning de la app de Okta, selecciona SCIM 2.0. Establece la SCIM connector base URL en el scimEndpointUrl de getScimDisplayInfo. Establece Authentication Mode en HTTP Header, con Authorization: Bearer <scim-token>. Establece rolesFormat en LIST_OF_STRINGS.

Azure AD / Microsoft Entra

SAML. Crea una nueva Enterprise Application → Non-gallery. En Single sign-on, elige SAML e importa los metadatos SP de Rhombus. Descarga el Federation Metadata XML de Azure y pásalo a updateSAMLSettingsV2.

SCIM. En Provisioning, elige Automatic. Usa la azureScimEndpointUrl (no el endpoint estándar) como Tenant URL, y pega el bearer token de setupSCIMAccessForOrg como Secret Token. Establece rolesFormat en LIST_OF_MULTI_VALUED_ATTRIBUTES: Azure envía las aserciones de roles en esta forma.

Google Workspace

SAML. Desde la Google Admin Console, agrega una app SAML personalizada dirigida a Rhombus. Descarga los metadatos del IdP de Google y pásalos a updateSAMLSettingsV2.

SCIM. Google Workspace soporta SCIM para algunas apps mediante Automated user provisioning. Usa el scimEndpointUrl con autenticación de bearer token. Establece rolesFormat en LIST_OF_STRINGS.

OneLogin

SAML. Crea un nuevo conector SAML 2.0; configura la ACS URL y el Entity ID a partir de los metadatos SP de Rhombus. Descarga el XML de metadatos del IdP de OneLogin y pásalo a updateSAMLSettingsV2.

SCIM. El aprovisionamiento SCIM v2 de OneLogin toma el scimEndpointUrl estándar y un bearer token. Establece rolesFormat en LIST_OF_STRINGS.


Auditar eventos de SSO

Cada intento de inicio de sesión SAML, exitoso o fallido, se escribe en el registro de auditoría de Rhombus, al igual que los cambios en la propia configuración SAML. Obtén estos eventos mediante POST /api/report/getAuditFeed.

Tipos de eventos de auditoría relevantes para SSO:

Tipo de eventoSe dispara cuando
SAML_LOGIN_WEBUn usuario inicia sesión correctamente vía SAML en la Consola
SAML_LOGIN_FAILURE_WEBUn inicio de sesión SAML falló en la Consola
SAML_LOGIN_MOBILEUn usuario inició sesión vía SAML en una app móvil de Rhombus
SAML_LOGIN_FAILURE_MOBILEUn inicio de sesión SAML falló en una app móvil de Rhombus
RHOMBUS_KEY_SAML_LOGINUn usuario inició sesión vía SAML en la app móvil Rhombus Key
UPDATE_INTEGRATION_SAMLLa propia configuración SAML fue modificada
Consejo

Envía los eventos UPDATE_INTEGRATION_SAML a tu SIEM para detectar cambios no autorizados en la configuración de SSO, y alerta ante cualquier pico de SAML_LOGIN_FAILURE_* para detectar rápidamente rotaciones rotas.

Solución de problemas

`updateSAMLSettingsV2` tiene éxito pero los usuarios no pueden iniciar sesión

Lo más frecuente es un problema con el propio XML de metadatos en lugar de la llamada a la API.

  • Verifica que el XML esté bien formado y contenga un certificado de firma vigente: un certificado caducado en los metadatos bloquea toda aserción.
  • Verifica que el entity ID en los metadatos coincida con lo que Rhombus espera (visible en la Consola en Settings → SSO).
  • Verifica que JIT esté habilitado si este es el primer inicio de sesión de estos usuarios y SCIM aún no los ha sincronizado; de lo contrario Rhombus no tiene ningún usuario al que mapear la aserción.
  • Revisa los eventos de auditoría UPDATE_INTEGRATION_SAML para confirmar que el cambio se aplicó como se esperaba.
Los usuarios SCIM se crean pero sus roles son incorrectos

Esto casi siempre es un desajuste de rolesFormat. Llama a findSCIMSettingsForOrg, verifica el valor y compáralo con la tabla de compatibilidad de formato de roles. Azure AD necesita LIST_OF_MULTI_VALUED_ATTRIBUTES; la mayoría de los demás necesitan LIST_OF_STRINGS.

La configuración de SCIM devuelve `scimAccessAlreadySetupFailure: true`

SCIM ya está configurado. Puedes (a) llamar a revokeSCIMAccessForOrg y volver a ejecutar la configuración para obtener un token nuevo, o (b) llamar a updateSCIMSettingsForOrg para modificar las opciones sin tocar el token.

El aprovisionamiento SCIM dejó de funcionar tras la rotación

El IdP sigue usando el bearer token antiguo. Después de revokeSCIMAccessForOrg + un nuevo setupSCIMAccessForOrg, el nuevo token debe pegarse en la configuración de aprovisionamiento del IdP. Haz ambas cosas en una sola ventana de mantenimiento para evitar una brecha de sincronización.

Bloqueado fuera de SAML — no puedes iniciar sesión, no tienes una clave de API a mano

Usa una cuenta break-glass con bypassSaml: true y una contraseña nativa de Rhombus. Si no existe ninguna, contacta al Soporte de Rhombus. Por eso el acceso break-glass es un requisito previo, no algo deseable.

JIT crea usuarios sin rol

Establece addUsersOnRoleMismatch: false para rechazar a los usuarios cuyo rol del IdP no se mapea, obligando al operador del IdP a corregir la aserción. Establécelo en true si prefieres crear el usuario y asignar un rol en Rhombus después. Elige de forma deliberada: los dos comportamientos son mutuamente excluyentes.

Próximos pasos