Ssh में सख्त होस्ट कुंजी जाँच को कैसे निष्क्रिय करें?


223

मैं sshUbuntu 11.04 के लिए सख्त होस्ट कुंजी चेकिंग को अक्षम करना चाहूंगा । यह कैसे करना है?


10
हाय karthick87, मुझे आशा है कि आप उस परिवर्तन को बनाने के सुरक्षा निहितार्थ को समझेंगे;)
पैंथर

1
हालांकि, यह ध्यान दिया जाना चाहिए कि आप जानना चाहते हैं कि मेजबान कुंजी बदल गई है या नहीं । यह एक बड़ा लाल झंडा है जो किसी को मेजबान को खराब कर सकता है। तो UserKnownHostFile / dev / null वास्तव में एक बुरा विचार है।

4
एसएसएच का उपयोग न केवल दूरस्थ कनेक्शन के लिए किया जाता है, आप जानते हैं। सभी मेजबानों को जो मैं कनेक्ट कर रहा हूं, वे अपनी मेज पर ढेर में हैं और एक ही आईपी साझा करते हैं, इसलिए मेरे पास हमेशा नया मेजबान चेतावनी है।
बारफू अल्बिनो

यदि आप किसी विशेष होस्ट के लिए केवल संदेश निकालना चाहते हैं, तो संबंधित लाइन ~ / .ssh / ज्ञात_होस्ट को हटा दें।
स्टैकएक्सचेंजर

2
यदि आपको केवल एक बार बिना किसी त्रुटि के कनेक्ट करने की आवश्यकता है:ssh -o UserKnownHostsFile=/dev/null
odinho - वेलमॉन्ट

जवाबों:


227

आपके ~/.ssh/config(यदि यह फ़ाइल मौजूद नहीं है, तो इसे बनाएं):

Host *
    StrictHostKeyChecking no

यह आपके द्वारा कनेक्ट किए जाने वाले सभी होस्ट के लिए इसे बंद कर देगा। *यदि आप केवल कुछ होस्ट पर लागू करना चाहते हैं, तो आप एक होस्टनाम पैटर्न के साथ बदल सकते हैं ।

सुनिश्चित करें कि फ़ाइल पर अनुमतियाँ केवल स्वयं तक पहुँच प्रतिबंधित करें:

sudo chmod 400 ~/.ssh/config

1
configमेरे घर निर्देशिका में कोई फ़ाइल नाम नहीं है ।
karthick87

4
एक बनाओ - फ़ाइल की पूरी सामग्री ऊपर मेरे उद्धरण में है। ध्यान दें कि यह .sshआपके होमडायर के उपनिर्देशिका में भी है।
सीज़ियम

क्या इंडेंटेशन की आवश्यकता है? मेरी प्रविष्टियाँ एक खाली रेखा द्वारा विभाजित ब्लॉकों की तरह दिखती हैं।
एंडी गीगा

4
यह कई मामलों में नासमझी है, अक्सर आप इसे केवल एक बार अक्षम करना चाहते हैं:ssh -o UserKnownHostsFile=/dev/null
ओडिन्हो - वेलमोंट

1
mkdir -p ~ / .ssh && echo "host *"> ~ / .ssh / config && echo "StrictHostKeyChecking no" >> >> ~ /
.ssh

189

~/.ssh/configसभी होस्ट * के लिए इसे अपनी फ़ाइल में जोड़ने के बजाय , यह एक विशेष होस्ट को निर्दिष्ट करने के लिए सुरक्षित होगा।

आप इस तरह कमांड-लाइन पर एक पैरामीटर भी पास कर सकते हैं:

ssh -o StrictHostKeyChecking=no yourHardenedHost.com

ध्यान दें कि आपको आम तौर पर केवल एक बार प्रति होस्ट करने की आवश्यकता होती है क्योंकि यह पहली बार कहता है:Warning: Permanently added 'frxxx.blaps.net,10.11.12.13' (RSA) to the list of known hosts.
MarkHu

