返回更新列表
新发布Aug 20, 2026

Bastillion v5.2.0

Bastillion 为您提供一种简洁的、基于浏览器的管理方式,用于跨所有系统管理 SSH 访问——就像一个带有友好仪表盘的堡垒主机。

分享

Build CodeQL License Java Built with Claude Code Website

Bastillion

Bastillion

一款现代、基于 Web 的 SSH 控制台与 SSH 密钥管理工具。

Bastillion 为您提供一种简洁、基于浏览器的 SSH 访问管理方式,覆盖您所有的系统——如同一个带有友好仪表盘的堡垒主机。它主要做两件事:

  1. 基于 Web 的 SSH 终端 — 主机注册后,授权用户可直接从浏览器打开一个或多个实时终端会话,并可选择将命令同时广播到所有已打开的会话(可以想象成 tmux 的同步窗格,但针对的是远程主机群,而非本地窗格)。

  2. SSH 密钥管理 — Bastillion 持有自己的 SSH 密钥对,并将公钥推送/轮换到您注册的主机上,因此单个用户无需自行持有或管理访问这些系统的长期密钥。

  • 使用双因素认证登录(Authy 或 Google Authenticator)
  • 集中管理并分发 SSH 公钥,并可集中禁用/轮换
  • 启动安全的多会话 Web Shell,并在会话间共享命令
  • 记录每个会话并按需回放——为任何合规框架提供可审计的证据
  • 将系统分组到配置文件中,并精确控制谁能访问什么
  • 一次性保存并跨整个主机群重新运行复合脚本
  • 在 SSH 之上叠加 TLS/SSL 以提供额外保护

多个终端同时向三台主机广播同一命令

三个真实、独立的 SSH 会话——一条命令,输入一次,处处执行。


目录


工作原理

Bastillion 位于您的用户与其需要访问的系统之间,充当可信的第三方,而非简单的密码保险库。以下是完整的端到端生命周期。

1. Bastillion 生成自己的 SSH 密钥对

首次启动时,Bastillion 会先生成自己的 Ed25519 密钥对——这是唯一会被推送到您主机上的密钥。它显示在控制台输出中,并始终可在设置下查看。

2. 注册系统

管理员在管理 → 系统下添加主机(用户、主机、端口以及该主机 authorized_keys 文件的路径)。Bastillion 使用您提供的密码或口令进行一次身份验证,然后将其自己的公钥推送到该主机的 authorized_keys 中。此后,它使用该密钥进行连接——绝不存储密码。密钥就位后,状态立即变为成功

管理系统——三台已注册主机,均显示成功状态

3. 将系统分组到配置文件,并分配用户

系统被分组到命名的配置文件中——例如“生产”、“预发布”、“数据库层”。随后,用户在管理 → 用户下与配置文件关联,这是控制谁能访问什么的唯一途径。撤销配置文件分配后,访问权限会立即消失,无需轮换密钥。

将三个系统分配到生产配置文件

4. 打开终端——并同时向所有终端广播

被分配的用户打开安全 Shell → 终端,选择一个或多个系统,即可在浏览器中获得并排的、可调整大小的、基于 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 获取(参见下文许可
  • 会话审计与回放,默认开启 — 每个终端会话都会被记录,并可在审计会话下回放,流式传输到浏览器,因此即使是大型会话也能即时加载
  • 自包含 jarjava -jar)形式运行,开箱即支持 HTTPS——参见下载并运行
  • 升级至 Java 21Jetty 12Jakarta EE 10
  • 全面支持 Ed25519(默认)和 Ed448 SSH 密钥
  • 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=

或将其粘贴到 BastillionConfig.properties 中的 licenseKey 中——如果两者都设置了,环境变量优先。 4. 重新启动 Bastillion。设置 会显示被许可人、系统上限和到期时间,并在到期前 90 天开始显示警告。

许可证按年计费,不会自动续订——不会保留任何银行卡信息。当收到到期警告时,可从同一定价页面再次购买。


安装选项

免费版: https://github.com/bastillion-io/Bastillion/releases


前提条件

