Назад к обновлениям
New releaseAug 20, 2026

Bastillion v5.2.0

Bastillion предоставляет вам чистый, основанный на браузере способ управления SSH-доступом ко всем вашим системам — как бастион-хост с удобной панелью управления.

Поделиться

Build CodeQL License Java Built with Claude Code Website

Bastillion

Bastillion

Современный веб-инструмент для SSH-консолей и управления SSH-ключами.

Bastillion предоставляет чистый браузерный способ управления SSH-доступом ко всем вашим системам — как bastion-хост с удобной панелью управления. Он выполняет две задачи:

  1. Веб-терминал SSH — после регистрации хоста авторизованные пользователи могут открывать одну или несколько живых терминальных сессий к нему прямо из браузера, с возможностью трансляции команд одновременно во все открытые сессии (представьте синхронизированные панели tmux, но для парка удалённых хостов вместо локальных панелей).

  2. Управление SSH-ключами — Bastillion хранит собственную пару SSH-ключей и отправляет/ротирует открытые ключи на зарегистрированные хосты, поэтому отдельным пользователям никогда не нужно хранить или управлять долгоживущими ключами к этим системам самостоятельно.

  • Вход с двухфакторной аутентификацией (Authy или Google Authenticator)
  • Управление и распространение открытых SSH-ключей, а также их централизованное отключение/ротация
  • Запуск защищённых многосессионных веб-оболочек и обмен командами между сессиями
  • Запись каждой сессии и её воспроизведение по требованию — готовые к аудиту доказательства для любой системы соответствия
  • Группировка систем в Профили и точный контроль того, кто и к чему имеет доступ
  • Сохранение и повторный запуск составных скриптов сразу на всём парке систем
  • Наложение TLS/SSL поверх SSH для дополнительной защиты

Несколько терминалов транслируют одну команду на три хоста одновременно

Три реальные независимые SSH-сессии — одна команда, введённая один раз, выполняется везде.


Содержание


Как это работает

Bastillion располагается между вашими пользователями и системами, к которым им нужен доступ, выступая в роли доверенной третьей стороны, а не простого хранилища паролей. Вот весь жизненный цикл от начала до конца.

1. Bastillion генерирует собственную пару SSH-ключей

При первом запуске, прежде чем что-либо делать, Bastillion генерирует для себя пару ключей Ed25519 — это единственный ключ, который когда-либо отправляется на ваши хосты. Он отображается в выводе консоли и всегда виден в разделе Настройки.

2. Регистрация системы

Администратор добавляет хост в разделе Управление → Системы (пользователь, хост, порт и путь к файлу authorized_keys этого хоста). Bastillion аутентифицируется один раз с помощью предоставленного вами пароля или парольной фразы, затем отправляет свой собственный открытый ключ в authorized_keys этого хоста. С этого момента он подключается с использованием этого ключа — никаких сохранённых паролей, никогда. Статус меняется на Успешно в тот момент, когда ключ установлен на место.

Управление системами — три зарегистрированных хоста, все со статусом Успешно

3. Группировка систем в Профили, назначение Пользователей

Системы группируются в именованные Профили — например, «Продакшн», «Стейджинг», «База данных». Затем пользователи привязываются к профилям в разделе Управление → Пользователи, что является единственным механизмом, контролирующим, кто и к чему имеет доступ. Отзовите назначение профиля — и доступ немедленно исчезнет, без необходимости ротации ключей.

Назначение трёх систем профилю Продакшн

4. Открытие терминалов — и трансляция во все одновременно

Назначенные пользователи открывают Безопасная оболочка → Терминалы, выбирают одну или несколько систем и получают живые, изменяемые по размеру терминалы на основе xterm в браузере, бок о бок. Введите один раз — и команда уйдёт во все терминалы, отмеченные как активные — те же нажатия клавиш, та же команда, та же форма вывода — на столько хостов, сколько вы выбрали.

Команда проверки работоспособности транслируется на три терминала одновременно, одинаковая форма вывода на всех трёх

5. Централизованная ротация или отзыв ключей

