Zurück zu den Updates
New releaseAug 20, 2026

Bastillion v5.2.0

Bastillion bietet Ihnen eine saubere, browserbasierte Möglichkeit, den SSH-Zugriff auf alle Ihre Systeme zu verwalten – wie ein Bastion-Host mit einem benutzerfreundlichen Dashboard.

Teilen

Build CodeQL License Java Built with Claude Code Website

Bastillion

Bastillion

Ein modernes, webbasiertes SSH-Konsolen- und SSH-Schlüsselverwaltungstool.

Bastillion bietet Ihnen eine übersichtliche, browserbasierte Möglichkeit, den SSH-Zugriff auf alle Ihre Systeme zu verwalten – wie ein Bastion-Host mit einem benutzerfreundlichen Dashboard. Es erfüllt zwei Aufgaben:

  1. Webbasierte SSH-Terminal – Sobald ein Host registriert ist, können autorisierte Benutzer eine oder mehrere Live-Terminalsitzungen direkt aus dem Browser öffnen, wobei Befehle optional gleichzeitig an alle geöffneten Sitzungen übertragen werden können (denken Sie an synchronisierte Panes von tmux, aber für eine Flotte entfernter Hosts statt lokaler Panes).

  2. SSH-Schlüsselverwaltung – Bastillion hält sein eigenes SSH-Schlüsselpaar und überträgt/rotiert öffentliche Schlüssel auf die von Ihnen registrierten Hosts, sodass einzelne Benutzer niemals langfristige Schlüssel für diese Systeme selbst besitzen oder verwalten müssen.

  • Anmeldung mit Zwei-Faktor-Authentifizierung (Authy oder Google Authenticator)
  • SSH-Public-Keys verwalten und verteilen sowie zentral deaktivieren/rotieren
  • Sichere Multi-Sitzungs-Web-Shells starten und Befehle über Sitzungen hinweg teilen
  • Jede Sitzung aufzeichnen und bei Bedarf abspielen – prüfungsreife Nachweise für jedes Compliance-Framework
  • Systeme in Profile gruppieren und genau steuern, wer worauf zugreifen kann
  • Composite-Skripte speichern und gleichzeitig über eine gesamte Flotte erneut ausführen
  • TLS/SSL über SSH für zusätzlichen Schutz stapeln

Mehrere Terminals, die denselben Befehl gleichzeitig an drei Hosts senden

Drei echte, unabhängige SSH-Sitzungen – ein Befehl, einmal getippt, überall ausgeführt.


Inhalt


So funktioniert es

Bastillion sitzt zwischen Ihren Benutzern und den Systemen, die sie erreichen müssen, und agiert als vertrauenswürdiger Dritter statt als einfacher Passwort-Tresor. Hier ist der gesamte Lebenszyklus, Ende zu Ende.

1. Bastillion generiert sein eigenes SSH-Schlüsselpaar

Beim ersten Start, vor allem anderen, generiert Bastillion ein Ed25519-Schlüsselpaar für sich selbst – dies ist der eine Schlüssel, der jemals auf Ihre Hosts übertragen wird. Er wird in der Konsolenausgabe angezeigt und ist immer unter Einstellungen sichtbar.

2. Ein System registrieren

Ein Administrator fügt einen Host unter Verwalten → Systeme hinzu (Benutzer, Host, Port und der Pfad zur authorized_keys-Datei dieses Hosts). Bastillion authentifiziert sich einmalig mit einem Passwort oder einer Passphrase, die Sie angeben, und überträgt dann seinen eigenen öffentlichen Schlüssel in die authorized_keys dieses Hosts. Ab dann verbindet es sich mit diesem Schlüssel – niemals gespeicherte Passwörter. Der Status wechselt auf Erfolg, sobald der Schlüssel an Ort und Stelle ist.

Systeme verwalten – drei registrierte Hosts, alle mit Status Erfolg

3. Systeme in Profile gruppieren, Benutzer zuweisen

Systeme werden in benannte Profile gruppiert – denken Sie an „Produktion", „Staging", „Datenbank- Ebene". Benutzer werden dann unter Verwalten → Benutzer mit Profilen verknüpft, was das Einzige ist, das steuert, wer worauf zugreifen kann. Widerrufen Sie eine Profilzuweisung und der Zugriff ist sofort beendet, ohne dass eine Schlüsselrotation erforderlich ist.

Zuweisung von drei Systemen zu einem Produktionsprofil

4. Terminals öffnen – und gleichzeitig an alle senden

