এসএসএইচ সার্ভার কী ফিঙ্গারপ্রিন্ট পান


82

কোনও এসএসএইচ সার্ভার কী ফিঙ্গারপ্রিন্টটিকে অনুমোদন না দিয়ে প্রোগ্রামগতভাবে পাওয়ার কোনও উপায় আছে ?

আমি চেষ্টা করছি ssh -v user@host false 2>&1 | grep "Server host key", তবে কী ভিত্তিক লেখক সেটআপ না করা থাকলে এটি একটি পাসওয়ার্ডের জন্য অপেক্ষা করে।

উত্তর:


71

আপনি একত্রিত করে এটি করতে পারেন ssh-keyscanএবং ssh-keygen:

$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file

(দুর্ভাগ্যক্রমে অনেক সহজ ssh-keyscan host | ssh-keygen -l -f /dev/stdinকাজ করে না)


1
হতে ssh-keygen -l -f - <(ssh-keyscan host)পারে, যদিও?
সিভিএন

21
ওপেনএসএইচ> = 7.2 এসএস-কিস্ক্যান স্টিডিনের কাছ থেকে পড়তে সক্ষম:ssh-keyscan host | ssh-keygen -lf -
মাইখাল

1
কেবল করুন:ssh-keygen -l -f <(ssh-keyscan host)
ক্রিস্টোফার

1
এটি শেল স্ক্রিপ্টগুলির জন্য একটি খারাপ অভিব্যক্তি, কারণ এটি শেলকে সমর্থন করে যা পসিক্স শেল দেয় না তার উপর নির্ভর করে।
Andreas Wiese

2
ssh-keygen -l -f -ssh-keygen 7.2 এবং উপরের হিসাবে প্রত্যাশার মতো কাজ করে। এটা তোলে stderr কিছু মন্তব্য লাইন উত্পাদন করে যে হিসাবে এন্থনি Geoghegan বা উত্তর উল্লেখিত ফিল্টার করা যেতে পারে,ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
সেডরিক নাইট

56

আমাকে সম্প্রতি এটি নিজেই করতে হয়েছিল তাই আমি ভেবেছিলাম এমন একটি উত্তর যুক্ত করব যা দেখায় যে কীভাবে এটি করা যায় ( ওপেনএসএসএইচ 7.2 বা আরও নতুন সংস্করণ সহ ) প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে এক লাইনে:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

নিম্নলিখিত পাঠ্যটি ব্যাখ্যা করে যে কীভাবে এই আদেশগুলি কাজ করে এবং ওপেনএসএসএইচ ইউটিলিটির পুরানো এবং নতুন সংস্করণগুলির মধ্যে আচরণের কিছু পার্থক্য তুলে ধরে।

সর্বজনীন হোস্ট কীগুলি আনুন

ssh-keyscanকমান্ড উন্নত ছিল যাতে ব্যবহারকারীরা SSH সার্ভারের এ প্রমাণীকরণ করতে ছাড়াই প্রকাশ্য হোস্ট কী পেতে পারেন। এর ম্যান পৃষ্ঠা থেকে:

ssh-keyscanবেশ কয়েকটি হোস্টের পাবলিক ssh হোস্ট কী সংগ্রহ করার জন্য একটি ইউটিলিটি। এটি ssh_known_hostsফাইল তৈরি এবং যাচাইকরণে সহায়তা করার জন্য ডিজাইন করা হয়েছিল ।

চাবির ধরন

আনার জন্য কী ধরণের -tবিকল্পটি ব্যবহার করে নির্দিষ্ট করা হয় ।

  • rsa1 (অপ্রচলিত এসএসএইচ প্রোটোকল সংস্করণ 1)
  • rsa
  • dsa
  • ecdsa (ওপেনএসএসএইচ এর সাম্প্রতিক সংস্করণ)
  • ed25519 (ওপেনএসএসএইচ এর সাম্প্রতিক সংস্করণ)

আধুনিক ওপেনএসএইচ প্রকাশে, আনতে হবে এমন ডিফল্ট কীগুলি হ'ল rsa (সংস্করণ ৫.১), ecdsa(সংস্করণ .0.০) এবং ed25519(version. version সংস্করণ থেকে)।

(ওপেনএসএসএইচ সংস্করণ 5.1 এর পূর্বে) এর পুরানো সংস্করণগুলির সাথে ssh-keyscan, ডিফল্ট কী টাইপটি ছিল সেকেলে rsa1(এসএসএইচ প্রোটোকল 1) তাই মূল প্রকারগুলি স্পষ্টভাবে নির্দিষ্ট করা দরকার:

ssh-keyscan -t rsa,dsa hostname

