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ć?

karthick87
źródło
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
Cez
źródło
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
MarkHu
źródło
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.

pacyfista
źródło
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'
Kyle
źródło
csshczy ssh?
kenorb
Może używa cssh.sourceforge.net
MarkHu
Czy się mylę, czy też drugi -onie jest potrzebny?
yckart
1
alias relay='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected] -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.

qwertzguy
źródło
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.

Alex Grey
źródło
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
Wolfgang Fahl
źródło