Имея ключи в формате ~ / .ssh / authorized_keys, вы можете легко определить прочность ключа?

17

~ / .ssh / authorized_keys [2] содержит список открытых ключей.

К сожалению, каждый открытый ключ не определяет надежность ключа (количество бит).

Есть ли утилита, которая может обрабатывать этот файл построчно и выводить силу ключа?

Я проверил страницы справочника ssh-keygen, но похоже, что он будет работать только с закрытыми ключами.

Кроме того, есть ли инструмент, который выводил бы хэш sha1 так же, как он отображается в pageantинструменте Putty?

Формат, который я ищу:

Key Algorithm  Strength  Hash                                             Comment
ssh-rsa        2048      00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff  user1@host1
ssh-rsa        2048      11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:11  user2@host2
Александр Погребняк
источник
2
Обратите внимание, что для openssh-7.2 вам больше не нужно использовать магию в принятом ответе, и вы можете просто передать ssh-keygenвесь файл целиком. Смотрите мой ответ ниже .
Jakuje

Ответы:

17

ssh-keygen может выполнять основную часть работы (генерировать отпечаток пальца из открытого ключа), но он не будет автоматически обрабатывать список из нескольких ключей, который обычно находится в authorized_keysфайле.

Вот скрипт, который разделяет ключи, передает их в ssh-keygen и создает нужную таблицу:

#!/bin/sh

# usage: authkeys-report <authorized_keys-file>    

set -ue

tmp="$(mktemp -t fingerprint-authkeys.XXXXXXXX)"
trap 'rm -f "$tmp"' 0

while read opts key; do
    case "$opts" in
        [0-9]*|ssh-dss|ssh-rsa)
            # not options, first "word" is part of key
            key="$opts $key"
        ;;
    esac
    echo "$key" >$tmp
    set -- $(ssh-keygen -lf "$tmp")
    bits="$1" fingerprint="$2"

    set -- $key # Note: will mangle whitespace in the comment
    case "$1" in
        [0-9]*) # SSH v1 key
            type=rsa1
            shift 3
        ;;
        ssh-rsa|ssh-dss) # SSH v2 key
            type="$1"
            shift 2
        ;;
        *)
            type=unknown
            set --
        ;;
    esac

    printf '%-14s %-9s %s %s\n' "$type" "$bits" "$fingerprint" "$*"
done <$1
Крис Джонсен
источник
tmp="$(mktemp -t fingerprint-authkeys)"должен быть изменен наtmp="$(mktemp -t fingerprint-authkeys.XXX)"
Стефан
1
@Stefan: Не все версии mktemp(1)нуждаются в Xs: FreeBSD , Mac OS X . Но добавление их не повредит поведению тех, кто в них не нуждается (они просто заканчиваются знаком X перед случайным суффиксом).
Крис Джонсен
ох .. :) круто ... я попробовал запустить скрипт на своей арочной коробке ... продолжал говорить/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Стефан
Спасибо, -lвариант действительно то, что я искал! Тем не менее, невероятно, что вы ничего не можете передать в ssh-keygen и сохранить MUSTфайл на диске.
Александр Погребняк
1
Обратите внимание, что для openssh-7.2 вам больше не нужно делать эту магию, и вы можете просто ssh-keygenзаполнить весь файл. Смотрите мой ответ ниже .
Jakuje
10

ssh-keygenв openssh-7.2 (в настоящее время в Fedora и Ubuntu Xenial по крайней мере) поддерживает чтение нескольких ключей из одного файла. Поэтому работает просто

# ssh-keygen -l -f ~/.ssh/authorized_keys
2048 SHA256:xh0IVbI... jakuje@jakuje (RSA)
2048 SHA256:xh0IVbI... jakuje@jakuje (RSA)

приводит к желаемому результату.

Jakuje
источник
1
Хорошо, что они наконец исправили недостаток. +1
Александр Погребняк
7

Если у вас есть zsh, вы можете сделать это как однострочник:

while read line ; do ssh-keygen -lf =(echo $line); done < .ssh/authorized_keys
GaryO
источник
4

экстраполируя из Zsh решение Bash решение

while read line ; do ssh-keygen -l -f <(echo $line); done < .ssh/authorized_keys 

/ dev / fd / 63 не является файлом с открытым ключом.
/ dev / fd / 63 не является файлом с открытым ключом.

почти ... Это должно работать, но ssh-keygen, похоже, не любит читать напрямую из сгенерированного fd. Используя временный файл для перенаправления <(, он затем работает. Почему?

while read line
do
  cat > /tmp/key <(echo $line)
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 

1024 1f: c7: da: ef: ff: ff: ff: ff: c8: 77: c6: f8: 1f: dd: f3: 1a / tmp / key (RSA)
3072 83: cd: af: b4: ff: ff: ff: ff: 02: 30: e7: 1e: 47: ed: c5: 69 / tmp / key (RSA)

конечно тогда ты можешь легче написать это и быть счастливым

while read line
do
  echo $line > /tmp/key
  ssh-keygen -l -f /tmp/key
done < .ssh/authorized_keys 
rm /tmp/key
Gunstick
источник
Может быть, более новая версия ssh-keygen может обрабатывать чтение из специального файла, потому что ваш однострочный режим отлично работает для меня.
Брайан Минтон
Некоторые версии, как чтение из стандартного ввода, другие отказываются. Переход через обычный файл работает везде.
Марчин
3

Скрипт для отображения всех отпечатков пальцев из authorized_keysфайла, созданного saravana:

#!/usr/bin/ksh

USER=`whoami`
USER_H=` lsuser -a home $USER |awk -F '=' '{print $2}'`

cat $USER_H/.ssh/authorized_keys| while read line
do
  echo $line > /tmp/finger_print
  echo "************* Key,finger print details below ***************************"

  cat /tmp/finger_print
  echo

  ssh-keygen -l -f /tmp/finger_print|grep -v not|awk '{print $1" " $2 " " $4}'
  if ssh-keygen -l -f /tmp/finger_print|grep "is not a" > /dev/null 2>&1
  then
    echo "The above key is an Invalid Key,Please correct it"
  fi

  echo "========================================================================"

  rm /tmp/finger_print
done
Saravana
источник