miércoles, 20 de abril de 2016

ssh

Para solucionar este problema, se desarrolló un nuevo protocolo llamado SSH (Secure Shell). SSH soluciona los dos problemas básicos de la comunicación segura con un host remoto. Primero, comprueba que el host remoto es quien dice ser (previniendo los llamados ataques de “man in the middle - hombre en el medio”), y segundo, encripta todas las comunicaciones entre los hosts locales y remotos.

SSH consta de dos partes. Un servidor SSH funciona en el host remoto, escuchando conexiones entrantes en el puerto 22, mientras que un cliente SSH se usa en el sistema local para comunicarse con el servidor remoto.

La mayoría de las distribuciones Linux están equipadas con una implementación de SSH llamada OpenSSH del proyecto OpenBSD. Algunas distribuciones incluyen los paquetes tanto del cliente como del servidor por defecto (por ejemplo, Red Hat), mientras que otras (como Ubuntu) solo tienen el cliente. Para permitir que un sistema reciba conexiones remotas, debe tener instalado el paquete OpenSSH-server, configurado y ejecutándose, y (si el sistema está también ejecutando un cortafuegos o tras él) debe permitir las conexiones de red entrantes por el puerto TCP 22.

Consejo: Si no tienes un servidor remoto para conectarte pero quieres probar estos ejemplos, asegurate de que el paquete OpenSSH-server está instalado en tu sistema y usa localhost como nombre del host remoto. De esta forma, tu máquina creará conexiones de red consigo misma.

El cliente SSH usado para conectar con servidores SSH remotos se llama, muy apropiadamente, ssh. Para conectar a un host remoto llamado remote-sys, usaríamos el cliente ssh así:

[me@linuxbox ~]$ ssh remote-sys
The authenticity of host 'remote-sys (192.168.1.4)' can't be established.
RSA key fingerprint is
41:ed:7a:df:23:19:bf:3c:a5:17:bc:61:b3:7f:d9:bb.
Are you sure you want to continue connecting (yes/no)?

La primera vez que se intenta la conexión, se muestra un mensaje indicando que la autenticidad del host remoto no puede ser establecida. Es porque el programa cliente nunca ha visto al host remoto antes. Para aceptar las credenciales del host remoto, introduce “yes” cuando te pregunte. Una vez que se establece la conexión, el usuario/a es preguntado/a por su contraseña:

Warning: Permanently added 'remote-sys,192.168.1.4' (RSA) to the list of known hosts.
me@remote-sys's password:

Después de que introduzcamos la contraseña correctamente, recibimos el prompt de shell del sistema remoto:

Last login: Sat Aug 30 13:00:48 2008
[me@remote-sys ~]$

La sesión remota de shell continua hasta que el usuario introduzca el comando exit en el prompt de shell remoto, cerrando de ese modo la conexión remota. En este punto, la sesión local de shell vuelve y reaparece el prompt de shell local.

También es posible conectar a sistemas remotos usando un nombre de usuario diferente. Por ejemplo, si el usuario local “me” tiene una cuenta llamada “bob” en un sistema remoto, el usuario me podría acceder a la cuenta bob en el sistema remoto de la siguiente forma:

[me@linuxbox ~]$ ssh bob@remote-sys
bob@remote-sys's password:
Last login: Sat Aug 30 13:03:21 2008
[bob@remote-sys ~]$

Como vimos antes, ssh verifica la autenticidad del host remoto. Si el host remoto no se autentica correctamente, aparece el siguiente mensaje:

[me@linuxbox ~]$ ssh remote-sys
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@  WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!  @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
41:ed:7a:df:23:19:bf:3c:a5:17:bc:61:b3:7f:d9:bb.
Please contact your system administrator.
Add correct host key in /home/me/.ssh/known_hosts to get rid of this message.
Offending key in /home/me/.ssh/known_hosts:1
RSA host key for remote-sys has changed and you have requested strict checking.
Host key verification failed.

Este mensaje está causado por una de dos posibles situaciones. Primero, un atacante habría intentado un ataque “hombre en el medio”. Es raro, ya que todo el mundo sabe que ssh alerta al usuario de ello. El culpable más probable es que el sistema remoto se haya modificado de alguna forma, por ejemplo, su sistema operativo o su servidor SSH ha sido reinstalado. Sin embargo, en aras de la seguridad y la protección, la primera posibilidad no debería descartarse. Siempre comprueba con el administrador del sistema remoto cuando aparezca este mensaje.

Tras determinar que el mensaje se debe a una causa benigna, es más seguro corregir el problema en el lado del cliente. Esto se hace usando el editor de texto (quizás vim) para eliminar las claves obsoletas del archivo ~/.ssh/know_hosts. En el mensaje del ejemplo anterior, vemos esto:

Offending key in /home/me/.ssh/known_hosts:1

Esto significa que la línea uno del archivo known_hosts contiene la clave infractora. Borra esta línea del archivo y el programa ssh podrá aceptar nuevas credenciales de autenticación del sistema remoto.

Además de abrir una sesión de shell en el sistema remoto, ssh también nos permite ejecutar un único comando en un sistema remoto. Por ejemplo, para ejecutar el comando free en un sistema remoto llamado remote-sys y mostrar el resultado en el sistema local:

[me@linuxbox ~]$ ssh remote-sys free
me@twin4's password:
             total   used   free shared buffers cached

Mem:        775536 507184 268352      0  110068 154596

-/+ buffers/cache: 242520 533016
Swap:      1572856      0 1572856
[me@linuxbox ~]$

Es posible usar esta técnica de muchas formas interesantes, como en este ejemplo en que realizamos un ls en el sistema remoto y redirigimos la salida a un archivo en el sistema local:

[me@linuxbox ~]$ ssh remote-sys 'ls *' > dirlist.txt
me@twin4's password:
[me@linuxbox ~]$

Fíjate que se usan comillas simples en el comando anterior. Esto es porque no queremos que la expansión del nombre de la ruta se realice en la máquina local; sino que queremos que se realice en el sistema remoto. Igualmente, si hubiéramos querido redirigir la salida a un archivo de la máquina remota, podríamos haber colocado el operador de redirección y el nombre de archivo dentro de las comillas simples:

[me@linuxbox ~]$ ssh remote-sys 'ls * > dirlist.txt'

No hay comentarios:

Publicar un comentario