SSH es un protocolo y el nombre del programa que lo implementa, que sirve para acceder de forma segura a máquinas remotas a través de una red, permitíendonos ejecutar comandos en la máquina remota e inclusive correr programas gráficos a través del Servidor X.

En este artículo veremos como SSH permite además de la conexión a otras máquinas, copiar datos de forma segura (tanto archivos como simular sesiones FTP seguras), gestionar claves RSA para no escribir claves al conectar a las máquinas y pasar los datos de cualquier otra aplicación por un canal seguro mediante SSH.

Entendiendo SSH

Anteriormente se utilizaba Telnet para accesar máquinas remotas en una red, el problema de esto es que Telnet no ofrece ningún tipo de seguridad, ya que envía toda la información en texto plano y es visible por cualquiera con acceso en la red, lo cual como es de suponerse es un gran riesgo de seguridad es por esto que NUNCA SE DEBE UTILIZAR TELNET PARA ACCEDER A UNA MAQUINA REMOTA y es recomendable deshabilitar este servicio, ya quitado esto del camino vamos a hablar de SSH.

SSH utiliza una arquitectura de Cliente-Servidor por tiene que estar corriendo el daemon de SSH en la máquina donde nos queremos conectar, la versión más popular de SSH es el OpenSSH el cual ya viene instalado por defecto en las mayorías de las distribuciones de linux actuales.

Si estamos en Debian o en Ubuntu (recordando colocar en el caso de Ubuntu al principio del comando) podemos correr el daemon de SSH ejecutando la siguiente línea de código:

/etc/init.d/ssh start

El puerto por defecto que usa SSH es 22, así que si tenemos un firewall activado tenemos que permitir este puerto si queremos permitir conexiones remotas a través de SSH.

Bueno ahora que tenemos SSH corriendo en la máquina remota y tenemos el cliente SSH en la máquina desde la cual nos queremos conectar solo queda correr el siguiente comando desde la consola:

ssh usuario1@servidor_remoto

Donde usuario1 es el nombre de usuario con el cual tenemos creada una cuenta en el servidor remoto y servidor_remoto es el nombre de dominio o la dirección IP de la máquina donde nos queremos conectar.

Cuando ejecutamos este comando nos debería preguntar nuestro password, introducimos el password y ya estamos conectados a la otra máquina, puedes ejecutar cualquier comando para los cuales tengas privilegios en la otra computadora.

Una buena medida de seguridad es no permitir el acceso como root via SSH para esto primero hacemos un backup o respaldo del archivo de configuración de SSH en el servidor remoto:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

Luego usando tu editor de texto favorito abrimos el archvio /etc/ssh/sshd_config y buscamos la lína de texto que dice ‘#PermitRootLogin yes‘ y la cambiamos por ‘ #PermitRootLogin no ‘ guardamos el archivo y reiniciamos SSH con el siguiente comando:

/etc/init.d/sshd restart

Si necesitas tener privilegios de root en el servidor remoto puedes crear un usuario que pueda ejecutar su para tener privilegios de root en la máquina remota.

SCP - Copia segura de archivos (Secure File Copying)

SCP es una parte integral del paquete de OpenSSH. Es un simple comando que nos permite copiar cualquier archivo o carpeta desde o hacia una máquina remota usando el protocolo SSH, y es un gran reemplazo para el protocolo FTP el cual es utilizamo ampliamente por los usuarios de Internet pero no están concientes que todos los passwords enviados por este protocolo están en texto simple, es decir, que pueden ser vistos por cualquiera que intercepte la transmisión entre ambos computadores. SCP es una alternativa mucho más confiable ya que manda encriptada toda la información através de SSH.

El ejemplo más simple de SCP es el siguiente:

scp archivo.txt usuario1@servidor_remoto:~/

Este comando copiará el archivo local archivo.txt a el servidor_remoto y lo colocará en el directorio home del usuario1. Se puede utilizar cuaquier directorio al que tenga acceso el usuario1 como por ejemplo /tmp/, /home/publico/, etc.

Ahora si queremos copiar un archivo desde el servidor remoto hacia nuestra máquina local ejecutamos el siguiente comando:

scp usuario1@servidor_remoto:~/archivo.txt

Este comando copiará el archivo.txt que se encuentra en la carpeta /home/ del usuario1 en el servidor_remoto a nuestra máquina local.

Algunas opciones útiles de scp son:

  • -r : para copiar archivos recursivamente (incluyendo subcarpetas)
  • -P port : donde cambiamos port por el número de puerto no estandar (que es el 22) en caso de que tengamos configurado el SSH en un puerto distinto al estándar. Si colocamos el servidor de SSH al puerto 443 que se utiliza para HTTPS podemos saltarnos restricciones existentes en un red corporativa.

