7 votes

ssh host key certificates, trouver la période de validité à distance ?

J'ai un environnement où j'utilise des certificats ssh pour authentifier les clés hôtes ssh. Je parle du type de certificats créés par l'exécution de la commande ssh-keygen -s /path/to/ca -h ... . Ces certificats sont également créés avec un intervalle de validité, indiquant le moment où ils expireront. Ces certificats sont maintenant utilisés depuis assez longtemps pour que je commence à les surveiller, afin d'être averti lorsqu'ils approchent de leur expiration.

Est-il possible d'établir une connexion à distance, sans se connecter, et d'obtenir l'affichage de l'intervalle de validité ou le téléchargement du certificat ? Exécution de ssh -vvv ne semblent pas afficher les informations dont j'ai besoin. Il en va de même pour ssh-keyscan semblent être au courant des certificats. Peut-être s'agit-il d'une bibliothèque que je n'ai pas examinée de suffisamment près ?

Dans le pire des cas, je peux toujours écrire un plugin de surveillance qui s'exécute localement et analyse la sortie de la fonction ssh-keygen -L -f . Pourtant, un scan à distance semble vraiment être l'approche préférable.

9voto

aecolley Points 933

C'est possible, mais il manque le support des outils. J'ai trouvé une bibliothèque qui parle suffisamment bien du protocole SSH pour me permettre d'écrire un outil permettant d'extraire le temps de validité du certificat de l'hôte sans avoir besoin d'une connexion ssh complète. Le voici, dans le langage Go. J'espère que cela vous aidera.

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()
  }
}

(Instructions rapides d'utilisation : installer Allez sur enregistrez le code vu ci-dessus dans sshcertscan.go, exécutez go build sshcertscan.go puis le faire pointer vers un serveur ssh sur le port 22 de examplehost avec ./sshcertscan examplehost:22 .)

1voto

Giovanni Tirloni Points 5581

Malheureusement, je ne connais pas d'outil open-source. Il semble que nmap soit capable de le récupérer d'une manière ou d'une autre à l'aide de NSE scripts (mais nécessite quelques ajustements -- vérifier /usr/share/nmap/scripts).

SSH Tectia SSH comprend un outil appelé ssh-fetchkey qui récupère le certificat et vous pouvez ensuite utiliser ssh-certview pour en afficher les détails.

0voto

jowi Points 111

Je crains que la réponse soit "ce n'est pas possible". Du moins, pas de la manière que j'ai trouvée, en utilisant soit le client openssh, soit la bibliothèque SSH paramiko pour Python. Je suggérerais un contrôle local tel que vous l'avez décrit, combiné à un contrôle à distance plus simple qui vérifie que la clé utilisée par SSHD est la clé dont vous venez de vérifier la durée de vie du certificat.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X