Secure Shell
脥ndice
1. Introducci贸n
2. Descripci贸n del tema en concreto
3. Ejemplo pr谩ctico de su utilidad
4. Conclusiones
5. Fuentes
1. Introducci贸n
SSH es un protocolo muy usado, sobretodo en sistemas UNIX-like. Se trata de un protocolo abierto, fiable y seguro que inicialmente serv铆a para conectar a m谩quinas remotas, pero que con el tiempo se ha usado para encapsular otros datos, de manera que podemos hacer pasar cualquier cosa por 茅l. Pretende ser un reemplazo seguro para aplicaciones tradicionales no seguras, como telnet, rlogin, rsh y rcp. Su versi贸n 2 (SSH2) proporciona tambi茅n sftp, un reemplazo seguro para FTP.
Es un protocolo con un alto nivel de cifrado, cosa que lo hace propicio para comunicaciones de datos sensibles.
SSH (Secure SHell) es tambi茅n el nombre del programa que implementa dicho protocolo.
2. Descripci贸n del tema en concreto
SSH trabaja de forma similar a como lo hace TelNet (explicado tambi茅n en esta wiki) permitiendo las mismas aplicaciones que 茅l y ampliando funcionalidades en la versi贸n 2. La diferencia principal es que SSH usa t茅cnicas de cifrado que hacen que la informaci贸n que viaja por el medio de comunicaci贸n vaya de manera no legible y ninguna tercera persona pueda descubrir el usuario y contrase帽a de la conexi贸n ni lo que se escribe durante toda la sesi贸n.
B谩sicamente, sus aplicaciones son:
- Manejar por completo un ordenador remoto mediante un int茅rprete de comandos.
- Redirigir el tr谩fico de X para poder ejecutar programas gr谩ficos si tenemos un Servidor X arrancado en el ordenador local. 脡sto se hace redirigiendo la variable DISPLAY del ordenador remoto para que apunte a la pantalla X del ordenador local y aceptando el host remoto en el servidor X local con el comando xhost +IP-remota.
- Copiar datos de forma segura (tanto ficheros sueltos como simular sesiones FTP cifradas, SFTP).
- Gestionar claves RSA para no escribir claves al conectar a las m谩quinas.
- Pasar los datos de cualquier otra aplicaci贸n por un canal seguro de SSH mediante un t煤nel SSH.
La primera versi贸n del protocolo y el programa eran libres y los cre贸 un sueco llamado Tatu Yl枚nen, pero su licencia fue cambiando y termin贸 apareciendo la compa帽铆a 'SSH Communications Security', que lo ofrec铆a gratuitamente para uso dom茅stico y acad茅mico, pero exig铆a el pago a otras empresas.
En el a帽o 1997 (dos a帽os despu茅s de que se creara la primera versi贸n) se propuso como borrador en la IETF.
A principios de 1999 se empez贸 a escribir una versi贸n que se convertir铆a en la implementaci贸n libre por excelencia, la de OpenBSD, llamada OpenSSH.
A partir de entonces han salido muchas versiones de programas que lo implementan. Cabe destacar la ausencia de SSH en el ?HyperTerminal de Windows en todas sus versiones.
SSH es un protocolo para iniciar sesiones en m谩quinas remotas que ofrece autenticaci贸n, confidencialidad e integridad. Consta de tres componentes:
Protocolo de transporte: normalmente opera sobre TCP/IP dando autenticidad, confidencialidad e integridad.
Protocolo de autenticaci贸n de usuario: autentica al usuario ante el servidor.
Protocolo de conexi贸n: multiplexa un canal encriptado en diversos canales l贸gicos. 脡ste requiere que los servidores tengan "llaves", las cuales son usadas por los clientes cada vez que se conectan a un servidor para verificar que no fue suplantado. Una llave es un n煤mero codificado y encriptado en un archivo. Para la encriptaci贸n de llaves, OpenSSH ofrece los algoritmos RSA y DSA (de los cuales para la versi贸n 2 se recomienda DSA).
El protocolo SSH cuenta con dos versiones. La primera de ellas se mantiene por motivos de compatibilidad, pero se recomienda generalmente el uso de la segunda, por su mayor seguridad. Entre los fallos de la primera versi贸n caben destacar:
Fallos estructurales que le hacen vulnerable a ciertos tipos ataques (ataques de replay)
- Ataque del tipo "Man In The Middle" (intercepci贸n las claves p煤blicas en el intercambio de las mismas)
En cambio, a煤n conserva ciertas ventajas sobre SSH2:
- Est谩 soportado en m谩s plataformas que SSH2
- Permite autentificaci贸n de tipo .rhosts (propuesta en SSH2), mientras que permite m茅todos de autentificaci贸n m谩s diversos (AFS, Kerberos, etc.)
- Tiene mejor rendimiento que SSH2
SSH, dependiendo de su versi贸n utiliza diferentes algoritmos de cifrado:
SSH1: DES, 3DES, IDEA, Blowfish
SSH2: 3DES, Blowfish, Twofish, Arcfour, Cast128-cbc
El cifrado utilizado para cuestiones de autentificaci贸n utiliza RSA para SSH1 y DSA para SSH2.
SSH permite autentificarse utilizando uno o varios de los siguiente m茅todos:
- Password
- Sistema de clave p煤blica
- Kerberos (SSH1)
- Basado en el cliente (por relaciones de confianza en SSH1 y sistema de clave p煤blica en SSH2)
Existen adem谩s parches que permiten realizar autentificaci贸n de otras maneras.
SSH protege contra los siguientes tipos de ataques:
IP Spoofing: un ordenador trata de hacerse pasar por otro ordenador (en el que confiamos) y nos env铆a paquetes "procedentes" del mismo. SSH es incluso capaz de proteger el sistema contra un ordenador de la propia red que se hace pasar por el router de conexi贸n con el exterior.
Enrutamiento de la IP de origen: un ordenador puede cambiar la IP de un paquete procedente de otro, para que parezca que viene desde un ordenador en el que se conf铆a.
DNS spoofing: un atacante compromete los registros del servicio de nombres.
Intercepci贸n de passwords y datos a trav茅s de la red.
Manipulaci贸n de los datos en ordenadores intermediarios.
Ataques basados en escuchar autentificaci贸n contra servidores X-Windows remotos.
SSH considera la red como un medio hostil en el que no se puede confiar. Un atacante, podr谩 forzar a que SSH se desconecte, pero no podr谩 descifrar o reproducir el tr谩fico, o introducirse en la conexi贸n.
Todo esto, de todos modos, es s贸lo posible si se utiliza alg煤n tipo de cifrado. SSH permite no usar cifrado (cifrado de tipo "none"), pero esta opci贸n no deber铆a utilizarse. Hay que tener en cuenta que SSH no sirve de nada si el atacante consigue hacerse con el control de la m谩quina como root, ya que podr谩 hacer que SSH quede inutilizado.
2.1 SSH1
Caracter铆sticas del protocolo
- El sevidor y el cliente se conectan a trav茅s de una red IP no segura.
- La conexi贸n siempre se inicia por parte del cliente. El servidor est谩 escuchando un puerto determinado, esperando la conexi贸n, y puede atender a varios clientes.
- Cuando el cliente se conecta al servidor, el servidor acepta la conexi贸n y responde enviando su identificaci贸n de versi贸n, a lo que el cliente responde enviando la suya. Esta informaci贸n valida que la conexi贸n se realiz贸 en el puerto correcto, establece la versi贸n del protocolo utilizada, y la versi贸n del software utilizada por cada uno de ellos. Esta informaci贸n no se env铆a cifrada, y es perfectamente legible. Si cualquier lado de la conexi贸n no acepta o no entiende esta informaci贸n, se cierra la conexi贸n.
- Una vez a terminado la fase de identificaci贸n, ambos lados comienzan una transmisi贸n seg煤n un protocolo binario. El servidor env铆a su clave de equipo (la clave RSA del propio equipo), la clave del servidor (una clave RSA generada cada hora), y otras informaciones al cliente. El cliente genera una clave de sesi贸n de 256 bits, la cifra utilizando ambas claves RSA y env铆a la clave cifrada, junto con el tipo de cifrado seleccionado al servidor.
- Ambos lados comienzan ahora a enviar datos cifrados mediante la clave generada y el algoritmo seleccionado. El servidor env铆a un mensaje de confirmaci贸n cifrado al cliente.
- Tras eso, el cliente se autentifica utilizando uno de los m茅todos de autentificaci贸n soportados:
- basada en los ficheros ".rhosts" o "/etc/hosts.equiv", por defecto no permitida
- esta misma junto con autentificaci贸n del ordenador cliente basada en RSA
- autentificaci贸n RSA
- y autentificaci贸n por password
- Tras
una correcta autentificaci贸n, el cliente env铆a una serie de peticiones
para comenzar la sesi贸n, como establecer una sesi贸n de consola remota,
forwarding de X11 o de un puerto TCP/IP, ejecutar un comando, etc.
Al ejecutar una consola o un comando, la sesi贸n entra en modo interactivo. En este modo, se env铆an datos en ambos sentidos, pueden abrirse nuevas conexiones, etc. Esta sesi贸n generalmente termina cuando el servidor env铆a el c贸digo de terminaci贸n del programa ejecutado al cliente.
El protocolo reserva cierta informaci贸n para permitir extenderlo en el futuro:
- Env铆o de la versi贸n del protocolo
- El primer paquete enviado por ambas partes, contiene una serie de flags, que pueden utilizarse para acordar el uso de extensiones compatibles
- En
las fases de autentificaci贸n y preparaci贸n de la sesi贸n, el cliente
realiza peticiones al servidor, de modo que si se env铆a una petici贸n no
permitida por el servidor, 茅ste simplemente devuelve que la petici贸n ha
fallado. Esto permite a帽adir nuevos m茅todos de autentificaci贸n y
operaciones de preparaci贸n. En cambio, la sesi贸n interactiva, no
permite la negociaci贸n de extensiones. 脡stas deber铆an negociarse en las
fases anteriores.
Formato de los paquetes
Tras el env铆o de los strings de identificaci贸n, ambas partes env铆an paquetes con el siguiente formato:
1
2
3
4
Tama帽o del paquete
1 a 8 bytes de relleno aleatorio
(cont.relleno aleat.)
Tipo paquete
DATOS
CRC
*Nota: Longitud de relleno + tipo + datos + CRC siempre m煤ltiplo de 8 bytes.
- Tama帽o del paquete: 32 bits. Es el tama帽o del paquete, sin incluir el campo tama帽o, y el relleno. El m谩ximo es de 262144 bytes.
- Relleno: 1 - 8 bytes de datos aleatorios (o ceros si no se utiliza cifrado). El tama帽o del relleno es de (8 - (tama帽o % 8)) bytes. El hecho de que este relleno sea aleatorio dificulta los ataques.
- Tipo de paquete: 8 bits. El valor 255 est谩 reservado para futuras ampliaciones.
- Datos: con un tama帽o igual al valor del campo "tama帽o" menos 5.
- Bytes de chequeo: 4 bytes. CRC con el polinomio 0xedb88320 del relleno, tipo de paquete y datos. Se calcula antes del cifrado.
Los paquetes de datos tienen, adem谩s, las siguientes caracter铆sticas:
- El paquete puede cifrarse utilizando cualquiera de los algoritmos soportados.
- La longitud de la parte cifrada (relleno + tipo + datos + chequeo) es siempre m煤ltiplo de 8 bytes.
- T铆picamente, el cifrado se utiliza sobre todos los paquetes, como si fuesen una 煤nica secuencia.
- El cifrado se activa cuando el cliente env铆a la clave de sesi贸n. El algoritmo de cifrado es seleccionado por el cliente.
Compresi贸n de los paquetes:
Si
la compresi贸n est谩 soportada, el tipo de paquete y los datos se
comprimen utilizando el algoritmo gzip. En este caso, el tama帽o del
paquete indica el tama帽o de los datos comprimidos, m谩s 4 para el CRC.
El relleno se calcula seg煤n los datos comprimidos, para que los datos
cifrados sean m煤ltiplo de 8 bytes.
Cifrado de paquetes:
El
protocolo soporta distintos m茅todos de cifrado. Durante la
inicializaci贸n de la sesi贸n, el servidor env铆a al cliente los m茅todos
que soporta, y el cliente elige uno de estos m茅todos, y genera una
clave aleatoria de 256 bits que tambi茅n env铆a al servidor. Todas las implementaciones deben de soportar el algoritmo 3DES, siendo los dem谩s opcionales. Para
cifrar los datos, las partes cifradas de cada paquete se consideran un
flujo de datos continuo, cuyo tama帽o es siempre m煤ltiplo de 8 bytes.
Las partes cifradas de paquetes consecutivos se cifran como si se
tratase de un buffer continuo de datos. Los datos se cifran
independientemente en cada direcci贸n.
Otras opciones de los aquetes de datos:
- El puerto por defecto para el servidor es el 22.
- El cliente puede conectarse desde cualquier puerto, pero si quiere utilizar autentificaci贸n mediante ".rhosts" o "/etc/hosts.equiv", debe conectarse a trav茅s de un puerto privilegiado (menor a 1024).
- El campo IP "Tipo de Servicio" deber铆a de ser IPTOS_LOWDELAY para conexiones interactivas, y IPTOS_THROUGHPUT para las no interactivas.
- Se
recomienda as铆 mismo que se utilicen se帽ales para comunicar que la
conexi贸n sigue activa, para detectar si alguno de los lados ha cortado
la conexi贸n de modo inusual.
Identificaci贸n de la versi贸n del protocolo:
Una vez que se ha abierto el socket, el servidor env铆a un string con el formato "SSH-<num_mayor_del_protocolo>.<num_menor_del_protocolo>-<versi贸n>\n". Los dos primeros campos identifican la versi贸n del protocolo, y el 煤ltimo campo, la versi贸n del software del servidor.
- El cliente env铆a despu茅s su propia informaci贸n. Si el servidor tiene un protocolo menor que el cliente, y 茅ste puede emularlo, env铆a la versi贸n menor.
- En caso
contrario, env铆a su propia versi贸n. El servidor compara la versi贸n
enviada por el cliente con la suya, y determina si pueden trabajar o
no. El servidor decidir谩 desconectarse, o enviar谩 el primer paquete
binario, y ambas partes utilizar谩n despu茅s la versi贸n del protocolo
acordada.
Intercambio de claves y autentificaci贸n del equipo servidor:
- El primer mensaje enviado por el servidor env铆a la clave del equipo, la clave p煤blica del servidor, los algoritmos de cifrado soportados, los m茅todos de autentificaci贸n soportados y las extensiones. Tambi茅n contiene un n煤mero aleatorio de 64 bits (cookie). Este paquete se env铆a sin cifrar.
Ambas partes calculan un identificador de sesi贸n del siguiente modo:
session_id = MD5(hostkey || serverkey || cookie)
- El cliente responde con un mensaje que contiene el tipo de cifrado elegido, una copia del cookie, y la clave de sesi贸n de 256 bits cifrada con ambas claves del servidor. Este mensaje no se cifra.
- Una vez que se ha enviado la clave de sesi贸n, el cliente cifrar谩 todos los paquetes salientes y descifrar谩 todos los paquetes entrantes.
- Una vez que el servidor recibe la clave, y activa el cifrado, env铆a al cliente un mensaje indicando el 茅xito de la operaci贸n.
- La
clave de equipo del servidor se recomienda que tenga 1024 bits, y la
clave del cliente, 768 bits. La clave m铆nima no puede ser menor de 512
bits.
El nombre de usuario:
- El cliente env铆a al servidor un mensaje indicando el nombre de usuario con el que se quiere conectar.
- El servidor valida que el usuario existe, si se necesita autentificaci贸n y responde con un mensaje de 茅xito (no se necesita autentificar el usuario) o fallo (se necesita autentificaci贸n, o el usuario no existe).
Si el usuario no existe, se devolver谩 fallo a todos los mensajes, excepto al mensaje de desconexi贸n, al mensaje "ignore" y al mensaje "debug", pero seguir谩 escuchando al cliente, de modo que este no puede saber si el usuario exist铆a o no.
Fase de autentificaci贸n:
Si
no se acepta el login autom谩ticamente, el cliente pide al servidor
distintos m茅todos de autentificaci贸n de manera aleatoria tantas veces
como desee. Si la autentificaci贸n es correcta se devolver谩 un mensaje
de 茅xito, y si falla, un mensaje de fallo.
Autentificaci贸n por RHOSTS:
- El cliente env铆a un mensaje con el nombre del usuario cliente. El servidor verifica este nombre contra los ficheros "/etc/hosts.equiv" y ".rhosts" (sistemas UNIX). La conexi贸n debe de venir desde un puerto privilegiado.
- Este tipo de verificaci贸n no suele activarse puesto que puede sufrir diversos ataques.
Autentificaci贸n por RHOSTS y RSA:
- El cliente no s贸lo env铆a el nombre de usuario, sino tambi茅n su clave p煤blica RSA. El servidor autentifica al cliente por el m茅todo RHOSTS, y si se verifica, comprueba si conoce su clave p煤blica, y si la enviada es la misma almacenada en el servidor.
- Si cualquiera de estos pasos no se cumple, se devolver谩 un mensaje de fallo.
- En caso contrario, se someter谩 al cliente a un desaf铆o RSA con la clave p煤blica del cliente. El cliente deber谩 descifrar un mensaje cifrado con su clave p煤blica, utilizando su clave privada, y enviar谩 la respuesta al servidor, que verificar谩 si se ha conseguido pasar el desaf铆o o no.
Autentificaci贸n por RSA:
- En este caso, el cliente env铆a su clave p煤blica, y si el servidor la admite, env铆a al cliente un desaf铆o RSA.
- En el caso de que el cliente lo supere, se permitir谩 el acceso del mismo.
Autentificaci贸n por password:
- El cliente env铆a al servidor el password del usuario, en texto plano (aunque lo normal ser谩 que viaje cifrado).
- Si el password es correcto, se permitir谩 el acceso.
Una vez que el servidor ha admitido la conexi贸n por parte del cliente, se negocian las opciones que van a utilizarse durante el intercambio de datos.
Sesi贸n interactiva e intercambio de datos:
- Durante una sesi贸n interactiva, los datos de salida el proceso en ejecuci贸n en el servidor se redireccionan a "stdout" o "stderr" en el cliente, y cualquier entrada disponible en "stdin" en el cliente se env铆a al programa en el servidor. El env铆o de datos es as铆ncrono, y tanto el cliente como el servidor pueden enviar datos al mismo tiempo.
- Cuando la aplicaci贸n termine de ejecutarse en el servidor, se enviar谩 un mensaje con el estado de finalizaci贸n del programa, y se cerrar谩 la conexi贸n.
- Adem谩s, de esto, la conexi贸n puede ser cerrada en cualquier momento por cualquiera de los dos ordenadores.
2.2 SSH2
Caracter铆sticas del protocolo
Cada servidor deber铆a de tener una clave de equipo. Es posible tener varias, con distintos algoritmos, e incluso varios equipos pueden compartir la misma clave. Si un equipo tiene claves, al menos debe de tener una clave utilizando el algoritmo obligatorio (DSS).
La clave se utiliza para verificar que el cliente est谩 conectado al servidor correcto, para lo que el cliente debe conocer de antemano la clave p煤blica del servidor. Pueden utilizarse dos modelos:
El cliente tiene una base de datos que asocia servidores con sus correspondientes claves p煤blicas.
Las asociaciones vienen dadas por una autoridad de certificaci贸n.
El protocolo permite que, la primera vez que el cliente se conecte con un servidor, no se compruebe su clave p煤blica, con lo que esta primera vez no ser铆a necesaria, pero esto hace que la conexi贸n sea vulnerable, por lo que no se recomienda, aunque a veces es necesaria esta opci贸n. Todas las implementaciones del protocolo deber铆an hacer todo lo posible por comprobar siempre esta clave.
Adem谩s, est谩 dise帽ado de manera que pueda resultar f谩cilmente extensible, a帽adiendo nuevos algoritmos, protocolos, tipos de datos, etc.
Asimismo permite negociar el cifrado, la integridad, el intercambio de claves, la compresi贸n, y los algoritmos y formatos de las claves p煤blicas. Los algoritmos de cifrado, integridad, clave p煤blica y compresi贸n pueden ser diferentes en cada sentido de la conexi贸n.
Consideraciones de seguridad:
- Los algoritmos de integridad, cifrado y clave p煤blica utilizados son conocidos y ampliamente probados.
- Los algoritmos utilizan claves lo suficientemente largas como para resistir durante d茅cadas los m谩s fuertes ataques de criptoan谩lisis.
- Como los algoritmos se negocian, si uno se ve comprometido es posible negociar el uso de otro sin cambiar el protocolo.
Protocolo de transporte:
Este
protocolo proporciona cifrado fuerte, autentificaci贸n del servidor y
protecci贸n de la integridad de los datos. No autentifica al cliente,
sino que permite hacer esto en un protocolo superior.
El protocolo de transporte negocia el m茅todo de intercambio de claves, el algoritmo de clave p煤blica, el algoritmo de cifrado sim茅trico, el algoritmo de autentificaci贸n de mensajes y el algoritmo de hash. En el mejor de los casos, se necesitaran dos intercambios de mensajes entre el cliente y el servidor para esta negociaci贸n, y en el peor, tres.
Establecimiento de la conexi贸n:
- El servidor generalmente escucha conexiones en el puerto 22 de TCP/IP.
- Cuando
se establece la conexi贸n, ambos lados deben enviar un string de
identificaci贸n con el formato: "SSH-versi贸n_protocolo-versi贸n_software
comentarios\r\n"
Formato de los paquetes:
Cada paquete tiene el siguiente formato:
1
2
3
4
Tama帽o del paquete
Tama帽o relleno
DATOS
(cont. DATOS)
Relleno aleatorio
MAC
*Nota: El tama帽o m铆nimo del paquete es 16 bytes, y el tama帽o m谩ximo del paquete debe de poder enviar 32768 bytes de datos sin comprimir, con un tama帽o total del paquete de 35000 bytes. Las implementaciones deber铆an de soportar paquetes mayores para tareas espec铆ficas.
Tama帽o del paquete, 4 bytes: el tama帽o del paquete sin incluir el campo MAC ni el propio campo tama帽o.
Tama帽o del relleno, 1 byte: el tama帽o del relleno.
Datos, (tama帽o paquete - tama帽o relleno 鈥 1) bytes: los datos 煤tiles del paquetes. Si la compresi贸n est谩 activada, est谩 comprimido. Inicialmente, la compresi贸n debe de estar desactivada ("NONE").
Relleno aleatorio, tama帽o del relleno bytes: relleno para que el tama帽o de todo el paquete, excepto el campo mac, tenga un tama帽o m煤ltiplo de 8, o el tama帽o del bloque de cifrado, lo que sea mayor. Tiene que tener, como m铆nimo, 4 bytes, y c贸mo m谩ximo 255.
MAC (message authentication code), n bytes: bytes para la autentificaci贸n del mensaje.
Compresi贸n y cifrado:
Si
se ha negociado la compresi贸n, el campo de datos estar谩 comprimido
seg煤n el algoritmo negociado. El campo del tama帽o y la MAC se
calcular谩n seg煤n los datos comprimidos. El cifrado se realizar谩 tras la
compresi贸n.
La compresi贸n debe de poder negociarse independientemente para cada sentido de la transmisi贸n.
Es obligatorio no soportar compresi贸n, y opcional soportar compresi贸n con el algoritmo "zlib".
El algoritmo de cifrado se negociar谩 durante el intercambio de claves. Los campos cifrados ser谩n: tama帽o del paquete, tama帽o del relleno, datos y relleno, despu茅s de ser comprimidos si la compresi贸n est谩 activa.
Los datos enviados en una direcci贸n deber铆an de ser tratados como un flujo continuo de datos, y las claves de los algoritmos deber铆an tener, al menos 128 bits.
Los algoritmos pueden ser diferentes en cada direcci贸n de la comunicaci贸n.
El 煤nico algoritmo requerido es el 3des-cbc, aunque pueden implementarse una gran cantidad de algoritmos opcionales.
Es tambi茅n posible especificar que el tr谩fico no sea cifrado, con lo que se perder铆a la confidencialidad, por lo que no se recomienda.
Integridad de los datos:
En
cada paquete se introduce un c贸digo de autentificaci贸n de mensaje (MAC)
calculado a partir de una clave compartida por el cliente y el
servidor, el n煤mero de secuencia del paquete, y el contenido del mismo.
El algoritmo es independiente en cada sentido de la conexi贸n.
El 煤nico algoritmo que ha de implementarse de manera obligatoria es el algoritmo hmac-sha1.
M茅todos de intercambio de claves:
El algoritmo requerido por toda implementaci贸n es el algoritmo DSS, aunque pueden implementarse muchos m谩s.
El tipo de clave debe conocerse de antemano (por ejemplo, especific谩ndolo en la negociaci贸n del algoritmo). Por ello es denominada clave p煤blica.
Intercambio de claves
Cada equipo env铆a una lista de los algoritmos que soporta. Cada una de las partes tiene un algoritmo preferido para cada una de las categor铆as, y se presupone que la mayor铆a de las implementaciones van a usar siempre el mismo algoritmo preferido. Cada parte puede suponer qu茅 algoritmo est谩 utilizando el otro equipo, y puede enviar un paquete de intercambio de claves seg煤n ese algoritmo si corresponde con el algoritmo predefinido.
Esta suposici贸n es incorrecta si:
- El algoritmo de intercambio y/o el algoritmo de clave de equipo se presuponen de manera incorrecta (el algoritmo predefinido es distinto en el cliente y en el servidor)
- No pueden ponerse de acuerdo en cualquiera de los otros algoritmos
En caso contrario, la suposici贸n se considera correcta, y el primer paquete enviado debe de ser gestionado como el primer paquete de intercambio de claves.
De todos modos, si la suposici贸n es incorrecta, y se ha enviado alg煤n paquete de intercambio de claves, estos paquetes ser谩n ignorados, y el lado implicado deber谩 de enviar un paquete de inicio correcto.
La autentificaci贸n del servidor en el intercambio de claves puede ir impl铆cita.
Tras un intercambio de claves con autentificaci贸n impl铆cita, el cliente debe esperar una respuesta a su petici贸n de servicio antes de enviar m谩s datos.
Negociaci贸n de algoritmos
El intercambio de claves comienza con un paquete enviado por ambas partes con la siguiente informaci贸n:
C贸digo de comando: 1 byte.
cookie: 16 bytes.
Algoritmos de intercambio de claves: string.
Algoritmos de clave de servidor: string.
Algoritmos de cifrado cliente/servidor: string.
Algoritmos de cifrado servidor/cliente: string.
Algoritmos de compresi贸n cliente/servidor: string.
Algoritmos de compresi贸n servidor/cliente: string.
Algoritmos de mac cliente/servidor: string.
Algoritmos de mac servidor/cliente: string.
Lenguajes cliente/servidor: string.
Lenguajes servidor/cliente: string.
Aiguiente paquete es el primero de intercambio de claves: boolean.
Reservado para extensiones: Entero (32 bits).
El primer algoritmo de cada lista debe de ser el preferido por la parte (el que se presupondr谩), y ninguna lista de algoritmos puede ser vac铆a.
Si ambas partes tienen el mismo algoritmo de intercambio de clave, se utilizar谩 ese algoritmo. En caso contrario, se seguir谩 el siguiente algoritmo, iterando sobre los algoritmos soportados por el cliente. Se elegir谩 el primero que cimpla las siguientes condiciones:
- Est茅 soportado por el servidor.
- Si necesita cifrado, hay un algoritmo de cifrado de clave de host (clave del equipo servidor) en el servidor que tambi茅n est谩 soportada en el cliente.
- Si necesita una clave del equipo servidor con firma, este algoritmo de firma existe en el servidor, y en el cliente.
- Si ning煤n algoritmo satisface estas condiciones, ambos lados deben desconectarse.
Tras el env铆o de este paquete, se produce el intercambio de claves seg煤n el algoritmo escogido.
Compresi贸n y cifrado:
Si
se ha negociado la compresi贸n, el campo de datos estar谩 comprimido
seg煤n el algoritmo negociado. El campo del tama帽o y la MAC se
calcular谩n seg煤n los datos comprimidos. El cifrado se realizar谩 tras la
compresi贸n.
La compresi贸n debe de poder negociarse independientemente para cada sentido de la transmisi贸n.
Es obligatorio no soportar compresi贸n, y opcional soportar compresi贸n con el algoritmo "zlib".
El algoritmo de cifrado se negociar谩 durante el intercambio de claves. Los campos cifrados ser谩n: tama帽o del paquete, tama帽o del relleno, datos y relleno, despu茅s de ser comprimidos si la compresi贸n est谩 activa.
Los datos enviados en una direcci贸n deber铆an de ser tratados como un flujo continuo de datos, y las claves de los algoritmos deber铆an tener, al menos 128 bits.
Los algoritmos pueden ser diferentes en cada direcci贸n de la comunicaci贸n.
El 煤nico algoritmo requerido es el 3des-cbc, aunque pueden implementarse una gran cantidad de algoritmos opcionales.
Es tambi茅n posible especificar que el tr谩fico no sea cifrado, con lo que se perder铆a la confidencialidad, por lo que no se recomienda.
Integridad de los datos:
En
cada paquete se introduce un c贸digo de autentificaci贸n de mensaje (MAC)
calculado a partir de una clave compartida por el cliente y el
servidor, el n煤mero de secuencia del paquete, y el contenido del mismo.
El algoritmo es independiente en cada sentido de la conexi贸n.
El 煤nico algoritmo que ha de implementarse de manera obligatoria es el algoritmo hmac-sha1.
Este intercambio produce dos valores: una clave secreta K, y un valor de intercambio H. El valor H del primer intercambio de claves es tambi茅n el identificativo de sesi贸n, y se genera a partir de una funci贸n de HASH.
El intercambio de claves termina con el env铆o de un comando SSH_MSG_NEWKEYS. Este mensaje se env铆a utilizando las claves y algoritmos que se utilizaban hasta ese momento, y tras su env铆o, todos los dem谩s paquetes que se env铆en lo har谩n con estas nuevas claves y algoritmos.
Cuando este mensaje se recibe, los nuevos algoritmos y claves deber谩n utilizarse para recibir.
Tras el intercambio de claves, este es el 煤nico paquete v谩lido, junto con la orden de desconexi贸n, el paquete "ignore" y el paquete "debug", para que ambos equipos confirmen que todo ha ido bien.
En el caso del intercambio de claves Diffie-Hellman, se calcula una clave secreta, compartida por ambos equipos, que no puede determinarse sino es por colaboraci贸n de ambos. El intercambio de claves se combina con una firma utilizando la clave del host del servidor para autentificar a 茅ste.
Si se recibe un mensaje de intercambio claves (y no se est谩 realizando ya uno), ambas partes vuelven a negociar la clave.
Este intercambio se realiza utilizando el cifrado activo en ese momento. Los m茅todos de cifrado, compresi贸n y MAC no se cambian hasta que termine la negociaci贸n, y se procesa de manera id茅ntica al intercambio inicial (excepto que el identificativo de sesi贸n no cambia).
Se recomienda cambiar las claves despu茅s de la transferencia de un gigabyte, o una hora de conexi贸n.
Tras el intercambio se puede continuar enviado datos.
Petici贸n de servicio:
Tras el intercambio inicial de claves, el cliente solicita un servicio, identificado por un nombre. Los servicios inicialmente implementados son el de autentificaci贸n y el de petici贸n de conexi贸n.
Si el servidor no acepta la petici贸n, deber谩 desconectarse, y si lo acepta, deber谩 notificarlo al cliente.
El servicio puede tener acceso al identificador de sesi贸n generado en el intercambio de claves.
Protocolo de autentificaci贸n
El protocolo de autentificaci贸n SSH es un protocolo de autentificaci贸n de prop贸sito general que trabaja sobre el protocolo de la capa de transporte SSH. Presupone que los protocolos inferiores proporcionan integridad y confidencialidad de los datos.
Este protocolo recibe el identificador de sesi贸n generado por el protocolo inferior. Este identificador de sesi贸n es 煤nico para la misma, y adecuado para realizar firmas, de modo que pueda probarse la posesi贸n de una clave privada.
Tambi茅n necesita conocer si el protocolo inferior realmente proporciona confidencialidad.
El servidor dirige la autentificaci贸n diciendo al cliente los m茅todos soportados. El cliente puede elegir cualquiera de ellos e ir probando en cualquier orden. De este modo el servidor tiene el control, pero cliente la suficiente flexibilidad para resultar c贸mo para el usuario.
Todas las peticiones de autentificaci贸n deben de tener el siguiente formato:
- C贸digo de comando (SSH_MSG_USERAUTH_REQUEST): 1 byte.
- Nombre de usuario: string.
- Nombre del servicio: string.
- M茅todo de autentificaci贸n: string.
- Datos dependientes del m茅todo: binario.
Si el usuario no existe, el servidor puede desconectarse, o enviar un listado incorrecto de m茅todos de autentificaci贸n, pero nunca aceptar ninguno.
El resto de mensajes depender谩n del m茅todo de autentificaci贸n escogido, que puede ser cambiado por el cliente en cualquier momento, con lo que el servidor deber谩 abandonar el proceso anterior, comenzar el nuevo.
Si el servidor rechaza la petici贸n, enviar谩 un mensaje de fallo con los m茅todos de autentificaci贸n portados. En caso de que la autentificaci贸n se acepte, se enviar谩 un mensaje indic谩ndolo.
Si la autentificaci贸n consta de varios pasos, se responder谩 a cada paso individual con un mensaje de fallo, que contendr谩 un campo 茅xito parcial a verdadero. El mensaje de aceptaci贸n s贸lo se enviar谩 al final de todo el proceso.
Cualquier mensaje que no sea de autentificaci贸n enviado por el cliente una vez se haya aceptado su petici贸n, deber谩 pasarse al servicio activo sobre este protocolo.
En ciertas jurisdicciones, puede ser necesario enviar un mensaje de aviso al comenzar la sesi贸n para obtener asistencia legal. Este protocolo permite al servidor enviar un mensaje (como el mostrado en sistemas UNIX) al cliente, para que este lo muestre, tras cualquier autentificaci贸n que se halla llevado a cabo con 茅xito.
M茅todo de autentificaci贸n por clave p煤blica:
Es el 煤nico m茅todo requerido en todas las implementaciones.
Con 茅ste m茅todo, la autentificaci贸n se prueba si se posee una clave privada. Se env铆a una firma creada con la clave privada del usuario. El servidor comprueba que la clave es v谩lida para el usuario, y que la firma tambi茅n es v谩lida. Si ambas condiciones se cumplen, la petici贸n se acepta. En caso contrario, se rechaza.
- El cliente env铆a al servidor la petici贸n de autentificaci贸n con su clave p煤blica.
- Si el servidor no acepta el m茅todo, env铆a un mensaje de fallo. En caso contrario, env铆a un mensaje de aceptaci贸n del m茅todo pedido.
- Si se acepta, el cliente enviar谩 un nuevo paquete de petici贸n de autentificaci贸n de clave p煤blica, pero incluyendo una firma creada con su clave privada, que firma todos los dem谩s campos del mensaje, incluyendo el identificativo de sesi贸n como campo firmado.
- Cuando
el servidor recibe este mensaje, comprueba que la clave proporcionada
es correcta, y si lo es, comprueba tambi茅n la firma. El servidor
entonces responder谩 con un mensaje de 茅xito o fallo.
M茅todo de autentificaci贸n por password:
El cliente env铆a un mensaje de autentificaci贸n con su password, con el formato siguiente:
- SSH_MSG_USERAUTH_REQUEST: 1 byte.
- User name: string.
- Service: string.
- "Password": string.
- FALSE: boolean.
- plaintext password: string.
Generalmente, el servidor responder谩 con 茅xito o fallo, pero en el caso de que el password haya caducado, enviar谩 el siguiente mensaje:
- SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: byte.
- Prompt: string .
- Language tag: string.
En este caso, el cliente puede continuar con un m茅todo de autentificaci贸n diferente, o pedir un nuevo password al usuario y volver a intentarlo, con el siguiente mensaje:
- SSH_MSG_USERAUTH_REQUEST: byte.
- User name: string.
- Service: string.
- "password": string.
- TRUE: boolean.
- plaintext old password: string.
- plaintext new password: string.
El servidor puede responder con un mensaje de 茅xito, fallo, o una nueva petici贸n de cambio de clave, en el caso de que considere que el nuevo password no es v谩lido.
Autentificaci贸n basada en la m谩quina cliente:
Es un m茅todo de autentificaci贸n similar al "rhosts" o "hosts.equiv", pero m谩s riguroso.
El m茅todo funciona del siguiente modo: el cliente env铆a una petici贸n de autentificaci贸n, firmada con su clave privada de equipo, que el servidor comprueba con la clave p煤blica del mismo. Una vez que se ha establecido la identidad el equipo cliente, la autorizaci贸n se realiza bas谩ndose en el nombre de usuario y el nombre de la m谩quina.
La firma incluye todos los campos del paquete de petici贸n de autentificaci贸n, y el identificativo de sesi贸n.
El servidor verificar谩 que la clave p煤blica pertenece al equipo indicado, que el usuario en ese equipo tiene permiso de conexi贸n, y que la firma es v谩lida para esa clave.
Protocolo de conexi贸n
El protocolo de conexi贸n SSH est谩 dise帽ado para funcionar sobre los protocolos de transporte y autentificaci贸n de usuario SSH. Proporciona sesiones de conexi贸n interactivas, ejecuci贸n remota de comandos, redirecci贸n de conexiones TCP/IP y redirecci贸n de conexiones X11.
Existen peticiones que afectan al estado del equipo remoto de manera "global", independientemente de cualquier canal. Un ejemplo ser铆a comenzar la redirecci贸n de un determinado puerto TCP/IP.
El destinatario responder谩 a estas peticiones con un mensaje de 茅xito o fallo, y se indica en la petici贸n que se espera una respuesta.
Canales: Cualquier parte de la conexi贸n puede abrir un canal, y los distintos canales se multiplexan sobre una sola conexi贸n. Los
canales se identifican con un n煤mero en cada extremo, que puede ser
distinto en cada parte. Cualquier mensaje perteneciente a un canal,
incluye el n煤mero de canal en el extremo opuesto. Los
canales tienen control de flujo, y no se env铆an datos al canal hasta
que se reciba un mensaje diciendo que existe espacio en la ventana de
recepci贸n. Cuando
cualquier parte quiere abrir un nuevo canal, reserva un n煤mero local
para el mismo, y env铆a un mensaje al otro extremo, que incluye el
n煤mero local, el tipo de canal que quiere abrir y el tama帽o inicial de
la ventana. El extremo remoto decide si puede abrir el canal, y
responde con un mensaje de confirmaci贸n, que contiene el n煤mero que
usar谩 茅l para el canal, y el tama帽o de la ventana, o bien con un
mensaje de fallo, que contiene el motivo del fallo (un c贸digo, y un
mensaje). El tama帽o de la ventana indica cu谩ntos bytes puede enviar el otro lado antes de recibir un mensaje de ajuste de ventana. Tras recibir un mensaje de ajuste de ventana, el receptor del mismo podr谩 enviar m谩s datos, seg煤n el nuevo tama帽o de la misma. La transferencia de datos se realiza con paquetes con el siguiente formato: El
m谩ximo tama帽o es el actual tama帽o de la ventana de transmisi贸n, y el
tama帽o de 茅sta se decrementar谩 en el tama帽o de los datos enviados. En ciertos tipos de canales, adem谩s, se puede enviar un c贸digo que indica el tipo de datos que se est谩n enviando: Cuando una parte no va a enviar m谩s datos por un canal, deber铆a enviar un mensaje de fin de datos con la siguiente estructura: Tras este mensaje, el canal contin煤a abierto, y se pueden enviar datos desde el otro extremo. Cuando cualquier extremo de la conexi贸n quiere cerrar el canal, manda un mensaje de cierre: Al recibir este mensaje, el otro extremo debe devolver un mensaje de cierre, a no ser que lo hubiera enviado antes. Muchos
canales tienen extensiones propias. Un ejemplo puede ser solicitar un
pty (pseudo terminal) para una sesi贸n interactiva. En ese caso, se
enviar谩 un comando de petici贸n que ser谩 propio del canal. Si no se espera petici贸n, no se enviar谩. En caso contrario, se enviar谩 un mensaje de 茅xito o fallo de la petici贸n.
Sesiones interactivas:
Una
sesi贸n es una ejecuci贸n remota de un programa. El programa puede ser
una consola, una aplicaci贸n, un comando del sistema o un subsistema.
Puede tener o no una terminal y puede requerir redirecci贸n de trafico
sobre X11. Adem谩s, m煤ltiples sesiones pueden estar activas a la vez. Para
realizar todas estas operaciones, se enviar谩n diferentes tipos de
mensajes para apertura de canales y solicitud de opciones en los
mismos, que no se describen aqu铆 por no extender a煤n mas esta
ampliaci贸n.
SSH Tectia - http://www.ssh.com - Servidor y cliente SSH comercial. Versiones para much铆simos sistemas operativos, tanto Windows como UNIX. OpenSSH - http://www.openssh.com - Implementaci贸n SSH (servidor, cliente y utilidades) gratuita y para sistemas UNIX-like. Est谩 desarrollado por OpenBSD. ossh - ftp://ftp.pdc.kth.se/pub/krypto/ossh/
- Implementaci贸n gratuita del protocolo SSH (servidor y cliente) para
sistemas UNIX-like. Dispone de compresi贸n de datos (incluye los datos
de las X) y alta seguridad. Dropbear SSH - http://matt.ucc.asn.au/dropbear/dropbear.html
- Implementaci贸n del protocolo SSH (servidor y cliente) para sistemas
UNIX-like. Hace hincapi茅 en el consumo m铆nimo de recursos, para
servidores limitados o con alta carga. ?MindTerm - http://www.appgate.com/products/80_MindTerm/ - Cliente JAVA para SSH. Deb ido a estar hecho en java es altamente portable. PuTTY - http://www.chiark.greenend.org.uk/~sgtatham/putty/
- Cliente gr谩fico SSH, Telnet, rlogin... Muy popular debido a su
simplicidad y que no necesita instalarse, es un 煤nico EXE. En la
versi贸n en desarrollo tiene soporte para terminales en el puerto s茅rie.
Dispone de versi贸n Windows y UNIX-like (requiere X). Unas opciones comunes de configuraci贸n del servidor SSH son: ?PermitRootLogin [yes/no]: Permite entrar al usuario root (administrador) de manera remota. RSAAuthentication [yes/no]:
Permite usar la identificaci贸n RSA para autentificar los
usuarios/servidores remotos y as铆 no tener que escribir las
contrase帽as. ?PubkeyAuthentication [yes/no]:
Permite usar la identificaci贸n por clave p煤blica para autentificar los
usuarios/servidores remotos y as铆 no tener que escribir las
contrase帽as. ?RhostsAuthentication [yes/no]:
Es un m茅todo de identificaci贸n basado en la combinaci贸n del m茅todo
rhosts o hosts.equiv combinado con autentificaci贸n basada en RSA. hostsRSAAuthentication [yes/no]: Es un m茅todo de identificaci贸n basado en autentificaci贸n mediante RSA. ?HostbasedAuthentication [yes/no]: Es un m茅todo de identificaci贸n basado en la llave p煤blica del host. ?X11Forwarding [yes/no]: Permite hacer un t煤nel para forwaddear las X y poder ejecutar aplicaciones X en el servidor mientras vemos las ventanas en la m谩quina local. Un
usuario tambi茅n puede crear un par de llaves que le faciliten su
autentificaci贸n al emplear ssh o scp. Estos programas por defecto piden
clave al usuario que se conecte a un servidor SSH. Si un usuario genera
sus llaves p煤blica y privada, puede saltarse esta autentificaci贸n pues
se har谩 de forma autom谩tica con las llaves. Para lograrlo su llave
p煤blica debe estar en el servidor al cual se conecta (en
~/.ssh/authorized_keys) y su llave privada en el ordenador loca
(normalmente en ~/.ssh/id_dsa). La generaci贸n de llaves puede hacerse con: que
por defecto dejar谩 su llave p煤blica en ~/.ssh/id_dsa.pub y su llave
privada en ~/.ssh/id_dsa (que adem谩s quedar谩 protegida por una palabra
clave que usted especifica). Como el nombre lo indica la llave privada
no debe compartirla, por el contrario la llave p煤blica puede
transmitirla y puede ser vista por cualquiera. En
el computador en el que desee conectarse, agregue en el archivo
~/.ssh/authorized_keys (o ~/.ssh/authorized_keys2 si usa DSA y una
versi贸n de OpenSSH anterior a la 3.1), su llave p煤blica.
Conexi贸n SSH habitual: SSH sin cifrado: El comando scp permite copiar ficheros de manera segura entre dos ordenadores: De local a remoto: Para mantener los mismos atributos del fichero ser谩 necesario utilizar la opci贸n -p, para usar compresi贸n en el env铆o -C y para moverlos en lugar de copiarlos existe la opci贸n -u. En sentido inverso: scp se puede usar con la mayor铆a de par谩metros del comando cp de unix, como podr铆a ser la opci贸n -r para copiar recursivamente. El
comando sftp permite realizar transacciones ftp de manera segura,
cifrando tanto la conexi贸n de datos como la conexi贸n de control. Para
ello el servidor remoto tiene que estar ejecutando el daemon sshd2. Si queremos utilizar el puerto 10110 para crear una conexi贸n segura al puerto 110 de una m谩quina remota usando las t茅cnicas de tunneling y port-forwarding haremos: Un ejemplo de ssh se pude ver en http://www.naguissa.com/sshapplet.php
(necesita java), que permite conectarse, por ejemplo, a la sala de
ordenadores de TD con nuestro usuario y password (servidor:
ccd-dc0.uab.es ).
Ya
sab铆amos del uso de SSH como shell remota segura, pues la hab铆amos
utilizado como acceso remoto a las estaciones de trabajo de las aulas
de pr谩ctica, pero es posible que muchos no nos hayamos dado cuenta que
lo usamos tambi茅n en otros contextos, como son las conexiones a las workstations SUN de la universidad, usando la t茅cnica de X-forwadding a trav茅s de un tunel SSH; o algunas coexiones a servidores de correo electr贸nico, que est谩n cifradas a trav茅s de un port-forwadding
usando un t煤nel SSH. Y qu茅 decir de la utilidad sftp de la sala de
ordenadores que nos ermite administrar los archivos de nuestra m谩quina
remota. 脡sto
nos demuestra la grand铆sima facilidad de uso que tiene SSH, que unido a
su grand铆sima seguridad (mayor en SSH1) y el hecho de que sea un
protocolo r谩pido (poco overhead, mas r谩pido SSH1 que SSH2) y el hecho
de que SSH2 sea libre han ayudado a que se popularice, sobretodo en
entornos UNIX-like, donde tiene mas experi茅ncia, y para conectarse
desde clientes, ya sean windows o UNIX, desde cualquier entorno, por
poco fiable que sea, como un cibercaf茅. Realmente
creo que se tendr铆an que potenciar las posibilidades de los t煤neles
SSH, que har铆an que todas las comunicaciones fuesen seguras y no habr铆a
problemas de sniffing ni hacking. Como cosas en contra podr铆amos citar el liero overhead
que genera, que es m铆nimo, la mol茅stia del intercambio de claves y los
problemas con direciones din谩micas. El resto de problemas ya se
arreglaron con la versi贸n 2.
http://es.wikipedia.org/wiki/Secure_Shell
2.3 Distribuciones
Para
instalar un servidor OpenSSH, que le permita conectarse a su sistema de
forma segura, instale el paquete ssh preferiblemente tomando la versi贸n
m谩s reciente. ssh-keygen -t dsa
3. Ejemplo pr谩ctico de su utilidad
ssh -o ordenador.remoto.org
ssh -o cipher=none ordenador.remoto.org
scp dir/local/fichero usuario@host:/directorio/destino
scp usuario@host:/directorio/origen/fichero dir/local
sftp servidor_remoto usuario
ssh -P -L 10110:popmail.correo.net:110
4. Conclusiones
5. Fuentes
http://www.ietf.org/internet-drafts/draft-ietf-secsh-architecture-13.txt
http://rcfile.org/ssh/
http://www.akadia.com/services/ssh_scp_without_password.html
http://packages.gentoo.org/search/?sstring=ssh
http://www.ssh.com/
http://www.openssh.com/
ftp://ftp.pdc.kth.se/pub/krypto/ossh/
http://matt.ucc.asn.au/dropbear/dropbear.html
http://www.appgate.com/products/80_MindTerm/
http://www.chiark.greenend.org.uk/~sgtatham/putty/
http://130.206.100.150/docs/articulo.ssh.html
http://www.ayahuasca.net/ssh
http://www.snailbook.com/docs/protocol-1.5.txt
http://www.snailbook.com/docs/architecture.txt
http://www.snailbook.com/docs/transport.txt
http://www.snailbook.com/docs/userauth.txt
http://www.snailbook.com/docs/connection.txt