Ephemera 是一个轻量级、自托管的SSH证书颁发机构,旨在为基础设施实施零信任访问。它用短生命周期证书替换静态SSH密钥,集成硬件支持的WebAuthn多因素认证(MFA),并维护密码学可验证的审计追踪。
graph LR
subgraph Client["用户(操作者)"]
SSH["SSH客户端"]
HW["硬件密钥<br/>WebAuthn / YubiKey"]
end
subgraph Auth["认证边界"]
MFA["WebAuthn MFA<br/><i>需要人类存在</i>"]
OIDC["OIDC<br/><i>可选</i>"]
end
subgraph CA["Ephemera SSH证书颁发机构"]
CORE["自托管CA<br/>可气隙部署"]
POLICY["策略引擎<br/><i>发放时的治理</i>"]
BUDGET["信任预算<br/><i>可选</i>"]
end
subgraph Targets["目标服务器"]
NATIVE["原生OpenSSH<br/>TrustedUserCAKeys"]
NOAGENT["无代理<br/>无SSH代理"]
end
subgraph Audit["审计与恢复"]
LOG["防篡改<br/>审计日志"]
BACKUP["加密备份<br/>Shamir恢复"]
end
Client --> Auth
Auth -->|"短生命周期证书"| CA
CA -->|"证书自动过期"| Targets
CA -.->|"事后完整性"| Audit
style Auth fill:#e8f5e9,stroke:#2e7d32
style CA fill:#e3f2fd,stroke:#1565c0
style Audit fill:#fff3e0,stroke:#ef6c00
Ephemera 的功能: 控制谁可以获取访问权限以及访问时长。
Ephemera 不做什么: 运行时监控、中间人代理、命令检查。
执行方式: 完全在原生OpenSSH内部——目标服务器上无需Ephemera代理。
无需密钥轮换: 证书会自动过期。
Ephemera 是一个基于原生OpenSSH功能构建的自托管SSH证书颁发机构。它将长期存在的SSH密钥替换为即时发放的短生命周期证书,并要求明确的人体存在和可审计的权限提升。
它专为希望实现集中化SSH治理但又不想使用中间人代理、自定义协议或云依赖的团队而设计。
核心SSH CA功能:生产就绪
信任预算:实验性(可选启用,可能变更)
实验性功能已明确隔离,并在默认情况下禁用。
传统SSH依赖于分布在笔记本电脑和服务器上的长期私钥。一旦密钥泄露,访问权限将持续存在,直到你发现并到处轮换密钥。Ephemera 用自动过期的短生命周期证书替换静态密钥,将误用窗口从数月缩短到数分钟。
即时访问:证书在数分钟内过期(默认5分钟),减少凭证被盗用的机会窗口。
WebAuthn强制:证书发放需要通过YubiKey或TouchID进行物理MFA(FIDO2)交互。
主权恢复:加密备份通过Shamir秘密共享保护,需要法定人数才能恢复。
可验证审计:所有CA操作都记录在Merkle链式账本中,提供防篡改历史。
细粒度RBAC:基于YAML的策略引擎根据角色、资源和条件定义访问权限。

Ephemera 包含一个可选的实验性治理原语,称为信任预算。
信任预算通过将访问视为有限、可见的资源,在证书发放时限制累积的特权权限。每次证书发放都会消耗明确的预算。当预算耗尽时,正常发放停止,直到预算重置或使用单独的紧急(打破玻璃)路径。
该机制:
信任预算为实验性,可能变更或移除。
Ephemera 包含 GateBridge,一个影子评估系统,在不影响生产行为的情况下,验证策略决策与备用引擎(Gate0)的一致性。
policy-shadow.log)每条记录包含:
GET /api/admin/gate0/status
返回:
{
"bridge_version": "1.0.0",
"gate0_version": "v0.2.1",
"policy_hash": "sha256:8f4b...",
"status": "healthy",
"last_mismatch": null,
"telemetry": {
"latency_p50_ms": 2.3,
"latency_p95_ms": 5.1,
"latency_p99_ms": 8.7
}
}
GateBridge 可以通过配置标志禁用。影子模式是故障开放的,不会影响授权决策。
Gate0 CLI接口没有破坏性变更。影子日志会增加新字段,但向后兼容可解析。
目标: 在5分钟内签发你的第一张SSH证书。
# 克隆并启动
git clone https://github.com/Qarait/ephemera.git
cd ephemera
docker compose up -d
注意: CA主密码在首次运行时会自动生成并持久化。
对于生产环境,在启动前将CA_MASTER_PASSWORD设置在.env文件中。
[!IMPORTANT] 生产部署:使用SoftHSM后端实现硬件支持的密钥隔离。CA私钥永远不会接触磁盘。参见 PKCS#11 Setup Guide。
在浏览器中打开 http://localhost:3000。
默认凭据:
admindocker compose logs ephemera | grep "Password:"
备选Compose文件:
docker-compose.dev.yml — 开发环境,本地构建和syslogdocker-compose.test.yml — 包含SSH目标,用于端到端测试# 从源码安装CLI
git clone https://github.com/Qarait/ephemera.git
cd ephemera
pip install .
# 初始化你的SSH配置
ephemera init
# 登录到CA
ephemera login
# 签发第一张证书
ephemera renew
# 检查你的状态
ephemera status
# 安全连接!
ssh user@your-server
Ephemera 提供一种安全的备份机制,用随机密码加密你的关键数据(CA密钥、数据库),然后将密码拆分为Shamir碎片。这确保没有任何单个人可以恢复备份,但法定人数可以。
# 创建加密备份,并将密码拆分为5个碎片(阈值为3)
ephemera backup-create --k 3 --n 5 --out-dir ./backup
这会生成:
ephemera_backup.enc(加密归档包)backup_shard_1_of_5.json 等(密码碎片)注意: 将碎片分别存放在不同的安全位置。将加密备份文件安全存放(没有碎片则无用)。
# 使用加密文件和任意3个碎片恢复
ephemera backup-restore --backup ./backup/ephemera_backup.enc --shards ./backup/backup_shard_1_of_5.json ./backup/backup_shard_2_of_5.json ./backup/backup_shard_4_of_5.json --out-dir ./restored
policy.yaml)Ephemera 使用强大的基于YAML的策略引擎进行基于角色的访问控制(RBAC)。
# 定义角色
roles:
developer:
can_request_cert: true
max_cert_duration: 300 # 5分钟
allowed_principals: ["dev-user"]
admin:
can_request_cert: true
max_cert_duration: 3600 # 1小时
allowed_principals: ["root", "admin"]
can_approve_sudo: true
# 定义规则
rules:
# 开发者只能访问开发服务器
- role: developer
resource: "dev-*"
action: "ssh"
effect: allow
# 管理员可以访问所有资源,但需要MFA
- role: admin
resource: "*"
action: "ssh"
effect: allow
conditions:
mfa_required: true
负责任地披露信息请参见 SECURITY.md。
想贡献?请查看我们的 新贡献者小任务。
[!TIP] 威胁模型和安全假设已记录在此处。欢迎提供反馈和批评。
| 字段 | 描述 |
|---|
timestamp | ISO 8601 UTC时间戳 |
match | 布尔值 —— 两个引擎是否一致? |
versions.bridge | GateBridge Python版本 |
versions.gate0 | Gate0 CLI版本 |
versions.policy_hash | policy.yaml的SHA256哈希 |
context_hash | 规范化输入的SHA256哈希 |
yaml_decision | YAML引擎结果 |
gate0_decision | Gate0引擎结果 |
snapshot | 完整上下文(仅在不匹配时,大小有限制) |