Volver a actualizaciones
Nuevo releaseAug 20, 2026

Bastillion v5.2.0

Bastillion te ofrece una forma limpia y basada en navegador para gestionar el acceso SSH en todos tus sistemas, como un host bastión con un panel amigable.

Compartir

Build CodeQL License Java Built with Claude Code Website

Bastillion

Bastillion

Una herramienta moderna y basada en web para consolas SSH y gestión de claves SSH.

Bastillion te ofrece una forma limpia y basada en navegador de gestionar el acceso SSH en todos tus sistemas — como un host bastión con un panel amigable. Hace dos cosas:

  1. Terminal SSH basada en web — una vez que un host está registrado, los usuarios autorizados pueden abrir una o más sesiones de terminal en vivo hacia él directamente desde el navegador, con comandos que opcionalmente se transmiten a todas las sesiones abiertas a la vez (piensa en los paneles sincronizados de tmux, pero para una flota de hosts remotos en lugar de paneles locales).

  2. Gestión de claves SSH — Bastillion mantiene su propio par de claves SSH y empuja/rota las claves públicas en los hosts que registras, de modo que los usuarios individuales nunca necesitan tener o gestionar claves de larga duración hacia esos sistemas por sí mismos.

  • Inicia sesión con autenticación de dos factores (Authy o Google Authenticator)
  • Gestiona y distribuye claves públicas SSH, y deshabilítalas/rodéalas de forma centralizada
  • Lanza shells web de múltiples sesiones seguras y comparte comandos entre sesiones
  • Graba cada sesión y reprodúcela bajo demanda — evidencia lista para auditoría para cualquier marco de cumplimiento
  • Agrupa sistemas en Perfiles y controla exactamente quién puede acceder a qué
  • Guarda y vuelve a ejecutar Scripts Compuestos en toda una flota a la vez
  • Apila TLS/SSL sobre SSH para protección adicional

Múltiples terminales transmitiendo el mismo comando a tres hosts a la vez

Tres sesiones SSH reales e independientes — un comando, escrito una vez, ejecutado en todas partes.


Contenido


Cómo Funciona

Bastillion se sitúa entre tus usuarios y los sistemas a los que necesitan acceder, actuando como un tercero de confianza en lugar de una simple bóveda de contraseñas. Aquí está todo el ciclo de vida, de principio a fin.

1. Bastillion genera su propio par de claves SSH

En el primer arranque, antes que cualquier otra cosa, Bastillion genera un par de claves Ed25519 para sí mismo — esta es la única clave que alguna vez se empuja a tus hosts. Se muestra en la salida de la consola y siempre es visible bajo Configuración.

2. Registra un sistema

Un administrador añade un host bajo Gestionar → Sistemas (usuario, host, puerto y la ruta al archivo authorized_keys de ese host). Bastillion se autentica una vez con una contraseña o frase de acceso que tú proporcionas, y luego empuja su propia clave pública al authorized_keys de ese host. A partir de entonces se conecta usando esa clave — sin contraseñas almacenadas, nunca. El estado cambia a Éxito en el momento en que la clave está en su lugar.

Gestionar Sistemas — tres hosts registrados, todos mostrando estado de Éxito

3. Agrupa sistemas en Perfiles, asigna Usuarios

Los sistemas se agrupan en Perfiles con nombre — piensa en "Producción", "Preproducción", "Nivel de Bases de Datos". Luego, los usuarios se vinculan a los perfiles bajo Gestionar → Usuarios, que es lo único que controla quién puede acceder a qué. Revoca una asignación de perfil y ese acceso desaparece inmediatamente, sin necesidad de rotación de claves.

Asignando tres sistemas a un perfil de Producción

4. Abre terminales — y transmite a todas a la vez

Los usuarios asignados abren Shell Seguro → Terminales, eligen uno o más sistemas y obtienen terminales en vivo, redimensionables y basadas en xterm en el navegador, lado a lado. Escribe una vez y se envía a cada terminal marcada como activa — la misma pulsación de tecla, el mismo comando, la misma forma de salida, en tantos hosts como hayas seleccionado.

Un comando de verificación de salud transmitido a tres terminales simultáneamente, misma forma de salida en las tres

5. Rota o revoca claves de forma centralizada