Zugewiesene Benutzer öffnen Sichere Shell → Terminals, wählen ein oder mehrere Systeme aus und erhalten Live-, größenveränderbare, xterm-basierte Terminals im Browser, nebeneinander. Einmal tippen und es geht an jedes als aktiv markierte Terminal – derselbe Tastendruck, derselbe Befehl, dieselbe Ausgabeform, über so viele Hosts, wie Sie ausgewählt haben.

Ein Health-Check-Befehl, der gleichzeitig an drei Terminals gesendet wird, mit gleicher Ausgabeform auf allen drei

5. Schlüssel zentral rotieren oder widerrufen

Da jeder Host dem gleichen Anwendungsschlüssel vertraut (nicht einem Schlüssel pro Benutzer), widerruft das einmalige Deaktivieren unter SSH-Schlüssel verwalten den Zugriff überall sofort – ohne Zielsysteme manuell anfassen zu müssen, ohne zu suchen, welcher Server welchen veralteten Schlüssel hat.

SSH-Schlüssel mit Profil, Fingerabdruck, Erstellungsdatum und Löschaktionen verwalten

6. Jede Sitzung wird aufgezeichnet – Audit und Wiedergabe

Alles, was in diesen Terminals getippt wird, und jedes zurückgegebene Byte wird automatisch aufgezeichnet. Manager öffnen Audit-Sitzungen, filtern nach Benutzer oder System und spielen jede Sitzung ab – nebeneinander für Sitzungen, die mehrere Hosts umfassten, mit einem Textfilter, um direkt zu den relevanten Zeilen zu springen. Die Ausgabe streamt beim Laden in die Seite, sodass selbst eine Sitzung, die Hunderte von Megabyte an Protokollen ausgab, mühelos abgespielt wird.

Wenn Sie einem Prüfer zeigen müssen, wer was, wo und wann ausgeführt hat – dies ist dieser Nachweis, standardmäßig erfasst. Praktisch jedes Compliance-Framework hat irgendwo eine Anforderung für privilegierte Audit-Trails (PCI DSS, HIPAA, SOC 2, ISO 27001 – wählen Sie Ihres), und dies erfüllt diese Anforderung ohne ein kommerzielles PAM-Produkt. Sitzungen werden standardmäßig 90 Tage lang aufbewahrt (deleteAuditLogAfter), und die Aufzeichnung kann mit ENABLE_INTERNAL_AUDIT=false deaktiviert werden – siehe Auditing.

Audit-Sitzungen mit Benutzer- und Systemfiltern aufgelistet


🚀 Was ist neu

  • SAML 2.0 SSO – Anmeldung über einen Unternehmens-IdP (Entra ID, Okta, ADFS und andere) – siehe Konfiguration
  • Lizenzierung – kostenlos für bis zu 8 Systeme, kostenpflichtige Stufen verfügbar unter loophole.company/pricing.html (siehe Lizenzierung unten)
  • Sitzungs-Audit und -Wiedergabe, standardmäßig aktiviert – jede Terminalsitzung wird aufgezeichnet und kann unter Audit-Sitzungen abgespielt werden, gestreamt an den Browser, sodass selbst riesige Sitzungen sofort laden
  • Läuft als eigenständige Jar-Datei (java -jar) mit HTTPS standardmäßig – siehe Herunterladen und Ausführen
  • Aktualisiert auf Java 21, Jetty 12 und Jakarta EE 10
  • Volle Unterstützung für Ed25519 (Standard) und Ed448 SSH-Schlüssel
  • v4 → v5-Migrationstool zum Übernehmen von Benutzern, Systemen, Schlüsseln und Audit-Protokollen aus einer bestehenden Instanz – siehe tools/migrate
  • Abgesichert mit einem CSRF-Filter und app-weiten Sicherheits-Headern

Lizenzierung

Bastillion läuft ohne Lizenz für bis zu 8 registrierte Systeme – genug, um es real auszuprobieren, bevor Sie kaufen. Eine Lizenz erhöht diese Grenze.

  1. Kaufen Sie eine Lizenz unter loophole.company/pricing.html (Starter/Team/Business – nach Systemanzahl bepreist). Die Zahlung leitet zurück und lädt automatisch eine .lic-Datei herunter.
  2. Öffnen Sie die .lic-Datei und kopieren Sie deren Inhalt (eine Zeile).
  3. Setzen Sie ihn über die Umgebungsvariable LICENSE_KEY: ```bash export LICENSE_KEY=

oder füge es stattdessen in licenseKey in BastillionConfig.properties ein — die Umgebungsvariable hat Vorrang, wenn beide gesetzt sind. 4. Starte Bastillion neu. Einstellungen zeigt den Lizenznehmer, die Systemobergrenze und das Ablaufdatum, mit einer Warnung, die 90 Tage vor Ablauf beginnt.

Lizenzen sind jährlich und erneuern sich nicht automatisch — es wird keine Karte hinterlegt. Kaufe erneut über dieselbe Preisseite, wenn du die Ablaufwarnung erhältst.


Installationsoptionen

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


Voraussetzungen

Java 21 (OpenJDK)```bash

