miércoles, 6 de abril de 2016

La seguridad en el conocimiento: puertos y protocolos

En anteriores entradas he dicho que Internet no provee seguridad en ninguno de sus aspectos y que son herramientas añadidas las que proporcionan la seguridad que se requiera. Y que lo mismo rige para Unix y sus derivados. Pero esto puede aplicarse a todo aquello que forma parte de Internet.
Un sistema informático sólo puede llegar a ser razonablemente seguro si no está conectado a Internet.
En general solemos ver Internet como un sistema de transmisión de información a través de las webs. Puedes acceder a otras webs pulsando enlaces o localizar información concreta usando buscadores como Google, Bing y Yahoo. Pero a poco que pienses, encontrarás otro sistema para compartir información en Internet que no es la web: el correo electrónico, por mucho que una forma bastante popular de acceder a los mismos sea a través de una aplicación... en una página web.

También están los sistemas de mensajería instantánea como el popular Whatsapp, que es una forma de comunicación exclusivamente a través de smartphones pero que usa Internet igualmente.

En realidad hay un puñado de servicios que están disponibles a través de Internet: recordemos, Internet es simplemente un sistema que permite conectar redes heterogéneas, incluyendo, por supuesto, los servicios que ofrezcan dichas redes.

Dejemos claras algunas ideas, si es posible: un protocolo es, a grandes rasgos, una descripción estándar de cómo se realiza un tipo de comunicación determinado, principalmente desde el punto de vista del sistema operativo; por su parte, un puerto es una definición técnica del sistema operativo que asocia un protocolo o servicio a una numeración. Constituyen un detalle de implementación y si bien son muy importantes, no son muy conocidos. Echa un vistazo a la entrada de la wikipedia al respecto; y un servicio es una aplicación que utiliza un protocolo determinado para intercambiar información.

Un aspecto de la comunicación por Internet es que siempre se explica que la dirección de las máquinas es un conjunto de enteros (p.ej. en IPv4 puedes tener una dirección como 92.68.165.210) y que unas máquinas especiales llamadas "servidores de nombres" (DNS) se encargan de hacer las traducciones oportunas desde las direcciones alfanuméricas típicas. Bien, DNS es un ejemplo de protocolo por el cual una máquina "servidora" recibe una entrada alfanumérica y la traduce a una dirección que siga el protocolo IP.

Pero ésta no es toda la historia. Una dirección de internet contiene dos partes: la dirección ip (o la alfanumérica aún sin traducir) y el número de puerto. Así: midireccion.com:80

http/https es uno de los protocolos más conocido y quizá el más famoso. Corresponde a la navegación web y sus siglas significan "HyperText Transport Portocol" (Protocolo de Transporte de HiperTexto). "Hipertexto" significa que lo que se envía no es texto simple, sino que incluye enlaces a otras direcciones web a través de enlaces (también llamados hipervínculos o hiperenlaces). http define la forma en la que una web es enviada a través de internet y la forma en la que los navegadores deben de interpretar los paquetes que va recibiendo para visualizar la web de forma correcta. Desde su punto de vista, enlazar con una web significa simplemente que al pinchar en el enlace se comience a enviar el contenido de la página web de destino del enlace.

En la comunicación http simpre hay al menos una máquina que contiene la web a consultar, denominada "servidor" y otra que es donde se efectúa la consulta denominada "cliente". Eventualmente, el servidor puede ser la misma máquina que el cliente, aunque generalmente desde un cliente accedamos a un montón de servidores que son los que contienen cada contenido concreto. Sí, los hipervínculos nos permiten acceder no sólo a otro contenido de la misma web, sino a contenido de otras web situadas en otras máquinas servidoras.

Para que una máquina pueda funcionar como servidor web necesita ejecutar una aplicación especial también llamada "servidor web". Un ejemplo muy popular de este tipo de software es Apache. Esta aplicación lo que hace básicamente es "escuchar el puerto web", hasta que recibe "una petición" que se ajuste al estándar http. Sí, Apache no sabría qué hacer si en lugar de una solicitud de una página concreta de la web que sirve recibiese un correo electrónico, y lo descartaría como una petición errónea.

"Escuchar un puerto" es una expresión técnica que significa que hay alguna aplicación en el sistema que está pendiente de que el sistema reciba algún paquete de Internet dirigido al puerto de turno. Puedes verlo como un barco que llega a un puerto y se le asigna una dársena concreta, o si llegas a un centro médico con una cita: llegas y consultas dónde está el despacho médico que te corresponde en función de tu cita.
"Escuchar un puerto" significa tener una aplicación especial que se encarga de los paquetes de Internet que se dirigen a dicho puerto.
"Una petición" es un paquete que sigue las especificaciones del protocolo correspondiente para que la aplicación servidora "sirva" su contenido. En el caso de una web, una petición podría ser algo como "envía el contenido de miweb.com/unapagina.hmlt a mi dirección de procedencia", pero escrito en un lenguaje que se ajuste a lo especificado por el protocolo http.

