Question Comment obtenir toutes les empreintes digitales du fichier .ssh / registered_keys (2)


Existe-t-il un moyen simple d’obtenir une liste de toutes les empreintes digitales entrées dans le fichier .ssh / allowed_keys || Fichier .ssh / registered_keys2?

ssh-keygen -l -f .ssh/authorized_keys 

renverra uniquement les empreintes digitales de première ligne / entrée / publickey

pirater avec awk:

awk 'BEGIN { 
    while (getline < ".ssh/authorized_keys") {
        if ($1!~"ssh-(r|d)sa") {continue}
        print "Fingerprint for "$3
        system("echo " "\""$0"\"> /tmp/authorizedPublicKey.scan; \
            ssh-keygen -l -f /tmp/authorizedPublicKey.scan; \
            rm /tmp/authorizedPublicKey.scan"
        )
    }
}'

mais existe-t-il un moyen plus simple ou une commande ssh que je n'ai pas trouvée?


30
2017-08-01 10:29


origine


Pour faire cela de manière fiable, vous devez considérer le champ options dans authorized_keys fichier, que le ssh-keygen baulks à. je recherche un moyen fiable pour l'analyser mais le meilleur que je pourrais venir est couvert par cette réponse. - starfry


Réponses:


Voici un autre hack utilisant plain bash sans fichiers temporaires:

while read l; do
  [[ -n $l && ${l###} = $l ]] && ssh-keygen -l -f /dev/stdin <<<$l;
done < .ssh/authorized_keys

Vous pouvez facilement en faire une fonction dans votre .bashrc:

function fingerprints() {
  local file="${1:-$HOME/.ssh/authorized_keys}"
  while read l; do
    [[ -n $l && ${l###} = $l ]] && ssh-keygen -l -f /dev/stdin <<<$l
  done < "${file}"
}

et appelez-le avec:

$ fingerprints .ssh/authorized_keys

35
2017-08-01 11:47



sympa @Raphink, merci. ajoutée code.childno.de/marcel/changeset/afdce0dd ;) Une note: ssh-keygen -l -f /dev/stdin semble ne pas fonctionner sur un mac .. néanmoins non pertinent pour les serveurs mais gnaa apple ou est-ce un "problème" BSD /dev/stdin is not a public key file.?! - childno͡.de
Lecture de /dev/stdin n’est pas une bonne idée en général, il vaut mieux utiliser -, mais pour une raison quelconque ssh-keygen ne sait pas -... - ℝaphink
Ne fonctionne pas sur Mac? - Will
Cela ne fonctionne pas si les clés sont préfixées avec des options. - starfry
@ ℝaphink: J'irais pour local file="${1:-$HOME/.ssh/authorized_keys}" pour lui permettre de fonctionner sans aucun argument et par défaut à l'habituel ~/.ssh/authorized_keys déposer et citer le < "$file" utilisé comme entrée dans le while boucle. - 0xC0000022L


Voici un moyen portable d'afficher toutes les empreintes clés d'un fichier donné, testé sur Mac et Linux:

#!/bin/bash

fingerprint_keys()
{
    if (( $# != 1 )); then
        echo "Usage: ${FUNCNAME} <authorized keys file>" >&2
        return 1
    fi

    local file="$1"
    if [ ! -r "$file" ]; then
        echo "${FUNCNAME}: File '${file}' does not exist or isn't readable." >&2
        return 1
    fi

    # Must be declared /before/ assignment, because of bash weirdness, in
    # order to get exit code in $?.
    local TMPFILE

    TEMPFILE=$(mktemp -q -t "$0.XXXXXXXXXX")
    if (( $? != 0 )); then
        echo "${FUNCNAME}: Can't create temporary file." >&2
        return 1
    fi

    while read line; do
        # Make sure lone isn't a comment or blank.
        if [[ -n "$line" ]] && [ "${line###}" == "$line" ]; then
            # Insert key into temporary file (ignoring noclobber).
            echo "$line" >| "$TEMPFILE"

            # Fingerprint time.
            ssh-keygen -l -f "$TEMPFILE"

            # OVerwrite the file ASAP (ignoring noclobber) to not leave keys
            # sitting in temp files.
            >| "$TEMPFILE"
        fi
    done < "$file"

    rm -f "$TEMPFILE"
    if (( $? != 0 )); then
        echo "${FUNCNAME}: Failed to remove temporary file." >&2
        return 1
    fi
}

Exemple d'utilisation:

bash $ fingerprint_keys ~/.ssh/authorized_keys
2048 xx:xx:xx:xx:xx:xx:xx:xx:bb:xx:xx:xx:xx:xx:xx:xx  x@x.local (RSA)
bash $ 

7
2017-07-28 03:00



Désolé de dire cela, mais ce n'est ni "plus simple", ni "plus petit", ni même "plus intelligent" et ne prend pas une autre approche que celle indiquée ci-dessus. juste un script utilisant plus de gestionnaires d'erreurs;) - childno͡.de
Ce qui le rend plus sûr, non? Vous êtes le bienvenu pour apporter des modifications, mais pourquoi un vote négatif? Je ne vous ai pas dit qu'il s'agissait d'une meilleure solution que la vôtre ... Je pense qu'un fichier temporaire sécurisé est préférable, et qu'il est nécessaire de disposer d'une plus grande sécurité pour les scripts. De plus, la version ci-dessus est compatible avec noclobber. - Will
Pour un système FreeBSD (qui n'utilise pas bash par défaut), j'ai apporté les modifications suivantes: En supposant que bash est installé à partir des ports, remplacez la première ligne par #!/usr/local/bin/bash. J'ai ensuite appelé la fonction en ajoutant ceci comme dernière ligne: fingerprint_keys $@. J'ai sauvegardé le script sous fingerprints.bash, en le marquant comme exécutable avec chmod u+x ./fingerprints.bash. De plus, j'ai ajouté un commentaire au fichier avec le lien vers cette réponse, comme ci-dessus, vers le haut. # solution from "Will" on SO http://serverfault.com/a/615892/126742. Appelez ça comme ça ./fingerprints.bash ~/.ssh/authorized_keys. - derekv
@derekv: la méthode la plus portable consiste à utiliser le hashbang suivant: #!/usr/bin/env bash, parce que le chemin pour env est très portable et il raconte env exécuter le Bash qu’il connaît. - 0xC0000022L


Un one-liner basé sur le / dev / stdin astuce de La réponse de ℝaphink et man xargs → EXEMPLES:

egrep '^[^#]' ~/.ssh/authorized_keys | xargs -n1 -I% bash -c 'ssh-keygen -l -f /dev/stdin <<<"%"'

2
2018-01-26 12:39



Cela fonctionne très bien et, étant donné qu'il s'agit d'une ligne, vous pouvez facilement utiliser la commande via SSH. Merci! - Thibaut Barrère