24
यह काम नहीं करेगा। इसके ssh -o UserKnownHostsFile=/dev/nullबजाय होना चाहिए ।
क्वर्टज़्गी

1
@qwertzguy यह काम करता है। आपका विकल्प इसे बना देगा ताकि मेजबान कुंजी हर बार खो जाए, जो उपयोगी और अधिक सुरक्षित है, लेकिन वह नहीं जो सवाल पूछा गया था।
जॉन बेंटले

@qwertzguy क्या आप इसे एक उत्तर के रूप में जोड़ सकते हैं, तुम्हारा वास्तव में quick'n'dirty के लिए सबसे अच्छा है "बस कनेक्ट मुझे पता है कि मैं क्या कर रहा हूँ"? निंजा-चोरी नहीं करना चाहता था आपका जवाब।
ओडिन्हो - वेलमॉन्ट

@ ओडिन्हो-वेलमॉन्ट किया
qwertzguy

106

यह इंगित करने के लायक है कि आपके ssh config में सेटिंग:

StrictHostKeyChecking no

इसका मतलब यह है कि hostkeys अभी भी .ssh / ज्ञात_होस्ट में जोड़े जाते हैं - आपको सिर्फ इस बारे में संकेत नहीं दिया जाएगा कि आप उन पर भरोसा करते हैं, लेकिन मेजबान को बदलना चाहिए कि मैं शर्त लगा सकता हूं कि आपको इसके बारे में बड़ी चेतावनी मिलेगी। आप किसी अन्य पैरामीटर को जोड़कर इस समस्या को हल कर सकते हैं:

UserKnownHostsFile /dev/null

यह इन सभी "नए खोजे गए" मेजबानों को कचरा बिन में जोड़ देगा। यदि कोई होस्ट कुंजी बदलता है, तो कोई परेशानी नहीं।

मुझे यह याद नहीं होगा कि इन चेतावनियों को दरकिनार करने का उल्लेख स्पष्ट सुरक्षा प्रभाव है - आपको सावधान रहना चाहिए कि आप इसे सही कारणों के लिए कर रहे हैं और जो आप वास्तव में कनेक्ट कर रहे हैं वह वही है जो आपको कनेक्ट करने के लिए है और नहीं एक दुर्भावनापूर्ण होस्ट, इस बिंदु पर जब से आप समाधान के रूप में ssh में सुरक्षा का एक बड़ा हिस्सा मिटा दिया है।

उदाहरण के लिए यदि आप कमांडलाइन के साथ इसे सेट करना चाहते हैं, तो पूरा कमांड होगा:

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host

हालांकि यह मूर्खतापूर्ण होगा - यह देखते हुए कि ssh config फ़ाइलों के लिए ऊपर दिए गए कार्य उदाहरण सभी मामलों में अधिक समझ में आने की संभावना है।


1
आप सही हैं, आपको बड़ी चेतावनी
मिलती है

1
मुझे लगता है कि यह सही उत्तर है। यह एक निजी स्थानीय नेटवर्क पर मेजबानों को जोड़ने के लिए अच्छी तरह से काम करता है।
स्टीव डेविस

4
करने के लिए एक उपनाम के लिए सुविधाजनक हो सकता है ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@host। मेरे मामले में मैं isshमेजबान से कनेक्ट करने के लिए उपयोग करता हूं जहां मुझे मेजबान कुंजी में परिवर्तन पता है।
ecerulm

1
@ecerulm - बस एक छोटा टाइपो: यह UserKnownHostsFileनहीं है UserKnownHostFiles
ग्रे पैंथर

20

FYI करें। मैं सिर्फ cssh का उपयोग करते समय होस्ट चेकिंग को अक्षम करना पसंद करता हूं।

alias cssh='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'

csshया ssh?
कीनॉर्ब

शायद वह cssh.sourceforge.net
MarkHu

