miércoles 29 de agosto de 2007

Algunas características avanzadas de iptables

Después de algunos reportes de sitios con páginas HTML alteradas, se me ocurrió publicar una entrada con algunas alusiones a características avanzadas del firewall de GNU/Linux que podrían resultar interesantes.

Dos características avanzadas que se tratan son:
  • Restricción del número de conexiones con la extensión --limit
  • Restricción de las conexiones con la extensión --recent

La extensión --limit

Para usar la extensión recent se necesitan crear reglas similares a esta:

iptables -m state --state NEW -p 6 -dport 22 -i eth0 \
-m state --state NEW -m limit --limit 10/hour --limit-burst 5 -j ACCEPT

Las reglas que usen la extensión limit pueden usarse para reducir los efectos de los ataques de denegación de servicio. Así mismo, ayudan a prevenir los ataques de fuerza bruta y/o ataques de diccionario para adivinar las contraseñas.


La regla escrita anteriormente aplicará a todos los paquetes nuevos que intenten iniciar una conexión a una shell remota (protocolo 6, puerto 22/tcp) hacia nuestro servidor. La regla permitirá
un máximo de 10 conexiones por hora y un máximo de 5 conexiones simultáneas.

Otro uso posible sería limitar el número de conexiones por unidad de tiempo para los usuarios de la red área local que tienen acceso a Internet a través de nuestro servidor ( o las conexiones al servidor proxy-caché).

Para comprender mejor la regla piense en un pequeño balde de agua donde --limit representa la velocidad del flujo del agua saliendo de la manguera para llenar el balde y --limit-burst es el volúmen del balde.

La extensión --recent

Esta extensión permite crear dinámicamente una lista de direcciones ip para luego ser usada en otras reglas de diversas maneras.

Un posible uso sería determinar la dirección ip origen desde donde se está lanzado un escaneo de puertos hacia nuestro servidor o desde donde se esté lanzando un ataque de fuerza bruta. También podría evitar la creación de muchas conexiones a nuestro servidor web con el fin de "botar" conexiones posteriores -ataque DoS.

iptables -A INPUT -m recent --name webconn --rcheck \
--seconds 300 -j DROP

iptables -A INPUT -p tcp -i eth0 --dport 80 -m recent \
--name webconn --set -j DROP


Las dos reglas anteriores implican la creación del mecanismo para permitir conexiones
hacia el puerto 80/tcp (hacia el servidor web) provenientes de la misma dirección cada 5 minutos.

Si su pretensión es usarla en servidores en producción tenga presenta el comportamiento de los usuarios yendo de una página a otra en su sitio. Puede tomar una idea de dicho comportamiento analizando los registros del servidor web para obtener un estimado del tiempo que los usuarios cambian de una página a otra en su sitio web.

Otro uso posible es usar reglas similares para proteger el acceso a puertos/protocolos que solo deben ser accedidos por el personal técnico y no por el público en general.

Conclusión

Internet es terreno salvaje y cada punto débil tratará de ser explotado, la única manera de protegerse o mitigar los intentos de violación a la seguridad es ser consistente y sistemático eliminando las fallas de seguridad que vayan siendo detectadas.

domingo 26 de agosto de 2007

Sitios web con aplicaciones dinámicas

Preámbulo

Esta entrada es mi comentario a la noticia aparecida en El Nuevo Diario en

http://www.elnuevodiario.com.ni/2007/08/26/informatica/57270

Elementos en la escena

Al colocar un sitio web con una aplicación en línea son diversos los factores que entran en juego, a saber:
  • Sistema operativo del usuario
  • Navegador del usuario
  • Protocolos usados para la comunicación entre el servidor web y el navegador
  • Protocolos usados para transferir los archivos de la computadora de los desarrolladores hacia el servidor público donde la aplicación descansará
  • Enrutadores intermedios
  • Servidor web
  • Firewall configurado del lado del servidor (en el propio servidor web o en un dispositivo enfrente de él)
  • Sistema operativo del servidor web
  • Lenguaje de programación
  • Sistema de bases de datos relacionales
Sistema operativo del usuario

El sistema operativo que el usuario tiene instalado en su computadora personal. Este puede ser, para mencionar los comunes en nuestro país:
  • MS Windows XP
  • MS Windows Vista
  • GNU/Linux
