วิธีการปิดการใช้งานการตรวจสอบคีย์โฮสต์ที่เข้มงวดใน ssh?


223

ฉันต้องการปิดใช้งานการตรวจสอบคีย์โฮสต์อย่างเข้มงวดsshสำหรับ Ubuntu 11.04 ทำอย่างไร?


10
สวัสดี karthick87 ผมหวังว่าคุณจะเข้าใจความหมายของการรักษาความปลอดภัยการเปลี่ยนแปลงที่มิ)
เสือ

1
อย่างไรก็ตามควรสังเกตว่าคุณต้องการทราบว่ามีการเปลี่ยนแปลงรหัสโฮสต์หรือไม่ นั่นเป็นธงสีแดงขนาดใหญ่ที่บางคนอาจปลอมแปลงโฮสต์ UserKnownHostFile / dev / null เป็นความคิดที่แย่จริงๆ

4
SSH ไม่เพียง แต่ใช้สำหรับการเชื่อมต่อระยะไกลเท่านั้น โฮสต์ทั้งหมดที่ฉันกำลังเชื่อมต่ออยู่นั้นอยู่ในกองบนโต๊ะของฉันและแชร์ IP เดียวกันดังนั้นฉันจึงมีคำเตือนโฮสต์ใหม่เสมอ
Barafu Albino

หากคุณเพียงแค่ต้องการลบข้อความสำหรับโฮสต์โดยเฉพาะให้ลบบรรทัดที่สอดคล้องกัน ~ / .ssh / known_hosts
stackexchanger

2
หากคุณเพียงแค่ต้องทำการเชื่อมต่อแบบครั้งเดียวโดยไม่มีข้อผิดพลาด:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont

คำตอบ:


227

ใน~/.ssh/config(หากไฟล์นี้ไม่มีอยู่ให้สร้างขึ้นใหม่):

Host *
    StrictHostKeyChecking no

นี่จะเป็นการปิดสำหรับโฮสต์ทั้งหมดที่คุณเชื่อมต่อ คุณสามารถแทนที่*ด้วยรูปแบบชื่อโฮสต์หากคุณต้องการใช้กับโฮสต์บางตัวเท่านั้น

ตรวจสอบให้แน่ใจว่าการอนุญาตในไฟล์ จำกัด การเข้าถึงตัวคุณเองเท่านั้น:

sudo chmod 400 ~/.ssh/config

1
ไม่มีไฟล์ชื่อconfigในไดเรกทอรีบ้านของฉัน
karthick87

4
ทำหนึ่ง - เนื้อหาทั้งหมดของไฟล์อยู่ในคำพูดของฉันด้านบน โปรดทราบว่ามันอยู่ใน.sshไดเรกทอรีย่อยของ homedir ของคุณเช่นกัน
Cesium

การเยื้องเป็นสิ่งจำเป็นหรือไม่? รายการของฉันดูเหมือนบล็อกหารด้วยบรรทัดว่าง
Andi Giga

4
นี่เป็นเรื่องไม่ฉลาดในหลาย ๆ กรณีบ่อยครั้งที่คุณต้องการปิดการใช้งานเพียงครั้งเดียว:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont

1
mkdir -p ~ / .ssh && echo "โฮสต์ *"> ~ / .ssh / config && echo "StrictHostKeyChecking no" >> ~ / .ssh / config
147.3k

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แทน
qwertzguy

1
@qwertzguy มันใช้งานได้ ตัวเลือกของคุณจะทำให้คีย์โฮสต์หายไปทุกครั้งซึ่งมีประโยชน์และปลอดภัยกว่า แต่ไม่ใช่คำถามที่ถาม
Jon Bentley

@qwertzguy คุณช่วยเพิ่มคำตอบนี้ได้หรือไม่คำตอบของคุณดีที่สุดสำหรับ quick'n'dirty "เพียงเชื่อมต่อฉันรู้ว่าฉันกำลังทำอะไร" ไม่ต้องการให้นินจาขโมยคำตอบของคุณ
odinho - Velmont

@ odinho-velmont เรียบร้อยแล้ว
qwertzguy

106

เป็นมูลค่าชี้ให้เห็นว่าการตั้งค่าใน ssh config ของคุณ:

StrictHostKeyChecking no

จะหมายความว่ายังมีการเพิ่มโฮสต์คีย์ใน. ssh / known_hosts - คุณจะไม่ได้รับแจ้งว่าคุณเชื่อถือหรือไม่ แต่ควรเปลี่ยนโฮสต์ฉันยินดีที่จะเดิมพันว่าคุณจะได้รับคำเตือนครั้งใหญ่ คุณสามารถแก้ไขปัญหานี้ได้โดยเพิ่มพารามิเตอร์อื่น:

UserKnownHostsFile /dev/null

การดำเนินการนี้จะเพิ่มโฮสต์ "ค้นพบใหม่" เหล่านี้ทั้งหมดลงในถังขยะ หากคีย์โฮสต์เปลี่ยนไปจะไม่มีปัญหา

ฉันจะสะเพร่าไม่ต้องพูดถึงว่าการหลีกเลี่ยงคำเตือนเหล่านี้ใน hostkeys มีขอบเขตความปลอดภัยที่ชัดเจน - คุณควรระวังด้วยเหตุผลที่ถูกต้อง & สิ่งที่คุณกำลังเชื่อมต่อกับที่จริงคือสิ่งที่คุณหมายถึงการเชื่อมต่อและไม่ โฮสต์ที่เป็นอันตรายเนื่องจาก ณ จุดนี้คุณได้ลบส่วนสำคัญของการรักษาความปลอดภัยใน ssh เป็นวิธีแก้ปัญหา

ตัวอย่างเช่นหากคุณพยายามตั้งค่านี้ด้วย commandline คำสั่งทั้งหมดจะเป็น:

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

แม้ว่าจะเป็นเรื่องโง่ - เนื่องจากตัวอย่างการทำงานด้านบนสำหรับไฟล์การกำหนดค่า ssh มีแนวโน้มที่จะสมเหตุสมผลมากกว่าในทุกกรณี


1
คุณถูกต้องคุณจะได้รับคำเตือนครั้งใหญ่
Freedom_Ben

1
ฉันคิดว่านี่เป็นคำตอบที่ถูก วิธีนี้ใช้งานได้ดีสำหรับการเชื่อมต่อกับโฮสต์บนเครือข่ายท้องถิ่นส่วนตัว
Steve Davis

4
ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@hostอาจจะสะดวกในการมีชื่อแทน ในกรณีของฉันฉันใช้isshเพื่อเชื่อมต่อกับโฮสต์ที่ฉันรู้ว่าการเปลี่ยนแปลงคีย์โฮสต์
ecerulm

1
@ecerulm - เพียงแค่พิมพ์ผิดเล็ก ๆ : มันไม่ได้UserKnownHostsFile UserKnownHostFiles
Panther สีเทา

20

FYI ฉันชอบที่จะปิดการตรวจสอบโฮสต์เมื่อใช้ cssh

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

csshหรือssh?
kenorb

บางทีเขาอาจใช้cssh.sourceforge.net
MarkHu

ฉันผิดหรือ-oไม่จำเป็นครั้งที่สอง?
yckart

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 ไซต์ 2 ไซต์ 3

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