Поскольку каждый хост доверяет одному и тому же ключу приложения (а не отдельному ключу на пользователя), его однократное отключение в разделе Управление SSH-ключами немедленно отзывает доступ везде — без необходимости вручную трогать целевые системы и без поиска того, на каком сервере какой устаревший ключ остался.

Управление SSH-ключами с профилем, отпечатком, датой создания и действиями удаления

6. Каждая сессия записывается — аудит и воспроизведение

Всё, что вводится, и каждый байт, возвращаемый в этих терминалах, записывается автоматически. Менеджеры открывают Аудит сессий, фильтруют по пользователю или системе и воспроизводят любую сессию — бок о бок для сессий, охватывающих несколько хостов, с текстовым фильтром для перехода прямо к нужным строкам. Вывод потоково загружается на страницу по мере чтения, поэтому даже сессия, выгрузившая сотни мегабайт логов, воспроизводится без каких-либо усилий.

Если вам нужно показать аудитору, кто что запускал, где и когда — вот эти доказательства, собранные из коробки. Практически каждая система соответствия содержит требование об аудиторском следе привилегированного доступа (PCI DSS, HIPAA, SOC 2, ISO 27001 — выбирайте свою), и это закрывает данное требование без коммерческого PAM-продукта. Сессии хранятся 90 дней по умолчанию (deleteAuditLogAfter), а запись можно отключить с помощью ENABLE_INTERNAL_AUDIT=false — см. Аудит.

Список аудита сессий с фильтрами по пользователю и системе


🚀 Что нового

  • SAML 2.0 SSO — вход через корпоративный IdP (Entra ID, Okta, ADFS и другие) — см. Конфигурация
  • Лицензирование — бесплатно до 8 систем, платные тарифы доступны на loophole.company/pricing.html (см. Лицензирование ниже)
  • Аудит и воспроизведение сессий, включено по умолчанию — каждая терминальная сессия записывается и может быть воспроизведена в разделе Аудит сессий, с потоковой загрузкой в браузер, поэтому даже огромные сессии загружаются мгновенно
  • Работает как автономный jar-файл (java -jar) с HTTPS из коробки — см. Загрузка и запуск
  • Обновлено до Java 21, Jetty 12 и Jakarta EE 10
  • Полная поддержка ключей SSH Ed25519 (по умолчанию) и Ed448
  • Инструмент миграции v4 → v5 для переноса пользователей, систем, ключей и журналов аудита из существующего экземпляра — см. tools/migrate
  • Усилено с помощью CSRF-фильтра и общеприкладных заголовков безопасности

Лицензирование

Bastillion работает без лицензии на 8 зарегистрированных системах — этого достаточно, чтобы по-настоящему попробовать его перед покупкой. Лицензия повышает этот предел.

  1. Купите лицензию на loophole.company/pricing.html (Starter/Team/Business — цена зависит от количества систем). Оплата перенаправляет обратно и автоматически загружает файл .lic.
  2. Откройте файл .lic и скопируйте его содержимое (одна строка).
  3. Задайте его через переменную окружения LICENSE_KEY: ```bash export LICENSE_KEY=

или вставьте его в licenseKey в BastillionConfig.properties — переменная окружения имеет приоритет, если заданы оба значения. 4. Перезапустите Bastillion. В Settings отображаются лицензиат, лимит системы и срок действия, с предупреждением за 90 дней до истечения срока.

Лицензии годовые и не продлеваются автоматически — карта не сохраняется. Приобретите новую лицензию на той же странице с ценами, когда получите предупреждение об истечении срока.


Варианты установки

Бесплатно: https://github.com/bastillion-io/Bastillion/releases


Предварительные требования

Java 21 (OpenJDK)```bash

apt-get install openjdk-21-jdk

### Аутентификатор (для 2FA)

| Приложение | 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) |

---

## Загрузка и запуск