GNU/Linux tiene reconocimiento mundial por su estabilidad y seguridad. En la práctica puede decirse que no existen virus para sistemas GNU/Linux.

Para cualquier caso, el sistema operativo debe estar licenciado, actualizado, con un sistema antivirus y adecuadas políticas de firewall.

Navegador del usuario

El navegador del usuario, igual que el párrafo anterior, para mencionar los más comunes:
  • Internet Explorer
  • Mozilla Firefox
En Europa, Mozilla Firefox es el preferido según estadísticas internacionales, menos susceptible a ataques (como fraude electrónico).

Protocolos usados para la comunicación entre el servidor web y el navegador

Siempre se usa http que es un protocolo inseguro (la comunicación es enviada en texto claro) lo que quiere decir que cualquier puede "ver" lo que está enviando (correo electrónico o mensajería instantánea). Así, si usa webmails para correo y en el navegador ve http:// quiere decir que alguien ubicado en su red de área local o alguien ubicado en la misma red pública puede leer su usuario / clave y luego tener acceso a sus correos donde usted podría pedir que se le enviaran sus claves.

Adicionalmente, los administradores de los sitios web utilizan ftp para transferir archivos hacia el sitios web. Lo que se dijo en el primer párrafo para http aplica para ftp, es un protocolo inseguro y el nombre / clave de usuario que hace las transferencias de archivos al sitio web puede ser captura y luego entrar al directorio y tener la potestad de alterar archivos. Es lo que mayormente ha pasado en los casos que se documentan en El Nuevo Diario.

Enrutadores intermedios

Los enrutadores intermedios son todos aquellos dispositivos de interconexión de redes entre usted y el servidor web que visita. Se hace la reseña a ellos porque alguien podría apoderarse de uno y colocar rutas falsas (cómo alguien que lo llevara a Granada cuando realmente lo está llevando a Chinandega) y obligarlo a visitar un sitio web falso (por ejemplo, el sitio web de un banco para tener acceso a su nombre de usuario / clave ) para luego hacer una transferencia a una tercera cuenta y ¡zas! el hacker ve su esfuerzo recompensado.

Honestamente, requiere esta técnica de una sólida comprensión de los protocoles TCP/IP y de administración de redes y sistemas para lograr un ataque de este tipo.

Sistema operativo del servidor web

El sistema operativo de servidor ampliamente usado para servicios de Internet es GNU/Linux. De hecho, Internet fue desarrollada bajo sistemas UNIX del cual GNU/Linux es pariente.

Servidor web

El servidor web más usado es Apache según la estadística pública en NetCraf, el servidor web de Microsoft es el más cercano perseguidor del servidor web Apache.

El servidor web de Microsoft ha sucumbido a nivel mundial a numerosos ataques, como el de CodeRed que logró hacer sucumbir miles de servidores web.

El servidor web es lo primero en que entra en contacto el navegador. A partir de allí, se estable conexión con la aplicación dinámica detrás de él.

Un diagrama simple sería:

cliente--navegador--enrutador--Internet--enrutador--servidor web--aplicación--base de datos


Firewall configurado del lado del servidor (en el propio servidor web o en un dispositivo enfrente de él)

La opinión generalizada es incluso no colocar firewall en el servidor web porque solo se dejan los servicios necesarios al público.

Ese enfoque está totalmente equivocado y puede resultar muy perjudicial. Aunque usted tiene abierta la puerta de su casa para que las visitas puedan entrar, no quiere decir que no esté vigilando la puerta cuando alguien entra y si le resulta sospechoso , claro que le cerraría el paso.

Una función similar es la que realiza un firewall cómo netfilter/iptables, que es un firewall con inspección de estado y muy configurable que estando ubicado en la frontera entre los visitantes que llegan de Internet y el servidor web, es la primera línea de defensa contra los intrusos.

Lenguaje de programación

El lenguaje de programación también es importante punto de vulnerabilidades. Los formularios se presentan en la página web pero la lógica detrás de ellos descansa en el lenguaje elegido, PHP es muy común acá y también ASP.

Una violación a la capa de lógica del negocio o una violación a la capa de presentación (a los programas que se encargan de la comunicación usuario/aplicación web), podría implicar una violación al sistema operativo en que descansa y por ende a los procesos a cargo del núcleo del sistema.