Interfaces Gráficas para SSH y para SCP

Una interfaz muy utilizada en Windows para realizar SSH es Putty es un programa totalmente gratuito y muy versatil que normalmente viene acompañado con pscp que permite hacer SCP desde Windows, este programa también está disponible para Linux. Tambien existe otra buena aplicación de SCP llamada WinSCP desde MS Windows.

Tanto Nautilus como Konkeror son capaces de manejar SCP, para esto colocamos en la barra de direcciones ssh://usuariio1@servidor_remoto:~/ y realizamos las transferencias que queramos.

SSH sin passwords - Generando claves RSA

Antes de seguir este paso es de destacar que puede ser inseguro utilizar este método ya que degrada la seguridad del acceso a un servidor remoto utilicelo bajo su propio riesgo.

Puede ser molesto tener que colocar el password cada vez que se realiza una conexión via SSH y utilizar una conexión sin clave es un gran riesgo de seguridad por lo que para este caso tenemos como solución la autorización a través de un par de llave pública-privada.

Este par de llave generalmente es generado en el sistema remoto utilizando el comando ssh-keygen. A continuación vamos a ver un ejemplo de una generación de clave RSA:

$ ssh-keygen -t rsa
  Generating public/private rsa key pair.
  Enter file in which to save the key
(/home/usuario1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in
/home/usuario1/.ssh/id_rsa.
  Your public key has been saved in
/home/usuario1/.ssh/id_rsa.pub.
 The key fingerprint is:
 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Cuando el programa pregunte por tu password de la llave (key password), debes presionar ENTER, de esta forma se crea una llave sin password. Recuerda que esto es siempre un hueco de seguridad así que hazlo bajo tu propio riesgo. La llave privada se guarda en /home/usuario1/.ssh/id_rsa y nunca se debe hacer pública. La llave pública es guardada en /home/usuario1/.ssh/id_rsa.pub y esta es la que podemos compartir con cualquiera.

Para accesar desde un sistema remoto desde nuestra computadora local sin ningún password (solamente usando llaves), debemos añadir la información de la llave pública en el archivo de llaves autorizadas (autorized_keys) que se encuentra en la carpeta home de nuestro usuario es decir, ~/.ssh. Esto se puede hacer con los siguientes comandos desde nuestro sistema local:

$ scp /home/user1/.ssh/id_rsa.pub \
 user1@remote_server:~/
$ ssh usuario1@servidor_remoto
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

El tercer comando obviamente va a ser ejecutado en el servidor remoto, luego de esto no se necesitará introducir la clave para realizar ningún comando en el servidor remoto lo cual hace las cosas mucho más rápidas.

Si necesitas tener acceso desde el servidor remoto hacia el sistema local tienes que generar un par de llaves en el sistema local y repetir el proceso, ya que las llaves sólo funcionan en un sentido.

Redireccionamiento de X11 - Corriendo aplicaciones gráficas remotamente

Otra funcionalidad de SSH es que permite ejecutar casi cualquier aplicación basada en el protocolo X (protocolo gráfico) remotamente, solo es necesario conectarse al servidor remoto usando la opción -X:

ssh -X usuario1@servidor_remoto

y se mostrará de ahora en adelante cualquier aplicación X que se corra en el sistema local. Podemos hacer que permanentemente se redireccione X11 editando el archivo de configuración de SSH ubicado normalmente en /etc/ssh/ssh_config y cambiando la linea de ForwardX11 de no a yes. Claro que se necesita que la opción de redireccionamiento también este presente en el servidor remoto pero casi siempre está habilitado por defecto.

Para ejecutar cualquier aplicación gráfica podemos utilizar la siguiente sintaxis de comando:

ssh -X usuario1@servidor_remoto 'firefox'

Esto ejecutará el navegador Firefox en el servidor remoto, redireccionando la pantalla a nuestro sistema local.Claro que la velocidad de la aplicación dependerá de la velocidad de nuestra conexión, en las redes locales funciona muy bien de hecho se pueden hasta ver películas, en caso de una conexión por Internet dependerá de que tan pesada sea la interfaz gráfica y la velocidad de conexión que poseas.

Ahora que sabemos conectarnos a un sistema remoto vía SSH, podemos ejecutar cualquier comando que normalmente ejecutaríamos en una máquina local. Esto es muy utíl sobre todo cuando tenemos un servidor web al que no tenemos acceso físicamente y la única forma de accesarlo es de forma remota. También aprendimos como copiar archivos y carpetas así como ejecutar interfaces gráficas remotamente.

En otro artículo veremos otras funcionalidades de SSH y aprenderemos otros trucos más.

Espero que les haya servido de algo y espero sus comentarios.