Conectándome a Windows 8 desde Ubuntu con SSH

Últimamente estoy intentando aprender a desenvolverme con la línea de comandos de Ubuntu y haciendo pruebas para conectarme entre máquinas a través del protocolo SSH.

Últimamente estoy intentando aprender a desenvolverme con la línea de comandos de Ubuntu y haciendo pruebas para conectarme entre máquinas a través del protocolo SSH.

Estar continuamente aprendiendo no resulta nada sencillo, al menos para mi, a veces intento aprender sobre algo y termino atrancando en un callejón sin salida… y me veo obligado a dejar el tema aparcado una temporada. Otras veces sin embargo consigo aprender algo nuevo con éxito y lo que es más importante consigo incorporarlo a mi rutina habitual de trabajo, este es el caso de Vim, Eclipse o Git… con los que ya he conseguido desenvolverme con cierta soltura.

Hace ya varios años también conseguí meterme a fondo con Amazon WS sobre todo con S3 y gracias a eso todas nuestras imágenes (incluidas las de este blog) están en la nube. Pero cuando intenté adentrarme en el mundo de EC2 choqué contra un muro, conseguí crearme alguna instancia Windows, acceder por escritorio remoto, encender, apagar… pero me da la impresión de que EC2 está pensado sobre todo para crearte instancias en servidores Linux, sin entorno gráfico e interaccionando con ellas a través de línea de comandos.

Es por eso que en las últimas semanas he estado jugando mucho con Ubuntu 12.04, tanto es así que ahora es mi sistema operativo por defecto en el portátil y me va estupendamente… llegué hasta tenerlo instalado en ordenador de la oficina, pero al final tuve que tirar la toalla y volver a ponerme exclusivamente Windows 8, un sistema operativo por otra parte maravilloso, del que estoy totalmente enamorado.

Así que las cosas están así, en el portátil Ubuntu y en la oficina Windows 8… y ¿como podría juguetear con SSH entre los dos? Pues es bastante sencillo, aunque a mi me llevó varios días, algo que espero poderos ahorrar a vosotros. Sirva este “tutorial” como una chuletilla por si algún día necesito configurarlo todo de nuevo.

Es muy importante recordar en todo momentos que estamos intentando conectarnos desde Ubuntu (cliente) a Windows 8 (servidor ssh) y que en cada equipo se tienen que hacer cosas distintas.

Primeros pasos en el Windows 8

1 – Nos tenemos que instalar CYGWIN “a collection of tools which provide a Linux look and feel environment for Windows”. Este programa es un poco especial porque tiene muchos componentes de instalación, y por defecto por ejemplo no te bajará lo necesario para disponer de OpenSSH, para esto tienes que seleccionar a la hora de la instalación los binarios de Admin –> cygrunsrv y Net –> openssh. Tal y como explica en este artículo y este otro con muchas capturas.

2 – Una vez instalado podremos crearnos una pantalla de terminal en Windows que acepta comandos Unix igual que cuando abrimos en Ubuntu un terminal con Control + Alt + T. Algunos comando puede que no te funcionen, por ejemplo, si escribes “clear” te dirá que no reconoce la instrucción… pero no te asustes busca por internet cual es el componente de CYGWIN que te falta, vuelve a ejecutar el setup y añádetelo…. y “tachán!!!” ya dispondrás de ese comando que echabas en falta. Uno de los componentes que yo me instalé fue Vim para poder editar archivos de texto desde el terminal con comodidad.

3 – Bien ahora tenemos que configurar el servidor de SSH, para eso tendremos que ejecutar CYGWIN como administrador ssh-host-config. Este proceso nos va a realizar varias preguntas a las que tendremos que responder a todas YES, lo más importante es que te va a crear dos cuentas de usuario en tu sistema, una de ellas que tiene por defecto el nombre de cyg_server es una cuenta de administrador que será la que utilices para loguearte posteriormente, te va a pedir por tanto un contraseña para esa cuenta que tiene que cumplir los criterios de password seguro que tienes configurado en tu sistema (por ejemplo: Patito99)

4 – Ahora viene algo un poco extraño que a mi me creo mucha confusión, para que el servidor SSH funcione necesita disponer de dos ficheros /etc/passwd y /etc/group. En esos ficheros tiene que estar presente la cuenta cyg_server y el grupo de Administradores al que pertenece la cuenta, creo que con eso bastaría para que funcionara el servidor SSH… pero la gente lo que hace es hacer un volcado de todos los grupos y usuarios locales de la máquina a través de estas instrucciones:

mkpasswd -l > /etc/passwd
mkgroup –l > /etc/group

Cuando no conseguí hacer que funcionara descubrí que si en lugar -l pones -d te vuelca los usuarios del dominio y no los locales… pero nosotros lo que necesitamos son los locales. Una vez ejecutes esas instrucciones, siempre dentro del terminal de cygwin, podrás ir a ver la parrafada que ha volcado en esos ficheros.

5 – Una vez hecho esto podemos poner en marcha el servidor de SSH. Cuando ejecutamos ssh-host-config en el paso 3, una de las de las cosas que hizo fue crear un servicio que ahora tenemos que poner manualmente en marcha (o reiniciar el ordenador para que automáticamente lo active). Para eso usamos la instrucción siguiente desde cygwin, entrando como administrador:

