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

Три реальные независимые SSH-сессии — одна команда, введённая один раз, выполняется везде.
Содержание
- Как это работает
- Что нового
- Лицензирование
- Варианты установки
- Предварительные требования
- Загрузка и запуск
- Сборка из исходного кода
- TLS / HTTPS
- Конфигурация
- Дополнительные скриншоты
- Лицензия
Как это работает
Bastillion располагается между вашими пользователями и системами, к которым им нужен доступ, выступая в роли доверенной третьей стороны, а не простого хранилища паролей. Вот весь жизненный цикл от начала до конца.
1. Bastillion генерирует собственную пару SSH-ключей
При первом запуске, прежде чем что-либо делать, Bastillion генерирует для себя пару ключей Ed25519 — это единственный ключ, который когда-либо отправляется на ваши хосты. Он отображается в выводе консоли и всегда виден в разделе Настройки.
2. Регистрация системы
Администратор добавляет хост в разделе Управление → Системы (пользователь, хост, порт и путь к файлу
authorized_keys этого хоста). Bastillion аутентифицируется один раз с помощью предоставленного вами пароля или
парольной фразы, затем отправляет свой собственный открытый ключ в authorized_keys этого хоста.
С этого момента он подключается с использованием этого ключа — никаких сохранённых паролей, никогда. Статус меняется на
Успешно в тот момент, когда ключ установлен на место.

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

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

5. Централизованная ротация или отзыв ключей
Поскольку каждый хост доверяет одному и тому же ключу приложения (а не отдельному ключу на пользователя), его однократное отключение в разделе Управление 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 зарегистрированных системах — этого достаточно, чтобы по-настоящему попробовать его перед покупкой. Лицензия повышает этот предел.
- Купите лицензию на loophole.company/pricing.html
(Starter/Team/Business — цена зависит от количества систем). Оплата перенаправляет обратно и автоматически
загружает файл
.lic. - Откройте файл
.licи скопируйте его содержимое (одна строка). - Задайте его через переменную окружения
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:
- Выпустите сертификат с помощью certbot (требуется реальное DNS-имя,
указывающее на этот хост, и доступный порт 80 для проверки HTTP-01): ```bash
sudo certbot certonly --standalone -d bastillion.example.com
Это записывает fullchain.pem и privkey.pem в
/etc/letsencrypt/live/bastillion.example.com/.
- Преобразуйте пару сертификат/ключ в формат 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 - Укажите 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=falseauthorized_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).

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

Управление доступом — навигация, профили и пользователи
Главное меню
Доступные инструменты ограничены правами вошедшего в систему пользователя.

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

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

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

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

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

Лицензия
Bastillion распространяется под лицензией Prosperity Public License.
Полный список сторонних зависимостей и их лицензий приведён в 3rdPartyLicenses.md.
Loophole, LLC — Шон Кавана