Imprimir

Obtener un shell remoto con SSH

Veamos detallamente cómo funciona una conexión SSH:

  1. el servidor arranca con el script de inicio /etc/init.d/ssh.
  2. el cliente inicia la conexión:
    $ ssh usuario@servidor

    Podemos utilizar la IP o el nombre del servidor. Si no especificamos el usuario, utilizará el usuario que está realizando la conexión. Por ejemplo, si el usuario francis desde la máquina asterix quiere conectarse a obelix como mario, ejecutará:

    francis@asterix:~$ ssh mario@obelix
  3. el servidor comprueba si el host del cliente tiene permiso para conectar, tras lo cual cliente y servidor intercambian en texto plano sus identificadores de versión, para comprobar si los protocolos soportados coinciden y la comunicación es posible.
  4. el servidor envía al cliente su clave pública DSA (algoritmo asimétrico) en texto sin cifrar, que el cliente usará para cifrar los mensajes hacia el servidor, haciéndolos sólo legibles para el propio servidor.
  5. si no es la primera vez que se conecta a ese servidor, el cliente compara la clave pública recibida del servidor con la que tiene almacenada para verificar su autenticidad. Si es la primera vez que se conecta a ese servidor y no la tiene almacenada, el cliente no sabe si la clave pública recibida es realmente la del servidor o la de un impostor que ha interceptado la conexión, lo que se conoce con el nombre de ataque man in the middle, por lo que pide confirmación al usuario para aceptarla como válida:
    The authenticity of host obelix (192.168.1.3) can't be established.
    DSA key fingerprint is e9:df:72:2c:eb:1d:bf:b2:3a:38:96:2a:3b:6b
    Are you sure you want to continue connecting (yes/no)?

    Para confirmarlo el usuario debería obtener el fingerprint por otro medio alternativo y seguro: correo electrónico cifrado, por teléfono, correo postal, en persona, etc. Confirmar la clave sin verificarla adecuadamente implica asumir el riesgo de una posible suplantación. Si confiamos en la clave, le decimos al cliente que continúe con la conexión:

    yes 
    Warning: Permanently added obelix (DSA) to the list of known hosts.

    Como hemos confiado en la clave pública recibida, el cliente nos informa de que ésta se ha añadido al archivo ~/.ssh/known_hosts, donde se almacenan los hosts conocidos. En adelante cada vez que el cliente se conecte a ese servidor comparará la clave pública recibida al iniciar sesión con la almacenada:

    • si son iguales, continuará con el proceso de conexión.
    • si son diferentes, nos avisará y pedirá confirmación para el nuevo fingerprint:
      key_read failed
      The authenticity of host obelix (192.168.1.3) can't be established.
      DSA key fingerprint is e9:df:72:2c:eb:1d:bf:b2:3a:38:96:2a:3b:6b
      Are you sure you want to continue connecting (yes/no)?
  6. el cliente genera una clave de sesión (válida sólo para la sesión en curso), selecciona un algoritmo de cifrado simétrico y envía un mensaje conteniendo la clave de sesión y el algoritmo simétrico seleccionado, cifrado con la clave pública DSA del servidor. A partir de este momento todo el tráfico entre cliente y servidor viaja cifrado utilizando el algoritmo de cifrado simétrico seleccionado y la clave de sesión.
  7. ahora el cliente se debe identificar ante el servidor, cosa que haremos mediante contraseña (también puede hacerse mediante claves DSA, sin necesidad de password). El servidor solicita al usuario la contraseña correspondiente a usuario:
    mario@obelix's password:

    Si el login es válido y no hay restricciones adicionales obtendremos un shell en el servidor SSH, de modo que podremos usar el sistema como si estuviéramos sentados allí, con los privilegios que tenga ese usuario:

    mario@obelix:~$

    Identificación del cliente mediante clave pública

    El cliente puede identificarse mediante clave pública, sin password. Para ello:

    - creamos en el cliente una clave RSA:

    francis@asterix:~$ ssh-keygen -t rsa -f ~/.ssh/id_rsa

    - activamos ssh-agent en el cliente para que no nos pida la pass-phrase:

    francis@asterix:~$ eval `ssh-agent -s`
    Agent pid 12297
    francis@asterix:~$ ssh-add
    Enter passphrase for /home/francis/.ssh/id_rsa:
    Identity added: /home/francis/.ssh/id_rsa (/home/francis/.ssh/id_rsa)

    - copiamos en el servidor la clave pública (~/.ssh/id_rsa.pub):

    francis@asterix:~$ scp ~/.ssh/id_rsa.pub mario@obelix:~/.ssh/id_rsa.pub

    - la añadimos en el servidor al final del fichero ~/.ssh/authorized_keys:

    mario@obelix:~$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

    - y comprobamos que podemos iniciar una sesión SSH sin password ni pass-phrase:

    francis@asterix:~$ ssh mario@obelix
    mario@obelix:~$
  8. para salir de la sesión SSH teclearemos exit, retornando al shell de la máquina cliente:
    mario@obelix:~$ exit
    logout
    Connection to obelix closed
    francis@asterix:~$

Deja un comentario