Microordenadores - Desarrollos modernos para sistemas retro

Como desactivar la autenticación por contraseña en OpenSSH
27 de Julio de 2017

Uno de los primeros pasos a la hora de securizar un sistema UNIX, aparte de configurar el firewall, es configurar OpenSSH para que la autenticación sólo funcione por llaves en lugar de contraseña. Aquí explico como hacerlo de forma sencilla.

Como generar el par de llaves ssh

Lo primero de todo es generar tu par de llaves. Esto funciona tanto en sistemas *BSD como en Linux, y se hace con el comando ssh-keygen sin argumentos. Como ejemplo, voy a crear un par de llaves públicas para un usuario desde un sistema OpenBSD:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/foo/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/foo/.ssh/id_rsa.
Your public key has been saved in /home/foo/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:KODmeTFFx2pS9mDGF46ifxKfGwvJnjgYp/iBPSEr4Mo foo@x200
The key's randomart image is:
+---[RSA 2048]----+
|     ...o.       |
|     .B+o        |
|  . .=o=.        |
| . o.oo..        |
|o = =o. S        |
|+B.= B .         |
|=** B =          |
|B .* = +         |
|.Eo.o o          |
+----[SHA256]-----+

En estos datos destaco la importancia del fingerprint o huella. Cuando te conectes remotamente deberás verificar que sea la misma para confirmar que no haya entre medias otro host redirigiendo el tráfico. A partir de aquí, en el directorio HOME (en este caso /home/foo tendrás estos tres o cuatro ficheros:

  • authorized_keys contiene las llaves públicas de los usuarios que podrán conectarse remotamente por ssh sin que pida contraseña.
  • id_rsa es la clave privada. Esta nunca se comparte.
  • id_rsa.pub es la llave pública, que se copia en el archivo ~/.ssh/authorized_hosts de un host remoto para poder conectarte remotamente sin que pida contraseña.
  • known_hosts guarda las huellas de los servidores conocidos de forma que, si cambian, en lugar de conectarse muestra un aviso.

Como desactivar la autenticación por contraseña

Si usas sistemas tipo Unix y has generado tus llaves ssh con ssh-keygen, en tu directorio ~/.ssh tendrás un fichero llamado id_rsa.pub que es la llave pública. Copia el contenido de este archivo al archivo ~/.ssh/authorized_keys del home de tu usuario del host remoto, bien sea una Raspberry Pi o un servidor VPS. Una vez que hagas esto la autenticación será por par de llaves en lugar de por contraseña, lo que es más seguro.

Una vez que funcione edita como root el archivo /etc/ssh/sshd_config y comenta la línea que pone PasswordAuthentication yes, de forma que quede así:

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

Una vez hayas llegado aquí, prueba a loguearte a través de ssh. Si todo ha funcionado correctamente debes entrar automáticamente si usas ssh-agent o tras introducir la clave de la llave ssh (la que te pidió al usar ssh-keygen), no del host. Si funciona, reinicia OpenSSH para que la configuración se aplique. Recuerda dar permisos al usuario para que pueda convertirse en root si es necesario, en caso de sistemas *BSD sería añadiéndolo al grupo wheel. En OpenBSD y FreeBSD OpenSSH se reinicia así:

# /etc/init.d/sshd restart

En Linux sin systemd se hace así:

# /etc/init.d/ssh restart
[ ok ] Restarting OpenBSD Secure Shell server: sshd.

Y, finalmente, en Linux con systemd (salvo que haya cambiado, ya que no uso systemd):

# systemctl restart sshd

Como mejorar todavía más la seguridad

Para mayor seguridad, y si tu versión de OpenSSH lo permite, puedes configurar un doble factor de autenticación mediante tokens TOTP.

Otro punto importante es decidir qué hosts pueden acceder al puerto ssh. Lo mejor es cerrar el firewall en una configuración de denegación por defecto y permitir el acceso a ssh solamente a determinados hosts. Una idea puede ser permitir las IPs de tu ISP, con lo que te ahorras muchos intentos de ataque. Esto ya depende del sistema operativo y del firewall que uses. En el caso de OpenBSD te recomiendo estos dos enlaces:


Contenido relacionado: