SSH-Host-Schlüsselzertifikate, Gültigkeitsdauer aus der Ferne finden?

7

Ich habe eine Umgebung, in der ich SSH-Zertifikate zur Authentifizierung von SSH-Hostschlüsseln verwende. Ich spreche über die Art von Zertifikaten, die durch Ausführen erstellt werden ssh-keygen -s /path/to/ca -h .... Diese Zertifikate werden auch mit einem Gültigkeitsintervall erstellt, in dem angegeben ist, wann sie ablaufen. Diese Zertifikate werden jetzt schon lange genug verwendet, damit ich sie überwachen kann, um einen Überblick zu erhalten, wenn sie kurz vor dem Ablauf stehen.

Auf jede Art und Weise kann ich eine Remoteverbindung herstellen, ohne mich anzumelden, und irgendwie wird entweder das Gültigkeitsintervall alt angezeigt. das Zertifikat herunterladen lassen? Laufen ssh -vvvscheint nicht die Informationen anzuzeigen, die ich brauche. Beides scheint ssh-keyscannicht zertifikatsbewusst zu sein. Vielleicht eine Bibliothek, die ich mir nicht genau genug angesehen habe?

Im schlimmsten Fall kann ich immer ein Überwachungs-Plugin schreiben, das lokal ausgeführt wird und dessen Ausgabe analysiert ssh-keygen -L -f. Trotzdem fühlt sich ein Remote-Scan wirklich wie der bevorzugte Ansatz an.

andol
quelle
Der Vergleich der Ausgabe ssh -vvvmit einem zertifizierten Hostschlüssel mit dem Aussehen eines normalen Hostschlüssels könnte einen Hinweis darauf geben, wo nach einer Antwort gesucht werden soll.
Kasperd
Es wird nicht nur der Fingerabdruck gedruckt.
Dennis Kaarsemaker
openssl s_client -showcerts würde für einen Webserver funktionieren. Ich habe keinen SSH-Server mit einem zertifikatbasierten Schlüssel, auf dem ich ihn testen kann.
Fred der magische

Antworten:

6

Dies ist möglich, es fehlt jedoch die Werkzeugunterstützung. Ich habe eine Bibliothek gefunden, die das SSH-Protokoll gut genug spricht, damit ich ein Tool schreiben kann, um das Host-Zertifikat valid_before time ohne vollständige ssh-Anmeldung zu extrahieren. Hier ist es in der Go-Sprache. Ich hoffe, es hilft.

package main

import "golang.org/x/crypto/ssh"
import "fmt"
import "os"
import "time"

func ignoreCertChain(auth ssh.PublicKey, address string) bool {
    return true // Pretend all certificates are trusted.
}

var sawACert bool

func examineCert(cert *ssh.Certificate) bool {
  expires := cert.ValidBefore
  var humanReadable string
  if expires >= ssh.CertTimeInfinity {
    humanReadable = "infinity"
  } else if expires < (1 << 63) {
    humanReadable = time.Unix(int64(expires), 0).Format(time.RFC3339)
  } else {
    humanReadable = "the distant future"
  }
  fmt.Println("Cert expires at time", expires, "(" + humanReadable + ")")
  sawACert = true
  return true  // Reject the cert, to force early connection close.
}

func main() {
  serverHostPort := os.Args[1]
  checker := &ssh.CertChecker{
    IsHostAuthority: ignoreCertChain,
    IsRevoked: examineCert,
  }
  config := &ssh.ClientConfig{
    User: "test-sshcertscan-not-a-real-login-attempt",
    Auth: []ssh.AuthMethod{
      ssh.Password(""),
    },
    HostKeyCallback: checker.CheckHostKey,
  }
  sawACert = false
  client, err := ssh.Dial("tcp", serverHostPort, config);
  if err != nil && !sawACert {
    panic(fmt.Sprint("Cannot connect to ", serverHostPort, ", error: ",
                     err.Error()))
  } else if client != nil {
    defer client.Close()
  }
}

(Anweisungen zur schnellen Verwendung: Installieren Sie Go , speichern Sie den oben in sshcertscan.go gezeigten Code, führen Sie ihn aus go build sshcertscan.gound zeigen Sie ihn auf einen ssh-Server auf examplehost Port 22 mit ./sshcertscan examplehost:22.)

Aecolley
quelle
Wow, auch das Schreiben dieses Beispielcodes ging weit darüber hinaus, danke! Jetzt muss ich nur noch ein bisschen mehr lernen :)
andol
1

Leider kenne ich kein Open-Source-Tool. Es scheint, dass nmap es irgendwie mit NSE- Skripten abrufen kann (muss aber angepasst werden - check / usr / share / nmap / scripts).

Der Tectia SSH- Server von SSH enthält ein Tool namens ssh-fetchkey, mit dem das Zertifikat abgerufen wird. Anschließend können Sie die Details mit ssh-certview anzeigen.

Giovanni Tirloni
quelle
Ich verwende möglicherweise keine NSE-Skripte für diesen Zweck, aber es klingt definitiv nach etwas, für das ich möglicherweise zukünftige Verwendungen finden werde. Vielen Dank!
Andol
0

Ich fürchte, die Antwort lautet "das ist nicht möglich". Zumindest in keiner Weise, die ich gefunden habe, entweder mit dem openssh-Client oder der paramiko SSH-Bibliothek für Python. Ich würde eine lokale Prüfung vorschlagen, wie Sie sie beschrieben haben, kombiniert mit einer einfacheren Fernprüfung, die bestätigt, dass der von SSHD verwendete Schlüssel der Schlüssel ist, dessen Lebensdauer Sie gerade überprüft haben.

Dennis Kaarsemaker
quelle