apt-get install openjdk-21-jdk

### Authenticator (für 2FA)

| Anwendung | 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) |

---

## Herunterladen und Ausführen

Laden Sie die neueste JAR-Datei von [Releases](https://github.com/bastillion-io/Bastillion/releases) herunter:```bash
java -jar bastillion-<version>.jar

Zugriff im Browser: https://<server-ip>:8443 — siehe TLS / HTTPS unten für das selbstsignierte Zertifikat, das Bastillion beim ersten Start generiert.

Standard-Anmeldedaten:``` username: admin password: changeme

Läuft im Vordergrund; stoppen mit Strg+C. Für Hintergrund-/Daemon-Betrieb verwenden Sie, was Ihre
Plattform normalerweise für einen langlaufenden Java-Prozess verwendet — `nohup java -jar ... &`, ein systemd-
Unit, ein Container usw.

---

## Aus dem Quellcode erstellen

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

Build and run (packt ein eigenständiges Jar mit eingebettetem Jetty-Server — siehe io.bastillion.Main — und führt es aus):```bash mvn package java -jar target/bastillion-5.0.0-SNAPSHOT.jar

Oder für die lokale Entwicklung ohne Neupaketierung bei jeder Änderung:```bash
mvn compile exec:java

Lauscht standardmäßig auf https://localhost:8443, genau wie der oben heruntergeladene Release — siehe TLS / HTTPS weiter unten, um zu erfahren, wie dieses Zertifikat eingerichtet wird und wie Sie stattdessen Ihr eigenes verwenden können.


TLS / HTTPS

Bastillion erzeugt beim ersten Start sein eigenes selbstsigniertes Zertifikat und bedient HTTPS — nichts zu konfigurieren. Browser zeigen einmalig eine Warnung an (es ist selbstsigniert, nicht von einer CA ausgestellt); klicken Sie sie weg, genau wie bei jedem anderen selbst gehosteten Gerät. Das Zertifikat und sein Passwort bleiben über Neustarts hinweg erhalten (keystore/bastillion.p12 unter CONFIG_DIR, das Passwort wird auf dieselbe verschlüsselte Weise gespeichert wie das Datenbank- Passwort).

Verwenden Sie Ihr eigenes CA-signiertes Zertifikat anstelle des selbstsignierten Standards — z. B. ein kostenloses von Let's Encrypt:

  1. Stellen Sie das Zertifikat mit certbot aus (erfordert einen echten DNS-Namen, der auf diesen Host zeigt, und einen erreichbaren Port 80 für die HTTP-01-Herausforderung): ```bash sudo certbot certonly --standalone -d bastillion.example.com

Dies schreibt fullchain.pem und privkey.pem nach /etc/letsencrypt/live/bastillion.example.com/.

  1. Konvertieren Sie das Zertifikat-/Schlüsselpaar in PKCS12, das Keystore-Format, das Bastillion erwartet: ```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. Richte Bastillion darauf aus und starte es neu: ```bash export KEYSTORE_PATH=/path/to/bastillion.p12 export KEYSTORE_PASSWORD=changeit

Browser werden der Verbindung nun ohne Warnung vertrauen. Let's-Encrypt-Zertifikate laufen alle 90 Tage ab — certbot renew gefolgt von erneutem Ausführen der Schritte 2–3 (und einem Neustart) hält es aktuell; certbot renew --deploy-hook kann das automatisieren.

Hinter einem Reverse-Proxy oder Load Balancer, der TLS bereits terminiert (nginx, Cloud Run usw.) — deaktivieren Sie Bastillions eigenes HTTPS und lassen Sie es stattdessen einfaches HTTP ausliefern:```bash export TLS_ENABLED=false

Standardmäßig wird in diesem Modus Port 8080 verwendet; setzen Sie `PORT`, um ihn zu ändern.

---

## Konfiguration

Jede der folgenden Einstellungen kann als **Umgebungsvariable** gesetzt werden – nehmen Sie den Eigenschaftsnamen, fügen Sie vor jedem Großbuchstaben einen Unterstrich ein und schreiben Sie ihn dann in Großbuchstaben: `licenseKey` → `LICENSE_KEY`, `dbUser` → `DB_USER`, `sshKeyType` → `SSH_KEY_TYPE`. Dies ist die empfohlene Methode zur Konfiguration von Bastillion, insbesondere in Containern – keine Datei zum Einhängen oder Einbrennen erforderlich.

`BastillionConfig.properties` funktioniert weiterhin als Fallback (Umgebungsvariablen haben immer Vorrang, wenn beide gesetzt sind) und ist der Ort, an dem jeder Wert gespeichert wird, den Bastillion beim ersten Start für Sie generiert – wie ein zufälliges DB-Passwort. Siehe `src/main/resources/BastillionConfig.properties` für die vollständige Liste der Einstellungen und ihrer Standardwerte.

**Alles unter einem einzigen Verzeichnis konsolidieren** (z. B. ein einzelnes Docker-Volume-Mount): `CONFIG_DIR` ist die eine Einstellung, die Sie dafür benötigen. Alles, was Bastillion speichert – `BastillionConfig.properties`, der selbstsignierte TLS-Keystore (`keystore/bastillion.p12`), die H2-Datenbank und das SSH-Host-Key-Paar (beide unter `keydb/`) sowie `bastillion.jceks` – liegt standardmäßig darunter, sodass das Ausrichten von `CONFIG_DIR` auf einen Ort alles dorthin verschiebt:```bash
export CONFIG_DIR=/data/bastillion/

KEYSTORE_PATH und DB_CONNECTION_URL existieren weiterhin, um nur einen davon separat auf einen anderen Speicherort zu verweisen (ein echtes Zertifikat, eine entfernte DB) — siehe TLS / HTTPS und den Abschnitt „Database Settings“ unten — aber keiner davon wird benötigt, um einfach alles in CONFIG_DIR zu konsolidieren.

CONFIG_DIR selbst standardmäßig auf ./config relativ zum Arbeitsverzeichnis. Eine bestehende Instanz upgraden, die es nie gesetzt hat? Ältere Versionen speicherten den Zustand direkt im Arbeitsverzeichnis statt in ./config — Bastillion erkennt das beim ersten Start mit dieser Version und verschiebt es automatisch nach ./config (oder in CONFIG_DIR, falls du jetzt eines gesetzt hast).

SSH-Schlüsselverwaltung```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>Benutzerdefiniertes SSH-Schlüsselpaar</strong></summary>

Standardmäßig erzeugt Bastillion beim ersten Start sein eigenes Ed25519-Schlüsselpaar. Um ein eigenes
zu verwenden, ist der einfachste Weg über die Benutzeroberfläche: **Einstellungen → Anwendungs-SSH-Schlüssel ersetzen**
(nur Manager-Konten) — fügen Sie einen privaten Schlüssel, einen öffentlichen Schlüssel und ggf. eine Passphrase ein,
und es wird sofort wirksam, ohne Neustart.

⚠️ Dies ersetzt den *einen* Schlüssel, dem jedes registrierte System vertraut. Es ist als einmaliger Schritt
bei der ersten Einrichtung von Bastillion gedacht, **bevor** Sie Systeme registriert haben — wenn Sie bereits
Systeme registriert haben, verliert Bastillion sofort den SSH-Zugriff auf alle, sobald Sie den Schlüssel
ersetzen, es sei denn, genau dieser Schlüssel befindet sich bereits in `authorized_keys` auf jedem einzelnen
von ihnen. Die Einstellungsseite verlangt ein zusätzliches Bestätigungskontrollkästchen, sobald Sie Systeme
registriert haben, genau aus diesem Grund.

**Bereits Systeme registriert und müssen den Schlüssel trotzdem rotieren?** Stellen Sie den neuen Schlüssel
über Bastillion selbst bereit, anstatt `authorized_keys` überall von Hand zu bearbeiten:

1. Setzen Sie `FORCE_USER_KEY_GENERATION=false`, damit **SSH-Schlüssel verwalten → SSH-Schlüssel hinzufügen** es Ihnen erlaubt,
   einen vorhandenen öffentlichen Schlüssel einzufügen, anstatt nur einen neuen zu erzeugen.
2. Fügen Sie den neuen Schlüssel dort gegen ein Profil hinzu, das alle Ihre Systeme abdeckt, und bestätigen Sie (unter
   SSH-Schlüssel verwalten oder im Status jedes Systems), dass er tatsächlich überall angekommen ist — beachten Sie
   `AUTH_KEYS_REFRESH_INTERVAL`, da dies das ist, was ihn ausrollt.
3. Erst wenn Sie sicher sind, dass er auf jedem System ist, ersetzen Sie den Anwendungsschlüssel in den Einstellungen.
4. Setzen Sie `FORCE_USER_KEY_GENERATION` auf seinen vorherigen Wert zurück, und sobald Sie bestätigt haben,
   dass der neue Anwendungsschlüssel auf jedes System übertragen wurde (auch hier beachten Sie
   `AUTH_KEYS_REFRESH_INTERVAL`), entfernen Sie den in Schritt 2 hinzugefügten Schlüssel aus SSH-Schlüssel verwalten —
   er wurde dort nur zur Vorbereitung von `authorized_keys` bereitgestellt und wird künftig nicht mehr benötigt.

Für skriptbasierte/headless Einrichtungen kann dasselbe stattdessen über Umgebungsvariablen und einen
Neustart erfolgen:```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

Sobald registriert, können Sie diese weglassen — das Schlüsselpaar ist bereits in der Datenbank gespeichert.

SSH_KEY_TYPE (rsa, ecdsa, ed25519 oder ed448) ist nur relevant, wenn Bastillion einen neuen Schlüssel generiert, nicht beim Importieren eines vorhandenen — der Typ eines importierten Schlüssels wird aus dem Schlüssel selbst ausgelesen:```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>Datenbankeinstellungen</strong></summary>

Eingebettetes H2-Beispiel:```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;

Remote H2-Beispiel:```bash export DB_CONNECTION_URL=jdbc:h2:tcp://:/~/bastillion;CIPHER=AES;

</details>

<details>
<summary><strong>Externe Authentifizierung (LDAP / JAAS)</strong></summary>

Authentifizierung gegen einen bestehenden LDAP/Active-Directory-Server anstelle von (oder zusätzlich zu) lokalen
Passwörtern. Aktivieren Sie es:```bash
export JAAS_MODULE=ldap-ol

Konfiguriere 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; };

