Entwicklung eines Verfahrens für den Notzugang zu SSH-Hosts mit Hardware-Schlüsseln

Entwicklung eines Verfahrens für den Notzugang zu SSH-Hosts mit Hardware-Schlüsseln

In diesem Beitrag entwickeln wir ein Verfahren für den Notzugriff auf SSH-Hosts unter Verwendung von Sicherheits-Hardware-Schlüsseln im Offline-Modus. Dies ist nur einer der Ansätze, den Sie anpassen können. Wir werden die SSH-Zertifizierungsstelle für unsere Hosts auf dem Sicherheits-Hardware-Schlüssel speichern. Dieses Schema funktioniert praktisch auf jedem OpenSSH, einschließlich SSH mit Single Sign-On.

Warum das Ganze? Nun, es ist eine Notlösung. Es ist ein Hintertürchen, das Ihnen den Zugriff auf Ihren Server ermöglicht, wenn aus irgendeinem Grund nichts anderes mehr hilft.

Warum Zertifikate anstelle von öffentlichen/privaten Schlüsseln für den Notzugriff verwenden?

  • Im Gegensatz zu öffentlichen Schlüsseln kann die Gültigkeitsdauer von Zertifikaten sehr kurz sein. Sie können ein Zertifikat generieren, das eine Minute oder sogar fünf Sekunden gültig ist. Nach Ablauf dieser Frist wird das Zertifikat für neue Verbindungen unbrauchbar. Dies ist ideal für den Notzugriff.
  • Sie können ein Zertifikat für jedes Benutzerkonto auf Ihren Hosts erstellen und solche "Einmal"-Zertifikate bei Bedarf an Kollegen senden.

Was Sie benötigen

  • Sicherheits-Hardware-Schlüssel, die resident keys unterstützen.
    Resident Keys sind kryptografische Schlüssel, die vollständig im Sicherheitsschlüssel gespeichert werden. Manchmal sind sie durch einen alphanumerischen PIN-Code geschützt. Der öffentliche Teil des resident keys kann, wenn nötig, zusammen mit dem Descriptor des privaten Schlüssels aus dem Sicherheitsschlüssel exportiert werden. Unterstützung für resident keys bieten beispielsweise USB-Schlüssel der Yubikey 5-Serie. Es ist wünschenswert, dass sie ausschließlich für den Notzugriff auf den Host bestimmt sind. Für diesen Beitrag werde ich nur einen Schlüssel verwenden, aber Sie sollten einen zusätzlichen als Backup haben.
  • Einen sicheren Ort zur Aufbewahrung dieser Schlüssel.
  • OpenSSH Version 8.2 oder höher auf Ihrem lokalen Computer und auf den Servern, auf die Sie Notzugriff benötigen. Ubuntu 20.04 wird mit OpenSSH 8.2 geliefert.
  • (optional, aber wünschenswert) CLI-Tool zur Überprüfung von Zertifikaten.

Vorbereitung

Zunächst müssen Sie eine Zertifizierungsstelle erstellen, die sich auf dem Sicherheitsschlüssel befindet. Stecken Sie den Schlüssel ein und starten Sie:

$ ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [security key ID]

Als Kommentar (-C) habe ich yubikey-9-512-742@smallstep.com angegeben, um nicht zu vergessen, zu welchem Sicherheitsschlüssel dieses Zertifizierungszentrum gehört.

Neben der Hinzufügung des Schlüssels zu Yubikey werden lokal zwei Dateien generiert:

  1. sk-user-ca, ein Schlüsseldescriptor, der auf den privaten Schlüssel verweist, der im Sicherheitsschlüssel gespeichert ist,
  2. sk-user-ca.pub, der der öffentliche Schlüssel für Ihr Zertifizierungszentrum sein wird.

Aber keine Sorge, auf Yubikey befindet sich noch ein weiterer privater Schlüssel, der nicht extrahiert werden kann. Daher ist hier alles sicher.

Fügen Sie auf Hosts im Namen des Benutzers root (sofern noch nicht geschehen) die folgende Zeile in die Konfiguration Ihres SSHD (\/etc\/ssh\/sshd_config) ein:

TrustedUserCAKeys \/etc\/ssh\/ca.pub

Fügen Sie dann den öffentlichen Schlüssel (sk-user-ca.pub) zu \/etc\/ssh\/ca.pub auf dem Host hinzu.

Starten Sie den Dienst neu:

# /etc/init.d/ssh restart

Jetzt können wir versuchen, auf den Host zuzugreifen. Aber zuerst benötigen wir ein Zertifikat. Erstellen Sie ein Schlüsselpaar, das mit dem Zertifikat verbunden ist:

$ ssh-keygen -t ecdsa -f emergency

Zertifikate und SSH-Paare
Manchmal hat man das Bedürfnis, ein Zertifikat als Ersatz für ein Paar aus öffentlichem/privatem Schlüssel zu verwenden. Aber für die Benutzerauthentifizierung reicht ein einzelnes Zertifikat nicht aus. Jedes Zertifikat hat auch einen zugehörigen privaten Schlüssel. Deshalb müssen wir dieses «Notfall»-Schlüsselpaar generieren, bevor wir uns ein Zertifikat ausstellen. Wichtig ist, dass wir dem Server das signierte Zertifikat zusammen mit dem Schlüsselpaar zeigen, für das wir den privaten Schlüssel besitzen.

So bleibt der Austausch öffentlicher Schlüssel weiterhin lebendig. Das funktioniert sogar mit Zertifikaten. Zertifikate befreien den Server einfach von der Notwendigkeit, öffentliche Schlüssel zu speichern.

Erstellen Sie nun das Zertifikat selbst. Ich benötige die Authentifizierung des Benutzers ubuntu in einem Zeitraum von 10 Minuten. Sie können es nach Ihrem eigenen Geschmack machen.

$ ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency

Sie werden aufgefordert, das Zertifikat mit Fingerabdrücken zu signieren. Sie können zusätzliche Benutzernamen angeben, die durch Kommas getrennt sind, z. B. -n ubuntu,carl,ec2-user.

Das ist es, jetzt haben Sie ein Zertifikat! Jetzt müssen die richtigen Berechtigungen festgelegt werden:

$ chmod 600 emergency-cert.pub

Danach können Sie den Inhalt Ihres Zertifikats einsehen:

$ step ssh inspect emergency-cert.pub

So sieht mein Zertifikat aus:

emergency-cert.pub
        Typ: ecdsa-sha2-nistp256-cert-v01@openssh.com Benutzerzertifikat
        Öffentlicher Schlüssel: ECDSA-CERT SHA256:EJSfzfQv1UK44/LOKhBbuh5oRMqxXGBSr+UAzA7cork
        Signierende CA: SK-ECDSA SHA256:kLJ7xfTTPQN0G/IF2cq5TB3EitaV4k3XczcBZcLPQ0E
        Schlüssel ID: "test-key"
        Seriennummer: 0
        Gültig: von 2020-06-24T16:53:03 bis 2020-06-24T17:03:03
        Prinzipale:
                ubuntu
        Kritische Optionen: (keine)
        Erweiterungen:
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc

Hier ist der öffentliche Schlüssel – der von uns erstellte Schlüssel emergency, verbunden mit der Zertifizierungsstelle sk-user-ca.

Endlich sind wir bereit, den SSH-Befehl auszuführen:


$ ssh -i emergency ubuntu@my-hostname
ubuntu@my-hostname:~$

  1. Jetzt können Sie Zertifikate für jeden Benutzer auf dem Host erstellen, der Ihrer Zertifizierungsstelle vertraut.
  2. Sie können emergency entfernen. Sie können sk-user-ca behalten, aber Sie benötigen es nicht, da es sich auch auf dem Sicherheitsschlüssel befindet. Möglicherweise möchten Sie auch den ursprünglichen PEM-öffentlichen Schlüssel von Ihren Hosts entfernen (z. B. in ~/.ssh/authorized_keys für den Benutzer ubuntu), falls Sie ihn für den Notzugang verwendet haben.

Notzugang: Aktionsplan

Stecken Sie den Sicherheitsschlüssel ein und führen Sie den Befehl aus:

$ ssh-add -K

So fügen Sie den öffentlichen Schlüssel der Zertifizierungsstelle und den Schlüsseldeskriptor zum SSH-Agenten hinzu.

Exportieren Sie nun den öffentlichen Schlüssel, um das Zertifikat zu erstellen:

$ ssh-add -L | tail -1 > sk-user-ca.pub

Erstellen Sie ein Zertifikat mit einer Gültigkeitsdauer, zum Beispiel nicht länger als eine Stunde:

$ ssh-keygen -t ecdsa -f emergency
$ ssh-keygen -Us sk-user-ca.pub -I test-key -n [username] -V -5m:+60m emergency
$ chmod 600 emergency-cert.pub

Und nun wieder SSH:

$ ssh -i emergency username@host

Wenn Ihre Datei .ssh/config bei der Verbindung Probleme verursacht, können Sie ssh mit dem Parameter -F none ausführen, um sie zu umgehen. Wenn Sie das Zertifikat einem Kollegen senden müssen, ist die einfachste und sicherste Option Magic Wormhole. Dafür benötigt man nur zwei Dateien – in unserem Fall sind das emergency und emergency-cert.pub.

Was mir an diesem Ansatz gefällt, ist die Hardwareunterstützung. Sie können Sicherheitsschlüssel im Safe aufbewahren, und sie gehen nirgendwohin.

Als Werbung

Epische Server sind günstige VPS mit leistungsstarken AMD-Prozessoren, CPU-Kernfrequenz bis zu 3,4 GHz. Die maximale Konfiguration kann nahezu jede Aufgabe lösen – 128 CPU-Kerne, 512 GB RAM, 4000 GB NVMe. Machen Sie mit!

Entwicklung eines Verfahrens für den Notzugang zu SSH-Hosts mit Hardware-Schlüsseln

Quelle: habr.com

60GB SSD 8Gb DDR4