¿Cómo deshabilitar la comprobación estricta de la clave de host en ssh?

223

Me gustaría deshabilitar el registro estricto de la clave de host sshpara Ubuntu 11.04. ¿Cómo hacerlo?

karthick87
fuente
10
Hola karthick87, espero que entiendas las implicaciones de seguridad de hacer ese cambio;)
Panther
1
Sin embargo, debe tenerse en cuenta que desea saber si una clave de host ha cambiado . Esa es una gran bandera roja de que alguien puede estar falsificando el host. Entonces UserKnownHostFile / dev / null es una muy mala idea.
44
SSH se usa no solo para conexiones remotas, ya sabes. Todos los hosts a los que me conecto están en mi mesa y comparten la misma IP, por lo que siempre tengo la nueva advertencia de host.
Barafu Albino
Si solo desea eliminar el mensaje de un host en particular, elimine la línea correspondiente ~ / .ssh / known_hosts.
stackexchanger
2
Si solo necesita hacer una conexión única sin errores:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont

Respuestas:

227

En su ~/.ssh/config(si este archivo no existe, solo créelo):

Host *
    StrictHostKeyChecking no

Esto lo desactivará para todos los hosts a los que se conecte. Puede reemplazarlo *con un patrón de nombre de host si solo desea que se aplique a algunos hosts.

Asegúrese de que los permisos en el archivo restrinjan el acceso solo a usted:

sudo chmod 400 ~/.ssh/config
Cesio
fuente
1
No hay ningún nombre configen mi directorio de inicio.
karthick87
44
Haga uno: todo el contenido del archivo está en mi cita anterior. Tenga en cuenta que también está en el .sshsubdirectorio de su homedir.
Cesio
¿Se requiere la sangría? Mis entradas parecen bloques divididos por una línea vacía.
Andi Giga
44
Esto no es prudente en muchos casos, a menudo solo desea desactivarlo una vez:ssh -o UserKnownHostsFile=/dev/null
odinho - Velmont
1
mkdir -p ~ / .ssh && echo "Host *"> ~ / .ssh / config && echo "StrictHostKeyChecking no" >> ~ / .ssh / config
147.3k
189

En lugar de agregarlo a su ~/.ssh/configarchivo para todos los Host *, sería más seguro especificar un host en particular.

También puede pasar un parámetro en la línea de comandos como este:

ssh -o StrictHostKeyChecking=no yourHardenedHost.com
MarkHu
fuente
Tenga en cuenta que generalmente solo necesita hacer esto una vez por host ya que dice esto la primera vez:Warning: Permanently added 'frxxx.blaps.net,10.11.12.13' (RSA) to the list of known hosts.
MarkHu
24
Eso no funcionará. Debería ser ssh -o UserKnownHostsFile=/dev/nullen su lugar.
qwertzguy
1
@qwertzguy Funciona. Su opción hará que se pierda la clave de host cada vez, lo cual es útil y más seguro, pero no lo que la pregunta solicitó.
Jon Bentley
@qwertzguy ¿Podría agregar esto como respuesta, la suya es realmente la mejor para quick'n'dirty "solo conéctese Sé lo que estoy haciendo"? No quería robar ninja tu respuesta.
odinho - Velmont
@ odinho-velmont hecho
qwertzguy
106

Vale la pena señalar esa configuración en su configuración ssh:

StrictHostKeyChecking no

Significará que aún se agregan teclas de host a .ssh / known_hosts: simplemente no se le preguntará si confía en ellos, pero si los hosts cambian, estoy dispuesto a apostar que recibirá una gran advertencia al respecto. Puede solucionar este problema agregando otro parámetro:

UserKnownHostsFile /dev/null

Esto agregará todos estos hosts "recién descubiertos" a la papelera. Si cambia una clave de host, no hay problemas.

Sería negligente no mencionar que eludir estas advertencias en las teclas de host tiene ramificaciones de seguridad obvias: debe tener cuidado de hacerlo por las razones correctas y de que a lo que se está conectando realmente es a lo que se quiere conectar y no un host malicioso, ya que en este punto ha erosionado una gran parte de la seguridad en ssh como solución.

Por ejemplo, si intentara configurar esto con la línea de comando, el comando completo sería:

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

Sin embargo, eso sería una tontería, dado que los ejemplos de trabajo anteriores para los archivos de configuración ssh probablemente tengan más sentido en todos los casos.

pacifista
fuente
1
Tienes razón, recibes la gran advertencia
Freedom_Ben
1
Creo que esta es la respuesta correcta. Esto funciona bien para conectarse a hosts en una red local privada.
Steve Davis
44
Podría ser conveniente tener un alias para ssh -o StrictHostKeyChecking=no -o UserKnownHostFiles=/dev/null user@host. En mi caso, utilizo isshpara conectarme a hosts donde sé que la clave del host cambia.
Ecerulm
1
@ecerulm - sólo una pequeña errata: es UserKnownHostsFileno UserKnownHostFiles.
Grey Panther
20

FYI. Prefiero deshabilitar la comprobación de host solo cuando uso cssh.

alias cssh='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
Kyle
fuente
cssho ssh?
kenorb
Tal vez usa cssh.sourceforge.net
MarkHu
¿Estoy equivocado o es el segundo -oinnecesario?
yckart
1
alias relay='ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected] -p 2222'trabaja para mí
arganzheng
9

Si desea deshabilitar una vez, use:

ssh -o UserKnownHostsFile=/dev/null

Eso también funcionará si la clave del host cambia y se asegurará de no guardar la clave como confiable para mayor seguridad.

qwertzguy
fuente
6

Por lo que parece ,

NoHostAuthenticationForLocalhost yes

puede ser lo suficientemente bueno para ti. Y aún sería capaz de mantener esa apariencia de seguridad.

alex grey
fuente
2

https://askubuntu.com/a/87452/129227 sugiere modificar el archivo de configuración que ayuda. Pero en lugar de abrir las cosas para cualquier host, quería que esto se hiciera por host. El siguiente script ayuda a automatizar el proceso:

llamada de ejemplo

./sshcheck somedomain sitio1 sitio2 sitio3

secuencia de comandos 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
fuente