~ / .ssh / authorized_keys 형식의 키를 사용하면 키 강도를 쉽게 결정할 수 있습니까?


17

~ / .ssh / authorized_keys [2]에는 공개 키 목록이 포함되어 있습니다.

불행하게도, 각 공개 키는 키 강도 (비트 수)를 지정하지 않습니다.

이 파일을 한 줄씩 처리하고 키 강도를 출력 할 수있는 유틸리티가 있습니까?

에 대한 매뉴얼 페이지를 확인 ssh-keygen했지만 개인 키에서만 작동하는 것처럼 보입니다.

또한 pageant퍼티 도구에 표시된 것과 같은 방식으로 sha1 해시를 출력하는 도구가 있습니까?

내가 찾고있는 형식 :

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)"
Stefan

1
@Stefan :의 모든 버전의 mktemp(1)필요성 X가 : FreeBSD의 , 맥 OS X . 그러나 그것들을 추가해도 그것들이 필요하지 않은 사람들의 행동을 해치지 않습니다 (임의의 접미사 앞에 X로 끝납니다).
Chris Johnsen

oh .. :) cool ... 아치 상자 에서 스크립트를 실행하려고했습니다 ... 계속 말하십시오/home/steve/.scripts/key-strength: line 36: $1: unbound variable
Stefan

고마워, -l옵션은 내가 찾던 것입니다! 여전히 ssh-keygen에 어떤 것도 파이프 할 수없고 MUST디스크에 파일이있을 수 없습니다 .
Alexander Pogrebnyak

1
openssh-7.2의 경우 더 이상이 마법을 수행 할 필요가 없으며 ssh-keygen전체 파일로 피드를 제공 할 수 있습니다 . 아래 내 답변을 참조하십시오 .
Jakuje

10

ssh-keygenopenssh-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
Alexander Pogrebnyak

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의 최신 버전이 특별한 파일의 읽기를 처리 할 수 ​​있습니다. 한 줄짜리 라이너가 완벽하게 작동하기 때문입니다.
Brian Minton

stdin에서 읽는 것과 같은 일부 버전은 거부합니다. 일반 파일을 통과하는 것은 모든 곳에서 작동합니다.
Marcin

3

authorized_keyssaravana가 만든 파일 에서 모든 지문을 나열하는 스크립트 :

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.