En los casos que documenta la noticia, lo que ha ocurrido es la explotación de las malas prácticas de programación por un lado y luego la falta de atención de los administradores de sistemas de no vigilar sistemáticamente el tráfico en el servidor web para notar la excesiva frecuencia de las consultas en corto periodo de tiempo al sistema de bases de datos cuando las inyecciones SQL están ocurriendo (para poner un ejemplo).

Sistema de bases de datos relacionales

El sistema de bases de datos relaciones también puede ser configurado para responder a consultas únicamente generadas desde el sistema local, si nota, el usuario remoto con su navegador únicamente habla con el servidor web, el servidor web habla con la aplicación y la aplicación habla con el sistema de bases de datos.

Los administradores acá normalmente dejan expuesto también el sistema de bases de datos relacional y además, lo dejan con las configuraciones por defecto.

Conclusión

La seguridad informática es una carrera larga donde como dice el dicho popular, la cadena no es más fuerte que el eslabón más débil. Cada parte que entra en juego, sistema operativo del usuario, navegador del usuario, enrutadores intermedios, servidor web, sistema operativo del servidor, programas de la aplicación web y el sistema de bases de datos relacionales, debe ser asegurada.

Cada eslabón de la cadena debe ser fortificado. Algunos eslabones dependen de los administradores de sistemas locales que deben encargarse de tener los sistemas operativos de la red de área local debidamente licenciados, actualizados, con sistemas antivirus al día, adecuadas políticas de firewall en los equipos de escritorio y en el enrutador o servidor de conectividad local. ¿No se ha imaginado que si alguien es capaz de "crackear" un sistema licenciado para ponerlo a disposición sin el pago de la correspondiente licencia también es capaz de agregar algún código de programación para que le informe de sus pulsaciones de teclas, de los sitios que visita o de los correos que manda o de las conversaciones de mensajería instantánea?

Otros eslabones, como los enrutadores intermedios, están fuera de la responsabilidad de los administradores locales o de los administradores de sistemas de los servidores web. Lo único que los salvaría, tratando de dar una respuesta ahora de cómo protegerse, es algún tipo de seguridad no basada en claves ni en direcciones ip sino en certificados de seguridad que identifiquen a servidor web y usuario.

El servidor web, la lógica detrás del servidor web (los programas) y el sistema de bases de datos relacional están bajo la responsablidad del administrador de sistemas del sistema que brinda los servicios de Internet (como web y correo) que debe ser lo suficientemente diligente para detectar anomalías en el tráfico que llega a su servidor, anomalías en los servicios (5 mil correos de un solo usuario en un mismo día deberían llamar su atención o consultas a razón de decenas o centenas por minuto deberían indicar la ocurrencia de un posible ataque de inyección SQL).

Concluyendo, la responsabilidad es compartida pero los casos documentados en El Nuevo Diario apuntan a neglicencia administrativa de los administradores de los sistemas expuestos publicamente que no han sido diligentes en la detección de anomalías ni en los escenarios previos cuando su sistema está siendo perfilado para un ataque. También, es responsabilidad de los programadores de las aplicaciones web que no han aplicado las adecuadas "fortificaciones" en el código que escriben.

jueves 23 de agosto de 2007

Creando una aplicación web (I parte)

Una aplicación web es una aplicación que genera documentos html (o xhtml) para ser vistos desde un navegador. Tome nota de que ese navegador puede ser ejecutado desde un equipo con arquitectura Intel, arquitectura "Mac", arquitectura RISC. Además, el sistema operativo en la plataforma de hardware podría ser:
  • MS Windows
  • GNU/Linux
  • Mac OS
  • Solaris
  • ....
Ese navegador al ser lanzado y apuntar a la dirección http://www.dominio.com/ mostrará el documento de índice principal que podría ser un archivo con la extensión:

  • .asp
  • .jsp
  • .php
  • ...
De acuerdo a la tecnología que se esté usando del lado del servidor. Alguna interacción entre el navegador y la aplicación web alojada en el servidor remoto es manejada mediante lenguajes del lado del cliente (por ejemplo, mediante Javascript).