বেস 64 কীগুলির ফিঙ্গারপ্রিন্ট হ্যাশগুলি পান

ssh-keyscanবেস 64-এনকোডড ফর্ম্যাটে এসএসএইচ সার্ভারের হোস্ট কী মুদ্রণ করে । এটি একটি ফিঙ্গারপ্রিন্ট হ্যাশ রূপান্তর করতে, ssh-keygenইউটিলিটি -lনির্দিষ্ট পাবলিক কী এর ফিঙ্গারপ্রিন্ট মুদ্রণের জন্য তার বিকল্পের সাহায্যে ব্যবহার করা যেতে পারে ।

যদি ব্যাশ, জ্যাশ (বা কর্ন শেল) ব্যবহার করে থাকে তবে প্রক্রিয়া প্রতিস্থাপনটি হ্যান্ডি ওয়ান-লাইনারের জন্য ব্যবহার করা যেতে পারে:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

দ্রষ্টব্য : .2.২ এর আগে ওপেনএসএইচ-র সংস্করণ সহ, ssh-keygenফাইলগুলি পড়ার জন্য ব্যবহৃত ফাংশনগুলি নামক পাইপগুলি (এফআইএফও) খুব ভালভাবে পরিচালনা করে না তাই এই পদ্ধতিটি কাজ করবে না, এইভাবে অস্থায়ী ফাইলগুলি ব্যবহারের প্রয়োজন হয়।

হ্যাশিং অ্যালগরিদম

কীগুলির ssh-keygenমুদ্রণ SHA256 ফিঙ্গারপ্রিন্ট হ্যাশগুলির সাম্প্রতিক সংস্করণ । সার্ভার কী ফিঙ্গারপ্রিন্টের (পুরানো আচরণ) MD5 হ্যাশগুলি পেতে -E , হ্যাশ অ্যালগরিদম নির্দিষ্ট করতে বিকল্পটি ব্যবহার করা যেতে পারে:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)

পাইপলাইন ব্যবহার করা

যদি কোনও পসিক্স শেল ব্যবহার করে (যেমন dash) যা প্রক্রিয়া প্রতিস্থাপনের বৈশিষ্ট্যযুক্ত না, অস্থায়ী ফাইলগুলি ব্যবহার করে অন্য সমাধানগুলি কাজ করবে। তবে ওপেনএসএসএইচের নতুন সংস্করণ (.2.২ থেকে) সহ, একটি সাধারণ পাইপলাইন ব্যবহার করা যেতে পারে যেহেতু স্ট্যান্ডার্ড ইনপুট স্ট্রিমের ফাইল-নাম হিসাবে ssh-keygenস্বীকৃতি দেওয়া হবে -, এতে এক-লাইন পাইপলাইন কমান্ডের অনুমতি দেওয়া হবে।

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -

সুন্দর এবং পুরো উত্তর, একটি অস্থায়ী ফাইল থাকার চেয়ে এটি অবশ্যই ভাল! প্রক্রিয়া প্রতিস্থাপন সংস্করণ দিয়ে শুরুর দিকে আপনি একটি টিএল; ডিআর সরবরাহ করার পরামর্শ দিচ্ছি, অধৈর্য লোকেরা এটির দ্রুত খুঁজে পেতে? :)
goncalopp

3
উবুন্টু 14.04 এলটিএসে কাজ করছে বলে মনে হচ্ছে না; আমি একটি ত্রুটি পেয়েছি "/ dev / fd / 63 একটি সর্বজনীন কী ফাইল নয়"। উপপ্রসেস কাজ করে।
Melle

@ ম্লেলেব আমি 12.04 সিস্টেমে আমার অ্যাক্সেস পেয়েছি একই জিনিসটি পেয়েছি। আমি সন্দেহ করি যে ssh-keygenওপেনএসএসএইচ এর পুরানো সংস্করণগুলি থেকে ফিফো / নামযুক্ত পাইপ থেকে পড়তে সমস্যা হয়েছে। যখন আমি কিছু ফ্রি সময় পাই তখন আমি এটিকে লক্ষ্য করব (এবং আমার উত্তর আপডেট করব)।
অ্যান্টনি জিওগিগান

3
@ মেললেব আমার উত্সাহে বিভিন্ন উত্স কোড রিলিজ ডাউনলোড এবং ফাংশনে ডিবাগিং printfবিবৃতি সন্নিবেশ করার পরে do_fingerprint(), আমি দেখতে পেলাম যে before.২ এর আগে ওপেনএসএইচ সংস্করণ সহ ssh-keygenফাইলগুলি পড়ার জন্য ব্যবহৃত ফাংশনগুলি নামক পাইপগুলি (ফিফও) খুব ভালভাবে পরিচালনা করে না handle প্রক্রিয়া প্রতিস্থাপন পদ্ধতি কাজ করবে না।
অ্যান্টনি জিওগেইগান

