Имея ключи в формате ~ / .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)

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


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

7

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

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

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

Может быть, более новая версия 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.