Bagaimana cara menonaktifkan pemeriksaan kunci host ketat di ssh?

223

Saya ingin menonaktifkan pemeriksaan kunci host ketat sshuntuk Ubuntu 11.04. Bagaimana cara melakukannya?

karthick87
sumber
10
Hai karthick87, saya harap Anda memahami implikasi keamanan dari melakukan perubahan itu;)
Panther
1
Namun perlu dicatat, bahwa Anda ingin tahu apakah kunci host telah berubah . Itu adalah bendera merah besar bahwa seseorang mungkin menipu tuan rumah. Jadi UserKnownHostFile / dev / null adalah ide yang sangat buruk.
4
SSH digunakan tidak hanya untuk koneksi jarak jauh, Anda tahu. Semua host yang saya hubungkan berada di tumpukan di meja saya dan berbagi IP yang sama, jadi saya selalu memiliki peringatan host baru.
Barafu Albino
Jika Anda hanya ingin menghapus pesan untuk host tertentu, hapus baris yang sesuai ~ / .ssh / known_hosts.
stackexchanger
2
Jika Anda hanya perlu melakukan koneksi satu kali tanpa kesalahan:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont

Jawaban:

227

Di ~/.ssh/configfile Anda (jika file ini tidak ada, buat saja):

Host *
    StrictHostKeyChecking no

Ini akan mematikannya untuk semua host yang terhubung. Anda dapat mengganti *dengan pola nama host jika Anda hanya ingin itu berlaku untuk beberapa host.

Pastikan izin pada file membatasi akses hanya untuk Anda:

sudo chmod 400 ~/.ssh/config
Cesium
sumber
1
Tidak ada file bernama configdi direktori home saya.
karthick87
4
Buat satu - seluruh isi file ada dalam kutipan saya di atas. Perhatikan juga di .sshsubdirektori homedir Anda.
Cesium
Apakah lekukan diperlukan? Entri saya terlihat seperti blok yang dibagi oleh baris kosong.
Andi Giga
4
Ini tidak bijaksana dalam banyak kasus, sering kali Anda hanya ingin menonaktifkannya sekali:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont
1
mkdir -p ~ / .ssh && echo "Host *"> ~ / .ssh / config && echo "StrictHostKeyMemeriksa no" >> ~ / .ssh / config
147.3k
189

Daripada menambahkannya ke ~/.ssh/configfile Anda untuk semua Host *, itu akan lebih aman untuk menentukan host tertentu.

Anda juga dapat mengirimkan parameter pada baris perintah seperti ini:

ssh -o StrictHostKeyChecking=no yourHardenedHost.com
MarkHu
sumber
Perhatikan bahwa Anda biasanya hanya perlu melakukan ini sekali per host karena ia mengatakan ini pertama kali:Warning: Permanently added 'frxxx.blaps.net,10.11.12.13' (RSA) to the list of known hosts.
MarkHu
24
Itu tidak akan berhasil. Seharusnya ssh -o UserKnownHostsFile=/dev/nullsebaliknya.
qwertzguy
1
@ qwertzguy Tidak berfungsi. Pilihan Anda akan membuatnya sehingga kunci host hilang setiap kali, yang berguna dan lebih aman, tetapi bukan apa yang ditanyakan.
Jon Bentley
@ qwertzguy Bisakah Anda menambahkan ini sebagai jawaban, Anda benar-benar yang terbaik untuk quick'n'dirty "hubungkan saja aku tahu apa yang saya lakukan"? Tidak ingin ninja-mencuri jawaban Anda.
odinho
@ odinho-velmont selesai
qwertzguy
106

Layak untuk menunjukkan pengaturan itu dalam konfigurasi ssh Anda:

StrictHostKeyChecking no

Akan berarti hostkeys masih ditambahkan ke .ssh / known_hosts - Anda tidak akan ditanya tentang apakah Anda mempercayai mereka, tetapi jika host berubah, saya berani bertaruh Anda akan mendapat peringatan besar tentangnya. Anda dapat mengatasi masalah ini dengan menambahkan parameter lain:

UserKnownHostsFile /dev/null

Ini akan menambahkan semua host "baru ditemukan" ini ke tempat sampah. Jika kunci host berubah, tidak ada masalah.

Saya akan lalai untuk tidak menyebutkan bahwa menghindari peringatan ini pada hostkey memiliki konsekuensi keamanan yang jelas - Anda harus berhati-hati bahwa Anda melakukannya untuk alasan yang tepat & bahwa apa yang Anda hubungkan sebenarnya adalah apa yang Anda maksudkan dengan koneksi dan bukan sebuah host jahat, karena pada titik ini Anda telah mengikis bagian utama keamanan di ssh sebagai solusi.

Misalnya jika Anda mencoba dan mengatur ini dengan commandline, perintah lengkapnya adalah:

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

Itu akan konyol - mengingat bahwa contoh-contoh yang berfungsi di atas untuk file konfigurasi ssh cenderung lebih masuk akal dalam semua kasus.

pasifis
sumber
1
Anda benar, Anda mendapatkan peringatan besar
Freedom_Ben
1
Saya pikir ini adalah jawaban yang tepat. Ini berfungsi baik untuk menghubungkan ke host di jaringan lokal pribadi.
Steve Davis
4
Mungkin nyaman untuk memiliki alias ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@host. Dalam kasus saya, saya gunakan isshuntuk terhubung ke host di mana saya tahu perubahan host key.
ecerulm
1
@ecerulm - hanya kesalahan ketik kecil: UserKnownHostsFilebukan UserKnownHostFiles.
Grey Panther
20

FYI. Saya lebih suka menonaktifkan pemeriksaan host hanya ketika menggunakan cssh.

alias cssh='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
Kyle
sumber
csshatau ssh?
kenorb
Mungkin dia menggunakan cssh.sourceforge.net
MarkHu
Apakah saya salah, atau yang kedua -otidak perlu?
yckart
1
alias relay='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected] -p 2222'bekerja untuk saya
arganzheng
9

Jika Anda ingin menonaktifkan sekali pakai:

ssh -o UserKnownHostsFile=/dev/null

Itu akan bekerja juga jika kunci host berubah dan akan memastikan tidak menyimpan kunci sebagai tepercaya untuk keamanan tambahan.

qwertzguy
sumber
6

Dari apa yang terdengar ,

NoHostAuthenticationForLocalhost yes

mungkin cukup baik untukmu. DAN Anda masih bisa mempertahankan kemiripan keamanan itu.

alex grey
sumber
2

https://askubuntu.com/a/87452/129227 menyarankan untuk memodifikasi file konfigurasi yang membantu. Tetapi alih-alih membuka segalanya untuk host mana pun, saya ingin ini dilakukan per host. Script di bawah ini membantu mengotomatiskan proses:

contoh panggilan

./sshcheck somedomain site1 site2 site3

skrip 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
Wolfgang Fahl
sumber