Um LDAP-Rollen Bastillion-Profilen zuzuordnen:```
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";
};

Administratoren werden beim ersten Login hinzugefügt und können Systemprofilen zugewiesen werden.

So funktioniert das Rollen-Mapping tatsächlich: Jede LDAP-Gruppe, zu der ein Benutzer gehört (gemäß roleBaseDn/ roleMemberAttribute oben), wird zu einem „Rollenname“ – dem Wert des roleNameAttribute dieser Gruppe (cn im obigen Beispiel). Bei jedem Login vergleicht Bastillion jeden dieser Rollennamen per exaktem Textabgleich mit den Namen der Profile, die Sie unter Verwalten → Profile erstellt haben. Ein Treffer weist den Benutzer diesem Profil zu; kein Treffer bedeutet keinen Zugriff auf dieses Profil. Wenn ein Benutzer also Mitglied der LDAP-Gruppe cn=admins,ou=groups,... ist, benötigen Sie ein Bastillion-Profil, das wörtlich admins heißt (abgesehen von der Groß-/Kleinschreibung – der Vergleich ist case-insensitiv, die Schreibweise jedoch nicht), damit diese Mitgliedschaft in Bastillion überhaupt etwas bedeutet. Es gibt keinen separaten Mapping-Schritt oder eine eigene Benutzeroberfläche dafür – die Namen müssen einfach übereinstimmen.

Ein Benutzer, dessen Rollen mit keinem Bastillion-Profil übereinstimmen, wird beim Login abgelehnt (Manager-Konten sind die eine Ausnahme; sie sind nicht profilgebunden). Setzen Sie defaultProfileForLdap auf einen Profilnamen, um jeden LDAP-Benutzer automatisch diesem zuzuweisen, sodass garantiert jeder sich anmelden kann, unabhängig vom Rollenabgleich – nützlich als Sicherheitsnetz, während Sie die Profilnamen noch mit den Gruppennamen Ihres Verzeichnisses in Einklang bringen:```bash export DEFAULT_PROFILE_FOR_LDAP=everyone