Загрузите последний jar-файл из [Releases](https://github.com/bastillion-io/Bastillion/releases):```bash
java -jar bastillion-<version>.jar

Доступ в браузере: https://<server-ip>:8443 — см. раздел TLS / HTTPS ниже о самоподписанном сертификате, который Bastillion генерирует при первом запуске.

Учётные данные по умолчанию:``` username: admin password: changeme

Работает в фоновом режиме; остановка — Ctrl+C. Для фоновой/демонной работы используйте то, что
обычно применяется на вашей платформе для длительных Java-процессов — `nohup java -jar ... &`, systemd-юнит,
контейнер и т. д.

---

## Сборка из исходного кода

Установите Maven 3+:```bash
apt-get install maven

Сборка и запуск (упаковывает автономный jar-файл со встроенным сервером Jetty — см. io.bastillion.Main — и запускает его):```bash mvn package java -jar target/bastillion-5.0.0-SNAPSHOT.jar

Или для локальной разработки без пересборки при каждом изменении:```bash
mvn compile exec:java

Слушает https://localhost:8443 по умолчанию, так же, как и загруженный выше релиз — см. TLS / HTTPS ниже о том, как настраивается этот сертификат и как использовать свой собственный вместо него.


TLS / HTTPS

Bastillion генерирует собственный самоподписанный сертификат при первом запуске и обслуживает HTTPS — настраивать ничего не нужно. Браузеры покажут предупреждение один раз (он самоподписанный, не выпущен CA); просто кликните по нему, как и для любого другого самохостингового устройства. Сертификат и его пароль сохраняются между перезапусками (keystore/bastillion.p12 в CONFIG_DIR, пароль хранится тем же зашифрованным способом, что и пароль базы данных).

Используйте собственный сертификат, подписанный CA, вместо самоподписанного по умолчанию — например, бесплатный от Let's Encrypt:

  1. Выпустите сертификат с помощью certbot (требуется реальное DNS-имя, указывающее на этот хост, и доступный порт 80 для проверки HTTP-01): ```bash sudo certbot certonly --standalone -d bastillion.example.com

Это записывает fullchain.pem и privkey.pem в /etc/letsencrypt/live/bastillion.example.com/.

  1. Преобразуйте пару сертификат/ключ в формат PKCS12 — формат хранилища ключей, который ожидает Bastillion: ```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. Укажите Bastillion на него и перезапустите: ```bash export KEYSTORE_PATH=/path/to/bastillion.p12 export KEYSTORE_PASSWORD=changeit

Браузеры теперь будут доверять соединению без предупреждений. Сертификаты Let's Encrypt истекают каждые 90 дней — certbot renew с последующим повторным выполнением шагов 2–3 (и перезапуском) поддерживает его актуальным; certbot renew --deploy-hook может автоматизировать этот процесс.

За обратным прокси или балансировщиком нагрузки, который уже завершает TLS (nginx, Cloud Run и т. д.) — отключите собственный HTTPS Bastillion и позвольте ему обслуживать обычный HTTP:```bash export TLS_ENABLED=false

По умолчанию в этом режиме используется порт 8080; задайте `PORT`, чтобы изменить его.

---

## Конфигурация

Каждый параметр ниже можно задать как **переменную окружения** — возьмите имя свойства,
вставьте подчёркивание перед каждой заглавной буквой, затем приведите его к верхнему регистру: `licenseKey` →
`LICENSE_KEY`, `dbUser` → `DB_USER`, `sshKeyType` → `SSH_KEY_TYPE`. Это рекомендуемый
способ настройки Bastillion, особенно в контейнерах — не нужно монтировать или встраивать файлы.

`BastillionConfig.properties` по-прежнему работает как запасной вариант (переменные окружения всегда имеют приоритет, если заданы оба),
и именно туда сохраняются любые значения, которые Bastillion генерирует при первом запуске — например, случайный
пароль БД. Полный список настроек и их значений по умолчанию см. в `src/main/resources/BastillionConfig.properties`.

**Объединение всего в одном каталоге** (например, при монтировании одного Docker-тома):
`CONFIG_DIR` — это тот параметр, к которому стоит обратиться. Всё, что сохраняет Bastillion —
`BastillionConfig.properties`, хранилище ключей самоподписанного TLS (`keystore/bastillion.p12`),
база данных H2 и пара ключей SSH-хоста (оба в `keydb/`), а также `bastillion.jceks` — по умолчанию
находится в нём, поэтому указание `CONFIG_DIR` на одно место перемещает всё это:```bash
export CONFIG_DIR=/data/bastillion/

KEYSTORE_PATH и DB_CONNECTION_URL по-прежнему существуют для того, чтобы указать только на один из них в отдельном месте (настоящий сертификат, удалённая БД) — см. TLS / HTTPS и раздел «Database Settings» ниже — но ни один из них не нужен просто для того, чтобы объединить всё в CONFIG_DIR.

Сам CONFIG_DIR по умолчанию равен ./config относительно рабочего каталога. Обновляете существующий экземпляр, который никогда его не задавал? В более старых версиях состояние хранилось непосредственно в рабочем каталоге, а не в ./config — Bastillion обнаруживает это при первом запуске с этой версией и автоматически переносит его в ./config (или в CONFIG_DIR, если вы его теперь задали).

Управление 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>Пользовательская пара SSH-ключей</strong></summary>

По умолчанию Bastillion генерирует собственную пару ключей Ed25519 при первом запуске. Чтобы использовать свою собственную,
проще всего сделать это через интерфейс: **Настройки → Заменить SSH-ключ приложения**
(только для учётных записей администратора) — вставьте закрытый ключ, открытый ключ и парольную фразу, если она есть,
и изменения вступят в силу немедленно, без перезапуска.

⚠️ Это заменяет *единственный* ключ, которому доверяет каждая зарегистрированная система. Это предназначено как одноразовый шаг
при первоначальной настройке Bastillion, **до** регистрации каких-либо систем — если у вас
уже зарегистрированы системы, Bastillion потеряет SSH-доступ ко всем ним в тот момент, когда вы замените
ключ, если только этот точный ключ уже не находится в `authorized_keys` на каждой из них
заранее. Страница настроек требует дополнительный флажок подтверждения, как только у вас есть
зарегистрированные системы, именно из-за этого.

**Уже есть зарегистрированные системы, и всё равно нужно ротировать ключ?** Предварительно разместите новый ключ
через сам Bastillion, а не редактируйте `authorized_keys` вручную повсюду:

1. Установите `FORCE_USER_KEY_GENERATION=false`, чтобы **Управление SSH-ключами → Добавить SSH-ключ** позволяло вставить
   существующий открытый ключ вместо только генерации нового.
2. Добавьте там новый ключ для профиля, охватывающего все ваши системы, и подтвердите (в разделе
   «Управление SSH-ключами» или в статусе каждой системы), что он действительно размещён везде — учитывайте
   `AUTH_KEYS_REFRESH_INTERVAL`, поскольку именно он отвечает за распространение.
3. Только когда вы уверены, что ключ есть на каждой системе, замените ключ приложения в настройках.
4. Верните `FORCE_USER_KEY_GENERATION` к предыдущему значению, затем, после подтверждения,
   что новый ключ приложения распространился на все системы (снова учитывайте
   `AUTH_KEYS_REFRESH_INTERVAL`), удалите ключ, добавленный на шаге 2, из раздела «Управление SSH-ключами» —
   он был размещён там только для предварительного заполнения `authorized_keys` и в дальнейшем не нужен.

Для сценарных/безголовых установок то же самое можно сделать через переменные окружения и
перезапуск вместо этого:```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

После регистрации их можно удалить — пара ключей уже сохранена в базе данных.

SSH_KEY_TYPE (rsa, ecdsa, ed25519 или ed448) имеет значение только тогда, когда Bastillion генерирует новый ключ, а не при импорте — тип импортированного ключа считывается из самого ключа:```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>Настройки базы данных</strong></summary>

Пример встроенной H2:```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 example:```bash export DB_CONNECTION_URL=jdbc:h2:tcp://:/~/bastillion;CIPHER=AES;

</details>

<details>
<summary><strong>Внешняя аутентификация (LDAP / JAAS)</strong></summary>

Аутентификация через существующий сервер LDAP/Active Directory вместо локальных
паролей (или наряду с ними). Включите её:```bash
export JAAS_MODULE=ldap-ol

Настройте 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; };

