Как отключить строгую проверку ключа хоста в ssh?


223

Я хотел бы отключить строгую проверку ключа хоста sshдля Ubuntu 11.04. Как это сделать?


10
Привет karthick87, я надеюсь, что ты понимаешь последствия этих изменений для безопасности;)
Panther

1
Однако следует отметить, что вы хотите знать, изменился ли ключ хоста . Это большой красный флаг, который кто-то может подделывать хозяину. Так что UserKnownHostFile / dev / null - действительно плохая идея.

4
Знаете, SSH используется не только для удаленных подключений. Все хосты, к которым я подключаюсь, находятся в куче на моей таблице и имеют один и тот же IP-адрес, поэтому у меня всегда появляется предупреждение о новом хосте.
Барафу Альбино

Если вы просто хотите удалить сообщение для определенного хоста, удалите соответствующую строку ~ / .ssh / known_hosts.
stackexchanger

2
Если вам просто нужно сделать одноразовое соединение без ошибок:ssh -o UserKnownHostsFile=/dev/null
Одино - Велмонт

Ответы:


227

В вашем ~/.ssh/config(если этот файл не существует, просто создайте его):

Host *
    StrictHostKeyChecking no

Это отключит его для всех хостов, к которым вы подключаетесь. Вы можете заменить *шаблон имени хоста, если хотите, чтобы он применялся только к некоторым хостам.

Убедитесь, что права доступа к файлу ограничивают доступ только для вас:

sudo chmod 400 ~/.ssh/config

1
В configмоем домашнем каталоге нет файлов .
karthick87

4
Сделайте один - все содержимое файла в моей цитате выше. Обратите внимание, что он также находится в .sshподкаталоге вашего homedir.
Цезий

Требуется ли отступ? Мои записи выглядят как блоки, разделенные пустой строкой.
Анди Гига

4
Это неразумно во многих случаях, часто вы просто хотите отключить его один раз:ssh -o UserKnownHostsFile=/dev/null
Один - Велмонт

1
mkdir -p ~ / .ssh && echo "Host *"> ~ / .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 Это работает. Ваш выбор сделает так, чтобы ключ хоста терялся каждый раз, что полезно и более безопасно, но не то, о чем спрашивал вопрос.
Джон Бентли

@qwertzguy Не могли бы вы добавить это в качестве ответа, ваш действительно лучший для quick'n'dirty "просто подключиться, я знаю, что я делаю"? Не хотел ниндзя украсть твой ответ.
Одино - Велмонт

@ odinho-velmont done
qwertzguy

106

Стоит указать на эту настройку в вашей конфигурации ssh:

StrictHostKeyChecking no

Будет означать, что ключи хоста все еще добавляются в .ssh / known_hosts - вас просто не спросят, доверяете ли вы им, но если хост поменяется, я готов поспорить, что вы получите большое предупреждение об этом. Вы можете обойти эту проблему, добавив еще один параметр:

UserKnownHostsFile /dev/null

Это добавит все эти "недавно обнаруженные" хосты в корзину. Если ключ хоста меняется, никаких проблем.

Я бы непростительно , не говоря уже о том , что обойти эти предупреждения на hostkeys имеет очевидные последствия безопасности - вы должны быть осторожны , что вы делаете это по правильным причинам и то , что вы подключаетесь на самом деле является то , что вы имеете в виду , чтобы подключиться и не злонамеренный хост, поскольку в этот момент вы разрушили основную часть безопасности в ssh как решение.

Например, если вы попытаетесь установить это с помощью командной строки, полная команда будет выглядеть так:

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

Хотя это было бы глупо - учитывая, что приведенные выше рабочие примеры для файлов конфигурации ssh, вероятно, будут иметь больше смысла во всех случаях.


1
Вы правы, вы получаете большое предупреждение
Freedom_Ben

1
Я думаю, что это правильный ответ. Это хорошо работает для подключения к хостам в частной локальной сети.
Стив Дэвис,

4
Может быть удобно иметь псевдоним для ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@host. В моем случае я использую isshдля подключения к хостам, где я знаю изменения ключа хоста.
ecerulm

1
@ecerulm - просто небольшая опечатка: это UserKnownHostsFileне так UserKnownHostFiles.
Серая пантера

20

FYI. Я предпочитаю отключать проверку хоста только при использовании cssh.

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

csshили ssh?
Кенорб

Может быть, он использует 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 site2 site3

скрипт 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.