</details>

<details>
<summary><strong>Single Sign-On (SAML 2.0)</strong></summary>

Authentifizieren Sie sich gegen einen Unternehmens-Identitätsanbieter – Microsoft Entra ID, Okta, ADFS oder einen beliebigen
SAML-2.0-IdP – anstelle von (oder zusätzlich zu) lokalen Passwörtern oder LDAP. Sobald dies konfiguriert ist, erscheint auf der Anmeldeseite eine Schaltfläche **Mit SSO anmelden**. Aktivieren Sie sie:```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>

In Entra ID (oder Ihrem bevorzugten IdP) registrieren Sie Bastillion als Enterprise Application / Service Provider mit:

  • Identifier (Entity ID): https://bastillion.example.com (oder SAML_SP_ENTITY_ID, falls gesetzt – siehe unten)
  • Reply URL (Assertion Consumer Service URL): https://bastillion.example.com/saml/acs

Keine IdP-Metadaten-URL zur Hand? Konfigurieren Sie den IdP stattdessen manuell – in diesem Fall werden alle drei zusammen benötigt:```bash export SAML_IDP_ENTITY_ID=https://sts.windows.net// export SAML_IDP_SSO_URL=https://login.microsoftonline.com//saml2 export SAML_IDP_CERT=

Nur erforderlich, wenn die auf der IdP-Seite registrierte Entity-ID nicht exakt mit `SAML_BASE_URL` übereinstimmen kann:```bash
export SAML_SP_ENTITY_ID=https://bastillion.example.com

Um Entra-Gruppen-/Rollenansprüche auf Bastillion-Profile abzubilden (siehe „Wie Rollenzuordnung tatsächlich funktioniert“ unten, bevor Sie SAML_ROLE_ATTRIBUTE von seinem Standardwert ändern):```bash export SAML_ROLE_ATTRIBUTE=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups export DEFAULT_PROFILE_FOR_SAML=everyone