Чтобы сопоставить роли LDAP с профилями 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";
};

Администраторы добавляются при первом входе в систему, и им могут быть назначены системные профили.

Как на самом деле работает сопоставление ролей: каждая группа LDAP, в которую входит пользователь (согласно roleBaseDn/ roleMemberAttribute выше), становится «именем роли» — значением атрибута roleNameAttribute этой группы (cn в примере выше). При каждом входе в систему Bastillion сравнивает каждое из этих имён ролей по точному текстовому совпадению с именами профилей, которые вы создали в разделе Управление → Профили. Совпадение назначает пользователю этот профиль; нет совпадения — нет доступа к этому профилю. Так что если пользователь является членом группы LDAP cn=admins,ou=groups,..., вам нужен профиль Bastillion, буквально названный admins (регистр не важен — сравнение нечувствительно к регистру, а вот написание — да), чтобы это членство имело какое-либо значение в Bastillion. Никакого отдельного шага сопоставления или интерфейса для этого нет — имена просто должны совпадать.

Пользователь, чьи роли не соответствуют ни одному профилю Bastillion, отклоняется при входе в систему (учётные записи Manager — единственное исключение; они не привязаны к профилям). Установите defaultProfileForLdap на имя профиля, чтобы автоматически назначать его каждому пользователю LDAP, гарантируя, что все смогут войти независимо от совпадения ролей — это полезно как страховка, пока вы ещё приводите имена профилей в соответствие с именами групп вашего каталога:```bash export DEFAULT_PROFILE_FOR_LDAP=everyone

</details>

<details>
<summary><strong>Единый вход (SAML 2.0)</strong></summary>

Аутентификация через корпоративный поставщик удостоверений — Microsoft Entra ID, Okta, ADFS или любой
SAML 2.0 IdP — вместо локальных паролей или LDAP (или наряду с ними). После настройки на странице входа появляется кнопка **Войти через SSO**. Включите её:```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>

