lunes, 8 de febrero de 2010

SSH: Conexiones seguras para tod@s


Seguramente muchos conozcais telnet, una forma de conseguir una consola de comandos en un ordenador remoto, igualmente muchos sabreis que es inseguro por que va "en plano" por la red (un ordenador cualquiera de la red podria ver lo que pasa en el pc remoto, secuestrar la sesion o incluso capturar las contraseñas), por eso desde hace unos años (desde el 99) se utiliza SSH (secure shell), que utiliza conexiones seguras, peroo... sabiais que ademas de utilizarlo como una consola de comandos se puede utilizar para:

  • Transferencias de archivos al estilo FTP
  • Copia de archivos en red
  • Cifrar casi cualquier tipo de conexion (todo lo que se pueda a traves de SOCKS: web, correo, mensajeria instantanea,... )
  •  Acceder a sistemas de archivos remotos como si fuesen locales (SSHFS)
  • VPN (aunque mientras se escribe esto solo es posible con el cliente y el servidor de OpenSSH)
Y todo esto sin dejar de lado la seguridad...

Para las pruebas se utilizo un servidor OpenSSH_5.3p1 y un cliente OpenSSH, el servidor puede necesitar alguna configuracion, pero la mayoria de las veces las distros/flavours ya lo traen listo para usar, ademas algunas cosas solo se pueden hacer con este servidor en concreto (OpenSSH)


Para intentar hacer todo mas claro, los comandos usaran este tipo de letra, lo que vaya etiquetado <asi> es una campo ( por ejemplo <direccion del servidor> podria ser ssh.pruebas.com o 192.168.1.17 ), por ultimo lo que va entre ´[´ y ´]´ es opcional (se usa, entre otras cosas, para activar opciones adicionales)

Empezando por lo basico:

Para abrir una consola de comandos en el servidor se utilizara el siguiente comando:

ssh [<usuario>@]<servidor> [-p <puerto>]

La parte de <usuario>@ solo es necesaria si se va a usar un usuario distinto al de la maquina local, y  -p <puerto> se usa para acceder por un puerto no estandar (que es el 22).

Este es un ejemplo posible:
Desde el pc 'vBox' el usuario 'kenkeiras' hace ssh al servidor 'sleepless' (ssh sleepless), aqui en vez de haber utilizado el nombre del servidor se puede utilizar su ip... si es la primera vez que se conecta a este servidor se pedira al usuario que confirme que el fingerprint de la clave del servidor coincida con la real (para evitar que se produzca un ataque Man-in-the-middle, por ejemplo)

Y despues la ejecucion seguiria como antes, pide la contraseña y abre la sesion del usuario.

Este comando (ssh sleepless) es el mismo que ssh $USERNAME@sleepless -p 22 ya que se presupone que el usuario va a ser el mismo en el servidor que en el pc local y que el puerto va a ser el estandar (el 22).

Manejando archivos:


Transferencia de archivos por SFTP (Secure File Transfer Protocol, Protocolo Seguro de Transferencia de Archivos) :

El uso de sftp es bastante sencillo, el comando de inicio es como el de ssh:
sftp [<usuario>@]servidor [-oPort=<puerto>]
La unica diferencia es que para especificar un puerto diferente (el estandar sigue siendo 22, todo funciona a traves de ssh) se utiliza -oPort , en vez de -p

Se utliza como un cliente ftp normal, pero siempre se usa binary para las transferencias (para los que no lo entiendan, esto ultimo da igual)

Por ejemplo:

Los comandos basicos son:

  • cd <directorio>: Cambia al directorio especificado
  • put <archivo local> [<archivo remoto>]: Envia un archivo 'archivo local' al servidor (si no se especifica el 'archivo remoto' se utilizara como nombre el de 'archivo local')
  • get <archivo remoto> [<archivo local>]: Envia del servidor el 'archivo remoto' al pc local (si no se especifica el 'archivo local' se utiliza como nombre el de 'archivo remoto')
  • mkdir <directorio>: Crea un directorio en el servidor
  • ls [<ruta>]: Muestra los contenidos del directorio actual (o si se especifica una ruta, de esa)
  • rm <archivo>: Elimina el archivo 'archivo'
  • rmdir <directorio>: Elimina el directorio 'directorio'
  • exit: Salir
  • !: Volver a la consola del pc local (cuando se salga de la consola se volvera a el SFTP)

