Jak wyłączyć ścisłe sprawdzanie klucza hosta w ssh?


223

Chciałbym wyłączyć ścisłe sprawdzanie klucza hosta w sshUbuntu 11.04. Jak to zrobić?


10
Cześć karthick87, mam nadzieję, że rozumiesz konsekwencje wprowadzenia tej zmiany w zakresie bezpieczeństwa;)
Panther

1
Należy jednak zauważyć, że chcesz wiedzieć, czy klucz hosta się zmienił . To duża czerwona flaga, że ​​ktoś może fałszować hosta. Więc UserKnownHostFile / dev / null to naprawdę zły pomysł.

4
Wiesz, SSH służy nie tylko do połączeń zdalnych. Wszystkie hosty, z którymi się łączę, znajdują się w stosie na moim stole i mają ten sam adres IP, więc zawsze mam ostrzeżenie o nowym hoście.
Barafu Albino,

Jeśli chcesz tylko usunąć wiadomość dla określonego hosta, usuń odpowiedni wiersz ~ / .ssh / known_hosts.
stackexchanger

2
Jeśli potrzebujesz tylko jednorazowego połączenia bez błędów:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont

Odpowiedzi:


227

W swoim ~/.ssh/config(jeśli ten plik nie istnieje, po prostu go utwórz):

Host *
    StrictHostKeyChecking no

Spowoduje to wyłączenie wszystkich hostów, z którymi się łączysz. Możesz zastąpić *wzorzec nazwy hosta, jeśli chcesz, aby dotyczył on tylko niektórych hostów.

Upewnij się, że uprawnienia do pliku ograniczają dostęp tylko do ciebie:

sudo chmod 400 ~/.ssh/config

1
W configmoim katalogu domowym nie ma pliku o nazwie .
karthick87

4
Zrób jeden - cała zawartość pliku znajduje się w moim cytacie powyżej. Pamiętaj, że znajduje się on również w .sshpodkatalogu Twojego katalogu domowego.
Cesium

Czy wymagane jest wcięcie? Moje wpisy wyglądają jak bloki podzielone pustą linią.
Andi Giga,

4
W wielu przypadkach jest to nierozsądne, często po prostu chcesz to raz wyłączyć:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont

1
mkdir -p ~ / .ssh && echo „Host *”> ~ / .ssh / config && echo „StrictHostKeyChecking no” >> ~ / .ssh / config
147,3 tys.

189

Zamiast dodawać go do ~/.ssh/configpliku dla całego hosta *, bezpieczniej byłoby określić konkretny host.

Możesz również przekazać parametr w wierszu polecenia w następujący sposób:

ssh -o StrictHostKeyChecking=no yourHardenedHost.com

Zauważ, że na ogół musisz to zrobić tylko raz na hosta, ponieważ mówi to po raz pierwszy:Warning: Permanently added 'frxxx.blaps.net,10.11.12.13' (RSA) to the list of known hosts.
MarkHu

24
To nie zadziała. Powinno być ssh -o UserKnownHostsFile=/dev/nullzamiast.
qwertzguy

1
@qwertzguy To działa. Twoja opcja sprawi, że klucz hosta będzie gubiony za każdym razem, co jest przydatne i bezpieczniejsze, ale nie to, o co pytano.
Jon Bentley,

@qwertzguy Czy możesz dodać to jako odpowiedź, twój jest naprawdę najlepszy na szybkie i brudne „po prostu połącz wiem, co robię”? Nie chciałem ukraść twojej odpowiedzi.
odinho

@ odinho-velmont done
qwertzguy

106

Warto zwrócić uwagę na to ustawienie w konfiguracji ssh:

StrictHostKeyChecking no

Oznacza to, że klucze hostów są nadal dodawane do .ssh / znanych_hostów - po prostu nie zostaniesz zapytany o to, czy im ufasz, ale jeśli hosty się zmienią, jestem gotów się założyć, że dostaniesz duże ostrzeżenie o tym. Możesz obejść ten problem, dodając kolejny parametr:

UserKnownHostsFile /dev/null

Spowoduje to dodanie wszystkich „nowo odkrytych” hostów do kosza. Jeśli klucz hosta ulegnie zmianie, nie będzie żadnych problemów.

Nie wspominam, że obejście tych ostrzeżeń na kluczach hosta ma oczywiste konsekwencje dla bezpieczeństwa - powinieneś być ostrożny, że robisz to z właściwych powodów i że to, z czym się łączysz, jest tym, co chcesz połączyć, a nie złośliwy host, ponieważ w tym momencie zniszczyłeś znaczną część bezpieczeństwa ssh jako rozwiązania.

Na przykład, jeśli spróbujesz ustawić to za pomocą wiersza polecenia, pełne polecenie to:

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

Byłoby to jednak głupie - biorąc pod uwagę, że powyższe przykłady działania dla plików konfiguracyjnych ssh prawdopodobnie będą miały większy sens we wszystkich przypadkach.


1
Masz rację, dostajesz duże ostrzeżenie
Freedom_Ben

1
Myślę, że to właściwa odpowiedź. Działa to dobrze w przypadku łączenia się z hostami w prywatnej sieci lokalnej.
Steve Davis

4
Przydałby się alias do ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@host. W moim przypadku używam isshdo łączenia się z hostami, gdzie znam zmiany klucza hosta.
ecerulm

1
@ ecerulm - tylko mała literówka: to UserKnownHostsFilenie jest UserKnownHostFiles.
Gray Panther

20

FYI. Wolę wyłączyć sprawdzanie hosta tylko podczas używania cssh.

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

csshczy ssh?
kenorb


Czy się mylę, czy też drugi -onie jest potrzebny?
yckart

1
alias relay='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 11086695@172.26.19.19 -p 2222'pracuj dla mnie
arganzheng

9

Jeśli chcesz wyłączyć jednorazowo, użyj:

ssh -o UserKnownHostsFile=/dev/null

Działa to również w przypadku zmiany klucza hosta i upewni się, że klucz nie zostanie zapisany jako zaufany w celu zwiększenia bezpieczeństwa.


6

Z tego, co to brzmi jak ,

NoHostAuthenticationForLocalhost yes

może być dla ciebie wystarczająco dobra. I nadal będziesz w stanie zachować pozory bezpieczeństwa.


2

https://askubuntu.com/a/87452/129227 sugeruje modyfikację pliku konfiguracyjnego, co pomaga. Ale zamiast otwierać rzeczy dla dowolnego hosta, chciałem, aby to zrobić dla każdego hosta. Poniższy skrypt pomaga zautomatyzować proces:

przykładowe połączenie

./sshcheck somedomain site1 site2 site3

skrypt 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.