
Bastillion v5.2.0
Bastillion 为您提供一种简洁的、基于浏览器的管理方式,用于跨所有系统管理 SSH 访问——就像一个带有友好仪表盘的堡垒主机。
Bastillion
一款现代化的、基于 Web 的 SSH 控制台和 SSH 密钥管理工具。
Bastillion 为你提供了一种简洁的、基于浏览器的方式来管理所有系统上的 SSH 访问——就像一个带有友好仪表盘的堡垒机。它做两件事:
-
基于 Web 的 SSH 终端——主机注册后,授权用户可以直接从浏览器打开一个或多个实时终端会话,命令可以选择性地同时广播到所有打开的会话(可以想象成 tmux 的同步窗格,只不过面对的是远程主机集群,而不是本地窗格)。
-
SSH 密钥管理——Bastillion 持有自己的 SSH 密钥对,并将公钥推送/轮换到你注册的主机上,因此单个用户永远不需要自己持有或管理这些系统的长期密钥。
- 使用 双因素认证 登录(Authy 或 Google Authenticator)
- 管理和分发 SSH 公钥,并集中禁用/轮换它们
- 启动安全的多会话 Web Shell,并在会话间 共享命令
- 记录每个会话 并按需回放——为任何合规框架提供可审计的证据
- 将系统分组为 Profiles,精确控制谁可以访问什么
- 保存并重新运行 Composite Scripts,一次性在整个集群上执行
- 在 SSH 之上叠加 TLS/SSL 以获得额外保护

三个真实、独立的 SSH 会话——一条命令,输入一次,处处运行。
目录
工作原理
Bastillion 位于你的用户和他们需要访问的系统之间,充当可信第三方,而不是简单的密码保险库。以下是完整的生命周期,从头到尾。
1. Bastillion 生成自己的 SSH 密钥对
首次启动时,在任何其他事情之前,Bastillion 会为自己生成一个 Ed25519 密钥对——这是唯一会被推送到你主机上的密钥。它会在控制台输出中显示,并且始终可以在 Settings 下查看。
2. 注册系统
管理员在 Manage → Systems 下添加主机(用户、主机、端口,以及该主机 authorized_keys 文件的路径)。Bastillion 使用你提供的密码或口令 一次性 认证,然后将自己的公钥推送到该主机的 authorized_keys 中。从那时起,它使用该密钥连接——永远不存储密码。密钥就位的那一刻,状态就会变为 Success。

3. 将系统分组为 Profiles,分配 Users
系统被分组为命名的 Profiles——可以理解为“Production”、“Staging”、“Database Tier”。然后在 Manage → Users 下将用户关联到 profiles,这是唯一控制谁可以访问什么的东西。撤销 profile 分配,该访问权限立即消失,无需轮换密钥。

4. 打开终端——并同时向所有终端广播
被分配的用户打开 Secure Shell → Terminals,选择一个或多个系统,即可在浏览器中获得实时、可调整大小的、基于 xterm 的终端,并排显示。输入一次,它就会发送到每个标记为活动的终端——相同的按键、相同的命令、相同的输出形态,覆盖你选择的所有主机。

5. 集中轮换或撤销密钥
因为每台主机都信任 同一个 应用程序密钥(而不是每个用户一个密钥),所以在 Manage SSH Keys 下禁用它一次,就会立即撤销所有地方的访问权限——无需手动接触目标系统,无需查找哪台服务器上有哪个过期密钥。

6. 每个会话都被记录——审计和回放
在这些终端中输入的所有内容以及返回的每一个字节都会被自动记录。管理员打开 Audit Sessions,按用户或系统过滤,并回放任何会话——对于跨多台主机的会话可以并排回放,并带有文本过滤器,可以直接跳转到关键行。输出在加载时 流式 传输到页面中,因此即使一个会话转储了数百兆字节的日志,回放也毫不费力。
如果你需要向审计员展示谁在何时何地运行了什么——这就是证据,开箱即用。几乎每个合规框架在某处都有特权访问审计跟踪要求(PCI DSS、HIPAA、SOC 2、ISO 27001——选你的),这无需商业 PAM 产品即可满足该要求。会话默认保留 90 天(deleteAuditLogAfter),并且可以通过 ENABLE_INTERNAL_AUDIT=false 关闭记录——参见 Auditing。