Java 21 (OpenJDK)```bash

apt-get install openjdk-21-jdk

### 认证器(用于双因素认证)

| 应用程序 | 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) |

---

## 下载并运行

从 [Releases](https://github.com/bastillion-io/Bastillion/releases) 下载最新的 jar 文件:```bash
java -jar bastillion-<version>.jar

在浏览器中访问:https://<server-ip>:8443 — 有关 Bastillion 首次运行时生成的自签名证书,请参阅下文 TLS / HTTPS

默认凭据:``` username: admin password: changeme

前台运行;按 Ctrl+C 停止。如需后台/守护进程运行,请使用平台常规方式管理长时间运行的 Java 进程——例如 `nohup java -jar ... &`、systemd 单元、容器等。

---

## 从源码构建

安装 Maven 3+:```bash
apt-get install maven

构建并运行(打包一个包含内嵌 Jetty 服务器的自包含 jar——参见 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 签发);点击继续即可,就像你对待其他任何自托管设备一样。该证书及其密码会在重启后保留(位于 CONFIG_DIR 下的 keystore/bastillion.p12,密码以与数据库密码相同的加密方式存储)。

使用你自己的 CA 签名证书 来替代默认的自签名证书——例如来自 Let's Encrypt 的免费证书:

  1. 使用 certbot 签发证书(需要一个指向此主机的真实 DNS 名称,并且端口 80 可访问以完成 HTTP-01 挑战): ```bash sudo certbot certonly --standalone -d bastillion.example.com

这将 fullchain.pemprivkey.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 等)——禁用 Bastillion 自身的 HTTPS,改为让其提供纯 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_PATHDB_CONNECTION_URL 仍然存在,用于单独将其中某一个指向不同的位置(真实的证书、远程数据库)——参见 TLS / HTTPS 以及下方的“数据库设置”部分——但若只是想把所有内容整合到 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`),从管理 SSH 密钥中移除您在步骤 2 中添加的密钥——
   它只是临时部署在那里以预置 `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_TYPErsaecdsaed25519ed448)仅在 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;

远程 H2 示例:```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,... 的成员,您需要一个字面名称为 admins 的 Bastillion 配置文件(大小写除外——比较是 不区分大小写的,但拼写必须一致),该组成员身份才能在 Bastillion 中生效。这里没有单独的映射步骤或 UI——名称只需对齐即可。

角色与任何 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 注册为企业应用程序 / 服务提供商,并配置以下内容:

  • 标识符(实体 ID):https://bastillion.example.com(或 SAML_SP_ENTITY_ID(如果已设置 - 见下文))
  • 回复 URL(断言消费者服务 URL):https://bastillion.example.com/saml/acs

手头没有 IdP 元数据 URL?在这种情况下,请改为手动配置 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=

仅当 IdP 侧注册的实体 ID 无法与 `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`,这对普通租户成员来说没问题,但对于 B2B 访客(任何使用个人或外部电子邮件作为访客添加并登录的人),会产生一个难看的访客 UPN,例如 `alice_gmail.com#EXT#@yourtenant.onmicrosoft.com`。为了获得更简洁的用户名,请前往企业应用程序的 *单一登录* → SAML → *属性与声明*,编辑 **唯一用户标识符(Name ID)**,并将其 *源属性* 从 `user.userprincipalname` 更改为 `user.mail`。

**角色映射的实际工作原理——与上述 LDAP 机制相同:** `SAML_ROLE_ATTRIBUTE` 指定 *哪个* 断言属性携带用户的组/角色;该属性在特定登录时持有的 *值* 会与您在 **管理 → 配置文件** 下创建的配置文件名称进行 **精确文本匹配** 比较。与配置文件名称匹配的值会将用户分配到该配置文件;声明的其他任何内容都无关紧要。因此,Bastillion 配置文件必须与断言发送的字符串完全同名——没有单独的映射步骤或 UI,名称只需对齐即可。

这正是人们在使用 Entra ID 时最容易出错的部分:默认情况下,Entra 的组声明可以将每个组作为其 **对象 ID**(一个 GUID)发出,而不是其显示名称,除非企业应用程序的令牌配置被明确设置为发出组 **名称**。如果您的 Bastillion 配置文件命名为 `admins`/`everyone` 之类,但 Entra 发送的是 GUID,则永远不会匹配。在假设映射损坏之前,请检查实际断言中的声明值(或该应用的 Entra 令牌配置)——通常问题出在这里,而不是 Bastillion 端。有三种修复方法,按我们推荐的顺序排列:

