
Ephemera è un'autorità di certificazione SSH leggera e auto-ospitata, progettata per imporre l'accesso Zero-Trust per le infrastrutture. Sostituisce le chiavi SSH statiche con certificati a breve durata, integra l'autenticazione MFA WebAuthn basata su hardware e mantiene registri di audit crittograficamente verificabili.
[!NOTE] Fonte Canonica: Codeberg
Mirror GitHub: GitHub (per disponibilità e hosting)
graph LR
subgraph Client["Utente (Operatore)"]
SSH["Client SSH"]
HW["Chiave Hardware<br/>WebAuthn / YubiKey"]
end
subgraph Auth["Confine di Autenticazione"]
MFA["WebAuthn MFA<br/><i>Presenza umana richiesta</i>"]
OIDC["OIDC<br/><i>Opzionale</i>"]
end
subgraph CA["Ephemera Autorità di Certificazione SSH"]
CORE["CA auto-ospitata<br/>Capace di air-gap"]
POLICY["Motore delle Policy<br/><i>Governance al rilascio</i>"]
BUDGET["Budget di Fiducia<br/><i>Opzionale</i>"]
end
subgraph Targets["Server di Destinazione"]
NATIVE["OpenSSH nativo<br/>TrustedUserCAKeys"]
NOAGENT["Nessun agente<br/>Nessun proxy SSH"]
end
subgraph Audit["Audit e Recupero"]
LOG["Registro Audit<br/>A prova di manomissione"]
BACKUP["Backup Crittografati<br/>Recupero Shamir"]
end
Client --> Auth
Auth -->|"Certificato a breve durata"| CA
CA -->|"Il certificato scade<br/>automaticamente"| Targets
CA -.->|"Integrità post-fatto"| Audit
style Auth fill:#e8f5e9,stroke:#2e7d32
style CA fill:#e3f2fd,stroke:#1565c0
style Audit fill:#fff3e0,stroke:#ef6c00
Cosa fa Ephemera: Governa chi può ricevere accesso e per quanto tempo.
Cosa NON fa Ephemera: Monitoraggio in esecuzione, proxy MITM, ispezione dei comandi.
Applicazione: Interamente all'interno di OpenSSH nativo — nessun agente Ephemera sui server di destinazione.
Rotazione delle chiavi: Non necessaria — i certificati scadono automaticamente.
Ephemera è un'autorità di certificazione SSH auto-ospitata basata sulle funzionalità native di OpenSSH. Sostituisce le chiavi SSH a lunga durata con certificati a breve durata emessi just-in-time, con presenza fisica esplicita ed escalation dei privilegi verificabile.
È progettato per team che desiderano una governance SSH centralizzata senza proxy MITM, protocolli personalizzati o dipendenze cloud.
Funzionalità principale CA SSH: Pronto per la produzione
Budget di Fiducia: Sperimentale (opt-in, soggetto a modifiche)
Le funzionalità sperimentali sono chiaramente isolate e disabilitate per impostazione predefinita.
L'SSH tradizionale si basa su chiavi private a lunga durata distribuite su laptop e server. Una volta che una chiave perde, l'accesso persiste fino a quando non la si scopre e la si ruota ovunque. Ephemera sostituisce le chiavi statiche con certificati a breve durata che scadono automaticamente, riducendo la finestra di utilizzo improprio da mesi a minuti.
Accesso Just-in-Time : I certificati scadono in pochi minuti (default 5m), riducendo la finestra di opportunità per credenziali rubate.
Applicazione WebAuthn : Il rilascio del certificato richiede interazione MFA fisica (FIDO2) tramite YubiKey o TouchID.
Recupero Sovrano : I backup crittografati sono protetti tramite Shamir's Secret Sharing, richiedendo un quorum per il ripristino.
Audit Verificabile : Tutte le azioni della CA sono registrate in un registro a catena Merkle per una cronologia a prova di manomissione.
RBAC Granulare : Un motore di policy basato su YAML definisce l'accesso in base a ruoli, risorse e condizioni.