SCP (Secure Copy, Copia Segura):


El comando basico de scp es el siguiente scp [[<usuario>@]<servidor>:]<archivo origen> [[<usuario>@]<servidor>:]<archivo destino 1> [ [[<usuario>@]<servidor>:]<archivo destino 2> ... ]

Es decir, el comando es scp y en cada opcion se utiliza la siguiente notacion para definir un archivo:

    [[<usuario>@]<servidor>:]<archivo> Si el archivo esta (o se va a copiar) a otro pc, se escribe <servidor> :  <archivo> , si el archivo es local, solo el nombre del archivo, y si el archivo esta en otro pc, pero se accede a traves de otro usuario, <usuario> @ <servidor> : <archivo>

El primer archivo es el que se va a copiar y los demas es a donde se va a copiar, por ejemplo:
Aqui se copia un archivo ('example') del servidor 'sleepless', a el archivo local 'example'.
Las opciones son parecidas a la del programa cp de unix, por ejemplo permite copiar directiorios enteros:

Cifrando conexiones:

Si conoces el protocolo SOCKS sabras que sirve para hacer servidores proxy y clientes para cualquier protocolo que funcione sobre TCP/IP (con SOCKS5 tambien sobre UDP/IP, pero en este caso concreto no), ssh permite utilizarlo para cifrar conexiones entre el cliente y el servidor, para proteger los datos en la red que hay entre los dos (y que puede ser insegura), la idea es algo asi:


[Cliente SSH] ~~~~~~~~~> [Servidor SSH] --------------> [Destino]
                        Red insegura                       Red segura
                          (Cifrado)                            (sin cifrar)

Esto sirve por ejemplo para un portatil que esta conectado a una wifi y que tiene (ya dentro de la red con cable, protegida, ...) un servidor SSH, se tunelan los paquetes hasta el servidor (a la aplicacion lo trata como un simple proxy SOCKS), donde ya no es posible un ataque tan sencillo como usar un sniffer en una red WEP.
Para hacer esto usaremos  ssh -D [<ip de enlace>:]<puerto de enlace>   [<usuario>@]< servidor> [-p <puerto para ssh>]

Como se puede ver es igual que un comando ssh con la diferencia de que se añade -D [<ip de enlace>:]<puerto de enlace>

La opcion -D significa que el tunelado sera dinamico (hay otras opciones que usan tunelado estatico, siempre al mismo pc y en el mismo puerto), sobre SOCKS.
La ip del enlace es opcional y sirve para concretar que interfaz de red se va a utilizar para la conexion, si no se especifica (o se usa un '*') cualquier pc en la red podra utilizar el tunel (esto puede ser util o no, dependiendo de las circunstancias), si no hay motivos para dejarlo abierto recomendaria utilizar 'localhost' (o '127.0.0.1') para permitir solo las conexiones locales.
Y puerto de enlace es el puerto que se proporcionara a los programas para que se conecten al tunel

Por ejemplo:

ssh -D localhost:1234 sleepless

Abrira una conexion SSH con 'sleepless' y un tunel SSH que se puede acceder por 'localhost' y por el puerto '1234' (normalmente solo el superusuario tiene permiso para abrir puertos con un numero menor que 1024)


Y esto es todo por ahora... (proximamente el SSHFS y las VPN)

[Referencias]
http://www.openssh.org/
http://www.lucianobello.com.ar/openssh/
http://tuxpepino.wordpress.com/2007/05/11/ssh-el-dios-de-la-administracion-remota/

Hasta otra.

1 comentario: