El SSH utiliza tres mecanismos (tres protocolos) [14]:
-
Transport Layer Protocol (TLP) [16]:
- Autentifica el servidor,
cifra la comunicación y conserva la integridad de la información transmitida.
Suele usar el TCP y adicionalmente puede comprimir los datos.
-
User Authentication Protocol (UAP) [15]:
- Utiliza el TLP y autentifica el
cliente al servidor.
-
Connection Protocol (CP) [17]:
- Se ejecuta sobre el UAP y permite multiplexar
muchos canales lógicos sobre un único tunel cifrado.
Existen dos versiones de SSH: la versión 1 y la versión 2. La segunda es la más
evolucionada y utilizada. Ambas versiones están basadas en un algoritmo de cifrado de
clave pública. SSH permite además comprimir el stream de datos al vuelo (on-the-fly).
Con esto ganaremos en velocidad efectiva de tranmisión y aumentaremos la
seguridad.
SSH utiliza DES (Data Encryption Standard) en su versión 1 y además AES
(Advanced Encryption Scheme) y Blowfish en su versión 2. DES es considerado el menos
seguro y AES el más seguro. Debe tenerse en cuenta que el consumo de CPU será
proporcional al nivel de seguridad.
Quizás la parte más importante de SSH radica en que posee un sistema para
autentificar a los extremos de la comunicación (evita el spoofing). De esta manera, se
asegura que tanto el emisor como el receptor son realmente quien dicen ser.
A continuación se presenta todo el proceso de comunicación (
http://es.tldp.org/Tutoriales/doc-ssh-intro/intro-ssh/node9.html) entre
un cliente y un servidor (versión 2 del protocolo):
- Fase de conexión TCP:
- El cliente establece una conexión TCP con el servidor.
- Fase de identificación del protocolo:
- Si el servidor acepta la conexión TCP envía al cliente un mensaje (no
cifrado) que indica los parámetros fundamentales de la conexión (como
por ejemplo, el puerto que utilizará para el resto de la sesión y la versión
del protocolo SSH).
- El cliente envía al servidor otro mensaje con su propia información acerca
de los parámetros que desea utilizar en la comunicación.
- Fase de autentificación del servidor:
- Si el servidor acepta las condiciones del cliente, el servidor envía su host
key pública, sin cifrar, y un número aleatorio, sin cifrar.
- El cliente comprobará que la host key recibida es igual a la que recibió en
la última conexión con dicho servidor. Si es la primera vez que se conecta,
mostrará la host key al usuario para que pueda, por ejemplo, telefonear
al administrador del host remoto para preguntarle la host key. Si no es
la primera vez y es diferente (el cliente mira en /.ssh/known_hosts),
también mostrará la host key para evitar el posible spoofing.
- Si el cliente continua con la conexión, cifrará y almacenará la host key
en /.ssh/known_hosts para futuras comprobaciones.
- Generación de la clave de sesión:
- El cliente genera una clave de cifrado simétrica llamada session key y la
cifra utilizando la host key pública del servidor.
- El cliente envía la session key cifrada al servidor.
- El servidor descifra la session key utilizando su host key privada. En este
punto ambos extremos conocen la clave de sesión que se utiliza para
cifrar y descifrar el resto de la comunicación.
- Fase de identificación y autentificación del usuario (
http://www.ssh.fi/support/documentation/online/ssh/adminguide/32/User_Authentication.html).
Se intentarán secuencialmente cada uno de los siguientes
métodos :
-
- Autentificación basada en el host del usuario: El usuario queda autentificado
en estos casos:
- Si el host de usuario está en /etc/hosts.equiv o en
/etc/ssh/shosts.equiv, y si el nombre del usuario es el mismo
en la máquina local y en la máquina remota.
- Si los ficheros /.rhosts o /.shosts en el directorio home del
usuario en la máquina remota contiene una entrada de la forma
ususario_maquina_cliente@maquina_cliente.
En cualquiera de estos casos es necesario que el fichero /etc/ssh/ssh_known_hosts
o el fichero /.ssh/known_hosts contenga el host key pública del
cliente.
-
- Autentificación de clave pública: Para poder usar esta forma de autentificación,
el usuario en alguna sesión previa ha debido generar una clave pública y otra
privada (generalmente usando RSA). En dicha sesión previa, el usuario ha
informado al servidor de su clave de usuario pública. Durante esta fase de
autentificación el servidor genera un número aleatorio (llamado challenge) que
es cifrado usando la clave pública que le envió el usuario. El cliente recibe el
desafío, lo descifra usando su clave privada, y lo vuelve a cifrar usando su
clave privada. Finalmente se lo envía al servidor. El servidor lo descifra usando
la clave pública del usuario y si el número coindice, entonces el usuario queda
autentificado.
-
- Autentificación basada en password: Consiste en enviar un password que sólo el
usuario conoce (generalmente el password usado en la cuenta de
la máquina remota). Dicho password viaja cifrado con la clave de
sesión.
- Fase de acceso al sistema remoto:
- El host remoto ejecuta un shell cuya entrada y salida es proporcionada
por el servidor SSH.
- Fase de desconexión:
- Cuando el usuario realiza un logout, el shell en el host remoto muere y
la conexión TCP se cierra.