Ephemera include un primitivo di governance sperimentale e opt-in chiamato Budget di Fiducia (Trust Budgeting).
Il Budget di Fiducia limita l'autorità privilegiata cumulativa al momento del rilascio del certificato, trattando l'accesso come una risorsa finita e visibile. Ogni rilascio di certificato consuma un budget esplicito. Quando il budget è esaurito, il rilascio normale si ferma fino a quando il budget non viene ripristinato o viene utilizzato un percorso di emergenza separato (break-glass).
Questo meccanismo:
Il Budget di Fiducia è sperimentale e potrebbe cambiare o essere rimosso.
Documentazione: docs/trust_budgeting.md
Ephemera include GateBridge, un sistema di valutazione ombra che convalida le decisioni delle policy rispetto a un motore alternativo (Gate0) senza influenzare il comportamento di produzione.
policy-shadow.log)Ogni voce contiene:
GET /api/admin/gate0/status
Ritorna:
{
"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 può essere disabilitato tramite flag di configurazione. La modalità ombra è fail-open e non influisce sulle decisioni di autorizzazione.
Nessuna modifica sostanziale all'interfaccia CLI di Gate0. I registri ombra acquisiscono nuovi campi ma rimangono retrocompatibili.
Obiettivo: Emettere il tuo primo certificato SSH in meno di 5 minuti.
# Clona e avvia
git clone https://github.com/Qarait/ephemera.git
cd ephemera
docker compose up -d
Nota: La password master della CA viene generata automaticamente e persistita al primo avvio.
Per la produzione, impostaCA_MASTER_PASSWORDin un file.envprima di avviare.
[!IMPORTANT] Distribuzioni di Produzione: Utilizza il backend SoftHSM per l'isolamento delle chiavi basato su hardware. La chiave privata della CA non tocca mai il disco. Vedi Guida all'Installazione PKCS#11.
Apri http://localhost:3000 nel tuo browser.
Credenziali predefinite:
admindocker compose logs ephemera | grep "Password:"
File Compose Alternativi:
docker-compose.dev.yml — Sviluppo con build locali e syslogdocker-compose.test.yml — Include target SSH per test end-to-end# Installa la CLI dal sorgente
git clone https://github.com/Qarait/ephemera.git
cd ephemera
pip install .
# Inizializza la tua configurazione SSH
ephemera init
# Accedi alla CA
ephemera login
# Emetti il tuo primo certificato
ephemera renew
# Controlla il tuo stato
ephemera status
# Connettiti in modo sicuro!
ssh user@your-server
Ephemera fornisce un meccanismo di backup sicuro che crittografa i tuoi dati critici (chiavi CA, database) con una password casuale, e quindi suddivide quella password in frammenti Shamir. Ciò garantisce che nessuna singola persona possa ripristinare il backup, ma un quorum può farlo.
# Crea backup crittografato e suddividi la password in 5 frammenti (soglia 3)
ephemera backup-create --k 3 --n 5 --out-dir ./backup
Questo produce:
ephemera_backup.enc (L'archivio crittografato)backup_shard_1_of_5.json, ecc. (I frammenti della password)Nota: Conserva i frammenti in posizioni separate e sicure. Conserva il file di backup crittografato in modo sicuro (è inutile senza i frammenti).
# Ripristina utilizzando il file crittografato e 3 frammenti qualsiasi
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 utilizza un potente motore di policy basato su YAML per il controllo degli accessi basato sui ruoli (RBAC).
# Definisci i Ruoli
roles:
developer:
can_request_cert: true
max_cert_duration: 300 # 5 minuti
allowed_principals: ["dev-user"]
admin:
can_request_cert: true
max_cert_duration: 3600 # 1 ora
allowed_principals: ["root", "admin"]
can_approve_sudo: true
# Definisci le Regole
rules:
# Gli sviluppatori possono accedere solo ai server di sviluppo
- role: developer
resource: "dev-*"
action: "ssh"
effect: allow
# Gli amministratori possono accedere a tutto con MFA
- role: admin
resource: "*"
action: "ssh"
effect: allow
conditions:
mfa_required: true
Consulta SECURITY.md per informazioni sulla divulgazione responsabile.
Vuoi contribuire? Dai un'occhiata ai nostri Compiti Piccoli per Nuovi Contributori.
[!TIP] Il modello delle minacce e le assunzioni di sicurezza sono documentati qui. Feedback e critiche sono benvenuti.
| Campo | Descrizione |
|---|
timestamp | Timestamp ISO 8601 UTC |
match | Booleano — i due motori sono d'accordo? |
versions.bridge | Versione Python di GateBridge |
versions.gate0 | Versione CLI di Gate0 |
versions.policy_hash | Hash SHA256 di policy.yaml |
context_hash | Hash SHA256 dell'input canonico |
yaml_decision | Risultato del motore YAML |
gate0_decision | Risultato del motore Gate0 |
snapshot | Contesto completo (solo in caso di disaccordo, dimensione limitata) |