Imagine, por ejemplo, que al dirigir el navegador hacia http://www.dominio.com/ está entrando a un sitio web que contiene una aplicación web disponible públicamente (todavía no se está haciendo referencia a una tecnología en particular porque se está analizando la teoría de la interacción entre el navegador y el servidor y ello es válido para cualquier sistema operativo del lado del cliente y cualquier sistema operativo del lado del servidor).

Al entrar al sitio, mostrará la página principal por defecto, lo común es tener un formulario de inicio de sesión (por ejemplo para iniciar sesión en su servidor de correo basado en web). Allí, escribe sus datos (usuario/clave) para poder tener acceso a sus correos. ¿Qué está sucediendo internamente? El formulario "sabe" a que programa enviar los datos porque ese parámetro (quién recibe los datos del formulario) está definido por el desarrollador al momento de crear el formulario. El programa encargado de procesar los datos, también "sabe" los datos que debe recibir. Una vez recibidos y verificados los datos, el programa "ejecuta" la lógica necesaria para interrogar a la base de datos sobre la existencia del usuario y sobre la validez de la clave; sin son válidas, se permitirá el inició de sesión, sino, se notificará al usuario que las credenciales no son válidas. Si son válidas, se devuelven al usuario la interfaz que muestra sus carpetas de correo y sus correos.

Toda la comunicación entre el navegador y el servidor ocurre mediante el protocolo HTTP (o HTTPS) según sea el caso. Este protocolo debe ser implementado en sistemas de servidor propietario o en sistemas de servidor de software libre / código abierto.

Luego, el servidor web debe "saber" cómo llamar a los programas de la aplicación web necesarios para que la interacción con el usuario remoto ocurra.

A su vez, dichos programas "conocen" cómo se debe hablar con la base de datos que aloja los datos de la aplicación a través del driver de la base de datos particular que se esté usando.

Una aplicación web escribe código HTML (o XHTML) para el navegador similarmente como los viejos programas en modo texto escribían caracteres para la pantalla.

¿Qué se necesita saber para escribir una aplicación web?
  • HTML (el lenguaje de facto en Internet para los navegadores)
  • CSS (Hojas de estilo en cascada)
  • Diseño gráfico
  • Algún lenguaje de programación para web
  • Algún marco de desarrollo para aplicaciones web
  • SQL
Siendo que el mayor porcentaje de servidores web en el mundo se ejecutan sobre GNU/Linux usando Apache, es muy sano pensar en aprender algún lenguaje multi-plataforma o PHP. Vale decir, que la tendencia está siendo Java -liberado para la comunidad de software libre / código abierto.

En nuestros entornos todavía no hemos llegado al grado de requerir una elevada especialización de los departamentos IT y por ello, es normal encontrar en la mediana y pequeña empresa, que una sola persona realiza las labores de:
  • Diseño gráfico
  • Maquetación HTML
  • Creación de la interfaz dinámica
  • Lógica de negocios
  • Administración de sistemas
  • Administración del Sistema de Bases de Datos Relacionales
Los CMS (Content Management System) aunque son una excelente alternativa, no resuelven totalmente las necesidades de procesamiento de datos que una aplicación web requiera.

sábado 18 de agosto de 2007

Inseguro por diseño

El FBI, agencia del gobierno de los Estados Unidos, está solicitando al congreso de EUA que todo futuro equipo de enrutamiento contenga "back-doors" para que las fuerzas de la ley puedan activar mecanismos de espionaje sobre el tráfico que pasa a través de esos dispositivos. [1]

Recuerdo ahora la decisión de un colega de optar por adquirir equipo con hardware dedicado para la implementación de tecnología de Redes Privadas Virtuales.

Hay muchos protocolos inseguros por diseño, HTTP y FTP son ejemplos claros de ellos donde cualquier persona con un analizador de tráfico puede espiar el tráfico http o ftp (por ejemplo) y obtener las parejas usuario/clave para luego ingresar a los sistemas donde los usuarios a los cuales se les haya capturado sus credenciales tienen acceso.

Como puede verse en la figura, las credenciales de acceso (usuario/contraseña) son mostradas por el analizador de tráfico. ¿Qué se necesita luego para tener acceso a los recursos disponibles vía ftp, como por ejemplo, los archivos de un sitio web? Se necesita nada más un cliente FTP y apuntar hacia el mismo servidor cuyo tráfico se estuvo inspeccionando.

