如何在ssh中禁用严格的主机密钥检查?


223

我想ssh为Ubuntu 11.04 禁用严格的主机密钥签入。怎么做?


10
嗨,karthick87,我希望您了解进行此更改的安全性;)
Panther

1
但是应注意,您知道主机密钥是否已更改。这是一个很大的危险信号,表明有人可能在欺骗主机。因此,UserKnownHostFile / dev / null是一个非常糟糕的主意。

4
您知道,SSH不仅用于远程连接。我要连接的所有主机都在表的堆中,并且共享相同的IP,因此我总是收到新的主机警告。
Barafu Albino 2014年

如果只想删除特定主机的消息,请删除相应的〜/ .ssh / known_hosts行。
stackexchanger

2
如果您只需要一次连接就可以没有错误:ssh -o UserKnownHostsFile=/dev/null
odinho-Velmont,

Answers:


227

在您的~/.ssh/config文件中(如果此文件不存在,则创建它):

Host *
    StrictHostKeyChecking no

这将关闭您连接到的所有主机。*如果只希望将其应用于某些主机,则可以将其替换为主机名模式。

确保文件上的权限仅限制您自己的访问:

sudo chmod 400 ~/.ssh/config

1
config我的主目录中没有命名的文件。
karthick87

4
做一个-文件的全部内容在上面的引用中。请注意,它也位于.sshhomedir 的子目录中。

需要缩进吗?我的输入看起来像用空行分隔的块。
安迪·吉加

4
这在许多情况下是不明智的,通常您只想禁用一次:ssh -o UserKnownHostsFile=/dev/null
odinho-Velmont,2017年

1
mkdir -p〜/ .ssh && echo“ Host *”>〜/ .ssh / config && echo“ StrictHostKeyChecking no” >>〜/ .ssh / config
147.3k

189

与其将它添加到~/.ssh/config所有Host *的文件中,不如指定一个特定的主机。

您还可以在命令行上像这样传递参数:

ssh -o StrictHostKeyChecking=no yourHardenedHost.com

请注意,您通常只需要对每个主机执行一次操作,因为它是第一次这样说:Warning: Permanently added 'frxxx.blaps.net,10.11.12.13' (RSA) to the list of known hosts.
MarkHu 2013年

24
那行不通。应该是ssh -o UserKnownHostsFile=/dev/null
qwertzguy 2014年

1
@qwertzguy确实有效。您的选择将使主机密钥每次都丢失,这是有用且更安全的,但不是问题所要的。
乔恩·本特利

@qwertzguy您能补充一下这个问题吗,您的回答确实真的最好,因为“快速连接”我就知道我在做什么”?不想忍者偷走你的答案。
奥迪尼奥-费尔蒙'17

@ odinho-velmont完成
qwertzguy

106

值得指出的是您的ssh配置中的设置:

StrictHostKeyChecking no

这意味着主机密钥仍会添加到.ssh / known_hosts中-不会提示您是否信任它们,但是如果主机发生更改,我敢打赌您会收到关于它的重大警告。您可以通过添加另一个参数来解决此问题:

UserKnownHostsFile /dev/null

这会将所有这些“新发现”主机添加到垃圾箱。如果主机密钥发生更改,则没有任何麻烦。

我会不遗余力地指出,规避主机密钥上的这些警告会带来明显的安全后果-您应注意,出于正确的原因在执行此操作,并且所连接的实际上您要连接的内容,而不是恶意主机,因为到此为止,您已经破坏了ssh安全性的主要部分作为解决方案。

例如,如果您尝试在命令行中进行设置,则完整的命令应为:

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

但是,这将是愚蠢的-鉴于上述ssh配置文件的工作示例在所有情况下都可能更有意义。


1
没错

1
我认为这是正确的答案。这非常适合连接到专用本地网络上的主机。
史蒂夫·戴维斯

4
可以方便地使用别名ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@host。就我而言,我用于issh连接到主机密钥已更改的主机。
ecerulm '16

1
@ecerulm-只是一个小的错字:UserKnownHostsFile不是UserKnownHostFiles
Gray Panther


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.