• No se han encontrado resultados

4.2 Segmento WAN

4.2.1 HTML5 y WebSockets: potenciando las aplicaciones con tecnología Web 2.0 El nuevo estándar HTML5 ha incorporado una gran cantidad de novedades con respecto a su 

4.2.1.1 Tecnología WebSockets

Los  WebSockets  [267]  han  sido  incorporados  en  HTML5  para  posibilitar,  de  forma  nativa  (sin  necesidad de plugins o programas propietarios) que las páginas Web y las aplicaciones contenidas en  éstas realicen transacciones de gran volumen de información en la Web en tiempo real y de forma  bidireccional,  pudiendo  el  servidor  enviar  información  sin  necesidad  de  que  el  cliente  realice  una  petición  previa.  La  comunicación  se  desarrolla  sobre  un  socket  tradicional  TCP/IP  bidireccional,  sin  necesidad  de  seguir  el  mecanismo  tradicional  de  HTTP.  Precisamente  esta  tecnología  es  el  complemento necesario para poder dotar a las aplicaciones nativas (implementadas con JavaScript,  HTML5  y  CSS3)  del  soporte  de  comunicaciones  necesario  y  ofrecer  una  usabilidad  mayor  que  las  aplicaciones  instalables  o  de  escritorio.  Como  cualquier  aplicación  Web  2.0,  el  mantenimiento  de  versiones queda centralizado de forma que el cliente o usuario no tenga que preocuparse de poder  tener  actualizada  la  aplicación.  Por  otro  lado,  se  consigue  además  una  funcionalidad  multi‐ plataforma basada en el navegador Web, e independiente de arquitecturas o sistemas operativos.  Esta  tecnología  ha  ido  evolucionando  desde  la  aparición  de  la  primera  propuesta  en  Julio  de  2009  (The  Web  Socket  protocol  draft‐hixie‐thewebsocketprotocol‐00),  especialmente  en  aspectos  relacionados con el tipo de formato de trama para las comunicaciones y la seguridad. En este aspecto,  ya dentro de la siguiente etapa de desarrollo (a partir de la versión draft‐hixie‐thewebsocketprotocol‐

76 [268], pasan a denominarse draft‐ietf‐hybi‐thewebsocketprotocol bajo la gestión del IETF [178]) y, 

de  seguridad  de  tipo  cache  poisoning  detectados  a  finales  del  año  2010  [269].  Llevando  un  seguimiento  de  la  evolución  del  protocolo,  se  han  ido  implementando  las  diferentes  versiones  publicadas  hasta  la  fecha,  estando  en  las  aplicaciones  basadas  en  WebSockets  desarrollados  en  el  marco  de  esta  tesis,  la  versión  17  (30  Septiembre  2011)  [270]  que  es  compatible  con  las  últimas  versiones  del  navegador  Google  Chrome.  El  proceso  de  establecimiento  de  la  conexión  en 

WebSockets  (versión  6+)  se  basa  en  un  mecanismo  de  handshake  de  seguridad  inicializado  por  el 

cliente, que consiste en una cabecera HTTP con parámetros relativos al protocolo WebSockets, en un  orden aleatorio:  GET /chat HTTP/1.1 Host: server.example.com  Upgrade: websocket  Connection: Upgrade  Sec‐WebSocket‐Key: dGhlIHNhbXBsZSBub25jZQ==  Sec‐WebSocket‐Origin: http://example.com  Sec‐WebSocket‐Protocol: chat, X73  Sec‐WebSocket‐Version: 8     

La  cabecera,  que  sigue  el  formato  de  Request‐Line  definido  en  HTTP,  contiene  básicamente  el  comando  GET  y  dos  líneas  de  declaración  estándar  de  conversión  a  WebSockets  (upgrade  y 

connection).  Otra  de  las  líneas  permite  definir,  como  medida  de  seguridad,  la  localización  del  host 

remoto que llevará a cabo la comunicación con el cliente una vez establecido el enlace. En el caso de  que  el  host  indicado  no  exista,  el  procedimiento  de  handshake  será  abortado  automáticamente.  Adicionalmente,  las  siguientes  líneas  están  orientadas  a  ofrecer  un  mayor  grado  de  seguridad  durante el proceso: 

 Sec‐WebSocket‐Protocol: X73. Permite definir el tipo de sub‐protocolo a emplear, una vez se ha  establecido  la  conexión  entre  ambos  extremos.  Si  el  servidor  soporta  dicho  sub‐protocolo  lo  incluye de vuelta en el mensaje de respuesta del handshake. En el caso de que el cliente ofrezca  un subprotocolo no soportado por el servidor, este puede abortar directamente la solicitud.   Sec‐WebSocket‐Origin: http://example.com. Indica el dominio en el cual se encuentra la página 

