YubiHSM 2 + cert-manager. Hardware-signierte TLS-Zertifikate auf Kubernetes
Was die Diskussion ausgelöst hat
Ich habe einen externen cert-manager-Issuer gebaut, der TLS-Zertifikate mit einem privaten Schlüssel signiert, der in einem YubiHSM 2 liegt. Der Schlüssel verlässt das Gerät nie. Ist das Overkill für ein Homelab? Absolut. Aber wenn man schon seine eigene CA betreibt, kann man den privaten Schlüssel auch gleich physisch unmöglich zu stehlen machen.
Der eingebaute CA-Issuer von cert-manager speichert Ihren Signierschlüssel einfach in einem Kubernetes Secret, was nur einen kubectl get secret davon entfernt ist, gestohlen zu werden. Der spaßige Teil dieses Projekts war, das HSM in Gos crypto.Signer-Interface einzubinden, sodass cert-manager gar nicht merkt, dass die Signatur von Hardware kommt. Es funktioniert einfach wie jeder andere Issuer.
Ausführlicher Beitrag mit Architektur und Code: https://charles.dev/blog/yubihsm-cert-manager
Als Nächstes baue ich eine hardwaregestützte Bitcoin-Wallet mit demselben YubiHSM 2. Ich beantworte in der Zwischenzeit gerne Fragen.
Was in den Kommentaren auffiel
Diskussionspunkt 1
Es physisch zu stehlen reicht auch nicht. Der Schlüssel ist als nicht exportierbares Objekt gespeichert, es gibt also buchstäblich keine Möglichkeit, ihn über USB oder irgendeine API auszulesen. Das HSM signiert Dinge, gibt aber niemals den Schlüssel selbst preis. Ihn tatsächlich zu extrahieren würde invasive Angriffe auf Chip-Ebene mit spezialisierter Laborausrüstung erfordern. An diesem Punkt greift man im Grunde Silizium an, nicht Software.
Diskussionspunkt 2
Kann man YubiHSM clustern, mit Echtzeit-Schlüsselverteilung und Load Balancing? Also, wenn ein Schlüssel stirbt, wie sichert man Redundanz, Failover mit Garantie auf keinen Datenverlust? Load Balancing über mehrere YubiHSM?
Diskussionspunkt 3
Ist es physisch zu stehlen nicht der einzige Weg?
Diskussionspunkt 4
Ich habe eine Go-Bibliothek namens yubihsm-sync, die kryptografische Objekte über 2-5+ YubiHSMs hinweg mit einem Hintergrund-Daemon repliziert. Sie erkennt kontinuierlich Änderungen und synchronisiert sie über alle Geräte einer Gruppe hinweg. Stirbt ein HSM, haben die anderen bereits alle Schlüssel. Das geschieht über gemeinsame Wrapping-Keys. Dasselbe Projekt enthält ein protokollbewusstes Gateway, das zwischen Ihren Anwendungen und den HSMs sitzt. Es spricht das native YubiHSM-Protokoll, sodass Apps nicht wissen müssen, dass mehrere Geräte dahinterstehen. Es unterstützt mehrere Routing-Modi: - Primary/Failover — bei einem HSM bleiben, ein anderes automatisch befördern, wenn es ausfällt - Round-Robin — Anfragen über alle gesunden HSMs verteilen - Inhaltsbasiert — zum spezifischen HSM routen, das das angeforderte Objekt besitzt Es handhabt Session-Affinität, Connection Pooling und Health-Checking automatisch. Ich werde in einem zukünftigen Beitrag der Reihe über diese Tools und das, was ich beim Bauen gelernt habe, schreiben.
Diskussionspunkt 5
Aktuell kein öffentliches Repo. Das ist ein Herzensprojekt, aus dem ich eines Tages gerne etwas Kommerzielles machen würde, deshalb halte ich den Quellcode vorerst privat. Im Moment konzentriere ich mich voll darauf, die zugrunde liegenden Bibliotheken und tiefe Integrationen über den gesamten Stack hinweg aufzubauen. Trotzdem ist konzeptionell nichts von dem, was ich mache, ein Geheimrezept. YubiHSMs Wrap-Key-Export/Import-Mechanismus ist das, was Replikation möglich macht, und das Protokoll ist von Yubico gut dokumentiert. Jemand mit genug Motivation könnte das durchaus selbst bauen, und ich hoffe, die Beiträge sind als Roadmap dafür nützlich. Mein nächster Blogbeitrag handelt von meiner BTC-Implementierung und der TUI, die ich dazu gebaut habe. Ein Teil des Spaßes beim Schreiben dieser Beiträge ist zu sehen, woran die Leute interessiert sind, also werden Fragen wie Ihre wirklich geschätzt. Melden Sie sich gerne, wenn Sie mehr Details möchten oder zusammenarbeiten wollen.
Thread-Übersicht
- Ursprüngliches Subreddit: r/kubernetes
- Ursprünglicher Autor: u/net_charlessullivan
- Reddit-Score: 63
- Kommentaranzahl: 18
- Ursprünglicher Thread: https://www.reddit.com/r/kubernetes/comments/1r6b2fg/yubihsm_2_certmanager_hardwaresigned_tls/