Debido a que cada host confía en la misma clave de aplicación (no una clave por usuario), deshabilitarla una vez bajo Gestionar Claves SSH revoca el acceso en todas partes inmediatamente — sin necesidad de tocar los sistemas de destino manualmente, sin buscar qué servidor tiene qué clave obsoleta.

Gestionar claves SSH con perfil, huella digital, fecha de creación y acciones de eliminación

6. Cada sesión se graba — audita y reproduce

Todo lo escrito y cada byte devuelto en esas terminales se graba automáticamente. Los gestores abren Auditar Sesiones, filtran por usuario o sistema y reproducen cualquier sesión — lado a lado para sesiones que abarcaron múltiples hosts, con un filtro de texto para saltar directamente a las líneas que importan. La salida se transmite a la página mientras se carga, de modo que incluso una sesión que volcó cientos de megabytes de registros se reproduce sin esfuerzo.

Si necesitas mostrar a un auditor quién ejecutó qué, dónde y cuándo — esta es esa evidencia, capturada de serie. Prácticamente todo marco de cumplimiento tiene un requisito de pista de auditoría de acceso privilegiado en algún lugar (PCI DSS, HIPAA, SOC 2, ISO 27001 — elige el tuyo), y esto cumple ese requisito sin un producto PAM comercial. Las sesiones se conservan durante 90 días por defecto (deleteAuditLogAfter), y la grabación se puede desactivar con ENABLE_INTERNAL_AUDIT=false — consulta Auditoría.

Sesiones de auditoría listadas con filtros de usuario y sistema


🚀 Novedades

  • SSO SAML 2.0 — inicia sesión a través de un IdP empresarial (Entra ID, Okta, ADFS y otros) — consulta Configuración
  • Licencias — gratuito hasta 8 sistemas, niveles de pago disponibles en loophole.company/pricing.html (consulta Licencias a continuación)
  • Auditoría y reproducción de sesiones, activadas por defecto — cada sesión de terminal se graba y se puede reproducir bajo Auditar Sesiones, transmitida al navegador para que incluso sesiones enormes se carguen al instante
  • Se ejecuta como un jar autocontenido (java -jar) con HTTPS de serie — consulta Descarga y Ejecución
  • Actualizado a Java 21, Jetty 12 y Jakarta EE 10
  • Soporte completo para claves SSH Ed25519 (por defecto) y Ed448
  • Herramienta de migración v4 → v5 para traer usuarios, sistemas, claves y registros de auditoría de una instancia existente — consulta tools/migrate
  • Reforzado con un filtro CSRF y cabeceras de seguridad en toda la aplicación

Licencias

Bastillion se ejecuta sin licencia hasta 8 sistemas registrados — suficiente para probarlo de verdad antes de comprar. Una licencia eleva ese límite.

  1. Compra una licencia en loophole.company/pricing.html (Starter/Team/Business — con precio según el número de sistemas). El pago redirige de vuelta y descarga un archivo .lic automáticamente.
  2. Abre el archivo .lic y copia su contenido (una línea).
  3. Configúralo mediante la variable de entorno LICENSE_KEY: ```bash export LICENSE_KEY=

o pégala en licenseKey en BastillionConfig.properties — la variable de entorno tiene prioridad si ambas están configuradas. 4. Reinicia Bastillion. Settings muestra el licenciatario, el límite del sistema y la expiración, con una advertencia que comienza 90 días antes de que expire.

Las licencias son anuales y no se renuevan automáticamente — no se guarda ninguna tarjeta en archivo. Compra de nuevo desde la misma página de precios cuando recibas la advertencia de expiración.


Opciones de Instalación

Gratis: https://github.com/bastillion-io/Bastillion/releases


Requisitos Previos

Java 21 (OpenJDK)```bash

apt-get install openjdk-21-jdk

### Autenticador (para 2FA)