এটি কাজ করে, তবে যদি এটি একটি ফিঙ্গারপ্রিন্ট যাচাই করতে ব্যবহার করা হয় তবে ব্যবহারকারীদের সচেতন হওয়া উচিত যে একটি রেসের শর্ত রয়েছে: আপনি যে কমান্ডটি নিয়েছেন সেই আঙুলের ছাপটি আপনি যে কীটি আনছেন তা অগত্যা নয়, যদি না আপনি ssh- কল করার আগে কীটি ডাম্প করেন unless এটিতে কীজেন।
কোডগনমে

20

nmapssh-hostkeyস্ক্রিপ্ট ব্যবহার করে এই ক্ষমতা প্রদান করে ।

কীটির হেক্সাডেসিমাল ফিঙ্গারপ্রিন্ট ফিরিয়ে দিতে:

$ nmap [SERVER] --script ssh-hostkey

কীটির সামগ্রীটি ফেরত দিতে:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full

কীটির ভিজ্যুয়াল বুদবুদ ফিরিয়ে আনতে

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'

উপরের সমস্তটি ফিরিয়ে দিতে:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all

উত্স: এনএম্যাপ ডক্স


3
এই উদাহরণগুলি কি ধরে নিয়েছে যে এসএসএইচ সর্বদা 22 বন্দরে চলছে? Ssh যদি একটি মানহীন পোর্টে শুনেন তবে কী হবে?
মার্টিন ভেজিটার 21

3
@ মার্টিনভেগটার (গুয়ারিন 42, যিনি মন্তব্য করতে পারেননি প্যারাফ্রেসিং) এনএমএপ-এর -pবিকল্প রয়েছে যা একটি বন্দর নির্দিষ্ট করতে পারে, যেমন -p 22000-vv
ভার্বোসটি

2

ফাইলজিলা হেক্সাডেসিমাল ফর্ম্যাটে এমডি 5 সহ হ্যাশগুলি প্রদর্শন করে।

আপনার উবুন্টু লিনাক্স মেশিনে এটি খুঁজতে এই কমান্ডটি ব্যবহার করুন:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)

দ্রষ্টব্য: আপনি যে মেশিনটি পরীক্ষা করতে চান তার আইপি দিয়ে "লোকালহোস্ট" প্রতিস্থাপন করুন।


1

এখানে একটি শেল স্ক্রিপ্ট রয়েছে (প্রধানত বোর্ন শেল তবে localকীওয়ার্ড ব্যবহার করে যা বেশিরভাগ আধুনিক ক্ষেত্রে পাওয়া যায় /bin/sh) আমি এটি করতে লিখেছি। এটি ব্যবহার করুন ssh-hostkey hostname। এটি প্রদত্ত হোস্টনাম বা আইপি ঠিকানার জন্য সমস্ত হোস্টকিগুলির জন্য sha256 এবং md5 ফর্ম্যাট উভয়ই ফিংগারপ্রিন্টগুলি প্রদর্শন করবে। আপনি কেবলমাত্র সেই নির্দিষ্ট ফর্ম্যাটটি দেখানোর জন্য দ্বিতীয় আর্গুমেন্ট হিসাবে ম্যানুয়ালি " md5" বা " sha256" নির্দিষ্ট করতে পারেন ।

এটি পুরানো ওপেনএসএসএইচ প্যাকেজগুলির সাথে সামঞ্জস্য করার জন্য পাইপিংয়ের পরিবর্তে একটি অস্থায়ী ফাইল ব্যবহার করে (অন্যান্য উত্তরে বর্ণিত)। অস্থায়ী ফাইল /dev/shmউপলব্ধ (শেয়ার করা মেমরি) যদি উপলব্ধ থাকে।

#!/bin/sh
usage () {
  printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}

ssh_hostkey () {
  local host="$1"
  local fprinthash="$2"
  local tmp=

  case "$host" in
    -h|--help|'')
      usage >&2
      return 1
      ;;
  esac

  case "$fprinthash" in
    md5|sha256|'') true;;
    *)
      usage >&2
      printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
      return 2
      ;;
  esac

  if test -d /dev/shm
  then tmp="$(mktemp -d -p /dev/shm)"
  else tmp="$(mktemp -d)"
  fi

  trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
  ssh-keyscan "$host" > "$tmp/f" 2> /dev/null
  case "$fprinthash" in
    sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
  esac
  case "$fprinthash" in
    md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
  esac

  trap - INT TERM EXIT
  rm -rf "$tmp" > /dev/null 2>&1
}

ssh_hostkey "$@"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.