Secure Shell (SSH).

SSH (Secure Shell) es un programa de login remoto que permite una transmisión segura de cualquier tipo de datos: passwords, sesión de login, ficheros, sesión X remota, comandos de administración, etc. Su seguridad estriba en el uso de criptografía fuerte de manera que toda la comunicación es cifrada y autentificada de forma transparente para el usuario. Es un claro y sencillo sustituto de los típicos comandos "r" de BSD (rlogin, rsh, rcp), telnet, ftp e incluso de cualquier conexión TCP.

Entre las mejoras que se pueden apreciar en el uso de SSH se encuentra una autenticación más robusta de usuarios y hosts, que la tradicionalmente ofrecida basada en direcciones IP y nombres de máquinas. Una privacidad mayor para el usuario debido al uso de canales de encriptación.

Así, el ssh establece un entorno protegido contra ataques típicos como: Ip Spoofing, Ip source routing, DNS spoofing, Sniffing, X11 Server Spoofing, etc.

Autenticación por password.

SSH permite autentificar a un usuario utilizando su password Unix ordinario. La única (e importante) diferencia es que el password no viaja nunca en claro por la red. Si utilizamos SSH para sustituir a telnet, rlogin o ftp evitaremos el peligro de que nuestro password sea capturado por posibles "sniffers" en la red.

Por otra parte, seguiremos siendo vulnerables a los llamados "ataques de diccionario" contra el password: si un atacante tiene acceso al fichero /etc/passwd, no resulta difícil averiguar passwords formados a partir de palabras susceptibles de figurar en un diccionario. Esto significa que sigue siendo extremadamente importante que el administrador proteja debidamente el fichero /etc/passwd y que los usuarios utilicen passwords "seguros" (lo más aleatorios posible, combinando mayúsculas, minúsculas, dígitos y puntuación).

La forma de uso de ssh es muy similar a la de rsh:

% ssh remoto
Accepting host remoto key without checking.
usuario's password:

Este comando nos permitiría iniciar una sesión interactiva en el nodo remoto, tras registrar la clave de servidor del mismo.

También se puede utilizar ssh para ejecutar un único comando en el servidor:

% ssh remoto pwd
Accepting host remoto key without checking.
usuario's password:
/home/usuario

A diferencia del comando rsh, ssh siempre pide que introduzcamos nuestro password. Además, muchas de las opciones de rsh, si no todas, están duplicadas para el comando ssh. Por ejemplo, si queremos conectarnos a una cuenta remota con un nombre de usuario diferente usaremos la opción "-l":

% ssh remoto -l otro_usu

Cada servidor de SSH tiene asociado un par de claves pública/privada, equivalentes al par de claves de un usuario. Estas claves se utilizan para identificar al servidor frente al usuario; de esta forma, se evita que otra máquina (posiblemente hostil) pueda suplantarlo.

La primera vez que nos conectamos a la máquina remota, SSH solicita al servidor su clave pública, y la acepta sin hacer ninguna comprobación. Esta clave queda registrada en el directorio $HOME/.ssh2/hostkeys del usuario; en futuras conexiones el cliente comparará la clave que le suministra el servidor con la que tiene almacenada. Si ambas claves no coinciden, el cliente no establecerá la conexión, para evitar que alguna máquina hostil pueda suplantar impunemente al servidor. Si en algún momento la clave del servidor cambia por un motivo legítimo (por ejemplo, por una reinstalación del sistema operativo), tendremos que borrar el fichero que contiene la clave del nodo remoto de nuestro directorio $HOME/.ssh2/hostkeys.

Hay que tener en cuenta que a la hora de almacenar las claves de los servidores, SSH no hace traducción de alias a nombres. Por ejemplo, "remoto.dominio.es" y "remoto" son tratados por SSH como dos servidores distintos, cada uno con su clave de host propia, aunque ambos nombres se traduzcan a la misma dirección IP.

Autenticación por clave pública.

La segunda alternativa de autentificación utiliza un esquema de clave pública/privada, también conocido como clave asimétrica. En este esquema se utiliza un par de claves:

  1. una clave pública, que se copia a todos los servidores a los que queremos conectarnos.

  2. una clave privada, que solamente nosotros poseemos; para mayor seguridad, esta clave está cifrada con una frase de paso.

Estas dos claves poseen una característica importante: un texto cifrado con la clave pública sólo puede ser descifrado usando la clave privada, mientras que un texto cifrado con la clave privada sólo puede descifrarse mediante la clave pública.

Veamos cómo se aplica esta propiedad al proceso de autentificación:

  1. el servidor nos envía un mensaje, que debemos devolver cifrado con nuestra clave privada.

  2. el servidor descifra el mensaje de respuesta con nuestra clave pública.

  3. el servidor compara el mensaje resultante con el texto original; si coinciden, el servidor nos considera debidamente autentificados

Por supuesto, todo este proceso es transparente para el usuario; nosotros solamente tendremos que preocuparnos de teclear nuestra frase de paso cuando el programa nos lo pida. El punto más débil de este esquema es cómo hacer llegar nuestra clave pública al servidor. De momento no existe ninguna forma automática de hacerlo, y no hay más remedio que hacerlo a mano.

La principal ventaja de este método de autentificación es que, aunque un atacante lograra comprometer el servidor, sólo podría conseguir acceso a nuestra clave pública, pero nunca a nuestra clave privada. De todas formas, en prevención de un posible compromiso del cliente, es necesario que la clave privada esté protegida con una frase de paso adecuada. De esta forma, nadie podrá utilizarla aún en el caso de que consiguiera de alguna manera hacerse con ella.

En el caso de realizar la conexión desde una máquina Unix, una ventaja secundaria es que se puede utilizar un agente de autentificación para evitar tener que teclear la frase de paso en cada conexión.

El mayor inconveniente de la autentificación por clave pública es la fase de configuración previa, que puede resultar algo engorrosa. Los pasos a seguir son:

  1. generación de las claves.

  2. propagación de la clave pública.

  3. selección del par de claves

Transferencia de ficheros.

Para la transferencia de ficheros existen dos alternativas:

El comando scp, equivalente al comando rcp tradicional; resulta muy útil para transferencias simples desde la línea de comandos. La forma de uso imita a la de rcp, con opciones similares. Por ejemplo:

% scp fichero remoto:
% scp remoto:/path/de/fichero /path/local
% scp fichero1 fichero2 remoto:dir
% scp fichero otro_usu@remoto:

El comando sftp, que intenta emular la forma de uso de un cliente FTP ordinario. Es útil para transferencias más complicadas, por ejemplo si tenemos que movernos por la estructura de directorios o listar su contenido. De todas formas, el número de comandos soportados es limitado.

% sftp remoto
local path  : /home/usuario
remote path : /home/usuario
sftp>help
?           dir         ldelete     mkdir       quit        user
bell        disconnect  ldir        open        recv        verbose
bye         get         lls         page        rm
cd          hash        lpwd        prompt      sort
close       help        lrm         put         status
delete      lcd         ls          pwd         timeout

? command  for more information on a specific command.
sftp>