Admins werden beim ersten SSO-Login hinzugefügt und können Systemprofile zugewiesen bekommen.

**In Bastillion angezeigter Benutzername:** Die SAML-NameID wird zum Benutzernamen. Entra sendet
standardmäßig `user.userprincipalname`, was für reguläre Tenant-Mitglieder in Ordnung ist, aber für
B2B-Gäste (alle, die mit einer persönlichen oder externen E-Mail als Gast angemeldet sind) eine
hässliche Gast-UPN wie `alice_gmail.com#EXT#@yourtenant.onmicrosoft.com` erzeugt. Für einen
saubereren Benutzernamen gehen Sie zur *Single sign-on*-Konfiguration der Enterprise Application →
SAML → *Attributes & Claims*, bearbeiten Sie **Unique User Identifier (Name ID)** und ändern Sie
deren *Source attribute* von `user.userprincipalname` auf `user.mail`.

**So funktioniert das Rollen-Mapping tatsächlich – gleicher Mechanismus wie bei LDAP oben:** `SAML_ROLE_ATTRIBUTE`
benennt *welches* Assertion-Attribut die Gruppen/Rollen des Benutzers trägt; welche *Werte* dieses
Attribut bei einem bestimmten Login enthält, werden **per exaktem Textabgleich** mit den Namen der
Profile verglichen, die Sie unter **Manage → Profiles** erstellt haben. Ein Wert, der mit einem
Profilnamen übereinstimmt, weist den Benutzer diesem zu; nichts anderes an der Claim ist relevant.
Ein Bastillion-Profil muss also exakt genauso heißen wie die Zeichenfolge, die die Assertion sendet –
es gibt keinen separaten Mapping-Schritt oder eine UI, die Namen müssen nur übereinstimmen.

Das ist der Teil, der bei Entra ID am häufigsten für Verwirrung sorgt: Standardmäßig kann der
Gruppen-Claim von Entra jede Gruppe als **Object ID** (eine GUID) ausgeben statt als Anzeigenamen,
sofern die Token-Konfiguration der Enterprise Application nicht explizit auf die Ausgabe von
Gruppen-**namen** eingestellt ist. Wenn Ihre Bastillion-Profile Namen wie `admins`/`everyone` tragen,
Entra aber GUIDs sendet, wird nie etwas übereinstimmen. Prüfen Sie den tatsächlichen Claim-Wert in
einer echten Assertion (oder der Token-Konfiguration von Entra für die App), bevor Sie annehmen, das
Mapping sei defekt – meist liegt es daran und nicht an einem Bastillion-seitigen Problem. Drei Wege,
das zu beheben, in der Reihenfolge unserer Empfehlung:

