2009-01-07

Montando un servidor SSH con clave pública

Bueno. Después de un momento de reflexión, supe qué escribir en mi blog. Empiezo con uno de mis mil sueños frustados: montar un servidor SSH propio, sin tener el problema de seguridad que representa el ataque por fuerza bruta.
Empiezo por lo primero: para montar un servicio en una máquina, hay que pensar en varias cosas, como el servicio que lo brindará, y el cliente que lo consumirá. El resto viene dentro de las especificaciones del servicio, en este caso, SSH.
Una breve definición de SSH dice que, es un servicio que brinda el acceso remoto a la consola de comandos de la máquina en cuestión, permitiendo controlarla desde otro equipo que tenga el cliente adecuado instalado.
Ya pensé en esto, así que empiezo a decir cómo lo haré.

Conseguir el servicio SSH: freeSSHd será el servicio que utilizaré. Así que hay que descargarlo e instalarlo.

En el proceso de instalación, este servicio pide dos cosas importantes, que se deben hacer en el momento mismo de la instalación (más que todo para evitar futuros inconvenientes), que es la creación de las claves privadas y montar la aplicación como un servicio. Recuerden que a ambas deben decir sí, a menos que tengan sus propias claves o quieran iniciar el servicio manualmente y manejar éste de una forma más personalizada.

Una vez termine de instalar, aparecerá un ícono en forma de equipo con un candado en la barra de tareas en segundo plano (al lado del reloj). Este manejará la configuración del servicio, incluyendo la ejecución. La parte interesante viene a la hora de autenticarnos en el servicio, ya que es posible (y me ha tocado casos) en que el tunneling y manejo por SSH de servidores sea lo más pobre a la hora de la autenticación: contraseñas alfa-numéricas de 4 o 5 caracteres es lo único que protege a todo el sistema, y la verdad, me parece bastante inseguro, siendo así posiblemente atacado por Black hats y hasta lammers. Así que, una vez instalado, nos vamos a la pestaña Authentication, y seleccionamos los métodos de autenticación que queremos para nuestro servicio. Después de la lógica, sabemos que si vamos a requerir siempre que el usuario se autentique con una clave pública, sólo tenemos dos opciones: que también se autentique con una contraseña o que no se autentique con contraseña, pues, en este caso me parece bobada autenticarse con contraseña, así que la deshabilito (tal como se muestra en la figura). A parte de esto, también es necesario especificar en qué carpeta se almacenarán las claves públicas de los usuarios autenticados, mostrada en el cuadro de texto "Public key folder".

Una vez configurado el método de autenticación, procedemos a crear las cuentas que se usarán para el acceso. En este caso sólo es necesario el nombre de usuario, ya que la autenticación será por medio de una clave pública. Y los servicios a utilizar dependerá de lo que queramos con la máquina. En este caso, sólo quiero Shell y SFTP. El tunneling no lo necesito, así que no lo habilito.


Después de haber terminado de configurar el servicio, procedemos a crear las claves para la autenticación. Estoy usando PuTTYgen para crear las claves. Mi predilección son claves RSA SSH-2 de 2048 bits, haciendo más difícil el rompimiento de éstas. Después de haber dados los parámetros, genereamos las claves y hay que hacer algo especial para que nos funcione correctamente el acceso SSH: debemos copiar la clave pública (que aparece en el diálogo del generador de claves) en un editor de textos (puede ser el mismo bloc de notas) y lo guardamos en la carpeta de claves públicas (que especificamos a la hora de especificar la autenticación), y el nombre del archivo deberá ser el mismo nombre de usuario que especificamos a la hora de montar los usuarios; y sólo el nombre de usuario, sin extenciones ni nada por el estilo.

Ya una vez hemos guardado la clave en el lugar correspondiente (y haber guardado igualmente la clave privada en el lugar corresopndiente), prodremos conectarnos. Para eso utilizo PuTTY, y siguiendo la categoría SSH > Connection > SSH > Auth, especifico el lugar donde se encuentra la clave privada, que me servirá como método de autenticación.

Posteriormentepodremos especificar la dirección IP, y desde ahí ya podremos conectarnos utilizando la clave privada que tenemos, desde cualquier lugar del mundo. Hay una serie de problemas que surgen con esto: si tenemos una IP dinámica (mi caso), es posible que tengamos acceso, hasta que el ISP nos cambie la IP, y tengamos que volver a memorizarla, y si estamos afuera de casa, digamos a dos horas de viaje, no podremos conectarnos porque esa IP ha sido cambiada, y de nada nos serviría ir hasta allá a conseguirla de nuevo. Así que podríamos inventar algún sistema de descubrimiento para que esa IP, cuando sea cambiada, se refresque y podamos seguir accediendo sin problemas. Por el momento lo tengo en borrador, pero les digo que utilizando PHP, servicios web y un cliente sale fácil. Es para mí una prioridad, así que en esto lo empezaré a hacer y escribiré aquí (o en Tiwtter) el proceso, para animarme más.
¡Una última cosa! Recuerden configurar firewalls, proxies, routers, gateways y cuanta cosa dependa el acceso a internet para que el servicio pueda ser consumido.