ได้รับกุญแจในรูปแบบ ~ / .ssh / authorized_keys คุณสามารถกำหนดความแข็งแรงของกุญแจได้อย่างง่ายดาย?


17

~ / .ssh / authorized_keys [2] มีรายการของกุญแจสาธารณะ

น่าเสียดายที่แต่ละคีย์สาธารณะไม่ได้ระบุความแรงของคีย์ (จำนวนบิต)

มียูทิลิตี้ที่สามารถประมวลผลไฟล์นี้ทีละบรรทัดและส่งออกความแข็งแรงของคีย์ได้หรือไม่?

ฉันตรวจสอบหน้าคนสำหรับssh-keygenแต่ดูเหมือนว่าจะทำงานเฉพาะกับกุญแจส่วนตัว

นอกจากนี้ยังมีเครื่องมือที่จะเอาท์พุท sha1 hash แบบเดียวกับที่แสดงใน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)"
Stefan

1
@ Stefan: ไม่ได้ทุกรุ่นของmktemp(1)ความจำเป็นใน Xs: FreeBSD , Mac OS X แต่การเพิ่มพวกมันจะไม่ทำร้ายพฤติกรรมของคนที่ไม่ต้องการพวกเขา (พวกเขาแค่จบลงด้วย Xs ก่อนที่จะต่อท้ายแบบสุ่ม)
Chris Johnsen

โอ้ .. :) เจ๋ง ... ฉันพยายามเรียกใช้สคริปต์บนกล่องโค้งของฉัน... พูดต่อไป/home/steve/.scripts/key-strength: line 36: $1: unbound variable
เรื่อย ๆ

ขอบคุณ-lตัวเลือกเป็นสิ่งที่ฉันกำลังมองหา! ยังไม่น่าเชื่อว่าคุณไม่สามารถไปป์ที่ ssh-keygen และMUSTมีไฟล์บนดิสก์
Alexander Pogrebnyak

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

7

หากคุณมี zsh คุณสามารถทำสิ่งนี้ในรูปแบบหนึ่งซับ:

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

4

การคาดการณ์จากโซลูชัน zsh เป็นโซลูชันทุบตี

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

/ dev / fd / 63 ไม่ใช่ไฟล์กุญแจสาธารณะ
/ dev / fd / 63 ไม่ใช่ไฟล์กุญแจสาธารณะ

เกือบ ... สิ่งนี้ควรใช้งานได้ แต่ ssh-keygen ดูเหมือนจะไม่ชอบอ่านโดยตรงจาก fd ที่สร้างขึ้น การใช้ไฟล์ temp สำหรับ <(การเปลี่ยนเส้นทางจะใช้งานได้ทำไม)

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 / คีย์ (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_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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.