1. **Entra-App-Rollen statt Gruppen-Claims verwenden (am saubersten).** Unter der App-Registrierung →
   App roles definieren Sie Rollen mit exakt den gewünschten Werten (`admins`, `everyone`, ...) und
   weisen dann Benutzer/Gruppen diesen Rollen unter *Users and groups* der Enterprise Application zu.
   Konfigurieren Sie das SAML-Token so, dass es den `roles`-Claim ausgibt, und richten Sie
   `SAML_ROLE_ATTRIBUTE` auf die URI dieses Claims statt auf den Gruppen-Claim. Sie wählen die exakte
   Zeichenfolge, die Entra sendet – kein GUID-Problem, und es ist ohnehin ein saubereres
   Autorisierungsmodell als die Zweckentfremdung von AD-Gruppen.
2. **Das Source-Attribut des Gruppen-Claims ändern.** Enterprise Application → Single sign-on →
   SAML → *Attributes & Claims* → Gruppen-Claim bearbeiten → dort gibt es ein *Source attribute*-
   Dropdown, normalerweise standardmäßig auf Group ID eingestellt. Je nach Tenant und ob die Gruppen
   Cloud-only sind oder aus lokalem AD synchronisiert werden, können Sie es möglicherweise auf
   `sAMAccountName` oder eine Anzeigenamen-Option umstellen – die genauen Optionen variieren je nach
   Tenant und Entra-Portalversion, prüfen Sie also, was tatsächlich angeboten wird, statt eine
   bestimmte Bezeichnung anzunehmen.
3. **Oder kämpfen Sie nicht dagegen – benennen Sie das Bastillion-Profil nach dem, was Entra
   tatsächlich sendet.** Wenn Entra darauf besteht, die GUID zu senden, erstellen Sie ein
   Bastillion-Profil, das wörtlich diese GUID als Namen trägt. Hässlicher, erfordert aber keinerlei
   Entra-seitige Neukonfiguration.

Ein Benutzer, dessen Claims zu keinem Bastillion-Profil passen, wird beim Login abgewiesen
(**Manager**-Konten sind die eine Ausnahme; sie sind nicht profilgebunden) – genau wie bei LDAP,
weshalb `DEFAULT_PROFILE_FOR_SAML` oben aus demselben Grund sinnvoll ist wie
`DEFAULT_PROFILE_FOR_LDAP`: als Sicherheitsnetz, während Sie Profilnamen noch mit den Claim-Werten
Ihres IdP abgleichen.

Bastillions eigene Einmalpasswort-Prüfung wird bei SSO-Logins übersprungen – der IdP soll seine
eigene MFA-/Conditional-Access-Richtlinie durchsetzen. Die erstmalige OTP-Registrierung wird
trotzdem angeboten, damit SAML-Benutzer eine lokale Fallback-Anmeldeinformation haben, falls SSO
jemals deaktiviert wird.

**Signierte Anfragen und verschlüsselte Assertions:** Bastillion generiert sein eigenes
SAML-Signaturzertifikat automatisch (selbstsigniert, auf dieselbe Weise wie sein TLS-Zertifikat),
sobald es zum ersten Mal benötigt wird, und signiert damit von da an jede ausgehende AuthnRequest –
keine Einrichtung erforderlich und harmlos, selbst wenn Ihr IdP es nicht prüft. Rufen Sie
`https://bastillion.example.com/saml/metadata` ab, um dieses Zertifikat in standardmäßiger
SP-Metadatenform zu erhalten, und geben Sie es Ihrem IdP-Administrator, falls dieser Bastillions
signierte Anfragen verifizieren oder Assertions für Bastillion verschlüsseln soll – die meisten IdPs
können eine SP-Metadaten-URL direkt importieren, statt ein rohes Zertifikat einzufügen. Wenn Sie
statt des automatisch generierten lieber ein echtes (z. B. CA-ausgestelltes) Schlüsselpaar verwenden
möchten, richten Sie `SAML_SP_KEYSTORE_PATH`/`SAML_SP_KEYSTORE_PASSWORD` auf einen PKCS12-Keystore,
der es enthält. Um verschlüsselte Assertions zu *erzwingen* (standardmäßig deaktiviert – aktivieren
Sie dies erst, wenn Ihr IdP tatsächlich so konfiguriert ist, dass er für Bastillions Zertifikat
verschlüsselt, sonst schlagen alle Logins fehl):```bash
export SAML_WANT_ENCRYPTED_ASSERTIONS=true

Nicht unterstützt: Single Logout (SLO) – die Abmeldung bleibt nur lokal und teilt dem IdP oder einer anderen Anwendung, bei der du über dieselbe SSO-Sitzung angemeldet warst, nichts mit. SAML SSO kann zusätzlich zu LDAP aktiviert werden; beide werden unabhängig voneinander ausgewertet und jede kann beim ersten Login neue Benutzer bereitstellen.

Auditing

Die Sitzungsprotokollierung ist standardmäßig aktiviert: Die Terminalausgabe wird in Bastillions Datenbank gespeichert und kann unter Audit Sessions eingesehen werden (nur Manager-Konten). Die Ausgabe wird an den Browser gestreamt, sodass auch Sitzungen mit sehr großen Mengen an Terminalausgabe wiedergegeben werden können. Der Audit-Verlauf wird für deleteAuditLogAfter Tage aufbewahrt (standardmäßig 90). Deaktiviere ihn mit:```bash export ENABLE_INTERNAL_AUDIT=false