Web  con  la  aplicación  (script)  que  implementa  los  WebSockets  configurados  para  acceder  al  servidor.  Es  una  medida  de  evitar  ataques  de  tipo  DNS,  así  como  para  permitir  servir  varios  dominios  desde  una  misma  dirección  IP.  En  el  caso  de  WebSockets  implementados  de  forma  nativa mediante JavaScript en una página Web, contiene el dominio del servidor de dicha página,  de  forma  que  puedan  restringirse  los  accesos  no  autorizados  a  los  recursos  del  servidor  si  han  obtenido el código de forma alternativa. 

Después  de  que  el  servidor  ha  recibido  la  solicitud,  además  de  comprobar  los  parámetros  de  seguridad mencionados, ha de procesar un desafío de clave que consistente en las siguientes etapas: 

1. Extraer la clave, la cual se encuentra en Sec‐WebSocket‐Key: dGhlIHNhbXBsZSBub25jZQ==.  2. Concatenar  la  clave  con  el  GUID  “258EAFA5‐E914‐47DA‐95CA‐C5AB0DC85B11”,  obteniendo 

como  resultado  un  nuevo  string  de  texto.  El  objetivo  es  minimizar  la  probabilidad  de  que  sea  usado por endpoints que desconozcan el protocolo WebSockets, reforzando la seguridad.  3. Obtener la huella (SHA‐1) [271] a partir del string anterior y codificar como base‐64 antes de ser  devuelta al cliente.  Una vez procesada la respuesta y comprobados los requisitos de seguridad, el servidor responde al  cliente de la siguiente forma:  HTTP/1.1 101 Switching Protocols Upgrade: websocket  Connection: Upgrade  Sec‐WebSocket‐Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=  Sec‐WebSocket‐Protocol: X73    En esta cabecera se indica tanto la clave de respuesta como el nombre del subprotocolo soportado  para poder iniciar las comunicaciones. A partir de ese momento, la conexión queda establecida y las  dos  entidades  pueden  comenzar  a  intercambiar  información.  Como  ya  se  ha  puntualizado  al  comienzo de esta sección, el formato de intercambio de tramas ha evolucionado de igual forma que  los algoritmos de seguridad en WebSockets. Inicialmente basado en la codificación del contenido del  mensaje (payload) UTF‐8 [272] con un sistema de señalización basado en caracteres de delimitación  (0x00  y  0xFF),  es  a  partir  de  la  versión  4  (draft‐ietf‐hybi‐thewebsocketprotocol‐04)  [273]  cuando  se  introducen  los  mecanismos  que  posibilitan  la  transmisión  binaria  mediante  la  introducción  del  concepto  de  Base  Framing  Protocol.  Este  formato  está  descrito  mediante  el  lenguaje  Augmented 

Backus‐Naur Form (ABNF) [274], que define la sintaxis y forma para la comunicación bidireccional. El  formato de una trama de WebSockets es el mostrado en la Figura 41.    Figura 41. Base Framing Protocol de WebSockets.  Donde los campos representados en la Figura 41 se describen en la Tabla 16.   

Tabla 16. Base Framing Protocol: descripción de campos.  Campo  Descripción  FIN  Indica si es el fragmento final en un mensaje.  RSV  Posibilita la introducción de extensiones sobre el protocolo.  OPCODE  Representa el tipo de mensaje, la interpretación del contenido del payload.  MASK  Indica si se emplea una máscara para la codificación del payload. Todos los  mensajes enviados desde el cliente han de ser enmascarados con un array  aleatorio de 4 bytes. En el caso del servidor, esta característica es opcional.  PAYLOAD  Contiene el tamaño del payload en  bytes.  MASKING KEY  Máscara de codificación, si usada.  PAYLOAD DATA  Datos efectivos o de aplicación.   

Dependiendo  del  código  de  control  (OPCODE),  los  tipos  de  mensaje  definidos  pueden  ser  los  mostrados en la Tabla 17:  Tabla 17. Base Framing Protocol: tipos de mensaje.  OPCODE  Descripción  0x0  Continuación, indicando que el frame forma parte junto con otros de un mismo  mensaje.  0x1  Formato de texto codificado en UTF‐8.  0x2  Formato binario, para la codificación directa de bytes.  0x3 – 0x7  Reservados.  0x8  Solicitud de finalización de la conexión.  0x9  Ping.  0xA  Pong.  0xB – 0xF  Reservados.   

Independientemente  del  tipo  de  codificación  empleada  para  la  transferencia  de  mensajes, 

WebSockets implementa además el uso de fragmentación. El objetivo principal es permitir el envío 

secuenciado  de  mensajes  cuyo  tamaño  es  desconocido  a  priori,  de  forma  que  el  receptor  pueda  ir  recibiendo  e  interpretando  la  información  en  su  caso.  Otra  de  las  razones  es  posibilitar  la  multiplexación sobre diferentes canales para que un mismo mensaje no haga un uso exclusivo de un  único canal, consiguiendo un balance de la carga de datos en la transferencia.