| Aplicación | Android | iOS |
|--------------|----------|-----|
| **Authy** | [Google Play](https://play.google.com/store/apps/details?id=com.authy.authy) | [iTunes](https://itunes.apple.com/us/app/authy/id494168017) |
| **Google Authenticator** | [Google Play](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2) | [iTunes](https://itunes.apple.com/us/app/google-authenticator/id388497605) |

---

## Descarga y ejecución

Descarga el último jar desde [Releases](https://github.com/bastillion-io/Bastillion/releases):```bash
java -jar bastillion-<version>.jar

Acceso en el navegador: https://<server-ip>:8443 — consulte TLS / HTTPS a continuación para obtener el certificado autofirmado que Bastillion genera en la primera ejecución.

Credenciales predeterminadas:``` username: admin password: changeme

Se ejecuta en primer plano; deténgalo con Ctrl+C. Para operación en segundo plano o como demonio, use lo que su
plataforma normalmente usa para un proceso Java de larga duración — `nohup java -jar ... &`, una unidad
de systemd, un contenedor, etc.

---

## Compilar desde el código fuente

Instale Maven 3+:```bash
apt-get install maven

Construir y ejecutar (empaqueta un jar autocontenido con un servidor Jetty integrado — ver io.bastillion.Main — y lo ejecuta):```bash mvn package java -jar target/bastillion-5.0.0-SNAPSHOT.jar

O para desarrollo local sin reempaquetar en cada cambio:```bash
mvn compile exec:java

Escucha en https://localhost:8443 de forma predeterminada, igual que la versión descargada anteriormente; consulta TLS / HTTPS más abajo para ver cómo se configura ese certificado y cómo usar el tuyo propio en su lugar.


TLS / HTTPS

Bastillion genera su propio certificado autofirmado en el primer arranque y sirve HTTPS — no hay nada que configurar. Los navegadores mostrarán una advertencia una vez (es autofirmado, no emitido por una CA); haz clic para continuar, igual que harías con cualquier otro dispositivo autohospedado. El certificado y su contraseña persisten entre reinicios (keystore/bastillion.p12 bajo CONFIG_DIR, con la contraseña almacenada de la misma forma cifrada que la contraseña de la base de datos).

Usa tu propio certificado firmado por una CA en lugar del autofirmado predeterminado — por ejemplo, uno gratuito de Let's Encrypt:

  1. Emite el certificado con certbot (requiere un nombre DNS real que apunte a este host, y el puerto 80 accesible para el desafío HTTP-01): ```bash sudo certbot certonly --standalone -d bastillion.example.com

Esto escribe fullchain.pem y privkey.pem en /etc/letsencrypt/live/bastillion.example.com/.

  1. Convierte el par de certificado/clave a PKCS12, el formato de almacén de claves que Bastillion espera: ```bash openssl pkcs12 -export
    -in /etc/letsencrypt/live/bastillion.example.com/fullchain.pem
    -inkey /etc/letsencrypt/live/bastillion.example.com/privkey.pem
    -out bastillion.p12 -name bastillion -passout pass:changeit
  2. Apunta Bastillion hacia él y reinicia: ```bash export KEYSTORE_PATH=/path/to/bastillion.p12 export KEYSTORE_PASSWORD=changeit

Los navegadores ahora confiarán en la conexión sin ninguna advertencia. Los certificados de Let's Encrypt caducan cada 90 días — certbot renew seguido de volver a ejecutar los pasos 2–3 (y un reinicio) lo mantiene actualizado; certbot renew --deploy-hook puede automatizar eso.

Detrás de un proxy inverso o balanceador de carga que ya termina TLS (nginx, Cloud Run, etc.) — deshabilite el HTTPS propio de Bastillion y deje que sirva HTTP plano en su lugar:```bash export TLS_ENABLED=false

Por defecto, en este modo se usa el puerto 8080; cambia `PORT` para modificarlo.

---

## Configuración

Cada ajuste que aparece a continuación se puede definir como una **variable de entorno**: toma el nombre de la propiedad, inserta un guion bajo antes de cada letra mayúscula y luego conviértela a mayúsculas: `licenseKey` → `LICENSE_KEY`, `dbUser` → `DB_USER`, `sshKeyType` → `SSH_KEY_TYPE`. Esta es la forma recomendada de configurar Bastillion, especialmente en contenedores: no hay ningún archivo que montar o integrar.

`BastillionConfig.properties` sigue funcionando como respaldo (las variables de entorno siempre tienen prioridad si ambas están definidas), y es donde se guarda cualquier valor que Bastillion genere automáticamente en el primer arranque, como una contraseña aleatoria de la base de datos. Consulta `src/main/resources/BastillionConfig.properties` para ver la lista completa de ajustes y sus valores predeterminados.

**Consolidar todo bajo un único directorio** (por ejemplo, un único volumen Docker montado): `CONFIG_DIR` es el ajuste que debes usar. Todo lo que Bastillion persiste — `BastillionConfig.properties`, el almacén de claves TLS autofirmado (`keystore/bastillion.p12`), la base de datos H2 y el par de claves de host SSH (ambos bajo `keydb/`), y `bastillion.jceks` — vive bajo ese directorio de forma predeterminada, por lo que apuntar `CONFIG_DIR` a un solo lugar reubica todo ello:```bash
export CONFIG_DIR=/data/bastillion/

KEYSTORE_PATH y DB_CONNECTION_URL siguen existiendo para apuntar solo uno de ellos a una ubicación diferente por su cuenta (un certificado real, una base de datos remota) — consulte TLS / HTTPS y la sección "Configuración de la base de datos" a continuación — pero ninguno es necesario solo para consolidar todo en CONFIG_DIR.

CONFIG_DIR en sí mismo tiene como valor predeterminado ./config relativo al directorio de trabajo. ¿Está actualizando una instancia existente que nunca lo configuró? Las versiones anteriores almacenaban el estado directamente en el directorio de trabajo en lugar de ./config — Bastillion lo detecta en el primer inicio con esta versión y lo mueve a ./config (o a CONFIG_DIR, si ahora ha configurado uno) automáticamente.

Gestión de claves SSH```bash # Disable key management (append instead of overwrite) export KEY_MANAGEMENT_ENABLED=false

authorized_keys refresh interval in minutes (no refresh for <=0)

export AUTH_KEYS_REFRESH_INTERVAL=120

Force user key generation and strong passphrases

export FORCE_USER_KEY_GENERATION=false

</details>

<details>
<summary><strong>Par de claves SSH personalizado</strong></summary>

De forma predeterminada, Bastillion genera su propio par de claves Ed25519 en el primer arranque. Para usar el tuyo propio,
la forma más sencilla es a través de la interfaz: **Configuración → Reemplazar clave SSH de la aplicación**
(solo cuentas de administrador): pega una clave privada, una clave pública y una frase de contraseña si la tiene,
y surte efecto de inmediato, sin necesidad de reiniciar.

⚠️ Esto reemplaza la *única* clave que todos los sistemas registrados confían. Está pensado como un paso único
al configurar Bastillion por primera vez, **antes** de registrar cualquier sistema. Si ya
tienes sistemas registrados, Bastillion pierde el acceso SSH a todos ellos en el instante en que reemplazas
la clave, a menos que esta clave exacta ya esté presente en `authorized_keys` en cada uno de ellos
primero. La página de Configuración requiere una casilla de confirmación adicional una vez que tienes sistemas
registrados, precisamente por esto.

**¿Ya tienes sistemas registrados y necesitas rotar la clave de todos modos?** Preconfigura la nueva clave
a través del propio Bastillion en lugar de editar `authorized_keys` manualmente en todas partes:

1. Establece `FORCE_USER_KEY_GENERATION=false` para que **Administrar claves SSH → Agregar clave SSH** te permita pegar
   una clave pública existente en lugar de solo generar una nueva.
2. Agrega la nueva clave allí contra un perfil que cubra todos tus sistemas y confirma (en
   Administrar claves SSH, o en el estado de cada sistema) que realmente se haya distribuido en todos ellos: ten en cuenta
   `AUTH_KEYS_REFRESH_INTERVAL`, ya que es lo que la propaga.
3. Solo cuando estés seguro de que está en todos los sistemas, reemplaza la clave de la aplicación en Configuración.
4. Restablece `FORCE_USER_KEY_GENERATION` a su valor anterior y, una vez que hayas confirmado
   que la nueva clave de la aplicación se ha propagado a todos los sistemas (de nuevo, ten en cuenta
   `AUTH_KEYS_REFRESH_INTERVAL`), elimina la clave que agregaste en el paso 2 de Administrar claves SSH:
   solo se preparó allí para presemillar `authorized_keys` y no se necesita de aquí en adelante.

Para configuraciones mediante scripts/sin interfaz, lo mismo se puede hacer con variables de entorno y un
reinicio en su lugar:```bash
# Regenerate and import SSH keys
export RESET_APPLICATION_SSH_KEY=true

# Private key
export PRIVATE_KEY=/Users/you/.ssh/id_rsa

# Public key
export PUBLIC_KEY=/Users/you/.ssh/id_rsa.pub

# Passphrase (leave blank if none)
export DEFAULT_SSH_PASSPHRASE=myPa$$w0rd

Una vez registrada, puedes eliminar estas: el par de claves ya está almacenado en la base de datos.

SSH_KEY_TYPE (rsa, ecdsa, ed25519 o ed448) solo importa cuando Bastillion está generando una clave nueva, no al importar una: el tipo de una clave importada se lee de la propia clave:```bash

SSH key type ('rsa', 'ecdsa', 'ed25519', or 'ed448')

Supported options:

rsa - Classic, widely compatible (configurable length, default 4096)

ecdsa - Faster, smaller keys (P-256/384/521 curves)

ed25519 - Default and recommended (≈ RSA-4096, secure and fast)

ed448 - Extra-strong (≈ RSA-8192, slower and less supported)

export SSH_KEY_TYPE=ed25519

</details>

<details>
<summary><strong>Configuración de la base de datos</strong></summary>

Ejemplo con H2 integrado:```bash
export DB_USER=bastillion
export DB_PASSWORD=p@$$w0rd!!
export DB_DRIVER=org.h2.Driver
export DB_CONNECTION_URL=jdbc:h2:file:keydb/bastillion;CIPHER=AES;

Ejemplo remoto de H2:```bash export DB_CONNECTION_URL=jdbc:h2:tcp://:/~/bastillion;CIPHER=AES;

</details>

<details>
<summary><strong>Autenticación externa (LDAP / JAAS)</strong></summary>

Autenticar contra un servidor LDAP/Active Directory existente en lugar de (o además de) las
contraseñas locales. Actívalo:```bash
export JAAS_MODULE=ldap-ol

Configura jaas.conf:``` ldap-ol { com.sun.security.auth.module.LdapLoginModule SUFFICIENT userProvider="ldap://hostname:389/ou=example,dc=bastillion,dc=com" userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))" authzIdentity="{cn}" useSSL=false debug=false; };

Para mapear roles de LDAP a perfiles de Bastillion:```
ldap-ol-with-roles {
    org.eclipse.jetty.security.jaas.spi.LdapLoginModule required
    debug="false"
    useLdaps="false"
    contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
    hostname="<SERVER>"
    port="389"
    bindDn="<BIND-DN>"
    bindPassword="<BIND-DN PASSWORD>"
    authenticationMethod="simple"
    forceBindingLogin="true"
    userBaseDn="ou=users,dc=bastillion,dc=com"
    userRdnAttribute="uid"
    userIdAttribute="uid"
    userPasswordAttribute="userPassword"
    userObjectClass="inetOrgPerson"
    roleBaseDn="ou=groups,dc=bastillion,dc=com"
    roleNameAttribute="cn"
    roleMemberAttribute="member"
    roleObjectClass="groupOfNames";
};

Los administradores se añaden en el primer inicio de sesión y se les pueden asignar perfiles de sistema.

Cómo funciona realmente la asignación de roles: cada grupo LDAP al que pertenece un usuario (según roleBaseDn/ roleMemberAttribute anterior) se convierte en un "nombre de rol": el valor del atributo roleNameAttribute de ese grupo (cn en el ejemplo anterior). En cada inicio de sesión, Bastillion compara cada uno de esos nombres de rol, mediante coincidencia exacta de texto, con los nombres de los Perfiles que hayas creado en Gestionar → Perfiles. Una coincidencia asigna al usuario a ese perfil; sin coincidencia, no hay acceso a ese perfil. Así que si un usuario es miembro del grupo LDAP cn=admins,ou=groups,..., necesitas un perfil de Bastillion literalmente llamado admins (mayúsculas aparte: la comparación es insensible a mayúsculas/minúsculas, pero la ortografía no lo es) para que esa membresía signifique algo en Bastillion. No existe ningún paso de asignación separado ni interfaz para esto: los nombres simplemente tienen que coincidir.

Un usuario cuyos roles no coinciden con ningún perfil de Bastillion es rechazado al iniciar sesión (las cuentas Manager son la única excepción; no están limitadas por perfiles). Establece defaultProfileForLdap con un nombre de perfil para asignar automáticamente cada usuario LDAP a él, garantizando que todos puedan iniciar sesión independientemente de la coincidencia de roles; útil como red de seguridad mientras sigues alineando los nombres de los perfiles con los nombres de grupos de tu directorio:```bash export DEFAULT_PROFILE_FOR_LDAP=everyone

</details>

<details>
<summary><strong>Inicio de sesión único (SAML 2.0)</strong></summary>

Autentíquese contra un proveedor de identidad empresarial (Microsoft Entra ID, Okta, ADFS o cualquier
IdP SAML 2.0) en lugar de (o además de) contraseñas locales o LDAP. Un botón **Iniciar sesión con SSO**
aparece en la página de inicio de sesión una vez configurado. Actívelo:```bash
export SAML_BASE_URL=https://bastillion.example.com
export SAML_IDP_METADATA_URL=https://login.microsoftonline.com/<tenant-id>/federationmetadata/2007-06/federationmetadata.xml?appid=<app-id>

En Entra ID (o tu IdP de preferencia), registra Bastillion como una Aplicación Empresarial / Proveedor de Servicios con:

  • Identificador (Entity ID): https://bastillion.example.com (o SAML_SP_ENTITY_ID si está configurado; ver más abajo)
  • URL de respuesta (URL del Servicio de Consumidor de Aserciones): https://bastillion.example.com/saml/acs

¿No tienes a mano la URL de metadatos del IdP? Configura el IdP manualmente en su lugar; los tres son necesarios juntos en ese caso:```bash export SAML_IDP_ENTITY_ID=https://sts.windows.net// export SAML_IDP_SSO_URL=https://login.microsoftonline.com//saml2 export SAML_IDP_CERT=

Solo es necesario si el Entity ID registrado en el lado del IdP no puede coincidir exactamente con `SAML_BASE_URL`:```bash
export SAML_SP_ENTITY_ID=https://bastillion.example.com

Para mapear las reclamaciones de grupo/rol de Entra a los perfiles de Bastillion (consulta "Cómo funciona realmente el mapeo de roles" a continuación antes de cambiar SAML_ROLE_ATTRIBUTE de su valor predeterminado):```bash export SAML_ROLE_ATTRIBUTE=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups export DEFAULT_PROFILE_FOR_SAML=everyone

Los administradores se añaden en el primer inicio de sesión SSO y se les pueden asignar perfiles de sistema.

**Nombre de usuario mostrado en Bastillion:** el SAML NameID se convierte en el nombre de usuario. Entra envía
`user.userprincipalname` por defecto, lo cual está bien para miembros habituales del inquilino, pero produce un
UPN de invitado poco elegante como `alice_gmail.com#EXT#@yourtenant.onmicrosoft.com` para invitados B2B (cualquier persona
que haya iniciado sesión con un correo personal o externo añadido como invitado). Para un nombre de usuario más limpio, ve a
la *Single sign-on* de la Aplicación Empresarial → SAML → *Attributes & Claims*, edita **Unique
User Identifier (Name ID)** y cambia su *Source attribute* de `user.userprincipalname`
a `user.mail`.

**Cómo funciona realmente el mapeo de roles - el mismo mecanismo que con LDAP arriba:** `SAML_ROLE_ATTRIBUTE`
nombra *qué* atributo de aserción transporta los grupos/roles del usuario; los *valores* que ese
atributo contenga en un inicio de sesión concreto se comparan, **por coincidencia exacta de texto**, con los nombres de
los Perfiles que hayas creado en **Manage → Profiles**. Un valor que coincida con un nombre de perfil
asigna el usuario a ese perfil; nada más sobre la reclamación importa. Así que un perfil de Bastillion debe llamarse
exactamente igual que la cadena que envía la aserción - no hay un paso de mapeo separado
ni una interfaz, los nombres solo tienen que coincidir.

Esta es la parte que más a menudo confunde a la gente con Entra ID específicamente: por defecto,
la reclamación de grupos de Entra puede emitir cada grupo como su **Object ID** (un GUID) en lugar de su nombre
para mostrar, a menos que la configuración de token de la Aplicación Empresarial esté explícitamente configurada para emitir **nombres**
de grupo. Si tus perfiles de Bastillion se llaman cosas como `admins`/`everyone` pero Entra está
enviando GUIDs, nada coincidirá nunca. Comprueba el valor real de la reclamación en una aserción auténtica (o
la configuración de token de Entra para la aplicación) antes de asumir que el mapeo está roto - normalmente es
esto, no un problema del lado de Bastillion. Tres formas de solucionarlo, en orden de lo que recomendamos:

1. **Usa App Roles de Entra en lugar de reclamaciones de grupos (lo más limpio).** En el registro de la aplicación →
   App roles, define roles con exactamente los valores que quieras (`admins`, `everyone`, ...), y luego
   asigna usuarios/grupos a esos roles en *Users and groups* de la Aplicación Empresarial.
   Configura el token SAML para emitir la reclamación `roles` y apunta `SAML_ROLE_ATTRIBUTE` a esa
   URI de reclamación en lugar de a la reclamación de grupos. Tú eliges la cadena exacta que envía Entra - sin problema
   de GUID en absoluto, y es un modelo de autorización más limpio que reutilizar grupos de AD de todos modos.
2. **Cambia el atributo de origen de la reclamación de grupos.** Aplicación Empresarial → Single sign-on →
   SAML → *Attributes & Claims* → edita la reclamación de Groups → hay un desplegable
   *Source attribute*, normalmente con Group ID por defecto. Dependiendo de tu inquilino y de si los grupos
   son solo en la nube o están sincronizados desde AD local, puede que puedas cambiarlo a `sAMAccountName`
   o a una opción de nombre para mostrar - las opciones exactas varían según el inquilino y la versión del portal de Entra, así que
   comprueba lo que realmente se ofrece en lugar de asumir una etiqueta específica.
3. **O no luches contra ello - nombra el perfil de Bastillion según lo que Entra envíe realmente.** Si
   Entra insiste en enviar el GUID, crea un perfil de Bastillion literalmente llamado con ese GUID.
   Más feo, pero requiere cero reconfiguración del lado de Entra.

Un usuario cuyas reclamaciones no coincidan con ningún perfil de Bastillion es rechazado al iniciar sesión (las cuentas **Manager** son
la única excepción; no están limitadas por perfil) - exactamente igual que con LDAP, así que
`DEFAULT_PROFILE_FOR_SAML` arriba merece la pena configurarlo por la misma razón
que `DEFAULT_PROFILE_FOR_LDAP`: una red de seguridad mientras sigues alineando los nombres de perfil con
los valores de reclamación de tu IdP.

La comprobación de contraseña de un solo uso (OTP) propia de Bastillion se omite para inicios de sesión SSO - se espera que el IdP
aplique su propia política de MFA/Conditional Access en su lugar. El registro OTP de primera vez se sigue
ofreciendo para que los usuarios SAML tengan una credencial de respaldo local disponible si el SSO se desactiva alguna vez.

**Solicitudes firmadas y aserciones cifradas:** Bastillion genera su propio certificado de firma SAML
automáticamente (autofirmado, de la misma manera que genera su certificado TLS) la primera
vez que se necesita, y firma cada AuthnRequest saliente con él a partir de entonces - sin
configuración requerida, e inofensivo incluso si tu IdP no lo comprueba. Obtén
`https://bastillion.example.com/saml/metadata` para conseguir ese certificado en formato estándar
de metadatos SP y entrégalo a tu administrador del IdP si deben verificar las solicitudes firmadas de Bastillion,
o deben cifrar aserciones para Bastillion - la mayoría de los IdP pueden importar una URL de metadatos SP
directamente en lugar de pegar un certificado en bruto. Si prefieres usar un par de claves real (p. ej.
emitido por una CA) en lugar del generado automáticamente, apunta `SAML_SP_KEYSTORE_PATH`/
`SAML_SP_KEYSTORE_PASSWORD` a un almacén de claves PKCS12 que lo contenga. Para *exigir* aserciones
cifradas (desactivado por defecto - solo actívalo una vez que tu IdP esté realmente configurado para
cifrar para el certificado de Bastillion, o cada inicio de sesión empezará a fallar):```bash
export SAML_WANT_ENCRYPTED_ASSERTIONS=true

No compatible con: Single Logout (SLO): el cierre de sesión solo es local y no informa al IdP ni a ninguna otra aplicación en la que hayas iniciado sesión mediante la misma sesión SSO. SAML SSO puede habilitarse junto con LDAP; ambos se evalúan de forma independiente y cualquiera de ellos puede aprovisionar nuevos usuarios en el primer inicio de sesión.

Auditoría

La auditoría de sesiones está habilitada por defecto: la salida del terminal se almacena en la base de datos de Bastillion y puede revisarse en Audit Sessions (solo cuentas de administrador). La salida se transmite al navegador, por lo que incluso las sesiones con cantidades muy grandes de salida de terminal pueden reproducirse. El historial de auditoría se conserva durante deleteAuditLogAfter días (90 por defecto). Desactívelo con:```bash export ENABLE_INTERNAL_AUDIT=false

También existe un registro de auditoría basado en archivos, deshabilitado por defecto. Actívalo en **log4j2.xml** descomentando:
- `io.bastillion.manage.util.SystemAudit`
- `audit-appender`

> https://github.com/bastillion-io/Bastillion/blob/main/src/main/resources/log4j2.xml#L19-L22
</details>

<details>
<summary><strong>Migración desde v4</strong></summary>

¿Estás actualizando desde una instalación antigua de Bastillion v4 y quieres conservar tus usuarios, sistemas, perfiles,
scripts y (lo más importante) el par de claves SSH existente de la aplicación en lugar de empezar
de cero? `tools/migrate/` incluye una herramienta de migración independiente exactamente para eso: exporta cada
tabla de la antigua base de datos H2 (descifrando las columnas cifradas a nivel de aplicación con el
almacén de claves de la instancia ANTIGUA) a un archivo JSON, y luego la importa en una instancia nueva de v5 (volviendo a cifrar
con el almacén de claves de la instancia NUEVA). Los usuarios existentes pueden iniciar sesión con sus contraseñas actuales
inmediatamente después — sin restablecimientos forzados.```bash
cd tools/migrate

# 1. Export the old database
./migrate.sh export /opt/Bastillion-jetty/jetty/bastillion/WEB-INF/classes/ ~/bastillion-export.json

# 2. Start the new v5 instance once against the config dir you're migrating into, then
#    stop it (Ctrl+C) once it's finished booting - this creates the schema, jceks, and
#    default admin user.
cd ../..
java -DCONFIG_DIR=/data/bastillion/ -jar target/bastillion-5.0.0-SNAPSHOT.jar

# 3. Import into the new database (full replace of all 12 tables)
cd tools/migrate
./migrate.sh import /data/bastillion/ ~/bastillion-export.json --yes-replace-all-data

# 4. Delete the export file - it contains decrypted secrets
rm ~/bastillion-export.json

Consulta tools/migrate/README.md para obtener todos los detalles: cómo encontrar el directorio de configuración de tu instalación anterior, qué se migra exactamente y las notas de seguridad sobre el archivo de exportación en texto plano.


Más capturas de pantalla

El flujo de trabajo principal se muestra en Cómo funciona. Expande un grupo a continuación para explorar el resto de la interfaz.

Autenticación — inicio de sesión y registro de verificación en dos pasos

Inicio de sesión

Inicia sesión con un nombre de usuario y una contraseña, además de un código de acceso OTP opcional.

Pantalla de inicio de sesión de Bastillion

Configuración de verificación en dos pasos

Escanea el código QR con Authy, Google Authenticator u otra aplicación compatible.

Pantalla de configuración de verificación en dos pasos de Bastillion

Gestión de accesos — navegación, perfiles y usuarios

Las herramientas disponibles están limitadas según los permisos del usuario que ha iniciado sesión.

Menú principal de Bastillion

Gestionar perfiles

Agrupa sistemas en perfiles con nombre que controlan el acceso.

Pantalla de gestión de perfiles de Bastillion

Gestionar usuarios

Crea cuentas, elige roles de usuario y concede acceso a sistemas mediante perfiles.

Pantalla de gestión de usuarios de Bastillion

Terminales y automatización — inicia sesiones y ejecuta scripts guardados

Terminales

Selecciona uno o más sistemas, opcionalmente filtrados por perfil, y ábrelos simultáneamente.

Pantalla de selección de terminales de Bastillion

Scripts compuestos

Guarda un script una vez y ejecútalo en cada terminal seleccionado.

Pantalla de gestión de scripts compuestos de Bastillion

Configuración — apariencia de la cuenta y autenticación de la aplicación

Configuración de usuario

Cambia tu contraseña, elige la apariencia de la interfaz y del terminal, y gestiona la clave pública que Bastillion utiliza para autenticarse en los sistemas registrados.

Pantalla de configuración de usuario de Bastillion


Licencia

Bastillion está disponible bajo la Prosperity Public License.

Lista completa de dependencias de terceros y sus licencias en 3rdPartyLicenses.md.

Loophole, LLC — Sean Kavanagh

[email protected]

Categorías