Por supuesto, pueden re-emplazarse el uso de protocolos inseguros como HTTP o FTP por sus pares de protocolos que usan tecnología criptográfica para evitar el espionaje de las sesiones HTTP o FTP.

Así, si se desea que los usuarios inicien sesión en servidores remotos para revisar el correo por ejemplo, vía los ya muy conocidos webmails es mejor HTTPS y para transferir archivos es preferible usar SFTP en lugar de su par inseguro FTP.

Acá, puede verse cómo usar o no usar tecnología propietaria se vuelve un asunto de seguridad nacional en los EUA y también debería verse como un asunto de seguridad nacional en Nicaragua.

[1] http://news.com.com/Networking+exec+blasts+wiretapping+rules/2100-1036_3-6136344.html?tag=news.1

domingo 5 de agosto de 2007

"Connection refused" recibida del sitio web de La Prensa

Buen día lista:

Simple error humano o ataque DoS [1] ? No he logre acceder al sitio web de
La Prensa.

Saludos,

Jorge Dávila.

[1] http://en.wikipedia.org/wiki/Denial-of-service_attack

ERROR
El URL solicitado no se ha podido conseguir

Mientras se intentaba traer el URL: http://www-ni.laprensa.com.ni/

Ha ocurrido el siguiente problema:

* Conexión fallida.

El sistema ha devuelto el siguiente mensaje:

(111) Connection refused

El equipo remoto o la red pueden estar fuera de servicio. Por favor, intente
de nuevo la petición.

Jorge Isaac Davila Lopez
Nicaragua Open Source
+505 430 5462
davila@nicaraguaopensource.com

sábado 4 de agosto de 2007

FOSS, software propietario, estándares y el tercer mundo

Preámbulo

He escrito este documento en aras de contribuir a la discusión sobre el uso del software libre / código abierto y el uso del software propietario.

Acá la discusión de diversos puntos.

En las tecnologías de la información y la comunicación (TIC) el tercer mundo tiene una elección estratégica a tomar: elegir FOSS (Free and Open Source Software – Software Libre / Código Abierto) elegir software propietario para la administración pública, infraestructura tecnológica de negocios (por ejemplo: servidores de correo y servidores web, dispositivos de interconexión de red). También elegir FOSS o software propietario para la educación pública.
La discusión se dividirá para fines de este artículo en: (1) estándares, (2) formatos de ficheros y sistemas de ficheros, (3) sistemas manejadores de bases de datos relacionales, (4) lenguajes de programación, (5) servicios de Internet (como correo electrónico, www).

Estándares

Los estándares pueden definirse como un conjunto de reglas que determinan el funcionamiento y características particulares de los servicios de Internet para dar un ejemplo. Ello quiere decir que la manera cómo es recibido, procesado y enviado el correo electrónico de un usuario conectado a un servidor de correo con software propietario o con software libre / código abierto sigue las mismas reglas independientemente de la plataforma en que descansa el servicio. Si no funcionara de esta manera, Internet, cómo la conocemos ahora, ¡no existiría! Los estándares hacen posible que la mayoría de usuarios (en Nicaragua) usando software propietario (licenciado o pirata) puedan comunicarse con los servidores de correo de los proveedores de servicios de Internet (PSI) locales sin que ello sea un impedimento para la aplicación propietaria cliente de correo funcione correctamente. Nótese que el formato de documentos de la suite de oficina distribuida con GNU/Linux es el formato estándar y no el formato de la suite de oficina distribuida con el software propietario.

Formatos de ficheros y Sistemas de ficheros

Un hecho interesante es que en muchos lugares se pide al personal elaborar un documento de texto para abarcar algún tópico en una misiva corporativa interna. Luego, ese mismo documento podría ser visto por público diverso en una presentación de diapositivas durante una conferencia o una sesión de trabajo. Posteriormente, ese mismo documento debe ser colocado en el sitio web corporativo. Más todavía: Ese mismo documento debe poder ser visto por usuarios conectados a Internet desde sus computadoras portátiles o desde sus celulares. Es notable que el documento pasa por diversas “transformaciones”. XML definitivamente es el formato de marcación requerido para que el creador del documento, un periodista por ejemplo, elabore el documento una sola vez y que un programador dedicado a XSLT codifique las hojas de transformación que tomaran el documento en formato XML y crearán la lógica necesaria para que de forma programática se produzcan de forma automática los documentos en los diversos formatos para su presentación. Una suite de oficina decente debe ser capaz de guardar los documentos en formato XML. El usuario solo debe ser consistente en la forma en que esquematiza su documento y aplica los formatos para que al momento de guardar el documento no tenga nada más una lista larga de párrafo sino un documento jerarquizado de acuerdo al esquema que se haya definido. El reconocimiento de los estándares posibilita que archivo de imagen pueda ser transportado en una memoria usb (dispositivo electrónico), almacenado en un disco duro (tecnología electromecánica) o respaldado en una unidad de cd o dvd (tecnología óptica).

