
Ephemera est une autorité de certification SSH légère et auto-hébergée conçue pour imposer un accès Zero-Trust pour l'infrastructure. Elle remplace les clés SSH statiques par des certificats à courte durée de vie, intègre une MFA WebAuthn basée sur le matériel et maintient des pistes d'audit cryptographiquement vérifiables.
[!NOTE] Source canonique : Codeberg
Miroir GitHub : GitHub (pour la disponibilité et l'hébergement)
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:#ef6c00
Ce que fait Ephemera : Gouverne qui peut recevoir l'accès et pour combien de temps.
Ce que Ephemera ne fait PAS : Surveillance en cours d'exécution, proxy MITM, inspection de commandes.
Application : Entièrement dans OpenSSH natif — aucun agent Ephemera sur les serveurs cibles.
Rotation de clés : Pas nécessaire — les certificats expirent automatiquement.
Ephemera est une autorité de certification SSH auto-hébergée construite sur les fonctionnalités natives d'OpenSSH. Elle remplace les clés SSH à longue durée de vie par des certificats à courte durée de vie délivrés juste-à-temps, avec une présence physique explicite et une escalade de privilèges auditables.
Il est conçu pour les équipes qui souhaitent une gouvernance SSH centralisée sans proxies MITM, protocoles personnalisés ou dépendances cloud.
Fonctionnalité principale de la CA SSH : Prêt pour la production
Trust Budgeting : Expérimental (optionnel, susceptible de changer)
Les fonctionnalités expérimentales sont clairement isolées et désactivées par défaut.
Le SSH traditionnel repose sur des clés privées à longue durée de vie réparties sur les ordinateurs portables et les serveurs. Une fois qu'une clé fuit, l'accès persiste jusqu'à ce que vous la découvriez et remplaciez les clés partout. Ephemera remplace les clés statiques par des certificats à courte durée de vie qui expirent automatiquement, réduisant la fenêtre de mauvaise utilisation de quelques mois à quelques minutes.
Accès juste-à-temps : Les certificats expirent en minutes (5 min par défaut), réduisant la fenêtre d'opportunité pour des identifiants volés.
Application WebAuthn : La délivrance de certificats nécessite une interaction MFA physique (FIDO2) via YubiKey ou TouchID.
Récupération souveraine : Les sauvegardes chiffrées sont protégées via le partage de secret de Shamir, nécessitant un quorum pour restaurer.
Audit vérifiable : Toutes les actions de la CA sont enregistrées dans un registre chaîné Merkle pour un historique infalsifiable.
RBAC granulaire : Un moteur de politiques basé sur YAML définit l'accès en fonction des rôles, des ressources et des conditions.

Ephemera inclut une primitive de gouvernance expérimentale et optionnelle appelée Trust Budgeting.
Trust Budgeting limite l'autorité privilégiée cumulative au moment de la délivrance des certificats en traitant l'accès comme une ressource finie et visible. Chaque délivrance de certificat consomme un budget explicite. Lorsque le budget est épuisé, la délivrance normale s'arrête jusqu'à ce que le budget se réinitialise ou qu'un chemin d'urgence (break-glass) séparé soit utilisé.
Ce mécanisme :
Trust Budgeting est expérimental et peut changer ou être supprimé.
Documentation: docs/trust_budgeting.md
Ephemera inclut GateBridge, un système d'évaluation en mode shadow qui valide les décisions de politique par rapport à un moteur alternatif (Gate0) sans affecter le comportement en production.
policy-shadow.log)Chaque entrée contient :
GET /api/admin/gate0/status
Retourne :
{
"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 peut être désactivé via un indicateur de configuration. Le mode shadow est fail-open et n'affecte pas les décisions d'autorisation.
Aucun changement cassant dans l'interface CLI de Gate0. Les logs shadow gagnent de nouveaux champs mais restent rétrocompatibles en lecture.
Objectif : Délivrer votre premier certificat SSH en moins de 5 minutes.
# Clone and start
git clone https://github.com/Qarait/ephemera.git
cd ephemera
docker compose up -d
Remarque : Le mot de passe maître de la CA est auto-généré et persisté au premier démarrage.
Pour la production, définissezCA_MASTER_PASSWORDdans un fichier.envavant de démarrer.
[!IMPORTANT] Déploiements en production : Utilisez le backend SoftHSM pour l'isolation des clés basée sur le matériel. La clé privée de la CA ne touche jamais le disque. Voir Guide d'installation PKCS#11.
Ouvrez http://localhost:3000 dans votre navigateur.
Identifiants par défaut :
admindocker compose logs ephemera | grep "Password:"
Fichiers Compose alternatifs :
docker-compose.dev.yml — Développement avec builds locaux et syslogdocker-compose.test.yml — Inclut une cible SSH pour les tests de bout en bout# 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 fournit un mécanisme de sauvegarde sécurisé qui chiffre vos données critiques (clés de la CA, base de données) avec un mot de passe aléatoire, puis divise ce mot de passe en fragments Shamir. Cela garantit qu'aucune personne seule ne peut restaurer la sauvegarde, mais qu'un quorum le peut.
# Create encrypted backup and split password into 5 shards (threshold 3)
ephemera backup-create --k 3 --n 5 --out-dir ./backup
Ceci produit :
ephemera_backup.enc (L'archive chiffrée)backup_shard_1_of_5.json, etc. (Les fragments de mot de passe)Remarque : Stockez les fragments dans des emplacements sécurisés distincts. Stockez le fichier de sauvegarde chiffré en toute sécurité (il est inutile sans les fragments).
# 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 utilise un puissant moteur de politiques basé sur YAML pour le contrôle d'accès basé sur les rôles (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
Veuillez consulter SECURITY.md pour les informations de divulgation responsable.
Vous souhaitez contribuer ? Consultez nos Petites tâches pour les nouveaux contributeurs.
[!TIP] Le modèle de menace et les hypothèses de sécurité sont documentés ici. Les retours et critiques sont les bienvenus.
| Champ | Description |
|---|
timestamp | Horodatage UTC ISO 8601 |
match | Booléen — les deux moteurs étaient-ils d'accord ? |
versions.bridge | Version Python de GateBridge |
versions.gate0 | Version CLI de Gate0 |
versions.policy_hash | Hash SHA256 du policy.yaml |
context_hash | Hash SHA256 de l'entrée canonisée |
yaml_decision | Résultat du moteur YAML |
gate0_decision | Résultat du moteur Gate0 |
snapshot | Contexte complet (uniquement en cas de désaccord, limité en taille) |