В Entra ID (или в вашем IdP по выбору) зарегистрируйте Bastillion как корпоративное приложение / поставщика услуг со следующими параметрами:

  • Идентификатор (Entity ID): https://bastillion.example.com (или SAML_SP_ENTITY_ID, если задан — см. ниже)
  • URL ответа (Assertion Consumer Service URL): https://bastillion.example.com/saml/acs

Нет под рукой URL метаданных IdP? В этом случае настройте IdP вручную — все три параметра обязательны вместе в таком случае:```bash export SAML_IDP_ENTITY_ID=https://sts.windows.net// export SAML_IDP_SSO_URL=https://login.microsoftonline.com//saml2 export SAML_IDP_CERT=

Только если Entity ID, зарегистрированный на стороне IdP, не может точно совпадать с `SAML_BASE_URL`:```bash
export SAML_SP_ENTITY_ID=https://bastillion.example.com

Чтобы сопоставить утверждения групп/ролей Entra с профилями Bastillion (см. раздел «Как на самом деле работает сопоставление ролей» ниже, прежде чем изменять SAML_ROLE_ATTRIBUTE со значения по умолчанию):```bash export SAML_ROLE_ATTRIBUTE=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups export DEFAULT_PROFILE_FOR_SAML=everyone

Администраторы добавляются при первом входе через SSO и могут получать системные профили.

**Имя пользователя, отображаемое в Bastillion:** SAML NameID становится именем пользователя. Entra по умолчанию отправляет
`user.userprincipalname`, что подходит для обычных участников тенанта, но создаёт
некрасивый гостевой UPN вида `alice_gmail.com#EXT#@yourtenant.onmicrosoft.com` для B2B-гостей (любых,
вошедших с личной или внешней почтой, добавленных как гости). Чтобы получить более чистое имя пользователя, перейдите в
*Single sign-on* корпоративного приложения → SAML → *Attributes & Claims*, отредактируйте **Unique
User Identifier (Name ID)** и измените его *Source attribute* с `user.userprincipalname`
на `user.mail`.

**Как на самом деле работает сопоставление ролей — тот же механизм, что и для LDAP выше:** `SAML_ROLE_ATTRIBUTE`
указывает, *какой* атрибут утверждения содержит группы/роли пользователя; *значения*, которые
этот атрибут содержит при конкретном входе, сравниваются **по точному текстовому совпадению** с именами
профилей, созданных вами в разделе **Manage → Profiles**. Значение, совпадающее с именем профиля,
назначает пользователя этому профилю; больше ничего в утверждении не имеет значения. Таким образом, профиль Bastillion должен называться
точно так же, как строка, которую отправляет утверждение — отдельного шага сопоставления
или интерфейса нет, имена просто должны совпадать.

