SSH sin password


Normalmente accedemos a nuestros servidores proporcionando usuario y password. Este es el método de autenticación interactiva por defecto. Con esta opción, los servidores quedan expuestos a ataques de diccionario o de fuerza bruta.
Este mini manual explica como habilitar la autenticación por certificado y así poder deshabilitar la autenticación interactiva. De esta manera se aumenta la seguridad de los servidores y de paso se puede conseguir que usuarios de servicio puedan copiar datos de un equipo a otro con SCP o ejecutar comandos remotamente con SSH, o incluso mantener túneles abiertos sin tener que estar logado.

La autenticación por certificado se basa en que el usuario genera un par de claves: pública y privada. La llave pública se guarda en el servidor y el usuario tiene la privada. Al inciar la conexión se negocia el par de llaves que se usará para la autenticación y el servidor manda un desafío cifrado con la llave pública. El cliente demuestra que tiene la llave privada devolviendo al servidor esos datos descifrados con su llave privada, y se inicia la sesión.

La llave pública que se almacena en servidor puede cifrarse con un password. Esto es útil si no podemos estar seguros de que nadie en el servidor vaya a copiar nuestra llave. Por otro lado, si vamos a usar autenticación por certificado para que usuarios de servicio hagan copias/ejecución de scripts en remoto .. etc, debemos dejar los certificados sin password o si no, pedirá el password cada vez que tenga que logar, con lo que no ganaríamos mucho; pero debemos asegurarnos de que el archivo de certificados tiene los permisos correctos.

  • Crear los certificados
  • Usamos la herramienta ssh-keygen [paquete openssh-client en Debian]

    $ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (~/.ssh/id_rsa):
    Created directory '~/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in ~/.ssh/id_rsa.
    Your public key has been saved in ~/.ssh/id_rsa.pub.
    The key fingerprint is:
    3c:7f:5c:50:c1:6f:fa:d0:af:a3:9c:86:2e:23:dc:ad username@Recycled
    $

    Nos pide el directorio donde queremos guardar las llaves pública y privada, por defecto será ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub.
    Luego pide un password para proteger las llaves (opcional). Hay algunos parámetros interesante de ssh-keygen como:
    -b indica el tamaño de la llave en bits.
    -C comentario, útil si gestionas varios juegos de certificados.
    -f archivo donde crear las llaves.

    Para más información “man ssh-keygen”.

  • Cifrar la clave pública.
  • Si hay riesgo de que alguien pueda acceder a los certificados, podemos cifrarlos usando un password.

    Para poner un password:

    $ ssh-keygen -p
    Enter file in which the key is (~/.ssh/id_rsa):
    Key has comment '~/.ssh/id_rsa'
    Enter new passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved with the new passphrase.

    Y para quitar o cambiar el password en los certificados:

    $ ssh-keygen -p
    Enter file in which the key is (~/.ssh/id_rsa):
    Enter old passphrase:
    Key has comment '~/.ssh/id_rsa'
    Enter new passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved with the new passphrase.
    $

  • Instalar las llaves
  • En el servidor, se almacenan las llaves públicas que están autorizadas en el archivo ~/.ssh/authorized_keys. Así que para poder logar como usuario “foo” en el servidor hay que añadir nuestra llave pública al final de ese archivo (por si hubieran más llaves autorizadas).

    $ ssh foo@servidor

    servidor $ cat id_rsa.pub >> .ssh/authorized_keys

    O sin logar en el servidor, estando en el cliente:

    $ cat ~/.ssh/id_rsa.pub | ssh foo@servidor 'cat - >> .ssh/authorized_keys'

    Nota: hay que asegurarse de que en el servidor el archivo /etc/ssh/sshd_config tiene descomentadas la lineas:
    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile %h/.ssh/authorized_keys

  • Probar las llaves
  • Desde un cliente linux, podemos probarlas así:

    $ ssh foo@servidor -i ~/.ssh/id_rsa
    Enter passphrase for key '~/.ssh/id_rsa':
    foo@servidor:~$

    Para poder usar las llaves con PuTTY debemos convertirlas con PuTTYgen
    [ http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html ]

    Nos copiamos la llave privada y con PuTTYgen la convertimos al formato ppk. Despues guardamos la llave privada y con PuTTY, le marcamos la llave privada a usar en la seccion: Connection, SSH, Auth, Private key file for authentication.

Finalmente, una vez que todo esta probado podemos cambiar el comportamiento del servidor SSH para que no acepte autenticación interactiva poniendo la linea:

PasswordAuthentication no

en el archivo /etc/ssh/sshd_conf

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: