Logo OpenSSH

Acceder remotamente a un equipo con SSH en Debian

 
 

Índice General

  1. ¿Qué vamos a hacer?
  2. Instalación del cliente SSH
  3. Generar par de claves pública/privada
    1. Generando el par de claves
    2. Copiar la clave pública en el servidor SSH remoto
    3. Copia de seguridad
  4. Acceder al servidor SSH remoto
  5. Ejecutar comandos en un host remoto

Enlaces externos
 

  1. ¿Qué vamos a hacer? (Volver al índice General)

    NOTA: En este artículo se da por hecho que existe un servidor SSH en la red, si no es así puedes ver el artículo Instalar y configurar el servicio SSH en Debian para aprender como instalarlo y configurarlo.

    En este artículo, aprenderemos a instalar y a utilizar un cliente SSH, para conectarnos a un equipo remoto a través de una comunicación cifrada. La conexión al equipo remoto la realizaremos utilizando alguno de los dos métodos de autenticación, que a continuación listamos:

    • Autenticación mediante usuario y contraseña: Este método obliga a que el usuario esté presente en la autenticación contra el servidor SSH ya que a la hora de iniciar la conexión, por defecto no podemos pasar la contraseña como parámetro. Existen métodos para superar esto como el que encontré en el artículo «[Script] Mejorando la productividad: Automatizando conexiones SSH mediante expect», pero pienso que el uso de clave pública asegura y simplifica el proceso, salvo que tus intenciones sean otras, como la de forzar el acceso al servidor SSH mediante scripts.
    • Autenticación con clave pública: Este método permite que un usuario se conecte a un sistema remoto sin necesidad de escribir la contraseña. Este modo es útil, por ejemplo, cuando tenemos tareas programadas que lanzan scripts para realizar copias de seguridad.

     
    En este artículo trabajaremos con el cliente SSH de OpenSSH. El paquete openssh-client proporciona los clientes de ssh, scp y sftp, los programas ssh-agent y ssh-add para hacer más comoda la autenticación de clave pública, y las utilidades ssh-keygen, ssh-keyscan, ssh-copy-id y ssh-argv0.

    Si quieres saber más sobre SSH y OpenSSH mira el artículo Instalar y configurar el servicio SSH en Debian para aprender como instalarlo y configurarlo. publicado con anterioridad en ZeppelinuX.

  2.  

  3. Instalación del paquete openssh-client (Volver al índice General)
    Antes de comenzar la instalación actualizamos los repositorios con la siguiente orden:

    $ sudo apt-get update

    A continuación procedemos a la instalación del paquete correspondiente al cliente SSH de OpenSSH.

    $ sudo apt-get install openssh-client
  4.  

  5. Generar par de claves pública/privada (Volver al índice General)
    En la criptografía de clave pública los procesos de encriptación y desencriptación son realizados utilizando claves diferentes, una clave para encriptar y otra para desencriptar y funciona de la siguiente manera. Cada usuario ha de crear un par de claves pública/privada para autenticación. El servidor SSH conoce la clave pública y sólo el usuario conoce su clave privada.

    En este ejemplo trabajaremos con dos cuentas de usuarios del sistema a los que llamaremos mortadelo y filemon, y el servidor SSH tiene la IP 192.168.1.20.
    Si no tenemos ningún usuario del sistema para hacer pruebas, podemos crearlo con el siguiente comando:

    $ sudo adduser mortadelo

    y obtendremos la siguiente salida:

    Añadiendo el usuario `mortadelo' ...
    Añadiendo el nuevo grupo `mortadelo' (1002) ...
    Añadiendo el nuevo usuario `mortadelo' (1001) con grupo `mortadelo' ...
    Creando el directorio personal `/home/mortadelo' ...
    Copiando los ficheros desde `/etc/skel' ...
    Introduzca la nueva contraseña de UNIX: 
    Vuelva a escribir la nueva contraseña de UNIX: 
    passwd: contraseña actualizada correctamente
    Cambiando la información de usuario para mortadelo
    Introduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado
            Nombre completo []: Mortadelo
            Número de habitación []: 
            Teléfono del trabajo []: 
            Teléfono de casa []: 
            Otro []: 
    ¿Es correcta la información? [S/n] S

    Y del mismo modo haremos para crear al usuario filemon.

    1. Generando el par de claves (Volver al índice General)
      Tras dar de alta al usuario mortadelo en el sistema, el usuario deberá generar el par de claves utilizando la orden ssh-keygen. SSH implementa la autenticación con clave pública utilizando los algoritmos RSA o DSA. La versión SSHv1 del protocolo SSH sólo soporta RSA, mientras que la versión SSHv2 soporta ambos algoritmos.
      Para generar el par de claves cambiaremos al directorio $HOME del usuario:

      mortadelo@pclocal:/$ cd ~

      NOTA: Para utilizar la firma digital sin contraseña, jamás se deberá establecer una contraseña durante la generación del par de claves. Cuando el diálogo solicite una contraseña con confirmación, sólo pulsar la tecla (Enter) y continuar con el procedimiento. Si se asigna una contraseña, está será utilizada para autenticar el certificado creado cada vez que se quiera utilizar éste.

      Generamos el par de claves del tipo DSA con la siguiente orden:

      1
      
      mortadelo@pclocal:~$ ssh-keygen -t dsa

      La salida de la orden sería la siguiente:

      Generating public/private dsa key pair.
      Enter file in which to save the key (/home/mortadelo/.ssh/id_dsa): 
      Created directory '/home/mortadelo/.ssh'.
      Enter passphrase (empty for no passphrase): 
      Enter same passphrase again: 
      Your identification has been saved in /home/mortadelo/.ssh/id_dsa.
      Your public key has been saved in /home/mortadelo/.ssh/id_dsa.pub.
      The key fingerprint is:
      74:58:4f:20:28:57:f3:79:de:54:bf:b8:b5:ca:bf:32 mortadelo@pclocal
      The key's randomart image is:
      +---[DSA 1024]----+
      |       o+ o..   .|
      |    . o  * +   ..|
      |     o  o + o . .|
      |       . . o o. .|
      |        S   ...o |
      |              o .|
      |             . . |
      |            .E.  |
      |             o+o.|
      +-----------------+

      Cuando se utiliza DSA, ssh-keygen guarda la clave privada en el archivo ~/.ssh/id_dsa y la clave pública en ~/.ssh/id_dsa.pub.

      Una vez generado el par de claves comprobaremos sus permisos:

      1
      2
      3
      4
      5
      6
      
      mortadelo@pclocal:~$ ls -la ~/.ssh
      total 16
      drwx------ 2 mortadelo mortadelo 4096 abr 23 12:54 .
      drwxr-xr-x 3 mortadelo mortadelo 4096 abr 23 12:53 ..
      -rw------- 1 mortadelo mortadelo  672 abr 23 12:54 id_dsa-rw-r--r-- 1 mortadelo mortadelo  607 abr 23 12:54 id_dsa.pub

      Revisar los permisos de las claves generadas:

      • id_dsa debe tener permisos restrictivos 600.
      • id_dsa.pub debe tener permisos restrictivos 644.
      • Además, el directorio /home/mortadelo/.ssh debe tener permisos 700, tal como se observa:
        1
        2
        3
        4
        5
        6
        7
        8
        
        mortadelo@pclocal:~$ ls -la ~
        total 24
        drwxr-xr-x 3 mortadelo mortadelo 4096 abr 23 12:53 .
        drwxr-xr-x 4 root      root      4096 abr 23 12:50 ..
        -rw-r--r-- 1 mortadelo mortadelo  220 abr 23 12:50 .bash_logout
        -rw-r--r-- 1 mortadelo mortadelo 3515 abr 23 12:50 .bashrc
        -rw-r--r-- 1 mortadelo mortadelo  675 abr 23 12:50 .profile
        drwx------ 2 mortadelo mortadelo 4096 abr 23 12:54 .ssh
    2. Copiar la clave pública en el servidor SSH remoto (Volver al índice General)

      NOTA: Antes de continuar, es necesario que el usuario local, en este ejemplo mortadelo, sea un usuario del servidor remoto y que no exista alguna restricción de acceso sobre este usuario en el servidor SSH remoto. Puede que el servidor remoto esté configurado para sólo aceptar conexiones de usuarios autorizados. Véase en el artículo Instalar y configurar el servicio SSH en Debian la Directriz AllowUsers .

      Ahora es necesario copiar la clave pública del usuario mortadelo al archivo ~/.ssh/authorized_keys en el servidor remoto.

      mortadelo@pclocal:~$ ssh-copy-id mortadelo@192.168.1.20
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      The authenticity of host '192.168.1.20' can't be established.
      ECDSA key fingerprint is 1a:3c:bb:32:2b:9b:71:27:35:61:6e:1b:cb:8c:e9:36.Are you sure you want to continue connecting (yes/no)? yes/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
      /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
      Debian GNU/Linux 8
      mortadelo@localhost's password: 
       
      Number of key(s) added: 1
       
      Now try logging into the machine, with:   "ssh 'mortadelo@192.168.1.20'"and check to make sure that only the key(s) you wanted were added.

      Al ser la primera vez que mortadelo se autentica contra el servidor SSH se le presenta en la línea 2 el fingerprint del servidor SSH al que se está conectando y se le pregunta si está seguro de que es ese el servidor con el que quiere conectar. Si estamos seguros, en la línea 3 decimos yes y continuamos con el proceso. Si todo a ido bien, en la línea 11 se le indica como iniciar una conexión SSH con el servidor: ssh mortadelo@192.168.1.20

    3. Copia de seguridad (Volver al índice General)
      Si tenemos que migrar la configuración de nuestro usuario a otra máquina, sería conveniente que respaldásemos nuestro directorio $HOME/.ssh, ya que es ahí donde se guardan los archivos de la clave pública y clave privada generados en el punto i. Una de las muchas formas de respaldar el directorio sería ejecutando la siguiente orden:

      $ tar czf ssh.tgz $HOME/.ssh

  6.  
     

  7. Acceder al servidor SSH remoto (Volver al índice General)
    Utilizando cualquiera de los dos modos de acceso en los que se centra este artículo, el resultado final es el mismo. La sintáxis que utilizaremos para realizar la conexión es la misma, la única diferencia es que en uno de los modos se nos pide usuario y contraseña y en el otro modo no. A continuación muestro las salidas por pantalla de los dos modos de conexión:

    • Con usuario y contraseña (Volver al índice General)
      Si queremos conectarnos al servidor remoto con el nombre de usuario actual del equipo local, la orden genérica es:

      $ ssh host_remoto

      Donde host_remoto es la IP o el hostname del servidor SSH remoto.
      En el siguiente ejemplo nos conectaremos con el usuario actual del equipo local (fijaos en el PROMPT) al servidor SSH con IP 192.168.1.20:

      filemon@pclocal:~$ ssh 192.168.1.20

      Si queremos conectar como un usuario remoto, la orden genérica es:

      $ ssh usuario_remoto@host_remoto

      Donde usuario_remoto es un usuario válido en el servidor remoto.
      En el siguiente ejemplo nos conectaremos con el usuario filemon que no ha generado el par de claves y se conectará mediante el método tradicional; usuario y contraseña al servidor SSH con IP 192.168.1.20:

      filemon@pclocal:~$ ssh filemon@192.168.1.20

      La salida en ambos ejemplos sería la siguiente:

      The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
      ECDSA key fingerprint is 5e:68:2f:d8:07:75:96:69:ca:34:30:ef:f0:04:4c:a7.
      Are you sure you want to continue connecting (yes/no)? yes

      Al ser la primera vez filemon se conecta al servidor, se le presenta el fingerprint del servidor remoto y pregunta si queremos continuar conectando con ese servidor, a lo que contestamos yes si estamos seguros.

      Warning: Permanently added '192.168.1.3' (ECDSA) to the list of known hosts.
       ==================================================
                          Bienvenido a 
        ______                     _ _            __   __ 
       |___  /                    | (_)           \ \ / / 
          / / ___ _ __  _ __   ___| |_ _ __  _   _ \ V /  
         / / / _ \ '_ \| '_ \ / _ \ | | '_ \| | | | > <   
        / /_|  __/ |_) | |_) |  __/ | | | | | |_| |/ . \  
       /_____\___| .__/| .__/ \___|_|_|_| |_|\__,_/_/ \_\ 
                 | |   | |                                
                 |_|   |_|                                
       ===================================================
      filemon@192.168.1.20's password:
      Linux zion 3.2.0-4-amd64 #1 SMP Debian 3.2.86-1 x86_64
      Mensaje del dia (MOTD)
       
      filemon@pcremoto:~$

      Tras aceptar el fingerprint, aparece el Banner de bienvenida, luego nos pide la password para el usuario filemon en el servidor con IP 192.168.1.20, continua presentando el mensaje del día (MOTD) y terminamos en el PROMPT de una terminal del servidor remoto.

    • Con clave pública (Volver al índice General)
      La sintaxis para conectarnos utilizando clave pública es la misma que la utilizada para conectarnos con usuario y contraseña, la diferencia está en que con clave pública, el usuario debe de haber generado el par de claves pública/privada en la máquina local y haber subido (copiado) al servidor remoto su clave pública.

      En este ejemplo nos conectaremos con el usuario mortadelo, que como hemos visto antes, ha generado el par de claves, ha copiado su clave pública en el servidor SSH y se conectará mediante el método de clave pública:

      mortadelo@pclocal:~$ ssh mortadelo@192.168.1.20

      Y la salida sería la siguiente:

       ==================================================
                          Bienvenido a 
        ______                     _ _            __   __ 
       |___  /                    | (_)           \ \ / / 
          / / ___ _ __  _ __   ___| |_ _ __  _   _ \ V /  
         / / / _ \ '_ \| '_ \ / _ \ | | '_ \| | | | > <   
        / /_|  __/ |_) | |_) |  __/ | | | | | |_| |/ . \  
       /_____\___| .__/| .__/ \___|_|_|_| |_|\__,_/_/ \_\ 
                 | |   | |                                
                 |_|   |_|                                
       ===================================================
      Linux zion 3.2.0-4-amd64 #1 SMP Debian 3.2.86-1 x86_64
      Mensaje del dia (MOTD)
       
      mortadelo@pcremoto:~$

      Observense dos cosas; la primera, es que a mortadelo no se le presenta el fingerprint del servidor remoto ya que lo aceptó cuando copió su clave pública al servidor, y la segunda, es que tampoco se le ha solicitado la password.

  8.  

  9. Ejecutar comandos en un host remoto (Volver al índice General)
    Ahora que ya sabemos cómo entrar en un servidor SSH remoto sin contraseña, por medio de clave pública, también podemos ejecutar comandos remotamente. Esto es muy útil a la hora de programar tareas que se ejecutan de forma automática. La sintaxis generica del comando sería:

    $ ssh usuario_remoto@host_remoto "comando_remoto"

    Donde comando_remoto ha de ir entrecomillado y ha de ser un programa o script ubicado en el host_remoto.
    Veamos un ejemplo muy simple que nos ilustre:

    $ ssh usuario_remoto@host_remoto "find /tmp -name *.txt"

    Este comando buscará los ficheros con extensión .txt del directorio temporal /tmp que hay en el ordenador remoto.

    Otro ejemplo sería ejecutar un script en el ordenador remoto, por ejemplo uno que realizase una copia de seguridad:

    $ ssh usuario_remoto@host_remoto "/home/usuario_remoto/bin/./backup.sh"

    Y podemos rizar el rizo lanzando esta última orden desde el programador de taréas cron.

    30 2 * * 1-5 ssh usuario_remoto@host_remoto "/home/usuario_remoto/bin/./backup.sh"

    Ejecutar el script remoto backup.sh de lunes a viernes a las 2:30 horas.

 
Enlaces externos (Volver al índice General)

 

Espero que este artículo os haya sido de utilidad. Si pensáis que podéis colaborar para mejorar este artículo, que hay algo erróneo en él o simplemente deseáis comentarlo, por favor, dejad vuestra opinión más abajo.
 
Seguir J. Carlos:

Técnico Informático - Desarrollo Web - Administración de Redes

Técnico Informático. Desarrollo Web. Administración de redes.

Últimas publicaciones de

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.