19 junio 2012

Acceso sin contraseña y BatchMode para ssh

Al realizar scripts que se conectan mediante ssh a equipos remotos para ejecutar alguna acción nos podemos encontrar que se queden esperando a alguna entrada, como la contraseña, que nunca llegará. Vamos a ver como ejecutar en equipos remotos acciones mediante ssh sin contraseña y como evitar que estos se queden colgados si algo va mal mediante BatchMode.
Par ejecutar un comando a un equipo remoto, normalmente se usa autenticación con el par de claves pública-privada.
Mediante ssh-keygen podemos generar la clave, con la opción -t para el tipo de clave:
 
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/ejemplo/.ssh/id_dsa):
Created directory '/home/ejemplo/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ejemplo/.ssh/id_dsa.
Your public key has been saved in /home/ejemplo/.ssh/id_dsa.pub.
The key fingerprint is:
57:2c:00:be:ef:00:0f:00:ba:be:00:19:c4:8e:be:73 ejemplo@systemadmin.es

Según el tipo de clave a generar se generan dos ficheros llamados diferente según el tipo:
  • rsa1: Generará, por defecto, el fichero ~/.ssh/identity para la clave privada y el fichero ~/.ssh/identity.pub para la clave pública. Este formato es válido para el protocolo 1 de SSH
  • rsa: Generará, por defecto, el fichero ~/.ssh/id_rsa para la clave privada y el fichero ~/.ssh/id_rsa.pub para la clave pública. Este formato es válido para el protocolo 2 de SSH
  • dsa: Generará, por defecto, el fichero ~/.ssh/id_dsa para la clave privada y el fichero ~/.ssh/id_dsa.pub para la clave pública. Este formato es válido para el protocolo 2 de SSH
La passphrase que nos pide es para añadir seguridad a la clave privada, pidiendo una contraseña para usarla. En el caso de querer conectar a equipos sin contraseña debemos dejarla en blanco.
A continuación deberemos copiar la clave pública al equipo remoto, añadiéndola al fichero ~/.ssh/authorized_keys, que deberá tener permisos 600:
 
chmod 600 ~/.ssh/authorized_keys

A continuación ya podremos conectarnos a dicho equipo sin contraseña:
 
[root@local ~]# ssh remoto.systemadmin.es -l jprats
Last login: Sun May  1 19:15:16 2011 from local.systemadmin.es
CentOS release 5.5 (Final)
Linux remoto.systemadmin.es 2.6.34.6-xxxx-grs-ipv6-64 #3 SMP Fri Sep 17 16:06:38 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux
[root@remoto ~]#

Para ejecutar comandos simplemente deberemos añadirlo al final del comando ssh para conectarnos:
 
[root@local ~]# ssh remoto.systemadmin.es -l jprats uname -a
Linux remoto.systemadmin.es 2.6.34.6-xxxx-grs-ipv6-64 #3 SMP Fri Sep 17 16:06:38 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux

En el caso que por algún motivo se perdiese la clave del ~/.ssh/authorized_keys nos pediría contraseña, lo cual no nos sirve de nada para un script:
 
# ssh remoto.systemadmin.es -l jprats who
jprats@remoto.systemadmin.es's password:

Para evitar que se quede esperando que se introduzca una contraseña que nunca se introducirá, al ser un script, debemos añadir la opción BatchMode=yes para indicar al ssh que no se quede esperando sino que simplemente falle:
 
# ssh -o BatchMode=yes remoto.systemadmin.es -l jprats who
Permission denied (publickey,password,keyboard-interactive).

Podemos conseguir un efecto similar mediante la opción PasswordAuthentication=no, pero en caso que no este la entrada del equipo en el fichero ~/.ssh/known_hosts se quedará colgado igualmente:
 
# ssh -o PasswordAuthentication=no remoto.systemadmin.es -l jprats who
The authenticity of host 'remoto.systemadmin.es (111.111.111.73)' can't be established.
RSA key fingerprint is de:ad:be:ef:de:6e:25:69:ed:06:df:ac:32:ba:be:c0.
Are you sure you want to continue connecting (yes/no)?

Mientras que con BatchMode=yes simplemente fallará:
 
# ssh -o BatchMode=yes remoto.systemadmin.es -l jprats who
Host key verification failed.

Para conseguir el mismo efecto deberíamos añadir  

StrictHostKeyChecking=yes, que por defecto esta a ask:

# ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=yes remoto.systemadmin.es -l jprats who
No RSA host key is known for remoto.systemadmin.es and you have requested strict checking.
Host key verification failed.

Por lo tanto, resulta muchos más cómodo usar BatchMode=yes


Tomado de: http://systemadmin.es/2011/05/acceso-sin-contrasena-y-batchmode-para-ssh

No hay comentarios: