〜/ .ssh / authorized_keys形式のキーを指定すると、キーの強度を簡単に判断できますか?


17

〜/ .ssh / authorized_keys [2]には公開鍵のリストが含まれています。

残念ながら、各公開キーはキーの強度(ビット数)を指定しません。

このファイルを1行ずつ処理し、キー強度を出力できるユーティリティはありますか?

のmanページをチェックしましたがssh-keygen、秘密鍵でしか機能しないようです。

また、pageantPuttyツールで表示されるのと同じ方法で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)"
ステファン

1
@Stefan:すべてのバージョンがmktemp(1)Xs:FreeBSDMac 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-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
アレクサンダーポグレブニャック

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_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.