
Ephemera ist eine leichtgewichtige, selbst gehostete SSH-Zertifizierungsstelle, die entwickelt wurde, um Zero-Trust-Zugriff für die Infrastruktur durchzusetzen. Es ersetzt statische SSH-Schlüssel durch kurzlebige Zertifikate, integriert hardwaregestütztes WebAuthn MFA und führt kryptografisch überprüfbare Audit-Trails.
[!NOTE] Kanonische Quelle: Codeberg
GitHub-Spiegel: GitHub (für Verfügbarkeit und Hosting)
graph LR
subgraph Client["User (Operator)"]
SSH["SSH Client"]
HW["Hardware Key<br/>WebAuthn / YubiKey"]
end
subgraph Auth["Authentication Boundary"]
MFA["WebAuthn MFA<br/><i>Human presence required</i>"]
OIDC["OIDC<br/><i>Optional</i>"]
end
subgraph CA["Ephemera SSH Certificate Authority"]
CORE["Self-hosted CA<br/>Air-gap capable"]
POLICY["Policy Engine<br/><i>Governance at issuance</i>"]
BUDGET["Trust Budgeting<br/><i>Optional</i>"]
end
subgraph Targets["Target Servers"]
NATIVE["Native OpenSSH<br/>TrustedUserCAKeys"]
NOAGENT["No agents<br/>No SSH proxy"]
end
subgraph Audit["Audit & Recovery"]
LOG["Tamper-Evident<br/>Audit Log"]
BACKUP["Encrypted Backups<br/>Shamir Recovery"]
end
Client --> Auth
Auth -->|"Short-lived cert"| CA
CA -->|"Certificate expires<br/>automatically"| Targets
CA -.->|"Post-fact integrity"| Audit
style Auth fill:#e8f5e9,stroke:#2e7d32
style CA fill:#e3f2fd,stroke:#1565c0
style Audit fill:#fff3e0,stroke:#ef6c00Was Ephemera tut: Regelt, wer Zugriff erhalten darf und wie lange.
Was Ephemera NICHT tut: Laufzeitüberwachung, MITM-Proxy, Befehlsinspektion.
Durchsetzung: Vollständig innerhalb von nativem OpenSSH — kein Ephemera-Agent auf Zielservern.
Schlüsselrotation: Nicht nötig — Zertifikate laufen automatisch ab.
Ephemera ist eine selbst gehostete SSH-Zertifizierungsstelle, die auf nativen OpenSSH-Funktionen aufbaut. Es ersetzt langlebige SSH-Schlüssel durch kurzlebige, Just-in-Time ausgestellte Zertifikate, mit expliziter physischer Anwesenheit und überprüfbarer Privilegieneskalation.
Es ist für Teams entwickelt, die eine zentrale SSH-Governance ohne MITM-Proxies, benutzerdefinierte Protokolle oder Cloud-Abhängigkeiten wünschen.
Kernfunktionalität der SSH-CA: Produktionsreif
Trust Budgeting: Experimentell (Opt-in, Änderungen vorbehalten)
Die experimentellen Funktionen sind klar isoliert und standardmäßig deaktiviert.
Traditionelles SSH verlässt sich auf langlebige private Schlüssel, die über Laptops und Server verteilt sind. Sobald ein Schlüssel durchsickert, bleibt der Zugriff bestehen, bis Sie ihn entdecken und die Schlüssel überall austauschen. Ephemera ersetzt statische Schlüssel durch kurzlebige Zertifikate, die automatisch ablaufen, und verkleinert das Missbrauchsfenster von Monaten auf Minuten.
Just-in-Time-Zugriff: Zertifikate laufen in Minuten ab (Standard 5m), wodurch das Zeitfenster für gestohlene Anmeldedaten verkleinert wird.
WebAuthn-Durchsetzung: Die Zertifikatsausstellung erfordert physische MFA-Interaktion (FIDO2) über YubiKey oder TouchID.
Souveräne Wiederherstellung: Verschlüsselte Backups werden durch Shamir's Secret Sharing geschützt und erfordern ein Quorum zur Wiederherstellung.
Überprüfbares Audit: Alle CA-Aktionen werden in einem Merkle-verketteten Ledger protokolliert, um eine manipulationssichere Historie zu gewährleisten.
Granulares RBAC: Eine YAML-basierte Policy-Engine definiert den Zugriff basierend auf Rollen, Ressourcen und Bedingungen.