Именно эта часть чаще всего вызывает проблемы у людей именно с Entra ID: по умолчанию
утверждение групп Entra может отправлять каждую группу как её **Object ID** (GUID), а не как отображаемое
имя, если конфигурация токена корпоративного приложения явно не настроена на отправку **имён** групп.
Если ваши профили Bastillion названы, например, `admins`/`everyone`, но Entra
отправляет GUID, ничего никогда не совпадёт. Проверьте фактическое значение утверждения в реальном запросе (или
конфигурацию токена Entra для приложения), прежде чем предполагать, что сопоставление сломано — обычно проблема
именно в этом, а не на стороне Bastillion. Три способа исправить это, в порядке наших рекомендаций:

1. **Используйте App Roles Entra вместо утверждений групп (самый чистый способ).** В регистрации приложения →
   App roles определите роли с точно теми значениями, которые вам нужны (`admins`, `everyone`, ...), затем
   назначьте пользователей/группы на эти роли в разделе *Users and groups* корпоративного приложения.
   Настройте SAML-токен на отправку утверждения `roles` и укажите `SAML_ROLE_ATTRIBUTE` на
   URI этого утверждения вместо утверждения групп. Вы выбираете точную строку, которую отправляет Entra — никакой проблемы
   с GUID вообще, и это более чистая модель авторизации, чем повторное использование AD-групп.
2. **Измените исходный атрибут утверждения групп.** Enterprise Application → Single sign-on →
   SAML → *Attributes & Claims* → отредактируйте утверждение Groups → там есть раскрывающийся список
   *Source attribute*, обычно по умолчанию установлен Group ID. В зависимости от вашего тенанта и того, являются ли группы
   облачными или синхронизированными из локального AD, вы можете переключить его на `sAMAccountName`
   или вариант отображаемого имени — точные варианты зависят от тенанта и версии портала Entra, поэтому проверяйте,
   что реально предлагается, а не предполагайте конкретную метку.
3. **Или не боритесь с этим — назовите профиль Bastillion в соответствии с тем, что Entra реально отправляет.** Если
   Entra настаивает на отправке GUID, создайте профиль Bastillion, буквально названный этим GUID.
   Менее красиво, но не требует перенастройки на стороне Entra.

Пользователь, чьи утверждения не совпадают ни с одним профилем Bastillion, отклоняется при входе (аккаунты **Manager** —
единственное исключение; они не привязаны к профилям) — точно так же, как с LDAP, поэтому
`DEFAULT_PROFILE_FOR_SAML` выше стоит задать по той же причине, по которой задаётся
`DEFAULT_PROFILE_FOR_LDAP`: как страховочная сетка, пока вы ещё выравниваете имена профилей с
значениями утверждений вашего IdP.

Собственная проверка одноразового пароля Bastillion пропускается для SSO-входов — ожидается, что IdP
обеспечивает собственную политику MFA/Conditional Access. Первичная регистрация OTP по-прежнему
предлагается, чтобы у SAML-пользователей был локальный резервный идентификатор на случай отключения SSO.