🚀 新特性
- SAML 2.0 SSO——通过企业 IdP(Entra ID、Okta、ADFS 等)登录——参见 Configuration
- 许可——最多 8 个系统免费,付费层级可在 loophole.company/pricing.html 获取(见下方 Licensing)
- 会话审计与回放,默认开启——每个终端会话都会被记录,并可在 Audit Sessions 下回放,流式传输到浏览器,因此即使巨大的会话也能即时加载
- 作为 自包含 jar(
java -jar)运行,开箱即用 HTTPS——参见 Download and Run - 升级到 Java 21、Jetty 12 和 Jakarta EE 10
- 完全支持 Ed25519(默认)和 Ed448 SSH 密钥
- v4 → v5 迁移工具,用于从现有实例迁移用户、系统、密钥和审计日志——参见
tools/migrate - 通过 CSRF 过滤器 和全应用 安全头 加固
许可
Bastillion 在最多 8 个注册系统 下可无许可证运行——足以在购买前真正试用。许可证会提高该上限。
- 在 loophole.company/pricing.html 购买许可证
(Starter/Team/Business——按系统数量定价)。付款后会重定向回来并自动下载一个
.lic文件。 - 打开
.lic文件并复制其内容(一行)。 - 通过
LICENSE_KEY环境变量设置它: ```bash export LICENSE_KEY=
或将其粘贴到 BastillionConfig.properties 中的 licenseKey 处——如果两者都设置了,环境变量优先。
4. 重启 Bastillion。Settings 会显示被许可方、系统上限和到期时间,并在到期前 90 天开始显示警告。
许可证按年提供且不会自动续订——不会留存任何银行卡信息。当收到到期警告时,从同一定价页面再次购买。
安装选项
免费: https://github.com/Loophole-LLC/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) |
---
## 下载并运行
从 [Releases](https://github.com/Loophole-LLC/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
对于隔离的本地 UI 审查,将测试数据保存在单独的目录中,并在首次启动时自动生成数据库密码:```bash
CONFIG_DIR=/tmp/bastillion-ui-review/ TLS_ENABLED=false PORT=8080
mvn -DGEN_DB_PASS=true compile exec:java
打开 `http://localhost:8080` 并使用上面的默认凭据登录。此 HTTP
配置用于本地开发。部署时,请使用下文所述的 HTTPS。
HTML、CSS 和 JavaScript 从 `target/classes/webapp` 提供;编辑 `src/main/webapp` 下的文件后,
运行 `mvn resources:resources` 并重新加载浏览器以查看更改。模板缓存最长 60 秒;
重启开发进程可立即清除该缓存。
默认监听 `https://localhost:8443`,与上面下载的发行版相同——有关该证书如何设置以及如何使用
自己的证书,请参阅下文 [TLS / HTTPS](#tls--https)。
---
## TLS / HTTPS
Bastillion 在首次启动时生成自己的自签名证书并提供 HTTPS 服务——
无需配置。浏览器会显示一次警告(它是自签名的,不是由 CA 签发的);
点击继续即可,就像对待任何其他自托管设备一样。证书及其密码在重启后保持不变(位于
[`CONFIG_DIR`](#configuration) 下的 `keystore/bastillion.p12`,密码以与数据库
密码相同的加密方式存储)。
**使用你自己的 CA 签名证书**来替代自签名默认证书——例如来自
[Let's Encrypt](https://letsencrypt.org/) 的免费证书:
1. 使用 [certbot](https://certbot.eff.org/) 签发证书(需要一个指向此主机的真实 DNS 名称,
并且端口 80 可访问以进行 HTTP-01 挑战): ```bash
sudo certbot certonly --standalone -d bastillion.example.com
这会将 fullchain.pem 和 privkey.pem 写入
/etc/letsencrypt/live/bastillion.example.com/。