Ephemera enthält eine experimentelle, optionale Governance-Primitive namens Trust Budgeting.
Trust Budgeting begrenzt die kumulative privilegierte Autorität zum Zeitpunkt der Zertifikatsausstellung, indem Zugriff als endliche, sichtbare Ressource behandelt wird. Jede Zertifikatsausstellung verbraucht ein explizites Budget. Wenn das Budget aufgebraucht ist, wird die normale Ausstellung gestoppt, bis das Budget zurückgesetzt oder ein separater Notfallpfad (Break-Glass) verwendet wird.
Dieser Mechanismus:
Trust Budgeting ist experimentell und kann sich ändern oder entfernt werden.
Dokumentation: docs/trust_budgeting.md
Ephemera enthält GateBridge, ein Schattenbewertungssystem, das Richtlinienentscheidungen gegen eine alternative Engine (Gate0) validiert, ohne das Produktionsverhalten zu beeinflussen.
policy-shadow.log)Jeder Eintrag enthält:
GET /api/admin/gate0/status
Returns:
{
"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 kann über ein Konfigurationsflag deaktiviert werden. Der Schattenmodus ist Fail-Open und hat keine Auswirkungen auf Autorisierungsentscheidungen.
Keine bahnbrechenden Änderungen an der Gate0-CLI-Schnittstelle. Schattenprotokolle erhalten neue Felder, bleiben aber abwärtskompatibel.
Ziel: Stellen Sie Ihr erstes SSH-Zertifikat in unter 5 Minuten aus.
# Clone and start
git clone https://github.com/Qarait/ephemera.git
cd ephemera
docker compose up -d
Hinweis: Das CA-Masterpasswort wird automatisch generiert und beim ersten Start dauerhaft gespeichert.
Verwenden Sie für die ProduktionCA_MASTER_PASSWORDin einer.env-Datei vor dem Start.
[!IMPORTANT] Produktionsbereitstellungen: Verwenden Sie das SoftHSM-Backend für hardwaregestützte Schlüsselisolation. Der private CA-Schlüssel wird niemals auf die Festplatte geschrieben. Siehe PKCS#11 Einrichtungsanleitung.
Öffnen Sie http://localhost:3000 in Ihrem Browser.
Standard-Anmeldedaten:
admindocker compose logs ephemera | grep "Password:"
Alternative Compose-Dateien:
docker-compose.dev.yml — Entwicklung mit lokalen Builds und Syslogdocker-compose.test.yml — Enthält SSH-Ziel für End-to-End-Tests# Install the CLI from source
git clone https://github.com/Qarait/ephemera.git
cd ephemera
pip install .
# Initialize your SSH config
ephemera init
# Login to the CA
ephemera login
# Issue your first certificate
ephemera renew
# Check your status
ephemera status
# Connect securely!
ssh user@your-server
Ephemera bietet einen sicheren Backup-Mechanismus, der Ihre kritischen Daten (CA-Schlüssel, Datenbank) mit einem zufälligen Passwort verschlüsselt und dieses Passwort dann in Shamir-Shards aufteilt. Dadurch wird sichergestellt, dass keine einzelne Person das Backup wiederherstellen kann, aber ein Quorum dazu in der Lage ist.
# Create encrypted backup and split password into 5 shards (threshold 3)
ephemera backup-create --k 3 --n 5 --out-dir ./backup
Dies erzeugt:
ephemera_backup.enc (Das verschlüsselte Archiv)backup_shard_1_of_5.json, usw. (Die Passwort-Shards)Hinweis: Bewahren Sie die Shards an getrennten, sicheren Orten auf. Bewahren Sie die verschlüsselte Backup-Datei sicher auf (sie ist ohne die Shards nutzlos).
# Restore using the encrypted file and any 3 shards
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 verwendet eine leistungsstarke YAML-basierte Richtlinien-Engine für die rollenbasierte Zugriffskontrolle (RBAC).
# Define Roles
roles:
developer:
can_request_cert: true
max_cert_duration: 300 # 5 minutes
allowed_principals: ["dev-user"]
admin:
can_request_cert: true
max_cert_duration: 3600 # 1 hour
allowed_principals: ["root", "admin"]
can_approve_sudo: true
# Define Rules
rules:
# Developers can only access dev servers
- role: developer
resource: "dev-*"
action: "ssh"
effect: allow
# Admins can access everything with MFA
- role: admin
resource: "*"
action: "ssh"
effect: allow
conditions:
mfa_required: true
Bitte beachten Sie SECURITY.md für Informationen zur verantwortungsvollen Offenlegung.
Möchten Sie beitragen? Schauen Sie sich unsere kleinen Aufgaben für neue Mitwirkende an.
[!TIP] Bedrohungsmodell und Sicherheitsannahmen sind hier dokumentiert. Feedback und Kritik sind willkommen.
| Feld | Beschreibung |
|---|
timestamp | ISO 8601 UTC-Zeitstempel |
match | Boolesch – stimmten beide Engines überein? |
versions.bridge | GateBridge Python-Version |
versions.gate0 | Gate0 CLI-Version |
versions.policy_hash | SHA256-Hash von policy.yaml |
context_hash | SHA256-Hash des kanonisierten Inputs |
yaml_decision | Ergebnis der YAML-Engine |
gate0_decision | Ergebnis der Gate0-Engine |
snapshot | Vollständiger Kontext (nur bei Abweichung, größenbegrenzt) |