**Подписанные запросы и зашифрованные утверждения:** Bastillion автоматически генерирует собственный сертификат подписи SAML
(самоподписанный, так же, как генерирует свой TLS-сертификат) при
первой необходимости и с тех пор подписывает им каждый исходящий AuthnRequest — никакой
настройки не требуется, и это безвредно, даже если ваш IdP его не проверяет. Получите
`https://bastillion.example.com/saml/metadata`, чтобы получить этот сертификат в стандартной форме
SP-метаданных, и передайте его администратору IdP, если они должны проверять подписанные
запросы Bastillion или шифровать утверждения для Bastillion — большинство IdP могут импортировать URL
SP-метаданных напрямую вместо вставки сырого сертификата. Если вы предпочитаете использовать настоящую (например,
выпущенную CA) пару ключей вместо автоматически сгенерированной, укажите `SAML_SP_KEYSTORE_PATH`/
`SAML_SP_KEYSTORE_PASSWORD` на хранилище ключей PKCS12, содержащее её. Чтобы *требовать* зашифрованные
утверждения (по умолчанию выключено — включайте это только после того, как ваш IdP действительно настроен
шифровать для сертификата Bastillion, иначе каждый вход начнёт завершаться ошибкой):```bash
export SAML_WANT_ENCRYPTED_ASSERTIONS=true

Не поддерживается в настоящее время: единый выход (SLO) — выход остаётся только локальным и не уведомляет IdP или любое другое приложение, в которое вы вошли через ту же SSO-сессию. SAML SSO можно включить вместе с LDAP; оба механизма оцениваются независимо, и любой из них может создавать новых пользователей при первом входе.

Аудит

Аудит сессий включён по умолчанию: вывод терминала сохраняется в базе данных Bastillion и может быть просмотрен в разделе Audit Sessions (только для учётных записей менеджеров). Вывод передаётся в браузер, поэтому даже сессии с очень большим объёмом терминального вывода можно воспроизвести. История аудита хранится в течение deleteAuditLogAfter дней (по умолчанию 90). Отключите её с помощью:```bash export ENABLE_INTERNAL_AUDIT=false

Также существует файловый журнал аудита, отключённый по умолчанию. Включите его в **log4j2.xml**, раскомментировав:
- `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>Миграция с v4</strong></summary>

Обновляетесь со старой установки Bastillion v4 и хотите сохранить своих пользователей, системы, профили,
скрипты и (что самое важное) существующую SSH-ключевую пару приложения, вместо того чтобы начинать
заново? `tools/migrate/` содержит автономный инструмент миграции именно для этого — он экспортирует каждую
таблицу из старой базы данных H2 (расшифровывая столбцы, зашифрованные на уровне приложения, с помощью
хранилища ключей СТАРОГО экземпляра) в JSON-файл, а затем импортирует его в новый экземпляр v5 (повторно
шифруя с помощью хранилища ключей НОВОГО экземпляра). Существующие пользователи могут войти в систему со своими текущими паролями
сразу после этого — без принудительного сброса.```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

См. tools/migrate/README.md для получения полных сведений — о том, как найти каталог конфигурации старой установки, что именно переносится, а также о замечаниях по безопасности относительно файла экспорта в открытом виде.


Дополнительные скриншоты

Основной рабочий процесс показан в разделе Как это работает. Раскройте группу ниже, чтобы изучить остальную часть интерфейса.

Аутентификация — вход и настройка двухфакторной аутентификации

Вход

Войдите, используя имя пользователя и пароль, а также при необходимости одноразовый код доступа (OTP).

Экран входа в Bastillion

Настройка двухфакторной аутентификации

Отсканируйте QR-код с помощью Authy, Google Authenticator или другого совместимого приложения.

Экран настройки двухфакторной аутентификации в Bastillion

Управление доступом — навигация, профили и пользователи

Главное меню

Доступные инструменты ограничены правами вошедшего в систему пользователя.

Главное меню Bastillion

Управление профилями

Группируйте системы в именованные профили, которые управляют доступом.

Экран управления профилями в Bastillion

Управление пользователями

Создавайте учётные записи, выбирайте роли пользователей и предоставляйте доступ к системам через профили.

Экран управления пользователями в Bastillion

Терминалы и автоматизация — запуск сеансов и выполнение сохранённых скриптов

Терминалы

Выберите одну или несколько систем, при необходимости отфильтрованных по профилю, и откройте их одновременно.

Экран выбора терминалов в Bastillion

Составные скрипты

Сохраните скрипт один раз и выполняйте его на каждом выбранном терминале.

Экран управления составными скриптами в Bastillion

Настройки — внешний вид учётной записи и аутентификация приложения

Параметры пользователя

Измените свой пароль, выберите внешний вид интерфейса и терминала, а также управляйте открытым ключом, который Bastillion использует для аутентификации на зарегистрированных системах.

Экран параметров пользователя в Bastillion


Лицензия

Bastillion распространяется под лицензией Prosperity Public License.

Полный список сторонних зависимостей и их лицензий приведён в 3rdPartyLicenses.md.

Loophole, LLC — Шон Кавана

[email protected]

Категории