https es una "versión" del protocolo. Significa "HyperText Transport Protocol Secure" (Protocolo de Transporte de HiperTexto Seguro). Básicamente permite modificar la configuración del servidor web para hacer uso de certificados de autenticidad con los que cifrar la conexión y asegurarse de que las distintas peticiones y atenciones se dan entre el mismo servidor y el mismo cliente. Es decir, https lo que hace es:
  • Cifrar la conexión
  • Asegurar que la conexión que se ha establecido entre dos máquinas sigue siendo entre las mismas dos máquinas.
Hay montones de protocolos de Internet, cada uno de los cuales puede funcionar con uno o varios puertos. Por ejemplo, está imap/pop/smtp, que son protocolos para el correo electrónico.  Hay protocolos para su uso en redes privadas pero que pueden (y son) utilizarse a través de Internet, como ssh (shell seguro, un sistema de obtener un terminal remoto para conectarse a un sistema operativo a través de la red). ftp es un sistema para transmitir ficheros entre máquinas conectadas a una red, aunque lo más probable es usar alguna versión como vsftp (ftp "muy seguro", según su  propio nombre: very secure ftp). Los navegadores web están diseñados y optimizados para trabajar con el protocolo http/https, pero eso no impide que hasta no hace mucho fuera frecuente que permitiesen usar alguna forma de ftp. Esto ha caído en desuso porque los servidores web son capaces también de servir ficheros, por lo que es más fácil utilizar un servidor web para servir la web y ficheros que se quieran compartir que tener dos servidores (uno web y otro ftp).

También se han desarrollado aplicaciones capaces de ser ejecutadas por un servidor web y un simple navegador que permiten acceder a contenidos de otros protocolos. Así, puedes tener un servidor "webmail" que permite a sus usuarios gestionar su correo electrónico sin requerir aplicaciones específicas para ello (pero sí tiene que existir un servidor de correo). También puedes usar aplicaciones web que te permiten compartir ficheros en algún sistema de sincronización como Dropbox o Google Docs. Esa es la razón por la que http/https sea con diferencia el protocolo más conocido.

Y por supuesto los navegadores y los servidores web son tan listos así que, a falta de puerto, entienden que una petición al protocolo http va al puerto 80 y si es al protocolo https va al puerto 443. Por supuesto, eso pasa con todos los protocolos: una petición al servidor ssh irá al puerto 22, ftp al 21 y así. En ocasiones, es buena idea configurar algunos servidores como el de ftp en otros puertos, así que las peticiones a ftp deben llevar ese nuevo puerto. Por ejemplo, si le decimos a nuestro servidor ftp que "escuche" el puerto 40000, entonces la máquina que se conecte a nuestro servidor deberá indicar que quiere conectarse al puerto 40000. Si pide otro puerto (incluido el estándar, el 21), simplemente será ignorada porque no hay nadie "escuchando" allí.
Siempre está llegando información a las máquinas, tengan una aplicación esperándola o no.
Todo esto es muy interesante o un simple ladrillo. Lo interesante es que una máquina conectada a Internet siempre recibe lo que se le envíe, tenga o no un programa apropiado para tratarlo. Así, si tu IP pública es 80.116.112.86 y yo escribo en mi navegador escribo http://80.116.112.86, mi sistema enviará una petición a tu máquina para que me sirva el contenido web del servidor... cosa que no tienes. Lo interesante es que tu sistema recibe igualmente la petición. Es la idea que está tras eso de tener puertos "abiertos" o "cerrados". La idea es poner una aplicación que hace de intermediaria entre la comunicación exterior y el sistema operativo. Así, dicha aplicación, llamada "Cortafuegos", sólo acepta las comunicaciones que van a algún puerto abierto, desechando las demás. Otro ejemplo de seguridad "añadida" por "encima del sistema".
Cada puerto abierto en nuestro sistema lo hace más débil. 
 En la práctica, la mayoría de usuarios tenemos un router proporcionado por nuestro proveedor de Internet. Por definición, todo el tráfico entre Internet y nuestro equipo pasa por dicho router, por lo que es un buen lugar para poner un cortafuegos es justo en ese router. Si los proveedores tuviesen vergüenza los proporcionarían con los puertos cerrados siempre, de forma que si necesitamos abrir uno lo haremos nosotros mismos. Nótese que el tráfico "normal" pasa por el cortafuegos igualmente, porque lo importante para un cortafuegos es proteger los puertos que no uses del exterior, para que no puedan ser utilizados por otras personas para introducir malware en nuestro equipo: se da por supuesto que el usuario va a conectarse a otros servidores para navegar por otras páginas, y ese tráfico se permite, de la misma forma que el usuario también podría conectarse a un servidor ftp (si encuentra alguno). En la práctica, lo que se hace es permitirte recibir tráfico general de sitios a los que te conectas tú en primer lugar.

De lo dicho, especialmente en el último párrafo, se entiende rápidamente que un usuario responsable debería de usar un equipo con todos los puertos cerrados salvo lo necesario para poder conectarse a otros servicios, particularmente servidores web. Explicar cómo los puertos abiertos pueden facilitar la vida de un atacante de nuestro sistema está mucho más allá del ámbito de las cosas que escribo, pero en general un puerto abierto es una debilidad, pero un puerto abierto sin uso es un problema de seguridad importante.

No hay comentarios:

Publicar un comentario en la entrada