क्या मैं गलत हूं, या दूसरा -oअनावश्यक है?
यॉकर्ट

1
alias relay='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 11086695@172.26.19.19 -p 2222'मेरे लिए काम करो
arganzheng

9

यदि आप एक समय आधार उपयोग पर अक्षम करना चाहते हैं:

ssh -o UserKnownHostsFile=/dev/null

यह भी काम करेगा अगर मेजबान कुंजी बदल जाती है और यह सुनिश्चित करेगा कि कुंजी को जोड़ा नहीं जाएगा जैसा कि अतिरिक्त सुरक्षा के लिए विश्वसनीय है।


6

इससे क्या लगता है ,

NoHostAuthenticationForLocalhost yes

आपके लिए काफी अच्छा हो सकता है । और आप अभी भी सुरक्षा के उस अनुरक्षण को बनाए रखने में सक्षम होंगे।


2

https://askubuntu.com/a/87452/129227 कॉन्फिग फाइल को संशोधित करने का सुझाव देता है जो मदद करता है। लेकिन किसी भी मेजबान के लिए चीजों को खोलने के बजाय मैं चाहता था कि यह प्रति मेजबान किया जाए। नीचे दी गई स्क्रिप्ट प्रक्रिया को स्वचालित करने में मदद करती है:

उदाहरण कॉल

./sshcheck somedomain site1 site2 site3

sshcheck स्क्रिप्ट

#!/bin/bash
# WF 2017-08-25
# check ssh access to bitplan servers

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'  
red='\033[0;31m'  
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}

#
# error
#
#   show an error message and exit
#
#   params:
#     1: l_msg - the message to display
error() {
  local l_msg="$1"
  # use ansi red for error
  color_msg $red "Error: $l_msg" 1>&2
  exit 1
}

#
# show the usage
#
usage() {
  echo "usage: $0 domain sites"
  exit 1 
}

#
# check the given server
#
checkserver() {
  local l_server="$1"
  grep $l_server $sconfig > /dev/null
  if [ $? -eq 1 ]
  then
    color_msg $blue "adding $l_server to $sconfig"
    today=$(date "+%Y-%m-%d")
    echo "# added $today by $0"  >> $sconfig
    echo "Host $l_server" >> $sconfig
    echo "   StrictHostKeyChecking no" >> $sconfig
    echo "   userKnownHostsFile=/dev/null" >> $sconfig
    echo "" >> $sconfig
  else
    color_msg $green "$l_server found in $sconfig"
  fi
  ssh -q $l_server id > /dev/null
  if [ $? -eq 0 ]
  then
    color_msg $green "$l_server accessible via ssh"
  else
    color_msg $red "ssh to $l_server failed" 
    color_msg $blue "shall I ssh-copy-id credentials to $l_server?"
    read answer
    case $answer in
      y|yes) ssh-copy-id $l_server
    esac
  fi
}

#
# check all servers
#
checkservers() {
me=$(hostname -f)
for server in $(echo $* | sort)
do
  os=`uname`
  case $os in
   # Mac OS X
   Darwin*)
     pingoption=" -t1";;
    *) ;;
  esac

  pingresult=$(ping $pingoption -i0.2 -c1 $server)
  echo $pingresult | grep 100 > /dev/null
  if [ $? -eq 1 ]
  then 
    checkserver $server
    checkserver $server.$domain
  else
    color_msg $red "ping to $server failed"
  fi
done
}

#
# check configuration
#
checkconfig() {
#https://askubuntu.com/questions/87449/how-to-disable-strict-host-key-checking-in-ssh
  if [ -f $sconfig ]
  then
    color_msg $green "$sconfig exists"
    ls -l $sconfig
  fi
}

sconfig=~/.ssh/config

case  $# in
  0) usage ;;
  1) usage ;;
  *) 
    domain=$1 
    shift 
    color_msg $blue "checking ssh configuration for domain $domain sites $*"
    checkconfig
    checkservers $* 
    ;;
esac
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.