Wie deaktiviere ich die strikte Überprüfung des Hostschlüssels in ssh?

223

Ich möchte das strikte Einchecken sshvon Hostschlüsseln für Ubuntu 11.04 deaktivieren . Wie es geht?

karthick87
quelle
10
Hallo karthick87, ich hoffe du verstehst die sicherheitstechnischen Auswirkungen dieser Änderung;)
Panther
1
Es sollte jedoch beachtet werden, dass Sie wissen möchten , ob sich ein Hostschlüssel geändert hat . Das ist eine große rote Fahne, dass jemand den Host fälscht. UserKnownHostFile / dev / null ist also eine wirklich schlechte Idee.
4
Sie wissen, dass SSH nicht nur für Remoteverbindungen verwendet wird. Alle Hosts, zu denen ich eine Verbindung herstelle, befinden sich auf meinem Tisch und haben dieselbe IP-Adresse. Daher wird immer die Warnung für den neuen Host angezeigt.
Barafu Albino
Wenn Sie die Nachricht nur für einen bestimmten Host entfernen möchten, löschen Sie die entsprechende Zeile ~ / .ssh / known_hosts.
Stackexchanger
2
Wenn Sie nur eine einmalige Verbindung ohne Fehler durchführen müssen:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont

Antworten:

227

In Ihrem ~/.ssh/config(falls diese Datei nicht existiert, erstellen Sie sie einfach):

Host *
    StrictHostKeyChecking no

Dadurch wird es für alle Hosts deaktiviert, zu denen Sie eine Verbindung herstellen. Sie können das *Muster durch ein Hostnamenmuster ersetzen, wenn Sie nur möchten, dass es auf einige Hosts angewendet wird .

Stellen Sie sicher, dass die Berechtigungen für die Datei den Zugriff nur auf Sie selbst beschränken:

sudo chmod 400 ~/.ssh/config
Cäsium
quelle
1
configIn meinem Home-Verzeichnis befindet sich keine Datei mit dem Namen .
karthick87
4
Machen Sie eine - der gesamte Inhalt der Datei ist in meinem Zitat oben. Beachten Sie, dass es sich ebenfalls im .sshUnterverzeichnis Ihres Homedir befindet.
Cäsium
Ist die Einrückung erforderlich? Meine Einträge sehen aus wie Blöcke, die durch eine leere Zeile getrennt sind.
Andi Giga
4
Dies ist in vielen Fällen unklug, oft möchten Sie es nur einmal deaktivieren:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont
1
mkdir -p ~ / .ssh && echo "Host *"> ~ / .ssh / config && echo "StrictHostKeyChecking no" >> ~ / .ssh / config
147.3k
189

Anstatt es ~/.ssh/configfür alle Hosts * zu Ihrer Datei hinzuzufügen , ist es sicherer, einen bestimmten Host anzugeben.

Sie können auch einen Parameter in der Befehlszeile wie folgt übergeben:

ssh -o StrictHostKeyChecking=no yourHardenedHost.com
MarkHu
quelle
Beachten Sie, dass Sie dies in der Regel nur einmal pro Host tun müssen, da dies das erste Mal Warning: Permanently added 'frxxx.blaps.net,10.11.12.13' (RSA) to the list of known hosts.
gesagt wird
24
Das geht nicht Es sollte ssh -o UserKnownHostsFile=/dev/nullstattdessen sein.
Qwertzguy
1
@qwertzguy Es funktioniert. Ihre Option bewirkt, dass der Host-Schlüssel jedes Mal verloren geht, was nützlich und sicherer ist, aber nicht das, wonach die Frage gestellt wurde.
Jon Bentley
@qwertzguy Könntest du dies als Antwort hinzufügen, deins ist wirklich das Beste für "Einfach verbinden, ich weiß was ich tue"? Ich wollte deine Antwort nicht ninja-stehlen.
Odinho - Velmont
@ Odinho-Velmont getan
Qwertzguy
106

Es lohnt sich darauf hinzuweisen, dass die Einstellung in Ihrer SSH-Konfiguration:

StrictHostKeyChecking no

Bedeutet, dass Hostkeys immer noch zu .ssh / known_hosts hinzugefügt werden - Sie werden nur nicht gefragt, ob Sie ihnen vertrauen. Sollten sich die Hosts ändern, wette ich, dass Sie eine große Warnung erhalten. Sie können dieses Problem umgehen, indem Sie einen weiteren Parameter hinzufügen:

UserKnownHostsFile /dev/null

Dadurch werden alle diese "neu entdeckten" Hosts in den Papierkorb verschoben. Wenn sich ein Hostschlüssel ändert, treten keine Probleme auf.

Ich möchte nicht erwähnen, dass das Umgehen dieser Warnungen auf Hostschlüsseln offensichtliche Auswirkungen auf die Sicherheit hat. Sie sollten darauf achten, dass Sie dies aus den richtigen Gründen tun und dass das, mit dem Sie sich verbinden, das ist, mit dem Sie sich verbinden und nicht ein bösartiger Host, da Sie zu diesem Zeitpunkt einen Großteil der Sicherheit in ssh als Lösung untergraben haben.

Wenn Sie beispielsweise versuchen, dies über die Befehlszeile festzulegen, lautet der vollständige Befehl:

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

Das wäre allerdings albern, da die obigen Arbeitsbeispiele für ssh-Konfigurationsdateien wahrscheinlich in allen Fällen sinnvoller sind.

Pazifist
quelle
1
Du hast
recht
1
Ich denke das ist die richtige Antwort. Dies funktioniert gut für die Verbindung mit Hosts in einem privaten lokalen Netzwerk.
Steve Davis
4
Könnte praktisch sein, einen Alias ​​zu haben ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@host. In meinem Fall verbinde ich mich isshmit Hosts, bei denen ich weiß, dass sich der Hostschlüssel ändert.
Ecerulm
1
@ecerulm - nur ein kleiner Tippfehler: Es ist UserKnownHostsFilenicht UserKnownHostFiles.
Grey Panther
20

Zu Ihrer Information. Ich bevorzuge es, die Host-Überprüfung nur bei Verwendung von cssh zu deaktivieren.

alias cssh='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
Kyle
quelle
csshoder ssh?
Kenorb
Vielleicht nutzt er cssh.sourceforge.net
MarkHu
Irre ich mich oder ist der zweite -ounnötig?
Yckart
1
alias relay='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected] -p 2222'Arbeit für mich
arganzheng
9

Wenn Sie die Funktion einmalig deaktivieren möchten, gehen Sie wie folgt vor:

ssh -o UserKnownHostsFile=/dev/null

Dies funktioniert auch, wenn sich der Hostschlüssel ändert, und stellt sicher, dass der Schlüssel aus Sicherheitsgründen nicht als vertrauenswürdig gespeichert wird.

Qwertzguy
quelle
6

Wie es sich anhört ,

NoHostAuthenticationForLocalhost yes

kann für Sie gut genug sein. UND Sie wären immer noch in der Lage, diesen Anschein von Sicherheit aufrechtzuerhalten.

alex grau
quelle
2

https://askubuntu.com/a/87452/129227 schlagen vor, die Konfigurationsdatei zu ändern, was hilft. Aber anstatt die Dinge für irgendeinen Host zu öffnen, wollte ich, dass dies für jeden Host gemacht wird. Das folgende Skript hilft bei der Automatisierung des Prozesses:

Beispielanruf

./sshcheck somedomain site1 site2 site3

sshcheck script

#!/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
quelle