Es gibt auch ein dateibasiertes Audit-Protokoll, das standardmäßig deaktiviert ist. Aktivieren Sie es in **log4j2.xml**, indem Sie
Folgendes auskommentieren:
- `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>Migration von v4</strong></summary>

Sie möchten von einer alten Bastillion-v4-Installation upgraden und Ihre Benutzer, Systeme, Profile,
Skripte und (am wichtigsten) das vorhandene SSH-Schlüsselpaar der Anwendung behalten, anstatt von
vorn zu beginnen? `tools/migrate/` enthält ein eigenständiges Migrationstool genau für diesen Zweck – es exportiert jede
Tabelle aus der alten H2-Datenbank (wobei die auf App-Ebene verschlüsselten Spalten mit dem Keystore der ALTEN
Instanz entschlüsselt werden) in eine JSON-Datei und importiert sie dann in eine frische v5-Instanz (wobei sie mit
dem Keystore der NEUEN Instanz erneut verschlüsselt werden). Vorhandene Benutzer können sich unmittelbar danach
mit ihren aktuellen Passwörtern anmelden – ohne erzwungene Zurücksetzungen.```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

Siehe tools/migrate/README.md für die vollständigen Details — zum Auffinden des Konfigurationsverzeichnisses Ihrer alten Installation, was genau migriert wird, sowie die Sicherheitshinweise zur Klartext-Exportdatei.


Weitere Screenshots

Der Kern-Workflow wird in So funktioniert es gezeigt. Klappen Sie unten eine Gruppe auf, um den Rest der Oberfläche zu erkunden.

Authentifizierung — Anmeldung und Zwei-Faktor-Registrierung

Anmeldung

Melden Sie sich mit Benutzername und Passwort sowie optional einem OTP-Zugangscode an.

Bastillion-Anmeldebildschirm

Zwei-Faktor-Einrichtung

Scannen Sie den QR-Code mit Authy, Google Authenticator oder einer anderen kompatiblen App.

Bastillion-Bildschirm zur Zwei-Faktor-Einrichtung

Zugriffsverwaltung — Navigation, Profile und Benutzer

Hauptmenü

Die verfügbaren Werkzeuge sind auf die Berechtigungen des angemeldeten Benutzers beschränkt.

Bastillion-Hauptmenü

Profile verwalten

Gruppieren Sie Systeme in benannte Profile, die den Zugriff steuern.

Bastillion-Bildschirm zur Profilverwaltung

Benutzer verwalten

Erstellen Sie Konten, wählen Sie Benutzerrollen und gewähren Sie Systemzugriff über Profile.

Bastillion-Bildschirm zur Benutzerverwaltung

Terminals & Automatisierung — Sitzungen starten und gespeicherte Skripte ausführen

Terminals

Wählen Sie ein oder mehrere Systeme aus, optional nach Profil gefiltert, und öffnen Sie sie gleichzeitig.

Bastillion-Bildschirm zur Terminalauswahl

Zusammengesetzte Skripte

Speichern Sie ein Skript einmal und führen Sie es auf jedem ausgewählten Terminal aus.

Bastillion-Bildschirm zur Verwaltung zusammengesetzter Skripte

Einstellungen — Konto-Erscheinungsbild und Anwendungs-Authentifizierung

Benutzereinstellungen

Ändern Sie Ihr Passwort, wählen Sie die Oberflächen- und Terminaldarstellung und verwalten Sie den öffentlichen Schlüssel, den Bastillion zur Authentifizierung bei registrierten Systemen verwendet.

Bastillion-Bildschirm zu Benutzereinstellungen


Lizenz

Bastillion ist unter der Prosperity Public License verfügbar.

Vollständige Liste der Drittanbieter-Abhängigkeiten und ihrer Lizenzen in 3rdPartyLicenses.md.

Loophole, LLC — Sean Kavanagh

[email protected]

Kategorien