Las características particulares del sistema de ficheros subyacente donde se almacenan los ficheros es materia de la que deben preocuparse los administradores de sistemas y no los usuarios. Los sistemas de ficheros deben proveer las suficientes características para garantizar un acceso granular a los ficheros que almacena (por ejemplo: por contenedores lógicos –llamados grupos o por usuario). Además, debe ser lo suficientemente versátil para permitir al usuario la libre elección del sistema de ficheros donde descansaran sus archivos. Esto es, los ejecutivos son libres de elegir el maletín en que guardarán sus archivos y para el maletín no es relevante si el ejecutivo escribe en hojas de papel o cartulina, solo se encarga de resguardarlos y tenerlos a disposición para cuando el ejecutivo desee tener acceso a ellos. Los sistemas de ficheros de GNU/Linux garantizan la inter-operabilidad con los sistemas de ficheros del software propietario.

Sistemas manejadores de bases de datos relacionales.

Los sistemas manejadores de bases de datos relacionales manejan cada uno un sub-conjunto del estándar SQL. El código SQL que se escribe para software libre / código abierto es exáctamente el mismo. No hay diferencia.

Lenguajes de programación

Las secuencias de código escritas por los programadores son las encargadas de dialogar directamente con el motor de bases de datos subyacente, obtener los datos y presentarlos al usuario. La tendencia ahora son sistemas conectados a Internet que proveen a los negocios y gobiernos la posibilidad de actualización en tiempo real de los datos. Siendo que casi el 80% de los servidores de Internet ejecutan software libre / código abierto ele lenguaje a elegir debe ser un lenguaje usado en la plataforma de software libre / código abierto si se quieren maximizar las bondades del uso de la tecnología de Internet. El lenguaje de programación a escoger debe ser multi-plataforma (capaz de ejecutarse en entornos de software libre / código abierto y en entornos de software propietario) para poder con facilidad portar las aplicaciones de negocios de una plataforma a otro sin que ello sea una experiencia traumática. En todos los casos es mejor capacitar a los programadores en lenguajes multi-plataforma que sufrir luego el impacto que una migración pueda tener sobre las aplicaciones de negocio. ¿Los entornos para desarrollo para crear las aplicaciones? Existen, son de licencia pública, de acceso gratuito. La tarea es solo descargarlos, instalarlos, aprender a usarlos –aprendizaje que además representa la creación de aplicaciones que podrán sobrevivir a una migración de plataforma.

Servicios de Internet

Los servicios de Internet, casi el 80%, se ejecuta en servidores GNU/Linux que sostiene servidores de correo, servidores web, servidores para transferencia de ficheros, servidores con software para implementar centrales telefónicas, aplicaciones para la comunicación personal como la mensajería instantánea o aplicaciones de voz sobre IP (para hablar a otra persona que se encuentra en una localidad remota). Los servicios de Internet que necesita una empresa a nivel nacional, multinacional, transnacional, están cubiertos por las aplicaciones de software libre / código abierto con igual o mejor funcionalidad que las aplicaciones disponibles en el software propietario.

Conclusión

Los gobiernos del tercer mundo, las empresas, las organizaciones, la educación pública deben incentivar la adopción de las tecnologías relacionadas con el software libre / código abierto. Hay muchas otras razones, como razones de seguridad de seguridad que otros han aducido, acá solo están discursando sobre las razones técnicas.

Las elecciones sobre la plataforma tecnológica deben ser considerando el respeto que la plataforma elegida tenga a los estándares. Deben hacerse pensando en crear una plataforma tecnológica empresarial sólida. También, se debe ser ético y no continuar la piratería de software.