net start sshd

Para parar el servicio utilizaremos stop en lugar de start.

6 – En teoría un servidor OpenSSH ya está funcionando, pero tendrás que irte al Firewall de Windows para abrir el puerto TCP 22 para que admita la entrada por ahí. En todas partes te recomienda que no utilices ese puerto porque es muy habitual, esto es algo que puedes hacer editando el archivo /etc/sshd_config. Esto es mejor dejarlo para el final, primero vamos a intentar conseguir conectarnos.

7 – Si todo ha ido bien (que no fue mi caso) ahora te deberías poder conectar por SSH desde tu ordenador Windows 8 a tu propio ordenador Windows 8. Para ello utilizaremos la siguiente instrucción:

ssh cyg_server@localhost -p 22

Realmente el -p 22 sobra porque es el puerto por defecto pero lo pongo para que sepas lo que tienes que hacer cuando cambies tu puerto. Primero te pedirá que aceptes la ECDSA key finger print del host (esto sólo te lo pedirá una vez) y después te pedirá la clave de la cyg_server.

Tendrás que meter Patito99… y ya te debería dejar entrar. Con esto hemos conseguido conectarnos por SSH a nuestro propio equipo, que vale más bien de poco… pero que nos sirve para saber lo estamos haciendo bien. Si algo falla para hacer debugging tenemos varias opciones:

– conectándonos con el parámetro “-v” para que nos de información de que es lo que está haciendo en cada momento y donde falla. Para una información aun más amplia podemos poner “-vvv”.

– también en lugar de arrancar el servidor SSH como un servicio podemos hacerlo manualmente de la siguiente manera:

% /usr/sbin/sshd.exe -D

8 – Suponiendo que todo haya funcionado bien, antes de irnos a nuestro equipo Ubuntu es probable que tengamos que hacer algunas configuraciones en nuestro router. Abriendo el puerto de SSH y redireccionandolo a la dirección IP local de nuestro equipo. Así cuando ataquemos nuestra dirección pública de internet por ese puerto, el firewall permitirá la entrada y enviara los datos a nuestro equipo. De nuevo lo ideal es ir pasito a pasito para no volvernos locos y conectar el cliente y el servidor a la misma LAN, antes de acometer la entrada desde el exterior.

Ahora en nuestro equipo Ubuntu…

9 – Ya en nuestro ordenador Ubuntu (vamos a suponer que estamos en la misma LAN y que nuestro equipo Windows9 tiene la IP 192.168.1.30) tendremos que ejecutar la siguiente instrucción:

ssh cyg_server@192.168.1.30

Si no tenemos ssh instalado nos pedirá que instalemos el paquete correspondiente y puede que tengamos que abrir el puerto de SSH en el Firewall de Ubuntu para que nos permita la conexión saliente. Debería funcionar todo de una manera muy parecida a cuando hicimos la prueba en local.

Conectándonos sin contraseña…

Si hemos conseguido conectarnos de esta manera entonces podemos acceder a la siguiente fase que es crearnos unas claves RSA en nuestro equipo Ubuntu para poder acceder sin necesidad de introducir el password.

Esto tiene su miga hasta que se entiende, básicamente en tu equipo Ubuntu te creas una clave pública y otra clave privada, y tienes que configurar los permisos para que se acceda de distinta manera a una y a otra.

Luego la clave pública la tienes que transferir al servidor SSH en el Windows8 (esto lo haremos utilizando SSH a la manera que ya sabemos, con password).

10 – Todo eso lo hacemos con esta serie de comandos que ejecutamos en el ordenador cliente, el que tiene Ubuntu:

ssh-keygen -t rsa

Esto nos crea las claves en ~/.ssh/ con los nombre id_rsa.pub (privada) y id_rsa_pub (clave pública). Nos pedirá una frase de seguridad para proteger la clave, elegimos por ejemplo “Gato99”.

En esa misma carpeta probablemente ya habrá un archivo known_hosts que se crea con todas las ECDSA key finger print de los host (ssh servers) a los que nos hemos aceptado conectar.

11 – Con chmod nos aseguraremos que los archivos en Ubuntu tienen los permisos adecuados:

chmod 700 ~/.ssh && chmod 600 ~/.ssh/*

12 – Ahora nos toca transferir la clave pública al servidor SSH, lo hacemos asi (todo en una única línea):

cat ~/.ssh/id_rsa.pub | ssh cyg_server@192.168.1.30 ‘cat >> .ssh/authorized_keys’

Nos pedirá el password, OJO tenemos que poner Patito99, porque esta operación la estamos haciendo todavía con password, el método antiguo.

13 – En servidor SSH en Windows 8 también nos tenemos que asegurar que los permisos de los archivos son correctos ejecutando la siguiente instrucción:

chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/

14 – Si todo ha funcionado bien ahora nos podremos conectar sin usar el password y utilizando en lugar nuestra “passphrase” Gato99. En Ubuntu te pedirá esta frase la primera vez y en las siguientes conexiones la recordará, hasta que re-inicies el ordenador.

Espero que os funcione… y si no os funciona no rendiros hasta que lo consigáis, en el camino seguro que aprendéis un montón de cosas