1. **使用 Entra 应用角色而不是组声明(最干净)。** 在应用的注册 → 应用角色下,定义具有您想要的确切值的角色(`admins`、`everyone`、...),然后在企业应用程序的 *用户和组* 下将用户/组分配到这些角色。配置 SAML 令牌以发出 `roles` 声明,并将 `SAML_ROLE_ATTRIBUTE` 指向该声明的 URI,而不是组声明。您可以选择 Entra 发送的确切字符串——完全没有 GUID 问题,而且这比重新利用 AD 组是更清晰的授权模型。
2. **更改组声明的源属性。** 企业应用程序 → 单一登录 → SAML → *属性与声明* → 编辑组声明 → 有一个 *源属性* 下拉菜单,通常默认为组 ID。根据您的租户以及组是仅云还是从本地 AD 同步,您可能可以将其切换为 `sAMAccountName` 或显示名称选项——确切选项因租户和 Entra 门户版本而异,因此请检查实际提供的选项,而不是假设特定标签。
3. **或者不要与之对抗——将 Bastillion 配置文件命名为 Entra 实际发送的任何内容。** 如果 Entra 坚持发送 GUID,则创建一个字面命名为该 GUID 的 Bastillion 配置文件。虽然更难看,但无需任何 Entra 端重新配置。

声明与任何 Bastillion 配置文件都不匹配的用户将在登录时被拒绝(**Manager** 账户是唯一例外;它们不受配置文件范围限制)——与 LDAP 完全相同,因此出于与设置 `DEFAULT_PROFILE_FOR_LDAP` 相同的原因,值得设置上述 `DEFAULT_PROFILE_FOR_SAML`:在您仍将配置文件名称与 IdP 的声明值对齐时,它是一个安全网。

Bastillion 自身的一次性密码检查对 SSO 登录跳过——IdP 应强制执行其自身的 MFA/条件访问策略。首次 OTP 注册仍然提供,以便 SAML 用户在 SSO 被禁用时拥有可用的本地备用凭据。

**签名请求和加密断言:** Bastillion 在首次需要时自动生成自己的 SAML 签名证书(自签名,与其生成 TLS 证书的方式相同),并从此用它签署每个出站 AuthnRequest——无需设置,即使您的 IdP 不检查它也无害。获取 `https://bastillion.example.com/saml/metadata` 以标准 SP 元数据形式获取该证书,如果您的 IdP 管理员应验证 Bastillion 的签名请求或应为 Bastillion 加密断言,请将其交给他们——大多数 IdP 可以直接导入 SP 元数据 URL,而不是粘贴原始证书。如果您希望使用真实的(例如 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 的数据库中,可在 审计会话(仅限管理员账户)下查看。输出会流式传输到浏览器,因此即使包含大量终端输出的会话也可以重放。审计历史记录保留 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 登录界面

双因素认证设置

使用 Authy、Google Authenticator 或其他兼容应用扫描二维码。

Bastillion 双因素认证设置界面

访问管理 — 导航、配置文件和用户

主菜单

可用工具的范围取决于登录用户的权限。

Bastillion 主菜单

管理配置文件

将系统分组到命名配置文件中,以控制访问权限。

Bastillion 配置文件管理界面

管理用户

创建账户、选择用户角色,并通过配置文件授予系统访问权限。

Bastillion 用户管理界面

终端与自动化 — 启动会话并运行已保存的脚本

终端

选择一个或多个系统(可按配置文件筛选),并同时打开它们。

Bastillion 终端选择界面

复合脚本

保存一次脚本,即可在每个选定的终端上执行。

Bastillion 复合脚本管理界面

设置 — 账户外观与应用身份验证

用户设置

更改密码、选择界面和终端外观,并管理 Bastillion 用于向已注册系统进行身份验证的公钥。

Bastillion 用户设置界面


许可证

Bastillion 采用 Prosperity Public License 许可。

完整的第三方依赖及其许可证列表见 3rdPartyLicenses.md

Loophole, LLC — Sean Kavanagh

[email protected]

分类