MODELO DE GESTIÓN DE SEGURIDAD CON SOPORTE A SNMP

MODELO DE GESTIÓN DE SEGURIDAD CON SOPORTE A SNMP
NICOLÁS BOTERO ARANA
Proyecto de grado presentado para optar el título de Ingeniero de Sistemas
Director: Ingeniero Edgar Enrique Ruiz García
PONTIFICIA UNIVERSIDAD JAVERIANA
FACULTAD DE INGENIERIA
CARRERA DE INGENIERIA DE SISTEMAS
BOGOTA D.C.
JUNIO DEL 2005
PONTIFICIA UNIVERSIDAD JAVERIANA
FACULTAD DE INGENIERIA
CARRERA DE INGENIERIA DE SISTEMAS
Rector Magnífico:
Padre Gerardo Remolina Vargas S.J.
Decano Académico Facultad de Ingeniería:
Ingeniero Francisco Javier Rebolledo Muñoz
Decano del Medio Universitario Facultad de Ingeniería:
Padre José Sarmiento Nova S.J.
Director Carrera de Ingeniería de Sistemas:
Ingeniera Hilda Cristina Chaparro López
Director Departamento de Ingeniería de Sistemas:
Ingeniero Germán Alberto Chavarro Flórez
Nota de Aceptación
______________________________________________________
______________________________________________________
______________________________________________________
________________________________________
Director del Proyecto
________________________________________
Jurado
________________________________________
Jurado
JUNIO DEL 2005
Artículo 23 de la Resolución No. 1 de Junio de 1946
“La Universidad no se hace responsable de los conceptos emitidos por sus
alumnos en sus proyectos de grado.
Sólo velará porque no se publique nada contrario al dogma y la moral católica y
porque no contengan ataques o polémicas puramente personales. Antes bien,
que se vean en ellos el anhelo de buscar la verdad y la Justicia”
AGRADECIMIENTOS
En primer lugar quiero agradecer a la Carrera de Ingeniería de Sistemas de la
Pontifica Universidad Javeriana por haberme instruido y formado como Ingeniero y
por haberme brindado el conocimiento que me ayudó a superar esta etapa de mi vida.
Debo un especial reconocimiento a mis padres por haberme brindado esta gran
oportunidad de estudio, por estar siempre conmigo en mis decisiones, en mis
problemas y en todo momento que tuve la necesidad de ellos. Muchas gracias a mi
hermano por haberme servido de guía, de compañero, pero sobre todo, de hermano,
de alguien que siempre está al lado de uno. Muchas gracias a mi hermana por darme
siempre esos empujoncitos de aliento, que de una forma muy cariñosa, lo ayudan a
uno a seguir adelante sin importar lo que venga.
Muchas gracias a mi novia que estuvo presente durante mi último año en la
Universidad y que me apoyó en todo momento. A mis amigos de la Universidad y del
colegio, amigos incondicionales que estuvieron presentes en mi vida desde los
comienzos más básicos de mi formación y con los cuales comparto momentos
fabulosos. En ellos pude encontrar siempre una mano amiga cuando era necesario.
No hay que olvidar aquellas personas que me permitieron irme formando como
Ingeniero y que me fueron brindando los pilares del conocimiento: mis profesores.
Muchas gracias por haberme enseñado todo aquello que necesité en el descubrimiento
del saber.
Al director de mi tesis le agradezco toda su paciencia en aquellos momentos donde
más se necesitaba, por haberme guiado en todo este proceso y haberme brindado un
ambiente de confianza y bienestar para el desarrollo de esta investigación.
TABLA DE CONTENIDO
GLOSARIO ................................................................................................................ 10
1 INTRODUCCIÓN .............................................................................................. 12
2 PLANTEAMIENTO DE LA INVESTIGACIÓN .............................................. 15
2.1
OBJETIVO GENERAL .............................................................................. 15
2.2
OBJETIVOS ESPECÍFICOS...................................................................... 15
2.3
REQUISITOS PARA EL DESARROLLO DEL PROYECTO.................. 15
3
METODOLOGÍA ............................................................................................... 16
3.1
DESARROLLO METODOLÓGICO DE LA INVESTIGACIÓN ............ 16
4
MARCO TEÓRICO............................................................................................ 18
4.1
ADMINISTRACIÓN DE SEGURIDAD ................................................... 18
4.2
ADMINISTRACIÓN DE RED .................................................................. 18
4.3
DOCUMENTACIÓN SOBRE SNMP........................................................ 19
4.3.1
Protocolo de administración simple (SNMP) ..................................... 19
4.3.1.1 Componentes de SNMP .................................................................. 20
4.3.1.2 Representación de la información................................................... 21
4.3.1.3 Operaciones (comandos) del protocolo........................................... 22
4.3.1.4 Estructura de la PDU....................................................................... 24
4.3.2
Protocolo de administración simple versión 3 (SNMPv3).................. 25
4.3.2.1 Arquitectura SNMPv3..................................................................... 26
4.3.2.2 Formato del mensaje ....................................................................... 29
4.3.2.3 Modelo de seguridad basado en usuarios (USM) ........................... 30
4.3.2.3.1 Parámetros de seguridad de USM ............................................. 30
4.3.2.3.2 Motor SNMP autoritativo ......................................................... 31
4.3.2.3.3 El grupo MIB usmUser [10] ..................................................... 33
4.3.2.3.4 Descubrimiento de motores SNMP........................................... 34
4.3.2.3.5 Administración de llaves........................................................... 34
4.3.2.4 Modelo de control de acceso basado en vistas (VACM) ................ 35
4.3.2.4.1 Elementos del modelo VACM .................................................. 35
4.3.2.4.2 La MIB del VACM ................................................................... 36
4.3.3
Comparación entre seguridad de SNMPv1 y SNMPv3 ...................... 37
4.4
DOCUMENTACIÓN DE MIB .................................................................. 38
4.4.1
Generalidades de MIB......................................................................... 38
4.4.2
La estructura de administración de la información ............................. 38
4.4.3
Interacción con la MIB........................................................................ 39
4.4.4
Notación de sintaxis abstracta ASN.1................................................. 40
4.4.4.1 Conceptos ASN.1............................................................................ 42
4.4.4.2 Tipos abstractos de datos ................................................................ 43
4.4.4.3 Identificación de objetos ................................................................. 46
4.4.4.4 Ejemplo de la MIB de prueba ......................................................... 47
5 DESARROLLO DEL PROYECTO ................................................................... 49
5.1
SELECCIÓN DE PROGRAMAS A UTILIZAR ....................................... 50
5.1.1
Programa Net-SNMP .......................................................................... 55
5.1.1.1 Pruebas de concepto........................................................................ 55
5.1.2
Selección de herramientas de seguridad ............................................. 57
5.1.3
Selección de motor de base de datos................................................... 62
5.1.4
Análisis del protocolo syslog .............................................................. 63
5.2
ARQUITECTURA DEL MODELO PROPUESTO................................... 64
5.2.1
Arquitectura general............................................................................ 64
5.2.2
Arquitectura del adaptador.................................................................. 66
5.2.2.1 Adaptador........................................................................................ 67
5.2.2.1.1 Analizador de logs..................................................................... 67
5.2.2.1.2 Consideraciones sobre los logs ................................................. 69
5.2.2.1.3 Consideraciones sobre la MIB .................................................. 70
5.2.2.1.4 Construcción del adaptador....................................................... 72
5.2.3
Arquitectura de la consola de seguridad ............................................. 78
5.2.3.1 Consola de seguridad ...................................................................... 80
5.2.3.1.1 Subsistema de ambiente gráfico................................................ 81
5.2.3.1.2 Subsistema de control de incidentes de seguridad .................... 81
5.2.3.1.3 Subsistema de recepción de mensajes SNMP........................... 82
5.2.3.1.4 Subsistema de envío de mensaje SNMP ................................... 82
5.2.3.2 Modelo entidad-relación de la base de datos utilizada.................... 82
5.2.3.3 Diagrama de clases de la consola de seguridad .............................. 83
6
PRUEBAS........................................................................................................... 84
6.1
DESCRIPCIÓN DE LA PRUEBA ............................................................. 84
6.2
DESARROLLO DE LAS PRUEBAS ........................................................ 85
6.3
RESULTADOS DE LAS PRUEBAS......................................................... 94
7 CONCLUSIONES .............................................................................................. 96
8 CONTINUIDAD DEL PROYECTO.................................................................. 99
8.1
POSIBLES TRABAJOS FUTUROS.......................................................... 99
BIBLIOGRAFIA ...................................................................................................... 101
ANEXO 1: TÉRMINOS DE LICENCIAMIENTO.................................................. 103
ANEXO 2: ESTRUCTURA DE UNA MIB............................................................. 109
ANEXO 3: IMPLEMENTACIÓN DE UNA MIB ................................................... 112
ANEXO 4: MANUAL DEL USUARIO................................................................... 122
ANEXO 5: INSTALACIÓN DEL PROGRAMA NET-SNMP ............................... 140
ANEXO 6: MANUAL DE INSTALACIÓN............................................................ 145
ANEXO 7: CONTENIDO DEL CD ......................................................................... 146
ANEXO 8: DIAGRAMA DE CLASES GENERAL................................................ 147
TABLA DE FIGURAS
Figura 1. Transporte de un mensaje SNMP ................................................................ 19
Figura 2. Estructura general de la MIB....................................................................... 21
Figura 3. Intercambio de mensajes SNMP.................................................................. 23
Figura 4. Estructura de la PDU ................................................................................... 24
Figura 5. Diagrama de una entidad SNMP ................................................................. 27
Figura 6. Formato del mensaje SNMPv3.................................................................... 29
Figura 7. Formato del mensaje SNMPv3 con el campo msgSecurityParameters ...... 31
Figura 8. Forma de manejo de las llaves..................................................................... 32
Figura 9. Relación de componentes ASN.1 ................................................................ 41
Figura 10. Vista del árbol construido.......................................................................... 48
Figura 11. Arquitectura propuesta .............................................................................. 49
Figura 12. Get utilizando SNMPv2............................................................................. 51
Figura 13. Response del mensaje SNMPv2 ................................................................ 52
Figura 14. Get utilizando SNMPv3............................................................................. 53
Figura 15. Response del mensaje SNMPv3 ................................................................ 54
Figura 16. Prueba de concepto realizada..................................................................... 56
Figura 17. Funcionamiento de Syslog......................................................................... 63
Figura 18. Arquitectura general .................................................................................. 65
Figura 19. Arquitectura del adaptador ........................................................................ 66
Figura 20. Estructura de los logs................................................................................. 70
Figura 21. Implementación de la MIB para la herramienta ........................................ 71
Figura 22. Estructura general de la MIB para el modelo propuesto ........................... 72
Figura 23. Estructura en C para la herramienta Kerio ................................................ 73
Figura 24. Arquitectura de la consola de seguridad.................................................... 79
Figura 25. Subsistemas de la consola de seguridad .................................................... 80
Figura 26. Diagrama entidad-relación......................................................................... 83
Figura 27. Diagrama de la red de prueba utilizada ..................................................... 86
Figura 28. Utilización de la red en la subred 1 ........................................................... 87
Figura 29. Utilización de la red en la subred 1 ........................................................... 88
Figura 30. Utilización de la red................................................................................... 90
Figura 31. Utilización de la red................................................................................... 91
Figura 32. Utilización de la red................................................................................... 92
Figura 33. Utilización de la red................................................................................... 93
Figura 34. Tráfico normal de la red ............................................................................ 94
Figura 35. Gráficas del envío de un gran número de Traps a la consola.................... 94
Figura 36. Estructura de un mensaje SNMPv3 ........................................................... 98
LISTA DE TABLAS
Tabla 1. Principios garantizados por cada grupo de aplicación .................................. 58
Tabla 2. Características analizadas de los Anti-Spyware ............................................ 59
Tabla 3. Características analizadas de los antivirus .................................................... 60
Tabla 4. Características analizadas de los firewalls .................................................... 60
Tabla 5. Características analizadas de los IDS............................................................ 60
Tabla 6. Criterios de selección de herramientas.......................................................... 61
Tabla 7. Resultados de aplicar criterios a herramientas.............................................. 62
Tabla 8. Orden de las herramientas según su peso...................................................... 62
Tabla 9. Porcentaje de notificación de eventos en el log ............................................ 89
GLOSARIO
1. SNMP (Simple Network Managment Protocol): usado para administrar la
configuración de dispositivos de red desde una estación de trabajo [5].
2. MIB (Management Information Base): es una colección de información que
esta ordenada en forma de árbol donde se registran las variables a monitorear
con sus respectivos valores y permiten un tipo de interoperabilidad.
3. OID (Object ID): identifica de manera única cada objeto representado en la
MIB y es una secuencia de números enteros no negativos separados por un
punto.
4. IDS (Intrusion Detection System): es una herramienta que permite monitorear
el comportamiento y el uso que se le da a los recursos en una máquina y
detectar si alguien está haciendo algo indebido.
5. Firewall: un equipo que impone un conjunto de directivas de seguridad que
restringen de forma severa el acceso al sistema y a los recursos [5].
6. ASN.1 (Abstract Syntax Notation 1): lenguaje utilizado para definir tipos de
datos.
7. Agente SNMP: programa que permite a un dispositivo responder a solicitudes
SNMP.
8. Solicitud SNMP: solicitudes enviadas o recibidas por una entidad
administradora. Pueden ser Get, Set, Trap, etc.
9. Autenticación: el proceso de determinar que una entidad es quien o lo que
dice ser [5].
10. Control de acceso y autorización: el proceso de determinar los recursos y
servicios que puede usar una entidad [5].
11. Integridad: los datos reflejen la realidad y que correspondan con lo que debe
ser y no ha sido modificadas indebidamente.
12. Disponibilidad: los servicios y la información deben, en todo momento, estar
disponibles.
13. Confidencialidad: que la información sólo sea vista por los entes involucrados
en la comunicación y que un tercero no pueda ingresar.
14. No repudio: que algún ente que haya participado en la comunicación no pueda
negar su participación en ella.
15. Auditabilidad: la herramienta guarda algún tipo de registro de eventos que han
sucedido en el tiempo.
16. BER (Basic Enconding Rules): un conjunto de reglas para traducir valores
ASN.1 a un flujo de octetos para transmitir por la red.
17. SMI (Structure of Management Information): define agrupaciones, nombres,
tipos de datos permitidos y la sintaxis para escribir MIB’s.
18. NMS (Network Management Station): estación de red encargada de gestionar
varios dispositivos de red.
19. PDU (Protocol Data Unit): define la estructura de la información que va a ser
enviada por la red.
10
20. USM (User-based Security Model): modelo de seguridad utilizado por
SNMPv3 para administrar el envío de mensajes SNMPv3.
21. VACM (View-based Access Control Model): modelo de control de acceso que
permite administrar quien tiene acceso a que información en la MIB.
11
1 INTRODUCCIÓN
Hoy en día en las empresas ha comenzado a ser de suma importancia el manejo que
se le da a la información y la forma como es utilizada la red. Debido a esto, son
muchas las funciones que desempeña un administrador de red: entre ellas debe velar
por la gestión de la red y por la seguridad de esta. Estas dos actividades han tenido un
gran desarrollo tanto teórico como práctico. Tanto para la seguridad como para la
gestión de red existen diversos programas en el mercado; algunos son libres y otros
cuestan mucho dinero. El problema que tienen estas herramientas es que hacen su
trabajo de manera que no se puede relacionar la gestión de red y la seguridad.
Normalmente cada una de ellas debe ser administrada desde el entorno visual que
ofrecen para interactuar. Por esta razón, un administrador de red debe estar
constantemente manejando varias herramientas a la vez para poder monitorear lo que
está sucediendo. Hasta el momento no se han encontrado herramientas que integren
esta funcionalidad bajo un mismo programa.
El mundo de la gestión de red es muy importante y debido a la alta sistematización en
las empresas, se ha tornado crítica la necesidad de saber que está pasando con los
equipos de la red. A grandes rasgos, la gestión de red es el hecho de anticiparse a
fallos en la red y de detectar su posible impacto en la prestación de un servicio a los
usuarios [1]. La esencia de la gestión de redes se puede definir como “… Gestión es
todo y, especialmente, es proactividad, característica que desgraciadamente no es
fácil encontrar en las herramientas que ofrece el mercado. Es esencial conocer no sólo
los fallos que se pueden estar produciendo en la red en un momento determinado,
sino poder anticiparte a los mismos, estar preparado y saber cómo reaccionar en caso
de que se produzcan” [1].
En forma general lo que pretende la gestión de red es minimizar los riesgos frente a
una posible falla, minimizar el costo asociado con las operaciones al evitar que
suceda algún tipo de problema y mantener la red en funcionamiento brindando los
servicios sin ningún problema. Las herramientas de gestión de red se pueden ver
como un elemento de seguridad en la red, ya que permiten saber sobre el
funcionamiento de los equipos y pueden ayudar a prever futuros problemas, en otras
palabras fortalecen la disponibilidad de los servicios.
Algunas de las funciones principales de un sistema de gestión de red son [3]:
descubrir automáticamente la topología de la red, brindar herramientas de
diagnóstico, monitorización de la red, gestión de MIB’s, entre otras. Normalmente
estos sistemas que utilizan SNMP consisten de [3]: agente, consola de gestión de red
y MIB.
12
Uno de los elementos más importantes en los sistemas de gestión de red son los
protocolos que utilizan para monitorear los elementos de la red. Existen dos
protocolos en el mercado para este fin: SNMP (Simple Network Management
Protocol) y CMIP (Common Management Information Protocol). Ellos definen un
monitor (NMS, Network Management Station) y varios elementos de red que tienen
un agente en ellos, el cual va a reportar sucesos al monitor.
Vale la pena mencionar que las primeras dos versiones del protocolo SNMP son muy
inseguras, ya que no implementan ningún método de seguridad, como si lo hace la
versión tres. Debido a esta falencia de seguridad, se puede proporcionar gran cantidad
de información a un atacante sobre la configuración de los equipos y la red [4].
Por otro lado, tenemos el mundo de la seguridad. Es un mundo muy complejo, en el
cual hay muchas variables y sucesos que hay que tener en cuenta. A grandes rasgos la
seguridad pretende proteger y garantizar que la información este segura del ambiente
externo e interno de una organización. Sus objetivos básicos son autenticación,
control de acceso y autorización, integridad, disponibilidad, confidencialidad, no
repudio y auditabilidad.
Para el mundo de seguridad hay diversas aplicaciones que pretenden proteger contra
ciertos riesgos. Existen, por ejemplo, aplicaciones para la detección de intrusos (IDS),
antivirus, firewalls, políticas en sistemas operativos, entre otros. Cada uno de estos
programas pretende proteger o garantizar alguno de esos objetivos de seguridad
mencionados. Otro problema encontrado es la independencia que existe entre cada
una de estas aplicaciones, las cuales realizan muy bien sus funciones, pero lo hacen
independientemente unas de otras. Hasta el momento no se han encontrado
herramientas que integren funcionalidad de estas aplicaciones. Solo lo hacen algunas
herramientas de manera centralizada para su producto, como por ejemplo, los
antivirus. Existen algunas herramientas comerciales de seguridad como Netscreen
IDP y los productos de Checkpoint que permiten configurar alertas de eventos de
seguridad detectados vía SNMP hacia una consola de gestión. Estas alertas son solo
informativas y solo sirven para el monitoreo o la consolidación de logs.
Adicionalmente no soportan SNMPv3 y no brindan ninguna posibilidad de
interactuar con las aplicaciones desde una consola central.
Entre estas aplicaciones podemos encontrar firewalls personales y empresariales que
sirven para bloquear y filtrar tráfico mediante el uso de reglas. Los IDS permiten
detectar ataques según análisis de tráfico y pueden utilizar como forma de detección
firmas (patrón preestablecido) o autónomos (a partir de la caracterización del tráfico
detectan desviaciones). Los antivirus permiten escanear los archivos y los correos en
busca de virus, gusanos, troyanos, entre otros, que pueden causar daños en las
máquina, archivos o en la red en general. Los sistemas operativos permiten manejar
seguridad a nivel de usuario, políticas de acceso y uso de los recursos, permiten
configurar protocolos, puertos, parches, etc. Todas estas herramientas generan ciertos
13
tipos de alertas visuales o notificaciones vía correo, pero primordialmente generan
logs.
Un aspecto importante es que muchas de estas aplicaciones generan algún tipo de log,
en donde se va guardando la información de eventos durante su ejecución. Algunas
herramientas como por ejemplo GFI LANguard S.E.L.M. [6] se encargan de
monitorear los logs de eventos de Windows y permite saber de manera centralizada lo
que sucede con el sistema operativo, ya que analiza los eventos de aplicación,
seguridad y sistema generados por este sistema operativo. Por ejemplo, permite saber
cuando alguien inicia sesión, cuando una aplicación genera un error, etc. Pero no se
encarga de integrar otras herramientas de seguridad.
Hasta ahora no se ha encontrado evidencia alguna de una herramienta que integre la
gestión de red y la seguridad de redes. En el mercado existen muchas aplicaciones
para cada uno de estos mundos. Hay herramientas gratuitas, de costo medio y hasta
de un costo muy elevado, a lo cual sólo podrían acceder empresas con mucho capital.
Es importante resaltar que por el hecho que una herramienta sea gratuita, no significa
que realice un trabajo deficiente. Es aquí donde el proyecto cobra valor, al permitir
que se puedan integrar varias herramientas de seguridad, sin importar su costo, bajo
una consola de seguridad las cuales van a ser monitoreadas por esta consola. Lo
importante de estas herramientas de seguridad es que deben generar logs legibles, por
ejemplo, logs en archivos de texto. Adicionalmente, se puede utilizar una herramienta
de gestión de red para poder integrar los dos mundos mediante dicha consola. De esta
forma se logra tener la administración de la red en una sola aplicación que puede
funcionar con distintos productos del mercado. Por esta razón el proyecto puede ser
de interés para las Mipymes y grandes empresas. Es necesario aclarar que el proyecto
se centra en el uso de herramientas gratuitas debido al fácil acceso que se tiene a
estas.
Con la investigación se busca crear una conciencia en los desarrolladores de las
aplicaciones de seguridad, para que incorporen en sus herramientas un agente SNMP
y así lograr que la administración y monitorización de éstas se pueda hacer sin la
necesidad de crear un adaptador para cada una de las herramientas.
Como se ha mencionado anteriormente, se desea integrar algunas herramientas de
seguridad bajo una herramienta que se encargará de monitorizar las alertas que estas
generen. Esto será posible mediante tres elementos: un protocolo seguro de
comunicación, ya que como estamos hablando de monitorear la seguridad, éste no
debe ser un punto inseguro en la arquitectura; un adaptador, encargado de monitorear
los programas en un equipo y por último, la consola de seguridad, que se va a
encargar de procesar los reportes de los adaptadores. El proyecto pretende dejar
abierta la posibilidad para que en el futuro, se pueda utilizar una herramienta de
gestión de red para monitorear la seguridad de la red.
14
2 PLANTEAMIENTO DE LA INVESTIGACIÓN
2.1 OBJETIVO GENERAL
Crear un modelo de gestión de seguridad de red que por medio de módulos permita
monitorear herramientas de seguridad. Este brindará soporte a SNMP, para la futura
integración con herramientas de gestión.
2.2 OBJETIVOS ESPECÍFICOS
•
•
•
•
•
•
Apropiarse del conocimiento del funcionamiento de SNMP y de las MIB.
Selección de un protocolo seguro para la comunicación.
Selección de herramientas de seguridad a utilizar para validar el modelo.
Diseño y documentación del modelo de los adaptadores.
Implementación de los adaptadores para que monitoreen las herramientas de
seguridad seleccionadas.
Diseño e implementación de la consola de seguridad con soporte a SNMP.
2.3 REQUISITOS PARA EL DESARROLLO DEL PROYECTO
•
•
•
•
•
•
Utilización de herramientas de seguridad gratuitas.
Herramientas que generen logs de texto legibles.
Estos logs deben contener la mayor cantidad de información acerca de un
evento de seguridad.
Utilizar el protocolo SNMP.
Tratar de mantener variedad en los sistemas operativos soportados por las
herramientas de seguridad.
En la medida de lo posible tratar que se pueda interactuar de alguna manera
con la herramienta.
15
3 METODOLOGÍA
La principal metodología de investigación que se utilizará en el proyecto se basa en el
método científico. Se iniciará con un método de exploración, que ayudará a conocer
la información pertinente acerca del proyecto. Luego, se utilizará una metodología
experimental, donde se procederá a validar el conocimiento adquirido. El cual se
describe a continuación.
Primero que todo, se debe encontrar el problema a darle solución con el presente
proyecto. Luego, se realizará una documentación profunda sobre el funcionamiento
de SNMP y de las MIB’s. El proceso de desarrollo se realizará utilizando el
paradigma de programación orientada a objetos. La documentación será transversal a
la etapa de desarrollo. Se utilizará un proceso de desarrollo iterativo, en donde se irá
verificando o refinando actividades anteriores. Para el desarrollo se va a realizar una
primera parte de documentación para luego pasar a la implementación. Este proceso
iterativo se compone de las siguientes fases: iniciación, elaboración, construcción y
transición.
En la fase de iniciación se va a realizar una documentación profunda de los dos temas
mencionados que se refleja en el marco teórico de este documento, para luego poder
proceder a realizar la definición de requerimientos del proyecto. En la fase de
elaboración se van a realizar ciertos documentos de definición y documentación de
cada una de las partes del proyecto. En este punto se incluyen las definiciones de la
respectiva arquitectura. En la fase de construcción se irán implementando cada uno de
los componentes, de tal forma que se pueda producir un producto funcional. En la
transición se irán realizando pruebas para cada uno de los componentes y así poder
validar que no haya errores en el producto final. Finalmente, se realizará una
integración de las partes desarrolladas para armar el producto final. Debido a la forma
y estructura del proyecto, el diseño y la documentación se van a realizar casi
simultáneamente.
3.1 DESARROLLO METODOLÓGICO DE LA INVESTIGACIÓN
Para el proceso de desarrollo de la investigación fue necesario el cumplimiento de las
siguientes actividades:
1. Investigación del estado del arte y verificación de productos o investigaciones
similares. En esta actividad lo que se pretende es explorar si existe algo
similar a la investigación propuesta y determinar lo que plantean dichos
estudios así como su funcionamiento. A partir de esto se puede darle un marco
a la investigación, definir el alcance, definir objetivos de la investigación,
16
2.
3.
4.
5.
6.
7.
determinar en que se va a distinguir frente a lo existente en el mercado.
Permite analizar que productos hay desarrollados y si alguno de ellos sirve
para el desarrollo esta.
Definición del marco teórico: en donde se define la teoría necesaria para
realizar la investigación. Para esto fue necesario aprender sobre el protocolo
SNMP y sobre la MIB, elementos fundamentales para el desarrollo de la
investigación. Esta actividad permite crear uno de los pilares teóricos en
donde se va a construir el modelo y su implementación.
Selección de programas a utilizar: especifica la selección de herramientas de
seguridad para validar el modelo, el motor de bases de datos y la
implementación del protocolo SNMP. Esta actividad es importante para
determinar de que manera se van a seleccionar los programas a utilizar para
validar el modelo y poder construir una implementación de éste. De esta
forma se puede demostrar o no la validez del modelo de seguridad propuesto y
mostrar su viabilidad.
Definición de la arquitectura del modelo propuesto: que se compone de las
siguientes arquitecturas: general, del adaptador y de la consola de seguridad.
Esta es una de las actividades más importantes ya que es donde se va a definir
la arquitectura del modelo. Aquí se definirán los componentes, el
funcionamiento, la comunicación y la interoperabilidad entre cada uno de los
elementos definidos en ella.
Definición y ejecución de las pruebas: actividad en donde se realizarán las
pruebas y las mediciones necesarias. Las pruebas nos permiten determinar de
una manera cuantitativa el funcionamiento de la aplicación desarrollada. Por
esta razón es muy importante definir claramente lo que se desea probar y
medir, y así, determinar la viabilidad de la implementación del modelo. Se
realizarán mediciones a nivel de la red y de la aplicación para determinar su
funcionamiento y el impacto que podría tener en una red.
Realización de conclusiones: esta actividad permite mencionar todos los
hallazgos encontrados durante el desarrollo de la investigación. Se mencionan
hechos como la viabilidad del modelo, resaltar aspectos importantes de éste,
entre otros.
Definición de la continuidad de la investigación: comúnmente una
investigación no abarca todos los caminos necesarios para que sea completa.
Es por esta razón que se resaltan trabajos futuros que se pueden desarrollar a
partir del modelo propuesto. Aspectos que no se consideraron en la definición
del alcance y de los objetivos y que pueden brindarle al modelo una riqueza
mayor, sin olvidar que los trabajos pueden ser trabajos de investigación.
17
4 MARCO TEÓRICO
4.1 ADMINISTRACIÓN DE SEGURIDAD
La administración de seguridad es un proceso mediante el cual se administran,
definen y actualizan las políticas de seguridad para proteger los recursos más valiosos
de la red y que a diferencia de la administración de red, no cuenta con protocolos que
permitan integrar los diferentes componentes que hacen parte de una arquitectura de
seguridad. Por otra parte podemos encontrar muchos programas y dispositivos de red
que permiten definir una arquitectura de seguridad.
Encontramos firewalls, enrutadores, IDS, switches, antivirus, sistemas operativos,
proxies, entre muchos otros. Cada uno de ellos desempeña una función primordial en
una arquitectura de protección de profundidad y en especial generan alarmas de una
manera independiente y sin ninguna administración centralizada que las coordine.
Esta es una de las razones por al cual el proceso de análisis forense debe ser largo y
se debe inspeccionar cada uno de estos elementos tanto hardware como software.
4.2 ADMINISTRACIÓN DE RED
La administración de red es el proceso mediante el cual podemos encontrar fallas en
algún punto de la red, de manera centralizada y tomar alguna acción que lleve a la
solución del problema. Es importante que la gestión de red sea proactiva, es decir,
que se pueda anticipar a un fallo de la red y no esperar a su materialización para
tomar una acción preventiva.
Antes de abordar el tema, es de suma importancia mencionar algunos breves
conceptos sobre la administración de red. Normalmente, cuando se desea monitorear
la red de una empresa, se utiliza un sistema de administración de red, el cual está
compuesto de los siguientes elementos: los nodos administrados, que es básicamente
lo que nosotros deseamos monitorear (enrutadores, switches, estaciones de trabajo,
etc.), que por medio de un agente presente en ellos se facilita su administración; la
estación de administración de red (NMS), que es donde se ejecuta el monitor, quien
va a comunicarse con los agentes para lograr la administración de la red; por último
tenemos el protocolo que se va a encargar de la comunicación entre el agente y la
NMS.
Para fines de la administración, no es suficiente con sólo intercambiar la información
de administración para poder monitorear el nodo. El protocolo, debe a su vez, proveer
una arquitectura de administración que utilice los conceptos de autenticación y de
18
autorización (que es limitar el acceso a un elemento y verificar que no sea alguien no
autorizado). Por otra parte, el nodo posee varias variables tanto de lectura como de
escritura que le permiten almacenar información acerca de si mismo.
Hasta el momento existen dos protocolos para la administración de red. Estos son:
SNMP y CMIP (Common Management Information Protocol). Este documento se va
a centrar en el protocolo SNMP.
4.3 DOCUMENTACIÓN SOBRE SNMP
4.3.1 Protocolo de administración simple (SNMP)
SNMP se originó en la comunidad de Internet como medida para administrar redes
TCP/IP.
Como no todos los dispositivos en las redes fueron creados con una mentalidad que
podrían llegar a ser administrados con SNMP, existen muchos dispositivos que no
pueden ser administrados, per se, con SNMP. Para eso, existe un tipo especial de
agente llamado agente proxy, que permite administrar este tipo de dispositivos.
Básicamente actúa como un convertidor de protocolos, que traduce de SNMP al
esquema propietario definido en el dispositivo. Este tipo de agente es útil para
administrar dispositivos que son administrados por un esquema propietario y se
desean incorporar al mundo SNMP.
SNMP funciona con el protocolo de transporte UDP (Unreliable Datagram
Protocol). Para mandar un mensaje, una entidad SNMP serializa un mensaje SNMP y
lo envía como un datagrama UDP a la dirección de la entidad que recibe. Los agentes
SNMP están escuchando por el puerto 161.
Se puede ver la forma como sería el transporte de un mensaje SNMP en la Figura 1,
donde se muestran los protocolos de cada capa involucrados en el proceso [9].
Figura 1. Transporte de un mensaje SNMP
19
4.3.1.1 Componentes de SNMP
Se compone de tres partes indispensables para su funcionamiento: consola de
administración (NMS), agente y MIB [7].
1. Agente: es un programa encontrado en un dispositivo de red, ya sea una
estación, un switch o un router o cualquier dispositivo administrable mediante
SNMP.
2. Consola de administración: es un programa encontrado en una estación de
trabajo y tiene la habilidad de indagar los agentes utilizando SNMP.
3. MIB: es una base de datos de objetos administrados que son accesibles por el
agente y manipulados vía SNMP para lograr la administración de la red.
Las responsabilidades más importantes de cada una de estas partes serían [7]:
1. Responsabilidades del agente:
Posee una vista de la MIB que incluye la MIB estándar de Internet más otras
extensiones1. En la MIB no se tiene porque implementar todos los grupos de
variables definidas en la especificación de las MIB. Gracias a esto se puede
simplificar significativamente la implementación de SNMP en dispositivos
pequeños de una red (debido a que tienen limitación de memoria y
procesamiento). Básicamente realiza dos funciones: inspeccionar las variables
de la MIB (que implica consultar los valores de las variables) y alterar
variables en la MIB (que implica cambiar los valores de las variables para
lograr algún efecto en el dispositivo).
2. Responsabilidades de la consola de administración:
Básicamente se encarga de ejecutar las aplicaciones que ayudan a analizar el
funcionamiento de la red. Normalmente provee una interfaz gráfica que
muestra un mapa de los agentes encontrados en la red.
3. La MIB:
Se encuentra dividida en cuatro áreas:
a. Atributos del sistema
b. Atributos privados
c. Atributos experimentales
d. Atributos de directorio
1
Se refiere con MIB estándar de Internet a la definición de la MIB-II del RFC 1213, una mejora de la
MIB-I y que son estándar para todo el que pretenda implementar dicha funcionalidad. Por otro lado, se
refiere a extensiones cuando hablamos de extensiones que se hacen a la definición estándar. Esto es,
definiciones de nuevos objetos a monitorear que no están definidos en la MIB-II. Son extensiones para
monitorear dispositivos de cada uno de los fabricantes y/o de todo aquel que desee desarrollar una
MIB nueva.
20
Toda la documentación está escrita en ASN.1, que trata de ser un estándar
frente a las documentaciones de SNMP.
Hay dos versiones de la MIB:
• MIB I: la primera en crearse y tiene una limitada lista de objetos
relacionadas con variables de ruteo de IP.
• MIB II: una versión más robusta a la anterior y extendió los objetos a
una gran variedad de medios y dispositivos de red.
4.3.1.2 Representación de la información
Cada objeto guardado en una MIB tiene un identificador que lo identifica de manera
única. Este identificador es conocido como el identificador de objeto (OID) y es una
secuencia de números enteros no negativos separados por un punto, que sale de un
árbol estandarizado mundialmente, que se puede observar en la Figura 2. Como todos
los árboles, éste se encuentra conformado por ramas y nodos. El nodo puede ser un
entero positivo y una etiqueta. También pueden tener hijos, que a su vez, son nodos.
Figura 2. Estructura general de la MIB
La MIB está escrita utilizando la sintaxis ASN.1. Ésta es utilizada para describir las
estructuras de datos que queremos definir para guardar la información de gestión.
Luego de definir estas estructuras se debe definir la sintaxis de transferencia, para
saber la forma en que van a ser transmitidos los datos en la red. A esto se le conoce
como las reglas de codificación básicas (BER) [19]. Es la codificación utilizada para
21
transferir información escrita en ASN.1 a otras aplicaciones mediante una sintaxis
que define y permite definir el formato de cómo se van a enviar los datos.
En el ASN.1 se definen tres tipos de objetos [8]:
• Tipos (types): que define nuevas estructuras de datos y comienzan en
mayúsculas
• Valores (values): que son variables de un tipo y son escritas en minúsculas
• Macros: usados para cambiar la gramática y son escritas en mayúsculas
4.3.1.3 Operaciones (comandos) del protocolo
En el protocolo de administración de red SNMP, se encuentran seis operaciones
básicas (comandos): GetRequest, GetNextRequest, GetResponse, SetRequest, Trap [7]
y GetBulkRequest.
Es importante aclarar la diferencia que hay entre GetRequest y GetNextRequest, que
aunque son similares, tienen una pequeña diferencia que es ampliamente necesaria y
utilizada. El comando GetRequest se encarga de traer el valor de ciertos objetos
especificados como parámetros, mientras que el comando GetNextRequest se encarga
de traer el siguiente valor del objeto según el orden lexicográfico (ver más adelante).
Con los comandos GetRequest, GetNextRequest y GetResponse se obtiene la
siguiente secuencia de eventos: el agente inspecciona el valor de las variables que
posee en la MIB, tras recibir un comando PDU (Protocol Data Unit), ya sea de
GetRequest o GetNextRequest, provenientes de la consola de administración (NMS).
Luego, el agente devuelve los datos que ha recolectado, tras el comando recibido,
mediante el comando GetResponse.
El comando SetRequest es usado por el agente para modificar variables de la MIB,
luego de recibir un comando de SetRequest. Este comando tiene mucho poder en el
mundo de la administración de red y si es usado de una manera indebida puede
corromper los parámetros de configuración de los nodos administrados y hasta
interrumpir los servicios de red. Por esta razón, es importante implementar
mecanismos de encriptación y de autenticación.
El quinto comando, Traps, es un comando especial que los agentes utilizan para
mandar datos a la consola de administración, cuando ha sucedido un evento inusual,
pero importante, que debe ser reportado sin solicitud.
El sexto comando, GetBulkRequest, es utilizado cuando se solicita la transferencia de
una gran cantidad de datos para, por ejemplo, traer tablas muy grandes que tienen
muchos datos. Así se minimizan el número de solicitudes que tocaría realizar para
22
traer las filas de las tablas. Es muy parecido al comando GetNextRequest, solo que no
solicita objeto por objeto, sino que puede solicitar una gran cantidad de una vez.
En la Figura 3 se puede apreciar como es el proceso de intercambio de mensajes, o
más bien, PDUs de SNMP para los comandos de Get, Set y Trap entre la consola
administrador y el agente [10]:
Figura 3. Intercambio de mensajes SNMP
El agente responde a un comando GetRequest con un comando GetResponse, el cual
contiene el mismo ID de petición, un campo dentro del formato de un mensaje SNMP
que contiene una identificación única para cada mensaje de solicitud (Figura 3 (a)). El
comando GetRequest si puede acceder a todas las variables solicitadas en el campo
variable, entonces se puede generar una respuesta GetReponse en donde irían en el
campo variable, una lista de las variables con su correspondiente valor. De forma
similar funciona el comando GetNextRequest (Figura 3 (b)). La diferencia radica en
que va a retornar la siguiente instancia de un objeto (en orden lexicográfico2). Por
2
Se refiere al siguiente objeto que le sigue al que están solicitando. Por ejemplo: si se hace un
GetNextRequest para el objeto sysLocation.0 (1.3.6.1.2.1.1.6.0), se va a retornar el nombre y el valor
del objeto sysServices.0 (1.3.6.1.2.1.1.7.0) con su respectivo valor. Otra nueva solicitud a este último
objeto va a retornar el nombre y el valor de ifNumber.0 (1.3.6.1.2.1.2.1.0).
23
ejemplo [10], ante esta solicitud: GetRequest (udpInDatagrams.0, udpNoPorts.0, …),
obtenemos
como
respuesta:
GetResponse
((udpInDatagrams.0=100),
(udpNoPorts.0=1), …). La operación SetRequest (Figura 3 (c)) es muy similar a
GetRequest, pero la diferencia sustancial radica en que el fin de esta operación es el
de escribir un valor y no el de leerlo. El agente, como se observa en el diagrama,
responde con un GetResponse que contiene el mismo ID de identificación. Al igual
que las anteriores es una operación atómica (o todas las variables o nada). En el
campo variable coloca los datos que fueron modificados. Por ejemplo [10], ante la
solicitud de modificación: SetRequest (ipRouteMetric.1.9.1.2.3=9), y la operación se
realizó con éxito, se responde con: GetResponse (ipRouteMetric.1.9.1.2.3=9) el cual
cambió la métrica de la entrada 9.1.2.3 de la tabla de ruteo a 9. Por último, tenemos la
operación Trap (Figura 3 (d)), la cual no necesita del arribo de un mensaje para
mandar los datos. A diferencia de los anteriores, esta operación es generada por el
agente cuando en el dispositivo que monitorea sucede algo excepcional y que debe
ser notificado al administrador.
4.3.1.4 Estructura de la PDU
En la Figura 4 se puede ver la estructura de los formatos de los PDUs del protocolo
[8]:
Figura 4. Estructura de la PDU
Es importante mencionar que significa cada uno de los campos mencionados
anteriormente [10]:
•
•
Versión: la versión de SNMP que se va a usar
Comunidad: relación que existe entre un agente y un grupo de aplicaciones
SNMP (un componente de una entidad SNMP)
24
•
•
•
•
•
•
•
•
•
•
Tipo PDU: indica el tipo de la PDU que va en el mensaje, que puede ser algún
tipo de Request (como GetRequest, GetNextRequest y SetRequest), un
GetResponse o un Trap.
Petición ID: usado para distinguir de entre otras solicitudes, cada solicitud con
una identificación única
Error-status: usado para indicar que ha sucedido una excepción mientras se
procesaba una solicitud
Error-índice: cuando el error-status es diferente a cero (no hubo error) puede
proporcionar información adicional indicando que variable causó la excepción
Campos variables: una lista de nombre de variables con sus correspondientes
valores, normalmente contiene los datos solicitados por una operación Get o
Trap
Empresa: tipo de objeto que genera un Trap
Dirección agente: dirección del objeto generado del Trap
Trap genérico: tipo genérico del Trap
Trap específico: código específico del Trap
Time-stamp: tiempo transcurrido entre la última vez que se reinició el
dispositivo de red y la generación del Trap
Vale la pena mencionar el término de comunidad, que bajo la mirada de SNMP, es la
pareja de un agente SNMP y una(s) aplicación(es) SNMP (entidades SNMP que
residen en las aplicaciones administradas). El nombre de la comunidad identifica un
esquema de autenticación3. La serie de eventos para la autenticación es la siguiente:
1. La entidad SNMP manda a una entidad de autenticación:
• Nombre de la comunidad
• Los datos
• La dirección del que manda
2. La entidad de autenticación que conoce el esquema de autenticación (que es lo
que puede o no hacer una comunidad, ya sea lectura y escritura o solo
lectura), retorna una de las dos siguientes posibilidades:
• Una instancia del tipo de dato y la identificación de la entidad que manda
• Una excepción
4.3.2 Protocolo de administración simple versión 3 (SNMPv3)
SNMPv3 se puede definir como:
3
En este caso el esquema de autenticación es muy sencillo. La aplicación SNMP, conoce las
comunidades válidas que pueden operar en el agente. Si la solicitud proviene de una comunidad
conocida, es aceptada. Según el tipo de comunidad se pueden hacer determinadas operaciones en la
MIB.
25
SNMPv3 = SNMPv2 + (seguridad y administración)
Fue diseñado para proteger contra las siguientes amenazas de seguridad, mediante el
uso de algoritmos de autenticación y de encripción, como lo especifica el RFC 2574:
•
•
•
•
Modificación de la información: una entidad podría alterar un mensaje
generado por otra que esta autenticada y así lograr que haya una acción no
autorizada en la entidad que recibe el mensaje. El problema aquí es que se
podría modificar algún parámetro de configuración.
Enmascaramiento (masquerade): operaciones no autorizadas para un usuario
pueden ser intentadas asumiendo la identidad de otro usuario que posee
autorización para la operación deseada.
Reenvío de mensajes: como SNMP opera sobre un protocolo de transporte sin
conexión, existe el riesgo que un mensaje SNMP sea almacenado por algún
tercero y luego, reenviado o duplicado, para realizar operaciones de
administración no autorizadas.
Poca privacidad (disclosure): una entidad puede observar el intercambio de
mensajes entre un agente y una consola de administración y así, aprender de
los valores de los objetos.
Por otro lado, se definió que no estaba diseñado para prevenir estos tipos de ataques:
•
•
Denegación de servicio (DoS): prevenir que haya intercambio de mensajes
entre agente y consola de administración.
Análisis de tráfico: un atacante puede observar los patrones de tráfico entre
estas dos entidades.
4.3.2.1 Arquitectura SNMPv3
Como se define en [4] y en el RFC 2271, SNMP se compone de entidades, donde
cada entidad implementa una parte de la funcionalidad de SNMP y así, puede actuar
como un agente en el nodo o como un nodo administrador.
26
Figura 5. Diagrama de una entidad SNMP
En la Figura 5 se muestra el diagrama general de bloques de una entidad SNMPv3
[10]. Cada entidad incluye sólo un motor SNMP que implementa funciones para
enviar y recibir mensajes SNMP, poder autenticar y encriptar mensajes y controlar el
acceso. Estas funciones están a cargo de ciertos módulos que exponen estas funciones
como servicios para que las puedan invocar o utilizar otras aplicaciones, de esta
manera conformando lo que se conoce como una entidad SNMP.
Como se ve en la Figura 5, tanto el motor como las aplicaciones, están definidas en
módulos. Lo que permite tener una ventaja: el rol de cada entidad esta determinado
por los módulos que implementa, permitiendo que sea mucho más sencillo modificar
los módulos.
Como se indica en [20], los componentes de una entidad SNMP son:
•
•
•
Despachador: permite el soporte de distintas versiones de mensajes SNMP, es
el encargado de aceptar y mandar las PDU’s, de pasarlas al subsistema de
procesamiento de mensajes y mandar los mensajes por la red.
Subsistema de procesamiento de mensajes: responsable por preparar mensajes
para envío y extraer datos de mensajes recibidos.
Subsistema de seguridad: provee los servicios de seguridad de autenticación y
de encripción o privacidad para los mensajes que así lo necesiten.
27
•
•
•
•
•
•
Subsistema de control de acceso: provee los servicios de autorización a
recursos y define que aplicación tiene derecho y el tipo de acceso que tiene.
Generador de comandos: inicializa las PDU’s de los mensajes y procesa la
respuesta.
Contestador de comandos: recibe las PDU’s destinadas a la entidad cuyo
campo de contextEngineID es igual a la identificación del motor SNMP.
Juego, realiza la operación adecuada y con ayudad del control de acceso,
genera una respuesta adecuada.
Originador de notificaciones: está continuamente monitoreando el sistema por
eventos o condiciones particulares y de ser necesario, genera una operación de
Trap. Para poder hacer esto, es necesario que tenga un mecanismo que le diga
a donde mandar los mensajes, que versión y parámetros de seguridad utilizar.
Receptor de notificaciones: escucha por mensajes de notificación (o Traps) y
genera un mensaje de respuesta.
Despachador proxy: se encarga del direccionamiento de mensajes SNMP.
En SNMPv3, la entidad posee un snmpEngineID único. Por propósitos de control de
acceso, cada entidad posee un número de contextos de información administrada.
Cada uno de estos contextos, tiene su propio contextName, que es local a la entidad.
Para que solo pueda existir un administrador de contextos, la entidad posee una única
identificación, contextEngineID, que es el mismo que para el snmpEngineID.
El snmpMessageProcessingModel determina el formato y la versión que va a tener el
mensaje. El snmpSecurityModel determina el modelo de seguridad que va a ser
utilizado. El snmpSecurityLevel, determina que servicios de seguridad son solicitados
para una operación específica. Pude brindar una de las siguientes combinaciones:
autenticación, autenticación y privacidad o ninguno de los dos.
Términos importantes para tener en cuenta [10]:
•
•
•
•
•
•
•
contextEngineID: identifica de manera única una entidad.
snmpEngineID: identifica de manera única el motor SNMP.
contextName: identifica un contexto particular dentro de un motor SNMP.
scopedPDU: es un bloque de datos que consiste de contextEngineID,
contextName y un PDU. Es enviado como parámetro al subsistema de
seguridad.
snmpSecurityModel: identificador único del modelo de seguridad del
subsistema de seguridad.
snmpMessageProcessingModel: identificador único del modelo de
procesamiento del mensaje del subsistema de procesamiento del mensaje.
snmpSecurityLevel: nivel de seguridad que especifica si un mensaje SNMP
puede ser enviado o bajo que operaciones están siendo procesados, referente a
la autenticación y privacidad. Los valores que puede tomar son:
28
noAuthnoPriv, authNoPriv y authPriv, donde cada uno puede proveer o no
uno de los servicios de seguridad.
4.3.2.2 Formato del mensaje
Al igual que en las dos versiones anteriores, se ha definido un formato de mensaje
que va a ser intercambiado entre entidades SNMP. Cada mensaje contiene un
encabezado y un PDU, como se observa en la Figura 6 [10].
Figura 6. Formato del mensaje SNMPv3
Los campos del formato anterior son:
•
•
•
•
msgVersion: su valor está por default en SNMPv3.
msgID: identificador único usado entre dos entidades para coordinar mensajes
de solicitud y de respuesta.
msgMaxSize: tamaño máximo del mensaje que el remitente puede aceptar.
msgFlags: una cadena que contiene tres banderas: reportableFlag, privFlag y
authFlag.
29
•
•
•
•
•
msgSecurityModel: un identificador que indica que modelo de seguridad fue
usado por el remitente para preparar el mensaje. Esto le permite al receptor
saber que modelo debe utilizar. Los valores pueden ser: 1 para SNMPv1, 2
para SNMPv2c y 3 para SNMPv3.
msgSecurityParameters: cadena que contiene parámetros generados por el
subsistema de seguridad en la entidad remitente y procesados por la entidad
receptora.
contextEngineID: identifica de manera única una entidad SNMP. Para
mensajes provenientes, determina a que aplicación el scopedPDU va a ser
enviado.
contextName: identifica de manera única un contexto particular dentro del
contexto del motor SNMP.
datos: un PDU que debe ser de tipo SNMPv2.
4.3.2.3 Modelo de seguridad basado en usuarios (USM)
El RFC 2274 define el USM para SNMPv3. La especificación contiene:
•
•
•
•
•
•
Autenticación: provee integridad de datos y autenticación. Utiliza los
algoritmos MD5 o SHA-1.
Timeliness: protege contra retardos o reenvíos de mensajes.
Privacidad: protege contra la no privacidad del mensaje. Encripta el
contenido. Utiliza el algoritmo DES (el modo CBC, Cipher Block Chaining).
Formato de mensaje: define el formato del campo msgSecurityParameters.
Descubrimiento: define procedimientos mediante el cual un motor SNMP
obtiene la información de otro.
Administración de llaves: define el procedimiento para la generación,
actualización y uso de las llaves.
4.3.2.3.1 Parámetros de seguridad de USM
El RFC 2274 define una estructura llamada UsmSecurityParameters, que especifica
el formato interno del campo msgSecurityParameters en un mensaje SNMPv3, como
se muestra en la Figura 7 [10]:
30
Figura 7. Formato del mensaje SNMPv3 con el campo msgSecurityParameters
4.3.2.3.2 Motor SNMP autoritativo
Antes de explicar los campos del mensaje, es necesario aclarar un concepto muy
utilizado por el modelo USM. Este es el motor SNMP autoritativo.
En cualquier transmisión de un mensaje, una de las dos entidades involucradas en el
proceso, ya sea el transmisor o el receptor, debe ser designada como el motor SNMP
autoritativo. De acuerdo a las siguientes reglas:
•
Cuando un mensaje SNMP contiene un payload que espera una respuesta
(como por ejemplo, Get, GetNext o Set) el receptor de los mensajes es
autoritativo.
31
•
Cuando un mensaje SNMP contiene un payload que no espera respuesta
(como por ejemplo, un Trap, un Response o un Report4) entonces el remitente
del mensaje es autoritativo.
Designar una entidad como autoritativa o no, permite que ocurran dos cosas. La
primera, que se pueda manejar el tiempo de validez de un mensaje (timeliness). Es
vital para establecer la sincronización entre las dos entidades. Para esto, se maneja un
reloj. Cuando una entidad autoritativa manda un mensaje a una entidad que no lo es,
incluye en este el valor de su reloj. Así, cuando lo recibe la entidad no autoritativa, se
utiliza ese valor para calcular el tiempo en el que va a estar la entidad autoritativa (el
destino), ya que es necesario que ponga ese estimado cuando va a enviar el mensaje
de respuesta. La segunda, el proceso de localización de llaves. Permite que un
principal tenga las llaves de múltiples motores. Estas llaves son localizadas al motor
autoritativo SNMP. De esta manera es responsable de una llave y no de muchas llaves
distribuidas.
Como se dice en el RFC 2574, para generar una llave localizada, Kul, (una llave
secreta compartida entre un usuario y un motor SNMP autoritativo), se debe hacer lo
siguiente: si el usuario utiliza una clave, ésta se convierte en una llave Ku usando
MD5 o SHA. Para convertir esta llave en una llave localizada, Kul, es necesario
anexar el snmpEngineID del motor SNMP autoritativo a la llave Ku y luego anexarle
al resultado otra vez la llave Ku. De esta forma se envuelve el snmpEngineID entre
dos copias de la llave Ku. Luego, se pasa una función de hash segura (que depende
del algoritmo usado) y así se obtiene una llave localizada, Kul. Este proceso se
resume en la Figura 8.
Figura 8. Forma de manejo de las llaves
Elementos de UsmSecurityParameters:
4
Forma en que se hace el descubrimiento de otros motores SNMP.
32
•
•
•
•
•
•
msgAuthoritativeEngineID: el snmpEngineID de un motor SNMP autoritativo,
involucrado en el intercambio de mensajes.
msgAuthoritativeEngineBoots: el valor de snmpEngineBoots del motor SNMP
autoritativo en el intercambio de mensajes, y corresponde al número de veces
que el motor se ha reiniciado.
msgAuthoritativeEngineTime: el valor snmpEngineTime del motor SNMP
autoritativo involucrado en el intercambio de mensajes, representa el número
de segundos desde que el motor SNMP incrementó snmpEngineBoots por
última vez.
msgUserName: el usuario a quien se le está intercambiando el mensaje.
msgAuthenticationParameters: es nulo si no se usa autenticación, de lo
contrario, es un código de autenticación de un mensaje HMAC.
msgPrivacyParameters: es nulo si no se usa privacidad, de lo contrario, es un
valor usado para formar el valor inicial en el algoritmo DES.
Como SNMPv3 define el uso o no de autenticación y encripción, el motor SNMP
requiere dos valores: una llave privada (privKey) y una llave de autenticación
(authKey). Estos valores son atributos relevantes de cada usuario creado. Los valores
de cada una de estas llaves no son accesibles vía SNMP.
4.3.2.3.3 El grupo MIB usmUser [10]
Es una MIB que se encarga de mantener información sobre principales (entidades)
locales y remotas. Contiene un objeto escalar llamado usmUserSpinLock (permite que
generadores de comandos se coordinen para cambiar las llaves, como un método de
garantizar la concurrencia) y una tabla usmUserTable, que tiene las siguientes
columnas más importantes:
•
•
•
•
•
usmUserEngineID: el identificador de un motor SNMP, que tiene el valor de
snmpEngineID.
usmUserName: el nombre del usuario que funciona como securityName.
usmUserSecurityName: el nombre del usuario de una forma independiente al
modelo de seguridad. Este valor y el anterior son iguales para que haya una
relación de identidad.
usmUserCloneFrom: se refiere a otra fila de esta tabla e indica el usuario del
que fue clonado el nuevo usuario. Al ingresar un usuario nuevo se llenan los
campos correspondientes y se pone una referencia al usuario del que se clonó
(los parámetros de autenticación y privacidad son copiados del usuario
original).
usmUserAuthProtocol: identificador que indica si un mensaje enviado por la
entidad, identificada por el usmUserEngineID es o no objeto de autenticación
y además, especifica el protocolo a usar.
33
•
•
•
•
usmUserAuthKeyChange: cuando es modificado, hace que la llave secreta de
autenticación para enviar mensajes, sea modificada.
usmUserPrivProtocol: identificador que indica si un mensaje enviado por la
entidad, identificada por el usmUserEngineID, puede ser protegido por
encripción o no, además indica el protocolo a utilizar.
usmUserPrivKeyChange: cuando es modificado, causa que se cambie la llave
secreta de encripción para enviar mensajes.
usmUserPublic: valor que puede ser leído públicamente y que es escrito como
parte del procedimiento de cambiar alguna de las llaves, para luego leerlo y
ver si el cambio fue realizado.
4.3.2.3.4 Descubrimiento de motores SNMP
USM requiere el uso de un proceso de descubrimiento para obtener suficiente
información de otros motores SNMP, para poder llevar a cabo la comunicación. Para
lograr esto, necesita conocer su snmpEngineID. Si el motor no es autoritativo, manda
un mensaje de Request al motor del cual desea conocer los datos. La solicitud va con
el campo securityLevel en noAuthnoPriv, el msgUserName con valor “initial” y el
msgAuthoritativeEngineID como nulo. El motor autoritativo responde con un
mensaje Report que contiene su snmpEngineID en el campo nulo.
Si se requiere de una comunicación autenticada, el motor SNMP no autoritativo debe
establecer una sincronización con el motor autoritativo. Para lograrlo, el motor no
autoritativo manda un mensaje de Request con msgAuthoritativeEngineID con el
valor del snmpEngineID y los valores de msgAuthoritativeEngineBoots y
msgAuthoritativeEngineTime en cero. La respuesta va a ser un mensaje Report del
motor autoritativo con los valores de snmpEngineBoots y snmpEngineTime en los
respectivos campos con valor cero.
4.3.2.3.5 Administración de llaves
Un requerimiento planteado en la creación del RFC para los servicios de
autenticación y privacidad, es que para la comunicación entre un motor no
autoritativo y uno autoritativo, se debe compartir una llave secreta de autenticación y
una llave secreta de privacidad. Estas llaves permiten que un usuario en un motor no
autoritativo, pueda emplear autenticación y privacidad en sistemas autoritativos
remotos.
Para mantener simple la administración de llaves, cada principal (una entidad a quien
se le proveen servicios) es responsable por mantener una llave de autenticación y de
encripción o privacidad. Estas llaves no son guardadas en una MIB y no son
accesibles vía SNMP.
34
4.3.2.4 Modelo de control de acceso basado en vistas (VACM)
El modelo VACM tiene dos importantes características [10]:
1. El VACM determina si el acceso a un objeto administrado, en una MIB local,
por un principal es permitido o no.
2. El VACM hace uso de una MIB que controla las políticas de control de
acceso para el agente
4.3.2.4.1 Elementos del modelo VACM
El RFC 2575 define cinco elementos que componen el VACM:
1.
2.
3.
4.
5.
Grupos.
Niveles de seguridad.
Contextos.
Vistas en las MIB.
Políticas de acceso.
Los grupos: se encuentran definidos como un conjunto de cero o más tuplas de tipo:
<securityModel, securityName>. El securityName a un principal y los derechos de
acceso para todos los principales en un grupo, y así todos en el grupo tienen los
mismo accesos. Cada grupo tiene un nombre único (groupName) y así se pueden
definir los derechos de acceso.
El nivel de seguridad: los derechos de acceso para un grupo pueden definirse según el
nivel de seguridad del mensaje en la solicitud. Por ejemplo, se puede permitir solo la
lectura para un mensaje no autorizado, pero necesitar autenticación para escribir.
Los contextos: un contexto MIB es un subconjunto de las instancias de los objetos de
la MIB local. Permiten agregar objetos a una colección con diferentes políticas de
acceso. El contexto se refiere a control de acceso. Una solicitud SNMP, identificada
únicamente por un contextEngineID, puede mantener más de un contexto. Un objeto
o una instancia de un objeto pueden estar en uno o más contextos. Cuando existen
múltiples contextos, para poder identificar la instancia de un objeto, se deben
identificar su contextName y contextEngineID.
Las vistas MIB: algunas veces deseamos restringir el acceso de un grupo particular a
un subgrupo de objetos de administración en el agente. Para poder hacer esto, el
acceso al contexto se hace mediante la definición de vistas MIB. Esto saca provecho
de que los objetos están organizados en forma de árbol. Por esto, asociado a cada
35
entrada en la tabla vacmAccessTable hay tres vistas: lectura, escritura y notificar
acceso (representa el conjunto de instancias de objetos autorizados cuando mandan
objetos en una notificación. Cada vista consiste en un conjunto de vistas de
subárboles.
Las políticas de acceso: el VACM permite que el motor SNMP sea configurado para
impartir ciertos derechos de acceso. La determinación de acceso depende de [10]:
•
•
•
•
•
El principal que hace la solicitud de acceso. El VACM permite que un agente
pueda permitir diferentes privilegios de acceso a diferentes usuarios.
El nivel de seguridad con la que se hizo la solicitud en un mensaje SNMP.
El modelo de seguridad usado para procesar el mensaje de solicitud. Por
ejemplo, se puede acceder a ciertos tipos si la solicitud viene a través de
USM.
El contexto de la MIB para la solicitud.
El tipo de acceso solicitado.
4.3.2.4.2 La MIB del VACM
Contiene información de contextos locales, grupos, derechos de acceso y vistas MIB.
Información sobre contextos locales:
La tabla vacmContextTable lista los contextos disponibles localmente. Esta
información es usada por el generador de comandos para crear la tabla
vacmAccessTable para poder controlar el acceso a los contextos. Un nombre
de contexto vacío representa el contexto default. Estas dos tablas no se
relacionan entre si.
Información sobre grupos:
La tabla vacmSecurityToGroupTable provee un groupName, dado un
securityModel y un securityName. El nombre de grupo es usado para controlar
el acceso de un grupo. La tabla es indexada por vacmSecurityModel y
vacmSecurityName.
Información sobre derechos de acceso:
La tabla vacmAccessTable puede ser configurada para definir los derechos de
acceso de los grupos. La tabla está compuesta por estos objetos:
•
•
•
vacmAccessContextPrefix: puede ser el nombre de un contexto
completo o el prefijo, según el valor de vacmAccessContextMatch.
vacmAccessSecurityModel: identifica un modelo de seguridad.
vacmAccessSecurityLevel: el nivel mínimo de seguridad requerido
para tener acceso.
36
•
•
vacmAccessContextMatch: el valor puede ser exacto (exact(1)), que
significa que el nombre del contexto debe ser exacto; ó puede ser de
prefijo (prefix(2)), entonces sólo debe haber concordancia entre el
vacmAccessContextPrefix y el contextName. Es muy parecido al
concepto de wildcards en Unix.
vacmAccessWriteViewName: identifica la vista MIB para la cual se
define el acceso. Indexa la tabla vacmViewTreeFamilyTable.
Información sobre vistas MIB:
La estructura de vacmMIBViews consiste de un objeto escalar, llamado
vacmViewSpinLock (que permite que los generadores de comandos coordinen
el uso de operaciones Set en la creación y modificación de vistas), y de una
tabla vacmViewTreeFamilyTable, cuyas columnas son:
•
•
•
•
vacmViewTreeFamilyViewName: el nombre asignado a un conjunto de
filas que constituyen una vista.
vacmViewTreeFamilySubtree: un identificador de objeto que
especifica un subárbol.
vacmViewTreeFamilyMask: la máscara que combinada con el
vacmViewTreeFamilySubtree define una familia de subárboles.
vacmViewTreeFamilyType: puede tomar uno de los valores siguientes:
incluido (included(1)) o excluido (excluded(2)) e indica si el
correspondiente subárbol de la familia, que está definido por los dos
campos anteriores, está o no en la definición.
4.3.3 Comparación entre seguridad de SNMPv1 y SNMPv3
La seguridad en SNMPv1:
Tanto las estaciones administradas como las NMS, necesitan protegerse a si
mismas y sus MIB’s de accesos no autorizados. SNMP, como se especifica en
el RFC 1157, provee una muy simple manera de asegurarse: mediante el uso
del concepto de comunidad. Una comunidad es la relación entre el agente y
los administradores. Con la comunidad se define la autenticación y el control
de acceso. Este concepto es local al dispositivo y se puede configurar una
comunidad para cada combinación de autenticación y acceso. Por ejemplo, se
puede definir una comunidad privada para lectura y escritura y una comunidad
pública para sólo lectura. La comunidad es empleada como parámetro de
comandos Get y Set.
Se utiliza un esquema muy trivial de autenticación: la comunidad. La cual
actúa como una clave compartida donde la solicitud recibida es procesada si el
nombre de la comunidad de la solicitud concuerda con la comunidad definida
en la entidad que recibe la solicitud.
37
De una manera muy sencilla, la comunidad, permite controlar el acceso a su
MIB. Mediante el empleo de más de una comunidad, se puede proveer
distintos tipos de acceso.
Por estas razones es común que SNMPv1 se utilice más para monitoreo de
dispositivos, que para control de los mismos, ya que el concepto de
comunidad es muy inseguro y además viaja en texto plano por la red. Es un
gran punto de inseguridad en una red, ya que es muy difícil saber a ciencia
cierta quien es el que solicita la información.
La seguridad en SNMPv3:
Como se vio anteriormente, esta versión provee un mejor sistema de
seguridad y mucho más robusto y confiable. Utiliza encripción convencional
con DES y autenticación con MD5. Además utiliza un modelo de usuarios y
de control de acceso, basado en vistas sobre la MIB actual. Esto permite que
se pueda restringir el acceso a ciertas partes de la MIB.
4.4 DOCUMENTACIÓN DE MIB
4.4.1 Generalidades de MIB
Este es un concepto que va muy unido al protocolo SNMP. Y que son de vital
importancia para la arquitectura de su funcionamiento. Como ya se ha visto, las bases
de información de gestión (MIB), son muy utilizadas por los agentes para poder
monitorear un aparato específico.
Las bases de información de gestión (MIB) son un conjunto de objetos gestionados
de un recurso que se encuentra en la red para ofrecer algún tipo de interoperabilidad o
funcionamiento en esta misma y el cual se desea gestionar. Dentro de la MIB, los
objetos están organizados en grupos, según su función y la información que guarda.
Los objetos en la MIB, se encuentran definidos formalmente y son administrados
mediante el protocolo SNMP. En ella hay unos grupos estándares que todos conocen
y con el tiempo se ha ido extendiendo según la aparición de nuevos aparatos
gestionables con SNMP, que se conocen como extensiones de la MIB.
4.4.2 La estructura de administración de la información
La SMI define como la información de administración es agrupada y nombrada, las
operaciones permitidas, tipos de datos permitidos y la sintaxis para escribir las MIBs.
38
Especifica que cada objeto administrado debe tener un nombre (único, mediante el
OID), una sintaxis (tipo de dato) y una codificación (como la información es
serializada para la transmisión, comúnmente se usa BER).
La SMI define la arquitectura general con la que se puede definir y construir una
MIB. Especifica los tipos de datos que se pueden usar en la MIB y la forma en que
los recursos en una MIB son representados e identificados. La MIB sólo puede
guardar tipos de datos simple, conocidos como escalares. Por esta razón con SNMP
solo se pueden consultar este tipo de datos. Para poder definir una MIB, es posible
utilizar los siguientes tipos de datos:
•
•
•
•
•
integer
Bloques básicos para construir otros
octetstring
tipos más complejos de objetos.
null
object identifier
Para construir tablas
sequence y sequence-of
En la lista no aparece el tipo enumerated, ya que éste se define como una lista de
enteros de tipo integer. Hay que tener en cuenta que no se puede usar el valor cero
(0), ya que este es usado para identificar instancias particulares de objetos y que debe
haber normalmente un tipo adicional, llamado other, para cuando no se puede
ninguno de los otros valores.
4.4.3 Interacción con la MIB
Una NMS debe ser cargada con la información que va a monitorear, o sea, la
estructura de la MIB privada. Normalmente un vendedor de dispositivos provee la
MIB en un texto simple y en una descripción formal. Con la descripción formal, una
NMS debe ser capaz de leer la MIB del disco, procesarla y pasarla para añadir los
objetos a la lista de objetos administrados. Adicional a esta forma, la NMS puede
utilizar un comando GetNextRequest para descubrir los objetos de una MIB del
dispositivo. Esto se puede gracias al orden lexicográfico en que son representados los
objetos en el árbol. Utilizando esta forma, tiene la ventaja de que descubre de una vez
el valor del objeto.
Existen dos formas de realizar la administración o gestión de la red: la primera, de
forma pasiva (implica la recolección de datos de los equipos, únicamente de forma
informativa, para ver que pasa con la red y los equipos) y la segunda, de forma activa
(que usa las variables de la MIB que son de lectura y escritura, de tal forma que si un
agente es instruido para modificar un valor, se pueda realizar una acción en el
aparato).
La comunidad OSI divide la administración de la red en cinco áreas funcionales [11]:
39
1. Administración de la configuración: nombra todos los elementos en la red y
especifica su estado y características.
2. Administración del performance: determina la utilización de la red y de sus
elementos. Permite medir tiempos de respuesta, recursos utilizados,
disponibilidad, etc.
3. Administración de errores: detecta, aísla y corrige problemas de red.
4. Administración de seguridad: controla el acceso y protege la información en
la red.
5. Contabilidad: mide el uso y el costo de los computadores basados en políticas
establecidas.
Hasta este momento existen los siguientes tipos de MIB, cada uno con distinta
funcionalidad:
•
•
•
Los estándares: MIB I y MIB II (para una diferenciación entre las dos, ver
más adelante)
Las experimentales: grupos que se encuentran en fase de desarrollo
Las privadas: información específica de fabricantes de equipos para equipos
específicos
4.4.4 Notación de sintaxis abstracta ASN.1
ASN.1 es un lenguaje formal desarrollado y estandarizado por CCITT y la ISO. Es
importante en la actualidad porque permite que se definan sintaxis sobre datos de
aplicaciones. También, como sucede con SNMP, se utiliza para definir la estructura y
la presentación de las PDU (Protocol Data Unit).
El empleo de ASN.1 trae muchas ventajas a la hora de desarrollar una aplicación que
la utilice. Trae beneficios como: estandarización (es un estándar internacional que
soporta muchos protocolos y también elimina el problema de interoperabilidad), es
algo que se escribe una vez y se puede usar por mucho tiempo (no hay que
preocuparse por problemas de compatibilidad de versiones), es ampliamente
divulgado y muy conocido. También es independiente del vendedor, de la plataforma
y del leguaje de implementación.
Terminología importante en ASN.1 [10]:
1. Sintaxis abstracta: describe la estructura general de los datos independiente de
cualquier técnica de codificación para representarlos. Permite definir tipos y
valores para los datos.
40
2. Tipo de dato: conjunto de nombres de valores. Pueden ser simples
(especificados por medio de valores) o estructurados (especificados por medio
de otros tipos).
3. Codificación: secuencia de octetos usada para representar los valores de los
datos.
4. Reglas de codificación: especificación de un mapeo de una sintaxis a otra.
Determina algorítmicamente como, para un conjunto de datos en una sintaxis,
se hace para representar los valores en la otra sintaxis.
5. Sintaxis de transferencia: la forma como los datos son representados a nivel
de bits cuando se van a transmitir de un lado a otro.
En la Figura 9 se puede observar como se relacionan estos conceptos [10]:
Figura 9. Relación de componentes ASN.1
En la Figura 9, se pueden identificar dos grandes componentes: el componente de
transferencia de datos, que se preocupa por los mecanismos de la transferencia de
datos entre entidades, y el componente de aplicación (en nuestro caso SNMP),
encargado de transferir datos al usuario e interpreta lo que viene del componente de
transferencia mediante las reglas de codificación.
Debe existir un almacenamiento de algún tipo, en donde se va a guardar la definición
de la estructura de los datos, que en nuestro caso van a ser las MIB’s (que son
definidas con una sintaxis abstracta).
Los componentes de aplicación se comunican entre si, por medio de una sintaxis
abstracta. Se interesa por la vista de los datos que debe tener el usuario, ya sea un
41
archivo, una base de datos o simplemente en la pantalla. El usuario se preocupa por la
semántica de los datos, básicamente, que lo que se va a enviar tenga coherencia y
cumpla con ciertas reglas definidas. El protocolo describe las PDU’s mediante una
sintaxis abstracta, similar a la notación Bacchus-Naur Form (BNF). Provee
representación y revisión de la sintaxis de los datos.
Mientras que los componentes de transferencia de datos se comunican por medio de
una sintaxis de transferencia. Recibe los datos del componente de aplicación como
una secuencia de octetos, que pueden ser ensamblados en la PDU correspondiente.
Estos dos componentes se logran comunicar gracias a las reglas de codificación.
Usando una sintaxis abstracta, se logran tener otros beneficios adicionales. Se tiene
un buen uso de representaciones locales, ya que se logra tener una independencia de
la implementación, del tipo de hardware y del tipo de representación interna de los
datos. Ofrece un rehúso de esquemas de codificación, si se tiene unas reglas de
codificación bien definidas, se puede referenciar por cualquier aplicación que use la
misma sintaxis. También se puede tener una buena estructura del código, si se tiene
una buena especificación de sintaxis abstracta y con ayuda de una herramienta, se
puede generar el código respectivo.
Gracias a la separación que tiene ASN.1 de la notación abstracta y la sintaxis de
transferencia, se puede reutilizar el código. Con la ayuda de un “compilador” de
ASN.1, cualquier definición en sintaxis abstracta puede ser mapeada a la estructura
abstracta de datos de cualquier leguaje de programación.
SNMP utiliza ASN.1, pero de una forma muy reducida y con muchas restricciones en
los tipos que pueden ser utilizados.
4.4.4.1 Conceptos ASN.1
Convenciones lexicográficas:
Las estructuras ASN.1, los tipos y los valores son expresados en una notación similar
a la utilizada por leguajes de programación como C, C++ o Java.
Se definen las siguientes convenciones [10]:
1. La distribución de las líneas no es importante. Puede haber múltiples espacios
y líneas.
2. Los comentarios son delimitados por parejas de guiones (--). De esta forma: -comentario – ó –comentario (toda la línea).
3. Nombres de valores y campos (identificadores) y nombres de tipos
(referencias a tipos) consisten en letras mayúsculas o minúsculas, dígitos y
guiones.
42
4. Los identificadores comienzan con una letra en minúscula.
5. Una referencia a tipo comienza con una letra en mayúscula.
6. Un tipo embebido (ya construido) consiste con todas las letras en mayúsculas.
Un tipo embebido es un tipo usado comúnmente para el cual se provee una
notación estándar.
4.4.4.2 Tipos abstractos de datos
ASN.1 es una notación para tipos de datos abstractos. Un tipo puede ser visto como
una colección de valores. El número de valores que puede tomar es infinito.
Los tipos se clasifican en cuatro categorías [10]:
•
•
•
•
Simples: son tipos atómicos, sin componentes. Se define especificando
directamente sus valores. Todos los otros tipos se construyen sobre tipos
simples.
Estructurados: un tipo estructurado tiene componentes. ASN.1 provee cuatro
tipos, para construir tipos de datos complejos a partir de tipos simples. Estos
son:
o SEQUENCE
o SEQUENCE OF
o SET
o SET OF
Los primeros dos son usados para definir una lista ordenada de valores de uno
o más tipos de datos. Mientras que los otros dos, son similares, pero el orden
de los elementos no importa.
Tagged: tipos derivados de otros tipos.
Otro (Other): incluye los tipos CHOICE y ANY.
Subtipos
ASN.1 permite la definición de subtipos. Un subtipo, pertenece a un tipo padre. La
idea del subtipo es restringir los valores que puede tomar y que son un subconjunto
de los valores que define el padre. Esto se puede extender a más de un nivel.
Hay seis formas para designar subtipos [10]:
•
•
•
Un solo valor: es un subtipo que lista explícitamente todos los valores que un
subtipo puede tomar.
Subtipos contenidos: crea nuevos subtipos de subtipos ya existentes. El
subtipo contenido debe llevar todos los valores del subtipo que contiene.
Rango de valor: aplica solo a INTEGER y REAL. Es especificado mediante un
valor mínimo y un valor máximo.
43
•
•
•
Alfabeto permitido: solo puede ser aplicado a tipos con cadenas de caracteres.
Este subtipo consiste de los valores que pueden ser construidos teniendo un
subalfabeto, de uno más grande.
Restricción de tamaño: limita el número de elementos en un tipo. Sólo puede
ser aplicado a tipos definidos como cadenas.
Subtipos internos: puede ser aplicado a SEQUENCE, SEQUENCE-OF, SET,
SET-OF y CHOICE. Este incluye en su valor solo los valores que satisfacen
una o más restricciones.
Cada uno de los objetos descritos en una MIB, se describen mediante la macro
OBJECT-TYPE. Cada objeto especificado se puede descomponer en una serie de
campos:
•
•
•
•
•
•
Descriptor: nombre del objeto
Value: nombre del objeto en la forma de OID
Syntax: especifica el tipo de dato
Access: especifica el nivel de acceso
Status: muestra la vigencia de la definición del objeto
Description: texto que describe el significado del objeto
Mediante la macro OBJECT-TYPE se pueden definir tres tipos de objetos: tablas,
filas y objetos terminales (hojas) [1]. Las tablas consisten en un conjunto de filas. La
sintaxis de la tabla debe ser: “SEQUENCE OF <sequence>”. Normalmente se le pone
como sufijo la palabra Table y a la secuencia se le pone el sufijo Entry. Por ejemplo,
si la tabla se llama ifTable, la secuencia sería IfEntry. La cláusula ACCESS debe estar
en not-accessible. El siguiente ejemplo muestra como se definiría la tabla de ifTable,
que se refiere a las interfaces:
ifTable OBJECT-TYPE
SYNTAX SEQUENCE OF IfEntry
ACCESS not-accessible
STATUS mandatory
::= {interfaces 2}
Una fila consiste en un conjunto de columnas. Esta se debe consultar por sus
columnas mediante un comando Get o GetNext. El nombre de la fila viene del
nombre de la tabla, pero se cambia el sufijo Table por Entry. La cláusula SYNTAX
debe ser la secuencia asociada a la tabla y el acceso debe ser not-accessible. El OID
de la fila debe ser el mismo de la tabla, pero adicionándole el valor 1. La cláusula
INDEX especifica las reglas para la construcción de instancias y es el nombre de la
secuencia de un ítem de la secuencia. Sigamos definiendo las filas para el ejemplo
anterior:
ifEntry OBJECT-TYPE
44
SYNTAX IfEntry
ACCESS not-accessible
STATUS mandatory
INDEX {ifIndex}
::= {ifTable 1}
La secuencia es usada para especificar columnas en una fila (en otras palabras, es una
secuencia de los campos que tendría la tabla). El nombre debe comenzar por
mayúscula. La sintaxis general de una secuencia es la siguiente:
<seqItem> = <SequenceName> “::=” “SEQUENCE” “{“
<columnItem> <leafSyntax>
{“,” <columnItem> <leafSyntax>}…
“}”
Continuando con el ejemplo tenemos:
IfEntry ::= SEQUENCE {
ifIndex INTEGER,
ifDescr DisplayString,
ifType INTEGER,
ifMtu INTEGER,
ifSpeed Gauge,
ifPhysAddress PhysAddress,
…
}
Por último, los objetos terminales (hojas), son la agrupación de información más
pequeña y se refiere a una variable específica. Continuando con el ejemplo:
ifDescr OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"A textual string containing information about the
interface. This string should include the name of
the manufacturer, the product name and the version
of the hardware interface."
::= {ifEntry 2}
ASN.1 define tres tipos de objetos: tipos, valores y macros. Cada uno de estos se
define de la siguiente manera:
45
•
•
•
Tipo (type): NombreDelTipo ::= TYPE
Valor (value): nombreDelValor NombreDelTipo ::= VALUE
Macro: ver más adelante
También se tienen los siguientes tipos simples:
•
•
•
•
INTEGER, tipo de dato que toma como valor un número entero, como por
ejemplo:
Status ::= INTEGER {up(1), down(2), testing(3)}
miStatus Status ::= up
-- ó 1
OCTET STRING: tipo de datos que toma cero o más octetos. Cada byte toma
valores entre 0 y 255.
OBJECT IDENTIFIER: tipo de dato que permite la identificación de objetos
de gestión.
NULL: tipo nulo.
El SMI define la siguiente macro para los objetos que van a ser administrados:
OBJECT-TYPE MACRO ::=
BEGIN
TYPE NOTATION
ObjectSyntax)
::=
“SYNTAX”
type
(TYPE
“ACCESS” Access
“STATUS” Status
VALUE NOTATION ::= value (VALUE ObjectName)
Access ::= “read-only”
| “read-write”
| “write-only”
| “not-accessible”
Status ::= “mandatory”
| “optional”
| “obsolete”
END
4.4.4.3 Identificación de objetos
Cuando se desee referir una instancia particular, se debe añadir un cero al final de la
ruta, sea relativa o absoluta, de la siguiente manera: 1.3.6.1.2.1.1.1.0 ó sysDescr.0.
Cada objeto definido tiene dos formas de identificarse en cuanto a la ruta y su
posición en el árbol: una forma absoluta (en el cual se especifica el camino a un
atributo desde la raíz del árbol, semejante a una ruta absoluta en los sistemas
46
operativos; siempre debe comenzar con un punto y debe especificar cada nodo por el
que pasa) y otra forma relativa (que especifica el camino a algún atributo en el árbol,
a partir de un nodo, muy parecido a una ruta relativa en los sistemas operativos).
Un objeto específico se puede identificar de manera única mediante alguna de las
siguientes tres formas:
1. Sólo números: se utiliza una secuencia de números enteros, separados por
puntos. Por ejemplo: 2.1.1.1 que identifica el objeto sysDescr.
2. Sólo texto: se utiliza los nombres de los nodos, separados por puntos. Por
ejemplo: mgmt.mib-2.system.sysContact que identifica el objeto sysContact.
3. Una combinación de los dos: se puede usar una combinación tanto de
números como de texto, separados por puntos. Por ejemplo: mgmt.mib2.1.sysContact que también identifica al objeto sysContact.
4.4.4.4 Ejemplo de la MIB de prueba
TEST-MIB DEFINITIONS ::= BEGIN
IMPORTS
enterprises
FROM RFC1155-SMI
OBJECT-TYPE
FROM RFC-1212
DisplayString
FROM RFC1213-MIB;
test
OBJECT IDENTIFIER ::= { enterprises 1 }
-- grupos en TEST
tesis
OBJECT IDENTIFIER ::= { test 1 }
-- el grupo Tesis
avDescr OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"Describe el tipo de antivirus que posee la
máquina que se esta accediendo."
::= { tesis 1 }
avUpdateVersion OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
ACCESS read-only
47
instaladas."
STATUS mandatory
DESCRIPTION
"Dice la versión de actualización de las
definiciones de virus que tiene
::= { tesis 2 }
END
Que nos generaría la siguiente estructura de árbol (como se ve en la Figura 10), donde
sale lo que definimos bajo el nodo de private:
Figura 10. Vista del árbol construido
48
5 DESARROLLO DEL PROYECTO
El desarrollo del proyecto se debe realizar en cuatro etapas muy importantes. La
primera de ellas es la de documentarse sobre el funcionamiento tanto de SNMP como
de la MIB. Luego, se debe definir el protocolo seguro que se va a utilizar en la
comunicación entre el adaptador y la consola. A continuación se debe construir el
adaptador que va a estar monitoreando los programas seleccionados en las máquinas.
Por último, se debe elaborar la consola de seguridad que es en donde se va a ver
reflejado lo que reportan los adaptadores. Este elemento debe soportar por un lado
SNMP (para la comunicación con una consola de gestión) y por el otro el protocolo
seleccionado para la comunicación con los adaptadores (SNMPv3).
La arquitectura propuesta se puede observar en la Figura 11.
Figura 11. Arquitectura propuesta
Se busca que el adaptador esté constantemente monitoreando el log del programa en
busca de alertas que esta haya generado en su ejecución. Las alertas encontradas las
reporta a la consola de seguridad utilizando el protocolo seguro de comunicación.
Como la consola tiene soporte a SNMP, un monitor SNMP podría comunicarse con
esta y debido a que posee una MIB (que contiene las variables de seguridad), podría
monitorear la consola de seguridad como si fuera un elemento de red como los otros.
Es por esto que esta consola debe tener un agente SNMP para facilitar la
comunicación hacia el monitor. Adicionalmente, la consola es capaz de generar
alertas por otros medios, como por ejemplo hacia un correo. Si la alerta persiste y no
se ha tomado ninguna acción sobre esta, es capaz de escalar el problema y de
informarle a otra persona que se ha definido anteriormente en la estructura de la
empresa. La idea del proyecto es dejar abierta la posibilidad que en un futuro se
desarrolle o se utilice una herramienta de gestión de red para la integración con la
consola de seguridad. Lo que se hizo es validar el modelo con un caso sencillo de
49
prueba de la comunicación con SNMP. Está fuera del alcance del proyecto la
integración con una herramienta de gestión de red.
5.1 SELECCIÓN DE PROGRAMAS A UTILIZAR
No se ha encontrado otra herramienta que pretenda integrar la gestión de red y la
seguridad al nivel que nosotros lo necesitamos. Lo que se propone es muy particular:
un modelo de seguridad que soporte SNMP, en especial, SNMPv3; es una
herramienta integral, o sea, que permite integrar y monitorear muchas herramientas
de seguridad, debido al uso de los adaptadores y hasta podría llegar a monitorear
cualquier herramienta que genere logs de notificaciones del funcionamiento de la
aplicación (que reflejen la acción que toma la herramienta frente a un suceso).
Existen aplicaciones que generan notificaciones pero únicamente lo hacen sobre su
plataforma (reportan lo que sucede en esa aplicación). Solo lo hacen algunas
herramientas de manera centralizada para su producto, como por ejemplo, los
antivirus, que utilizan programas instalados en los clientes pero administrados desde
un servidor que tiene una consola robusta para soportar los clientes.
Se utilizó como protocolo de comunicación SNMPv3, ya que no se pueden utilizar las
versiones 1 y 2c por lo altamente inseguras y porque introducirían un punto inseguro
en el modelo propuesto. SNMPv3 nos permite utilizar encripción y autenticación en
los mensajes intercambiados ocultando el contenido y valores de los objetos. Además
se encuentra estandarizado mundialmente. En la Figura 12 y 13 se observa el
intercambio de mensajes utilizando SNMPv2. Ante una solicitud del valor de un
objeto, mediante el comando Get, obtenemos el valor de dicho objeto. En las figuras
se pueden observar claramente la comunidad utilizada, el comando, la versión del
protocolo, el OID del objeto y su valor. En las Figuras 14 y 15 observamos el
intercambio de mensajes utilizando SNMPv3. Ante un mensaje de tipo Get
obtenemos el valor del objeto deseado. Se observan los campos de la versión
utilizada, las tres banderas utilizadas y el contenido encriptado de la PDU.
50
Figura 12. Get utilizando SNMPv2
51
Figura 13. Response del mensaje SNMPv2
52
Figura 14. Get utilizando SNMPv3
53
Figura 15. Response del mensaje SNMPv3
54
5.1.1 Programa Net-SNMP
Net-snmp es un programa que provee herramientas y librerías relacionadas al
protocolo SNMP que incluye: un agente extensible, esto quiere decir que el agente
básico que viene con el programa puede ser extendido a manejar otras MIB’s que uno
puede desarrollar y estas pueden ser fácilmente introducidas al agente, por lo cual,
éste puede monitorear lo que se le ha incorporado; una librería SNMP, provee una
implementación del protocolo con la funcionalidad especificada en los RFC’s que
definen el funcionamiento de SNMPv1, SNMPv2 y SNMPv3; herramientas para
obtener y modificar información de agentes SNMP; herramientas para generar y
manejar Traps; un “compilador” de MIB’s que se encarga de generar una plantilla de
código en lenguaje C, y que implementa alguna de la funcionalidad final que tendría
lo que uno está programando; entre otras. Los desarrolladores principales del
proyecto son Dave Shield y Wes Hardaker.
Utiliza un tipo de licencia BSD la cual nos indica que el uso, la copia, la modificación
y la distribución del software y su documentación para cualquier propósito y sin
ningún cargo, es permitido. Teniendo en cuenta que se debe poner el copyright
adecuado y el permiso mencionado (especificados en el Anexo 1) y que deben
aparecer en la documentación creada para la aplicación. No se permite que el nombre
de ningún individuo ni institución sea usado con fines de publicidad o anuncio sin su
previo permiso. Para información más detallada sobre el licenciamiento ver Anexo 1.
El programa fue desarrollado y está dirigido a desarrolladores y administradores de
sistemas con conocimiento en C para permitirles utilizar la arquitectura SNMP.
Soporta los siguientes sistemas operativos: Microsoft Windows de 32-bit
(95/98/NT/200/XP) y todos los POSIX5 (Linux/BSD/Sistemas operativos tipo Unix).
El lenguaje de programación en el que está escrito el programa es en C y en Perl.
Para ver información sobre la instalación del programa Net-SNMP referirse al Anexo
6.
5.1.1.1 Pruebas de concepto
Se realizó para probar la validez y la forma de operación de las herramientas y
librerías de Net-SNMP y así poder garantizar que efectivamente cumple con los
requisitos para el desarrollo del proyecto. Esto permite mostrar la viabilidad de la
5
Portable Operating System Interface for uniX (POSIX): su objetivo es el de disminuir el proceso de
desarrollo de software en distintas plataformas mediante el establecimiento de una guías para que sigan
los distintos vendedores de sistemas operativos.
55
expansión de la aplicación para que monitoree nuevos objetos definidos. Se
realizaron tres pruebas de concepto, que corresponden al desarrollo de las siguientes
tres partes de la arquitectura de prueba: la consola, el agente y la MIB.
En la Figura 16, podemos observar la arquitectura general de la prueba.
Figura 16. Prueba de concepto realizada
Se debió realizar una MIB con una variable de prueba para observar la versión de un
antivirus, utilizando la notación ASN.1, de la siguiente manera:
TEST-MIB DEFINITIONS ::= BEGIN
IMPORTS
DisplayString FROM RFC1213-MIB
MODULE-IDENTITY, OBJECT-TYPE, enterprises
FROM SNMPv2-SMI;
tesis MODULE-IDENTITY
LAST-UPDATED "0411050000Z"
ORGANIZATION "Prueba de concepto"
CONTACT-INFO
"Nicolas"
DESCRIPTION
"Definición de la variable para la prueba de
concepto."
::= { enterprises 1 }
test
OBJECT IDENTIFIER ::= { enterprises 1 }
-- Grupos en TEST
tesis
OBJECT IDENTIFIER ::= { test 1 }
-- El grupo Tesis
56
avVersion OBJECT-TYPE
SYNTAX
Integer32
MAX-ACCESS read-write
STATUS
current
DESCRIPTION
"La versión que tiene del antivirus."
DEFVAL { 10 }
::= { tesis 1 }
END
Aquí se puede observar que se define el objeto avVersion, de tipo entero, con acceso
de lectura y de escritura y valor inicial de 10. Luego de tener la definición de la MIB,
se procede a “compilarla” con el programa que viene con la herramienta (llamado
mib2c), el cual genera el código en C, que implementa esa funcionalidad. El código
se debe modificar y especificarle el valor de los datos o el lugar de donde proviene el
valor que va a utilizar la variable. En este caso particular no es necesario modificar el
código. Luego, el código compilado, se debe incluir dentro del agente, para que este
pueda monitorear el objeto definido. De esta forma se pueden hacer sobre la variable
operaciones de lectura y de escritura. El agente solo inicializa la MIB que se definió y
ninguna otra. Esto implica que una consulta a una variable del grupo system no se
puede hacer, ya que el agente no inicializó dicha MIB. Se creó un agente
personalizado que solo responde a peticiones de la variable definida. Esto permite
seleccionar lo que se desea en el agente y así permitir que no use tantos recursos en
cosas que no vamos a estar monitoreando.
Por otro lado, la consola esta encargada de comunicarse con el agente con el
protocolo SNMPv3. En la consola se maneja una sesión que es la encargada de llevar
todos los parámetros de la configuración de SNMPv3. De esta manera se comunica
utilizando autenticación (con MD5) y encripción (con DES). La consola puede
consultar la variable que se le solicite. En este caso consulta la variable avVersion. Si
trata de consultar un objeto que no ha sido definido en el agente, muestra un error
diciendo que dicho objeto no está definido en el agente. Esto permite controlar lo que
se desea que tenga el agente cargado.
La prueba nos permitió probar que el programa Net-SNMP efectivamente sirve para
lo que nosotros deseamos hacer. El programa permite extender el agente para que
monitoree y guarde información de los logs y de esta manera poder desarrollar los
adaptadores para que lean los logs y reporten a la consola de seguridad.
5.1.2 Selección de herramientas de seguridad
Recordando que los principios de seguridad son:
57
1. Autenticación (la forma de determinar que una entidad es lo que dice ser).
2. Control de acceso y autorización (la forma de determinar los recursos y
servicios que puede utilizar la entidad).
3. Integridad (los datos reflejen la realidad y que correspondan con lo que
debe ser y no ha sido modificadas indebidamente).
4. Disponibilidad (los servicios y la información deben, en todo momento,
estar disponibles).
5. Confidencialidad (que la información sólo sea vista por los entes
involucrados en la comunicación y que un tercero no pueda ingresar).
6. No repudio (que algún ente que haya participado en la comunicación no
pueda negar su participación en ella).
7. Auditabilidad (la herramienta guarda algún tipo de registro de eventos que
han sucedido en el tiempo).
A partir de la teoría se clasificaron las herramientas según grupos que pretenden
proteger contra cierto problema de seguridad (clasificados en categorías genéricas)
presente en las organizaciones. En estas clasificaciones se pueden agrupar la mayoría
de las herramientas de seguridad [12] [13] [14] [15] [16] [17] [18]. Cada una de estas
herramientas pretende fortalecer ciertos principios de seguridad como se ve en la
Tabla 1. Se debe tener en cuenta la siguiente terminología utilizada:
•
•
•
•
Spyware: es una palabra normalmente utilizada para software que soporta
publicidad. Adicionalmente es una tecnología que ayuda a recolectar
información de un individuo sin su consentimiento.
Antivirus: es un programa que se encarga de escanear cualquier tipo de
dispositivo de almacenamiento en busca de un virus conocido o potencial.
Firewall: es un dispositivo o programa encargado de filtrar el acceso a una
red. Permite definir lo que puede o no pasar a la red. Protege contra acceso no
autorizado desde otra red.
IDS: es un programa que se encarga de monitorear equipos en busca de
indicios de un ataque o de búsqueda de una falla en la seguridad. Puede
monitorear eventos en busca de algunos indicios.
Tabla 1. Principios garantizados por cada grupo de aplicación
58
Cada una de las categorías de programas se encarga de fortalecer ciertos principios de
seguridad. Para muchos de los usuarios de computadores, los spyware son muy
trabajosos de solucionar. Cuando el equipo posee un spyware instalado (normalmente
es un programa en ejecución), se encuentra en peligro porque no se sabe exactamente
como fue diseñado el programa. Podría abrir algún puerto y permitir el ingreso no
autorizado, podría modificar o alterar datos en el equipo o hasta podría reportar cosas
que hacemos o tenemos a otra persona. Los antivirus se encargan de buscar y eliminar
virus de los equipos, que a su vez son programas hechos con intenciones no éticas.
Protege un equipo de tal forma que no dañen su disponibilidad, ya que dependiendo
del virus, podría afectar la disponibilidad de algún(os) servicio(s). Para un mayor
nivel de protección encontramos los firewalls, que se encargan de filtrar acceso no
autorizado y definen reglas de quien(es) pueden acceder a un determinado recurso
que presta un servidor o hasta regular el acceso a una estación. Permite una forma de
protección mayor para garantizar que las personas no puedan decir que no han hecho
algo. Una forma más proactiva de estar protegido es mediante el uso de IDSs que
permiten la detección temprana de ataques a equipos en la red. Así garantizamos
prevenir que suceda algo en la red, que pueda perjudicar su normal funcionamiento.
Por último, los sistemas operativos proveen cierto grado de protección contra estas
características. Depende de la versión y el tipo de sistema operativo, se pueden
controlar más o no estos principios. Se puede decir que ofrecen una primera capa de
fortalecimiento de los principios. Es difícil proteger un sistema operativo que tiene
muchas falencias de seguridad y por esto deben ser sistemas muy robustos y seguros.
Estas aplicaciones que fortalecen los principios de seguridad tienen algo en común: la
generación de logs como parte de su ejecución. Una de las características más
importantes que debe tener el programa para que pueda ser monitoreado por el agente
y por consiguiente por la consola de seguridad. Los programas que se analizan a
continuación cumplen con alguno(s) de los criterios para el desarrollo del proyecto.
Tabla 2. Características analizadas de los Anti-Spyware
La Tabla 2 muestra las características presentes en tres programas Anti-Spyware. Se
ven características como el sistema operativo que soportan (Windows o Linux), si se
ejecuta como consola o con modo gráfico, si soporta logs binarios o de texto y por
último si se pueden programar scans con los programas, para que así escaneen el
sistema en busca de Spyware.
59
Tabla 3. Características analizadas de los antivirus
En la Tabla 3 se observar un listado de programas antivirus y algunas características
interesantes para el proyecto. Se ven características como el sistema operativo que
soportan (Windows o Linux), si se ejecuta como consola o con modo gráfico, si
soporta logs binarios o de texto y por último si se pueden programar scans con los
programas, para que así escaneen el sistema en busca de virus. La “s” en la gráfica
indica que utiliza un servicio registrado en Windows.
Tabla 4. Características analizadas de los firewalls
Algunos programas de firewalls se muestran en la Tabla 4. Se puede observar un
listado de las características de estos programas. Se ven características como el
sistema operativo que soportan (Windows o Linux), si se ejecuta como consola o con
modo gráfico, si soporta logs binarios o de texto y por último si están en continua
ejecución, ya que estos programas protegen mientras el programa este en memoria.
Puede ser interesante el firewall Kerio, que adicional a ser firewall tiene un IDS.
Tabla 5. Características analizadas de los IDS
60
En la Tabla 5 se observar algunos IDS. Se aprecia un listado de las características de
estos programas. Se ven características como: el sistema operativo que soportan
(Windows o Linux); si se ejecuta como consola o en modo gráfico; si soporta logs
binarios o de texto; si tiene un sheduler incorporado para programar scans; si soporta
más aplicaciones, que la herramienta se puede clasificar en más de una categoría ya
que realiza otras funciones; la utilidad para el administrador de red, como le ayuda la
herramienta de esa categoría a desempeñar su función y si le sirve para garantizar la
seguridad en la red; la interacción por línea de comandos, que permite interactuar con
la herramienta desde una consola de la línea de comandos para poder tomar una
acción sobre ella y por último si están en continua ejecución, ya que estos programas
protegen y alertan mientras el programa este en memoria y en ejecución. Puede ser
interesante el firewall Kerio, que adicional a ser firewall tiene un IDS. Entendemos
por manejan los con mucha información si la herramienta pone mucha información
relevante al evento de seguridad detectado y da información sobre el evento.
Tabla 6. Criterios de selección de herramientas
En la Tabla 6 se puede observar unos criterios de selección con sus respectivos pesos,
que serán utilizados como parte en la selección de las herramientas con las cuales se
va a validar el modelo. Se utilizaron estos criterios porque son los que van de acuerdo
a los intereses del proyecto por trabajar con herramientas gratuitas. Los pesos van de
1 (bajo) a 5 (alto). Luego de hacer un cruce de criterios y de herramientas a utilizar
(Tabla 7), se obtuvieron los resultados que se muestran en la Tabla 8.
En la Tabla 7, se observa los criterios utilizados en la evaluación y las herramientas a
utilizar. Se calculó el peso total de cada aplicación, según los criterios establecidos.
Vale la pena explicar un poco en que consiste la característica de soporte a más
aplicaciones. Básicamente es que la herramienta no sólo se dedica a trabajar en la
categoría a la cual pertenece sino que tiene otras características que le permiten estar
en otra categoría. El criterio de la utilidad para un administrador de red se vio como
lo que más le sirve para el desarrollo de su papel. Se piensa que si se tienen buenas
políticas a nivel de IDS y de firewalls (que dan datos en tiempo real), se puede, en
cierta, forma proteger contra los virus y spyware, ya que podría llegarse a filtrar ese
61
contenido. Tanto los antivirus como los anti-spyware pueden detectar las cosas un
tiempo después y no sería tan crucial como con los otros.
Tabla 7. Resultados de aplicar criterios a herramientas
Tabla 8. Orden de las herramientas según su peso
El resultado de haberle puesto el peso a los criterios se observa en la Tabla 8. Según
los criterios, vemos el orden de las herramientas según los pesos. Llaman la atención
Kerio, IpTables y Avast!. En especial IpTables y Kerio. Las cuales son las
herramientas que se utilizarán en el proyecto.
5.1.3 Selección de motor de base de datos
Debido a las características del proyecto se ha pensado en utilizar como motor de
bases de datos MySQL. Un motor que nos ofrece muy buenas características de
desempeño, precio, confiabilidad, velocidad y escalabilidad. Es uno de los motores de
bases de datos más populares utilizados. Una de las razones más importantes por las
cuales se decidió utilizar este motor fue para mantener los costos del proyecto muy
bajos, permitiendo su utilización por cualquier empresa sin importar su capacidad
62
económica. Vale la pena aclarar que cualquier motor de bases de datos puede ser
utilizado en el modelo propuesto.
5.1.4 Análisis del protocolo syslog
Con el fin de analizar otras posibilidades de comunicación y de no sesgarse a la
utilización de solo unos recursos, se miró la posibilidad de utilizar el protocolo syslog
como medio de manipulación de los logs. La idea es centralizar en un servidor todo el
reporte de los logs y poner en este un agente SNMP que se encargaría de enviar
mensajes a la consola de seguridad. De esta forma se crearía un adaptador para las
herramientas y que reportara por medio del protocolo sucesos que encontrara en los
logs. Esta idea debido al funcionamiento del protocolo, fue descartada, ya que no
ofrece ningún tipo de seguridad. Lo interesante del protocolo es que muestra un
formato de log que se debe seguir y que brinda información adecuada de algún
evento.
Syslog es un protocolo, definido en el RFC 3164, que permite que una máquina
mande mensajes por una red IP a un servidor syslog como se muestra en la Figura 17.
Permite que las herramientas puedan reportar sucesos por este medio al servidor, para
que este se encargue de su procesamiento y de su almacenamiento. Los mensajes son
transportados por el puerto UDP 514.
Figura 17. Funcionamiento de Syslog
La estructura que se define para los mensajes es:
<Prioridad> Fecha Hora Equipo Aplicación: mensaje
Tiene varios problemas de seguridad y es esto lo que puede traer problemas para
nuestra arquitectura. Por el hecho de transportar los mensajes por un puerto UDP, no
se garantiza que los mensajes sean entregados a su destinatario. Algo muy grave, ya
que alguno de estos mensajes podría tener una gran importancia para la aplicación. A
su vez, no puede garantizar el orden del recibo de los mensajes, tocaría diseñar algún
método para lograr esto. Esto puede presentar problemas ya que se pierde tiempo y
procesamiento tratando de averiguar el orden de los mensajes.
Al no garantizar la entrega de los mensajes, estos se pueden perder y si el mensaje se
pierde, se pierde y nunca será recibido ni nadie se enterará de que se perdió, ya que el
servidor solo se encarga de recibir los mensajes y no de solicitarlos a las aplicaciones.
Para los mensajes no se define ningún tipo de encripción ni de autenticación, algo que
63
podría ser un punto de inseguridad en la arquitectura propuesta. La falencia de estos
aspectos de seguridad, permitiría que los mensajes fueran reenviados o duplicados,
permitiendo que se recibieran datos erróneos o con intenciones maléficas. Adicional a
todo esto, se tendría un punto de falla muy grande, ya que si por algún motivo el
servidor perdiera su disponibilidad, la consola de seguridad se vería con problemas
para poder monitorear las herramientas.
Lo que si puede llegar a ser rescatable del protocolo es el formato del mensaje. La
idea sería incorporar ese formato dentro de los logs que vaya a crear la consola de
seguridad.
5.2 ARQUITECTURA DEL MODELO PROPUESTO
5.2.1 Arquitectura general
En la Figura 18 se puede observar la arquitectura general de la solución planteada.
Nos muestra un diagrama de capas con los respectivos componentes y la forma en
que se comunican entre si.
Antes de abordar la arquitectura propuesta es necesario aclarar unos términos de la
arquitectura que son claves y deben quedar bien claros y entendidos para evitar
cualquier confusión.
En la arquitectura se mencionan los conceptos de adaptador, herramienta, consola de
seguridad, incidentes de seguridad y eventos.
El adaptador es el conjunto de agente SNMP y analizador de logs, que trabajan
cooperativamente para lograr la funcionalidad deseada. Hay que aclarar la diferencia
entre un agente SNMP proxy y un adaptador: el agente proxy está encargado de
traducir del protocolo SNMP a un protocolo de administración propietario de un
dispositivo, mientras que el adaptador traduce instrucciones de un ente no
administrable, como son los logs, a SNMP. Por esta razón se habla de adaptador y no
de agente SNMP Proxy. Se entiende por herramienta toda aplicación desarrollada con
fines de garantizar la seguridad en la red sea un firewall, IDS, antivirus, etc. La
consola de seguridad es el encargado de administrar de manera centralizada los
adaptadores y de comunicarse con la consola de gestión.
Los incidentes de seguridad y los eventos son la unidad básica de información
utilizada por la consola de seguridad para guardar incidentes de seguridad en la base
de datos. Se maneja un incidente por cada una de las máquinas para lograr de esta
manera centralizar en un incidente todos los eventos reportados por el (los)
64
adaptador(es) de una máquina. A su vez un incidente de seguridad está compuesto
por varios eventos, que son cada uno de los incidentes de seguridad reportados por
los adaptadores y que contienen los datos detallados de lo que sucedió. Los eventos e
incidentes tienen un procedimiento asociado que permite documentar como fue su
solución. El procedimiento le permite documentar claramente lo que se hizo para
solucionar el evento o el incidente, de esta forma se enriquece la base de datos con
información que puede ser utilizada en un futuro y que también podría ayudar a
solucionar otro evento de seguridad similar. Los incidentes y los eventos tienen
asociado un estado, que indica si el evento o incidente ya fue solucionado o no, y
además posee una fecha de cierre que le permite especificar la fecha de cierre del
evento o incidente.
Figura 18. Arquitectura general
Se muestra un diagrama general de arquitectura y es necesario profundizar en la
arquitectura del host y de la consola.
El funcionamiento normal del modelo es:
1. El adaptador inicia su ejecución y manda un Trap informando que ya está
monitoreando la herramienta.
2. La consola de seguridad recibe el Trap y registra el adaptador para que pueda
ser monitoreado por la consola.
3. El adaptador cada minuto manda un Trap informando que está en ejecución y
monitoreando la aplicación.
4. La consola de seguridad recibe estos mensajes que le indican que el adaptador
aún está en ejecución.
5. Prepara las estadísticas para mandarle un Trap a la consola de gestión.
En general frente a un suceso de seguridad sobre una máquina van a suceder los
siguientes pasos:
65
1. La herramienta monitoreada detecta el ataque y genera las entradas
correspondientes en el log.
2. El adaptador diseñado para monitorear la herramienta va a estar examinando
el log y si encuentra un nuevo evento va a mandar un Trap a la consola de
seguridad con la información necesaria.
3. La consola de seguridad recibe el Trap e indica que en esa máquina están
ocurriendo sucesos de seguridad.
4. Guarda la información necesaria en la base de datos y prepara las estadísticas
para mandar un Trap a la consola de gestión informándole el nombre de la
máquina, la dirección IP, el número de incidentes de seguridad abiertos y el
ID de cada uno de ellos.
5.2.2 Arquitectura del adaptador
Figura 19. Arquitectura del adaptador
Como se ve en la Figura 19, el adaptador está compuesto por dos componentes: un
agente SNMP y un analizador de logs. El adaptador es el que va a permitir monitorear
las herramientas de seguridad que no son capaces de reportar o generar mensajes
SNMP. Este se encarga de reflejar la información y el estado que proviene del log, es
decir, reporta lo que escribe la herramienta en el log. Los logs, dependiendo de la
herramienta, se generan localmente y es el adaptador instalado en la máquina el que
66
se encarga de leer el log y de actualizar el estado de los objetos definidos en su(s)
MIB(s).
Lo interesante de algunas herramientas es que se pueden programar para ejecutarse en
ciertos momentos, lo que puede solucionar el hecho de que sea el usuario quien
genera la ejecución del programa. Otras herramientas están en constante ejecución
monitoreando los eventos y modificando los logs.
Es responsabilidad del adaptador notificar a la consola de seguridad, mediante una
operación Trap, la ocurrencia de un evento. La consola es la encargada de tener la
capacidad de determinar la gravedad del reporte.
Previamente se debe analizar la estructura del log (que debe ser de tipo texto, según el
criterio mencionado) y de ella sacar los campos relevantes que podrían ser
importantes para la consola de seguridad y por ende para el administrador de red. Una
vez analizada la estructura del log, se procede a realizar un analizador de logs
específico para la aplicación y que esté en capacidad de leer el log.
Para que el adaptador esté en la capacidad de monitorear los logs, se debe crear una
MIB para esa herramienta, con los objetos definidos a partir de los campos relevantes
del log.
5.2.2.1 Adaptador
5.2.2.1.1 Analizador de logs
Es uno de los componentes vitales para la arquitectura propuesta, ya que es quien se
encarga de ir al log y traer los datos para su transporte vía SNMP. Es difícil dar una
arquitectura general para un analizador de logs, ya que su construcción está muy
relacionada con la estructura misma del log. Lo que si se puede hacer es dar algunas
pautas que se deben tener en cuenta cuando se planea construir un analizador de logs
para determinada herramienta. Para el desarrollo del proyecto se desarrollaron dos
adaptadores.
Se recomienda que el analizador de logs sea un programa compuesto de un archivo .c
y .h, ya que esto facilita su inclusión en el agente y su uso posterior dentro del código.
Como en todos los .h, deben estar los prototipos de las funciones que se van a utilizar
para acceder al log, para persistir y leer archivos temporales para el uso del adaptador
y la estructura que va a representar los campos importantes del log. Por otro lado, el
archivo .c contiene la implementación de las funciones, la lógica que se encarga de
ejecutar esas tareas.
67
Es importante analizar la estructura del log y determinar los campos importantes del
log, aquellos que nos brindan más información acerca del evento registrado en el log.
Luego de haber analizado el log y de haber extraído los campos importantes, se
procede a construir el .h y en especial la estructura que va a utilizarse para representar
el log.
Una vez creada la estructura que contendrá los campos del log, se puede proceder a
implementar las funciones que se definieron en el .h. Para garantizar un mejor
funcionamiento del adaptador, se recomienda tener en cuenta los siguientes puntos:
1. Como lo que se está leyendo es un archivo que puede llegar a tener miles de
registros, es importante persistir mínimo a un archivo cuatro datos: el primero
es un apuntador a la última línea que se leyó, para que de esta forma el
adaptador pueda continuar leyendo el log desde donde quedó. Es importante
tener este apuntador en el analizador porque permite controlar que cuando el
contenido del log sea borrado, se pueda comenzar a leerlo desde el comienzo.
2. Segundo, se debe llevar un registro de la fecha y hora del último evento leído
en el log. Aquí se encuentran los otros tres datos que nos interesa persistir a
un archivo: el mes, el día y la hora del evento leído del log. Esto permite saber
que el evento que vamos a procesar es antiguo o reciente comparado con el
último que se leyó.
3. Como ya se ha mencionado, se deben persistir estos datos para que el
adaptador en una ejecución posterior no termine reportando un evento que
ocurrió hace días y sólo se enfoque en aquella parte del log que contiene
eventos nuevos, que no han sido reportados.
4. Es importante definir bien cuales de los registros en el log van a ser
reportados a la consola de seguridad. Estos requerimientos dependen del tipo
de herramienta utilizada. Por ejemplo para un firewall se recomienda notificar
a la consola de seguridad registros que hayan sido rechazados o denegados
por la aplicación, ya que proveen mayor información sobre un posible ataque
porque son reglas que el administrador ha definido para filtrar porque
permiten bloquear puertas para un eventual ataque.
El analizador de logs construido posee dos funciones que se encargan de manejar el
log. Existe una función, llamada void readFileK(), para leer el archivo de los datos
que se persisten en el disco duro y que permite determinar el lugar en donde se leyó
por última vez el log. La otra función utilizada, llamada kerioids *readAllK(), es
la que se encarga de traer del log la siguiente línea que debe ser procesada y retorna la
estructura con los datos correspondientes para que el agente SNMP actualice los
valores de los objetos.
68
5.2.2.1.2 Consideraciones sobre los logs
Con el fin de determinar la mejor forma de crear el modelo de seguridad, era
necesario analizar cual arquitectura era la que más se adaptaba a nuestras necesidades
y que pudiera brindar un mejor soporte y desempeño para futuras aplicaciones del
modelo. Los criterios se piensan, no solo en el caso de estudio, sino a una escala
mayor, como lo puede ser la implementación en una empresa.
Estas consideraciones que se tuvieron en cuenta para la construcción del modelo,
buscan favorecer el desempeño y confiabilidad de la aplicación. Ellas tienen relación
con la forma de realizar el analizador de logs y la forma de realizar las MIB’s a partir
de estos logs. Hay que tener en cuenta un factor que está siempre presente en las
decisiones que vamos a tomar: la arquitectura de la herramienta que se va a utilizar
para los agentes, el protocolo SNMPv3 (Net-SNMP) y el funcionamiento del
protocolo SNMP.
La consideración que se tuvo que tener en cuenta fue la de crear un analizador de logs
genérico para los tipos de logs. Tras una larga investigación, se pudo determinar que
no hay un estándar para los logs que manejen las aplicaciones. Es por esto que la
estructura, el formato y el tipo de archivo quedan a disposición de los desarrolladores
de las aplicaciones y es decisión de ellos escoger la mejor aproximación que les sirva.
Esto complica mucho la unificación de los logs, ya que las empresas desarrolladoras
crean los logs como un archivo de soporte para el funcionamiento solo de sus
aplicaciones, sin pensar, en la tendencia que tiene hoy la tecnología de unificar el
mundo de gestión y el de seguridad. Hecho que podría llegar a simplificar mucho el
proceso de unificación planteado. Sería interesante la creación o mejoramiento de
seguridad de protocolos, definidos en un RFC como en el caso de Syslog [21], que
permitan el reporte estandarizado de mensajes para que los desarrolladores puedan
utilizarlo en su estructura de los logs.
En nuestro caso particular, como usuarios e integradores de estos dos mundos, era
necesario analizar la posibilidad de crear un analizador de logs estándar. Se pensó que
como algunos de los logs son archivos de texto, se podría tener la ayuda de un
archivo que describe la estructura del log, para que el analizador estándar lo lea y
pueda interpretar el log. El problema surge cuando vamos a ver a fondo los campos
de los logs y se ve que al tratar de generalizarlos, hay diferencias sustanciales que
podrían complicar tanto la construcción del analizador como del archivo de la
estructura del log. Las herramientas que vamos a utilizar en el caso de estudio, son un
vivo ejemplo de la falta de unificación en cuanto a la estructura de los logs. Tienen
una estructura muy particular de los campos.
En la Figura 20 se puede observar dos registros de los logs de estas dos aplicaciones.
En la Figura 20 (a) se encuentra el formato del log de la herramienta Kerio y en la
Figura 20 (b) está el de la herramienta IpTables. Se pueden observar sutilezas en el
69
registro de los campos de cada log. Por ejemplo, se puede ver el formato de la fecha
del registro de la herramienta Kerio y compararla con el de IpTables; el registro de la
MAC de IpTables, necesita de un tratamiento especial, ya que ahí se encuentran tanto
la MAC de destino como la de origen. Es importante mencionar el hecho de que
IpTables guarda sus registros en el log info del kernel. Por esta razón se encuentran
no solo registros del programa, sino también del sistema operativo, para lo cual es
necesario implementar un medio de filtrado de los registros para poder proceder a la
extracción de los datos del registro de IpTables. Para esto, se utiliza el prefijo que se
puede definir en las reglas del programa como filtrado de paquetes y que al decirle a
la aplicación que escriba un registro en el log para determinada regla, se guardan los
datos con el prefijo definido. En este caso se utiliza el prefijo:
“Shorewall:all2all:REJECT:” como medio de filtrado de los registros. Esto también
impide que se puedan generalizar los logs.
Figura 20. Estructura de los logs
5.2.2.1.3 Consideraciones sobre la MIB
La consideración que se tuvo que tener en cuenta fue la de crear una MIB general
para grupos de programas, esto es, una MIB para firewalls, otra para IDS, etc. El
problema de utilizar una MIB para cada grupo viene cuando pensamos en el
desempeño del modelo. Analizando la arquitectura propuesta se puede ver que el
adaptador va a tener la implementación de la MIB de cada grupo dentro del código
del agente. En el agente, más específicamente en el módulo de la MIB incorporada al
agente, se define cada cuanto tiempo se va a llamar al analizador de logs. Por esta
razón si se tiene un agente que va a monitorear más de una aplicación de un
determinado grupo, ésta en un instante solo puede llamar a un analizador de logs.
Esto quiere decir que si se van a monitorear, por ejemplo, 5 aplicaciones de un grupo
el agente sólo puede monitorear una herramienta a la vez, ya que solo puede llamar a
un analizador de logs a la vez y, además, solo tendría una instancia de cada objeto a
monitorear, ver Figura 21 (a).
70
Este hecho puede afectar el tiempo de respuesta del agente, ya que en un instante sólo
puede monitorear una herramienta. También tendría que implementar cierto
algoritmo como puede ser “Round Robin”, para la selección del analizador de logs y
la asignación del orden. Esto implica que el agente tardaría en monitorear una
aplicación, lo que se demore el analizador de logs de cada una de las siguientes
aplicaciones.
Cabe notar que el analizador de logs va a leer un archivo, el cual puede ser tan
pequeño como de unos cuantos KB o hasta de unos cuantos MB o más. Es por esto
que ese tiempo de espera puede ser muy corto o tan largo como sea el tamaño del
archivo. Aquí aparecería cierta demora en la monitorización de una determinada
aplicación y se sacrificaría ese análisis en tiempo real. Elemento que se considera
importantísimo en herramientas IDS, firewalls o antivirus.
Lo mencionado anteriormente se puede solucionar implementando una MIB
específica para cada herramienta a monitorear, para que de esta manera se incorpore
esa MIB al agente y que esta se encargue de monitorear únicamente el log de esa
herramienta, así, incrementando el tiempo de respuesta del agente para esa aplicación
y también permitiendo que el análisis sea mucho mas cercano al tiempo de respuesta
de la aplicación monitoreada, brindado resultados en vivo del estado de la aplicación,
ver Figura 21 (b).
Adaptador
Adaptador
Figura 21. Implementación de la MIB para la herramienta
Para el caso de estudio se definió la estructura de árbol de las MIB’s a implementar
(ver Figura 22). Como el caso de estudio es solo con fines de realizar una prueba de
concepto, no se registró ni se solicitó una asignación de un número bajo la rama
enterprises. El nodo principal de nuestro árbol es modSegSNMP (modelo de
seguridad con soporte a SNMP). Debajo de esta hay otros dos nodos: agente y
consola. Bajo la consola van a estar definidos los objetos que va a exponer a una
71
herramienta de gestión y esta es la MIB que la herramienta de gestión va a conocer;
bajo el agente van a estar las MIB’s de las herramientas que vamos a monitorear, para
este caso, se encuentra un nodo kerio y otro ipTables. Debajo de estos, se van a
encontrar los objetos que van a guardar los datos de los logs. Es aquí donde se
reflejan los campos de los logs que son interesantes.
Figura 22. Estructura general de la MIB para el modelo propuesto
5.2.2.1.4 Construcción del adaptador
Ahora es tiempo de definir y construir el analizador de logs para cada herramienta.
Para esto es necesario ver la estructura del archivo y sus campos y decidir cuales
pueden ser importantes para el administrador de red. Hay que preguntarse: ¿Cuáles
campos brindan información pertinente sobre la seguridad? Luego de definir los
72
campos, se debe crear una estructura en C6 que va a contener variables en donde se
van a reflejar los campos del archivo. Por ejemplo en la Figura 23 observamos una
estructura (construida a partir de los campos importantes del log) para la herramienta
Kerio.
Figura 23. Estructura en C para la herramienta Kerio
A partir de esa estructura, se procede a definir las hojas (objetos) a monitorear de
cada aplicación. Para ver la definición de los objetos para una las dos herramientas
referirse al Anexo 2. Se pueden añadir campos adicionales si se desea guardar datos
adicionales. Para nuestro caso se define en ambas MIB’s un objeto xStateOfInterface
(donde x puede ser k para Kerio o ip para IpTables) que permite tomar acciones sobre
la interfaz de red del equipo.
Para adicionar las MIB’s desarrolladas en el agente remitirse al Anexo 6.
De esta forma se integra el módulo creado, según la MIB definida, al agente. Para que
de esta forma el agente pueda mantener las instancias de las variables definidas (que
son los objetos definidos en la MIB) y para que así pueda consultar y guardar los
datos.
En este punto ya se pueden hacer consultas a las variables definidas en el agente y
dependiendo de los permisos, se pueden consultar y/o modificar los valores. Por
ejemplo, se puede hacer esta consulta:
Entrando un poco más en la forma en que se extendió el agente es importante
mencionar algunos aspectos relevantes del código. Para el caso de prueba se utilizó la
herramienta mib2c para generar la plantilla del código a utilizar para poder extender
6
Lenguaje de programación C
73
el agente. En estos archivos aparecen funciones que vale la pena mencionar para que
sirven.
El archivo creado comienza con una función llamada:
void init_yy(void)
//donde yy es el nombre del archivo generado por
mib2c
Esta función es la encargada de inicializar el módulo que queremos implementar. En
este caso es para ipTables o kerio. Dentro de ella se van a definir las OID’s de cada
objeto de manera estática y en formato de números, ya que se debe guardar durante la
ejecución del agente estos valores para la consulta específica de las variables.
También se encuentra la definición de las variables que van a estar encargadas de
guardar los datos de las variables que vamos a solicitarle al analizador de logs.
Una de las funciones más importantes es la que se encarga de registrar el objeto
escalar y su handler o manejador, que es el que se encarga de administrar como
vamos a manejar los datos de la variable. Por ejemplo se tiene que para poder
manejar la variable y el dato del objeto ipDate, es necesario definir lo siguiente:
netsnmp_register_scalar(
netsnmp_create_handler_registration("ipDate", handle_ipDate,
ipDate_oid, OID_LENGTH(ipDate_oid),
HANDLER_CAN_RONLY
));
La función encargada de registrar el objeto escalar es netsnmp_register_scalar
que recibe como parámetro un apuntador a un netsnmp_handler_registration,
que tiene el registro y apunta al handler o manejador para ese objeto. La función
netsnmp_create_handler_registration es la encargada de crear y registrar el
handler para ese objeto. Recibe el nombre del handler encargado de llamar a la
función handle_ipDate para que atienda la solicitud SNMP, para el objeto
ipDate_oid. La función OID_LENGTH calcula la longitud de dicho objeto. El último
parámetro que en este caso es HANDLER_CAN_RONLY indica el nivel de acceso que se
tiene, o sea si es de lectura o lectura y escritura.
Ahora se va a ver en detalle la función handle_ipDate, encargada de atender
solicitudes SNMP para el objeto ipDate. Su implementación es la siguiente:
int
handle_ipDate(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
74
snmp_set_var_typed_value(requests->requestvb,
ASN_OCTET_STR,
(u_char *) data_ipDate,
strlen(data_ipDate));
break;
}
}
default:
snmp_log(LOG_ERR, "unknown mode (%d) in
handle_ipDate\n", reqinfo->mode );
return SNMP_ERR_GENERR;
return SNMP_ERR_NOERROR;
El switch sirve para identificar el tipo de solicitud proveniente. En este caso si es de
tipo MODE_GET, se va a llamar a la función snmp_set_var_typed_value, que está
encargada de manejar la obtención del valor del objeto solicitado. Recibe como
parámetros la lista de variables solicitadas (requests->requestvb), el tipo de dato
del objeto (ASN_OCTET_STR), un apuntador al dato del objeto y la longitud de los
datos en bytes. De esta forma se puede consultar el valor del objeto.
Otra función importante, un poco equivalente a la vista para registrar el objeto, es una
función creada para registrar objetos de tipo enteros, como se ve a continuación:
netsnmp_register_int_instance("ipStateOfInterface",
ipStateOfInterface_oid,
OID_LENGTH(ipStateOfInterface_oid),
&data_ipStateOfInterface,
handle_ipStateOfInterface);
La función netsnmp_register_int_instance recibe como parámetros el nombre
del handler, el objeto (ipStateOfInterface_oid), su longitud, el valor que se va a
registrar, y el handler que uno va a utilizar para manejar las solicitudes.
Uno de las funciones básicas para la actualización de los datos del módulo es una
función para registrar una alarma, para decirle al agente que cada cierto tiempo vaya
por los datos. La función es la siguiente:
snmp_alarm_register(1,
SA_REPEAT,
call_log_analyzer_iptables,
NULL);
La función snmp_alarm_register registra los callbacks que deben ocurrir cada
determinado tiempo en el futuro. Recibe como parámetros cada cuantos segundos se
debe llamar al callback, una bandera llamada SA_REPEAT que indica con cuanta
frecuencia se debe llamar al callback, en este caso, el callback registrado se va a
75
repetir cada SA_REPEAT segundos, el callback que es un apuntador a
SNMPAlarmCallback que es la función callback guardada y registrada para el uso
cuando ocurra el tiempo, en nuestro caso va a ser call_log_analyzer_iptables, lo
que quiere decir que cada que se cumpla el tiempo, se va a llamar al analizador de
logs de una determinada herramienta y esta es la encargada de traer los nuevos datos
del log, para que los guarde el módulo. Por último, recibe un apuntador que es usado
por la función callback, pero en nuestro caso no se va a utilizar, por lo cual se manda
como parámetro NULL.
void
call_log_analyzer_iptables(unsigned int clientreg, void *clientarg)
{
struct iptablesLog *data;
int i=0;
data=(struct iptablesLog *) calloc(1, sizeof(struct
ptablesLog));
data->rdate=(struct CDate *) calloc(1, sizeof(struct CDate));
}
strcpy(data->computer,"a");
data=readAllIp();
if(strcmp(data->macdst,"")!=0)
{
strcpy(data_ipDate,data->rdate->date);
strcpy(data_ipTime,data->rdate->time);
strcpy(data_ipHost,data->computer);
strcpy(data_ipIn,data->in);
strcpy(data_ipOut,data->out);
strcpy(data_ipMACDst,data->macdst);
strcpy(data_ipMACSrc,data->macsrc);
strcpy(data_ipSrcAddress,data->src);
strcpy(data_ipDstAddress,data->dst);
strcpy(data_ipPacketLength,data->len);
strcpy(data_ipProtocol,data->proto);
strcpy(data_ipSrcPort,data->spt);
strcpy(data_ipDstPort,data->dpt);
send_ipNotifyTrap_trap();
}
La función callback call_log_analyzer_iptables llama al analizador de logs y
actualiza los datos que están actualmente en el módulo. Adicionalmente se manda un
Trap con los datos recibidos mediante la función send_ipNotifyTrap_trap, que
manda una Trap al lugar especificado en el archivo de configuración snmpd.conf en
la parte donde dice trapsess, de esta forma:
trapsess -v 3 -u nbatest -n "" -l authPriv -a MD5 -A nbaprueba -x
DES -X nbaprueba -e 0x0102030406 localhost:162
76
Que especifica que se va a mandar un Trap, con los mismos datos que se usarían en
un snmpget con versión tres. Solo que se especifica el equipo que lo va a recibir y por
el puerto que lo recibe, que en este caso es el puerto default de 162.
Para mandar el Trap desde el código se debe hacer lo siguiente:
int
send_ipNotifyTrap_trap( void )
{
netsnmp_variable_list *var_list = NULL;
oid ipNotifyTrap_oid[] = { 1,3,6,1,4,1,1,1,2,15,1 };
size_t ipNotifyTrap_oid_len = OID_LENGTH(ipNotifyTrap_oid);
oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
size_t objid_snmptrap_len = OID_LENGTH(objid_snmptrap);
oid ipDate_oid[] = { 1,3,6,1,4,1,1,1,2,1,0 };
size_t ipDate_oid_len = OID_LENGTH(ipDate_oid);
snmp_varlist_add_variable(&var_list,
objid_snmptrap, objid_snmptrap_len,
ASN_OBJECT_ID,
(u_char *) ipNotifyTrap_oid,
ipNotifyTrap_oid_len *
sizeof(oid));
snmp_varlist_add_variable(&var_list,
ipDate_oid, ipDate_oid_len,
ASN_OCTET_STR,
data_ipDate, strlen(data_ipDate));
send_v2trap( var_list );
snmp_free_varbind( var_list );
}
return SNMP_ERR_NOERROR;
Se crea la lista que va a contener las variables y los datos. Se define el OID que
identifica las Traps para la herramienta IpTables. Luego se define el OID de las Traps
en general. Luego se definen los tamaños y los OID’s de las variables que va a
contener el Trap, luego se asigna a la lista de variables el OID de las Traps en general
y posteriormente con los objetos que queremos que contenga la Trap. Por último se
manda la Trap que contiene una PDU de versión 2 y se libera la lista.
La función snmp_varlist_add_variable adiciona la dupla (objeto, valor) a la lista
de variables. Recibe como parámetros la lista de variables, el OID del objeto a
adicionar, su longitud, el tipo de dato ASN que es el objeto, el valor del objeto y su
longitud.
77
De la misma manera cuando el adaptador inicia su ejecución se manda una Trap
informando que ese adaptador ha iniciado su ejecución y por tanto el monitoreo de la
herramienta. Adicionalmente cada minuto se manda un Trap informando que el
adaptador está “vivo”.
Hay que mencionar que para que se tome una acción tras una solicitud, hay que
definir en el handler de ese objeto la acción que se va a realizar, de la siguiente
manera:
int
handle_ipStateOfInterface(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
{
if(reqinfo->mode==MODE_SET_ACTION)
{
if(data_ipStateOfInterface==0)
{
printf("Bring down interface");
}
}
}
return SNMP_ERR_NOERROR;
Aquí se verifica si el modo de la solicitud es MODE_SET_ACTION que indica que la
solicitud es un snmpset al objeto y luego es necesario verificar si el valor de
data_ipStateOfInterface es cero, en tal caso se debe bajar la interfaz de red.
5.2.3 Arquitectura de la consola de seguridad
78
Figura 24. Arquitectura de la consola de seguridad
La Figura 24 nos muestra los componentes generales de los que se compone la
consola de seguridad. Ésta es la encargada de realizar acciones mediante la operación
Set, sobre los adaptadores y también recibir Traps provenientes de ellos. Además
muestra al usuario algunos datos relevantes de las herramientas que está
monitoreando para que se informe sobre lo que está sucediendo en ellas.
Otras funciones importantes que debe cumplir la consola de seguridad es la de
notificar o generar alertas por otros medios que no sean mensajes SNMP como por
ejemplo mensajes a un beeper o un celular. También debe ser capaz de escalar
notificaciones de máquinas que están generando muchos problemas importantes y
que no han sido atendidos oportunamente en la máquina.
Adicionalmente, a la consola de seguridad se le deben informar las MIB’s de las
herramientas que va a monitorear, con el fin de que pueda conocer los objetos por los
cuales va a indagar en el host. También existe la posibilidad de que descubra estos
objetos mediante unas operaciones GetNext o Walk (comando que trae en secuencia
ciertos valores en orden lexicográfico) y así, no solo logra conocer el objeto, sino que
conoce su valor.
Como la consola de seguridad debe soportar SNMP, ésta incluye un agente SNMP
para que pueda exponer objetos monitoreables a una consola de gestión. Al agente se
le debe crear una MIB de aquellos objetos que deseamos exponer a la consola de
gestión. Adicionalmente cuenta con un receptor de Traps que se encarga de recibir
los Traps enviados desde los adaptadores para su posterior análisis y representación
en la consola de seguridad.
79
La consola de seguridad utiliza una base de datos para guardar información referente
a los incidentes de seguridad y eventos generados por los adaptadores y es ahí donde
se guardan los datos reportados del log de la aplicación monitoreada. En la base de
datos es donde se guardan las notificaciones recibidas por los adaptadores y es el
repositorio de eventos que las herramientas de seguridad han escrito en sus logs.
Desde este punto de vista vemos que en la base de datos se encuentra la información
escrita en los logs de cada una de las herramientas, lo que permite ver desde la
consola una consolidación de los logs para así poder simplificar el proceso de
auditoría y análisis forense, procesos que necesitan de la verificación manual de los
logs de las herramientas. Cada cierto tiempo la consola verifica si es necesario escalar
un evento de seguridad que ya ha cumplido la vigencia para ser solucionado. De ser
necesario manda un correo a la(s) persona(s) que están un nivel más arriba en el
organigrama de la empresa.
5.2.3.1 Consola de seguridad
La consola de seguridad, diseñada específicamente para los administradores de red u
otra persona encargada de administrar el estado de la red, se encuentra compuesta de
cuatro subsistemas que complementan la funcionalidad necesaria de la consola como
se muestra en la Figura 25. Cada subsistema tiene determinadas tareas que permiten
una buena independencia entre ellos y cada uno de ellos tiene una función específica.
Figura 25. Subsistemas de la consola de seguridad
80
5.2.3.1.1 Subsistema de ambiente gráfico
Es el encargado de administrar la interfaz con el usuario y de responder a comandos
del usuario al igual que mostrarle a él lo que ocurre en la aplicación. Aquí el usuario
puede añadir o eliminar usuarios del sistema tanto para aquellos que acceden vía la
consola o vía Web, editar parámetros de los Traps que entran y de los que salen.
Adicionalmente puede interactuar con las máquinas y si lo desea las puede agrupar
por subredes diferentes e insertar etiquetas que las identifiquen. Se muestra
información del estado de las máquinas y si el usuario lo desea puede ver los
incidentes de seguridad y eventos de la máquina deseada.
Se encarga de permitir interactuar al usuario con los incidentes y eventos,
permitiendo cambiar su estado, editar la fecha de cierre y agregar el procedimiento
utilizado para solucionar el incidente y/o evento. Aquí se notifica en la pantalla del
usuario el estado actual de cada una de las máquinas monitoreadas. Los estados
manejados son: abierto, que indica que un incidente o evento se encuentra sin
solución; cerrado, que indica la clausura y solución de un incidente o evento y por
último, descartado, indicando que el incidente o evento no representa un evento de
seguridad relevante. Cuando la máquina se encuentra arriba y se están recibiendo
notificaciones de los agentes diciendo que están “vivos”, se muestran los botones en
color azul (que indica que la máquina está viva); cuando los botones toman el color
blanco quiere decir que no se han vuelto a recibir ningún tipo de notificación de ese
agente; por último, cuando el botón está intermitente entre color azul y rojo, es
porque se están recibiendo notificaciones del agente (que indica que la máquina está
siendo atacada).
5.2.3.1.2 Subsistema de control de incidentes de seguridad
Es la parte central de la arquitectura en donde se va a realizar todo el análisis y
administración de los eventos, incidentes de seguridad, notificaciones y estadísticas
necesarias para mantener al usuario informado. En este subsistema se procesan las
notificaciones recibidas por el subsistema de recepción de mensajes SNMP. A partir
de estas notificaciones se administran los incidentes y eventos para esa máquina.
Cuando llega una notificación es necesario procesar su información y actualizar la
base de datos con la información necesaria, calcular las estadísticas de las
notificaciones recibidas, notificar al subsistema de ambiente gráfico que ha llegado
un nuevo mensaje para que tome la medida adecuada, tomar la decisión si es
necesario el envío de una notificación vía SMTP y por último, cada cierto tiempo
preparar un mensaje para el subsistema de envío de mensajes SNMP.
81
5.2.3.1.3 Subsistema de recepción de mensajes SNMP
Su función es la de estar constantemente escuchando notificaciones provenientes de
los adaptadores para así notificarlas al subsistema de control de incidentes de
seguridad. Al arribo de una notificación es necesario analizar el contenido del Trap y
extraer la información relevante para el subsistema de control de incidentes de
seguridad. Una vez analizada la información se debe armar el mensaje para
notificárselo al subsistema de control de incidentes de seguridad y así enviarle la
información necesaria para que sea procesada.
5.2.3.1.4 Subsistema de envío de mensaje SNMP
Está encargado de mandar Traps informativas a una consola de gestión. Cada cierto
tiempo, cuando así lo determine el subsistema de control de incidentes de seguridad,
es necesario tomar la información estadística suministrada por ese subsistema y armar
un Trap con esa información para que así sea enviada esta información a la consola
de gestión, en donde se reportará que algo ha sucedido. Este subsistema hace uso del
agente SNMP y de la MIB para poder exponer la información necesaria para una
consola de gestión. Esta MIB fue diseñada para mostrar información que ha sido
analizada y filtrada por la consola de seguridad, permitiendo que la consola de
gestión vea solo estos datos porque no está dentro de su función la de monitorear y
recibir información acerca de herramientas de seguridad. Por esta razón no se
exponen los datos de las MIB de los adaptadores y también para evitar que la consola
de gestión reciba notificaciones que la consola de seguridad ha recibido. Lo que
quebrantaría un poco el modelo propuesto y la utilidad de la consola de seguridad,
que es la encargada de administrar y gestionar las herramientas.
Para los usuarios autorizados que desean conocer información acerca de los
incidentes y/o eventos existe un ambiente Web por donde pueden acceder a dicha
información y consultar el estado de los incidentes y/o eventos de las máquinas. Este
ambiente es solamente informativo y no permite ningún tipo de interacción con la
información presentada al usuario.
5.2.3.2 Modelo entidad-relación de la base de datos utilizada
El diagrama de entidad-relación utilizado en la consola de seguridad se muestra en la
Figura 26. Se puede observar que una máquina puede tener varios incidentes de
seguridad (en caso que tenga uno o más vencidos) y que a su vez cada incidente
puede tener varios eventos. La tabla usuario es utilizada para guardar los usuarios que
van a acceder a la consola de seguridad y al ambiente Web. Por último la tabla datos
del programa se utiliza para guardar datos relacionados con la ejecución de la
consola.
82
Figura 26. Diagrama entidad-relación
5.2.3.3 Diagrama de clases de la consola de seguridad
Referirse al Anexo 9 para los diagramas de clases.
83
6 PRUEBAS
6.1 DESCRIPCIÓN DE LA PRUEBA
Una vez planteado el modelo de seguridad propuesto, es necesario realizar un
protocolo de pruebas para poder validar el modelo y presentar un ambiente de prueba
que lo muestre en ejecución. Por esta razón se construyó un ambiente de pruebas que
trate de simular lo que puede ser una red corporativa, en donde se pretende que usen
el modelo para fortalecer aún más sus niveles de seguridad y brindar una mejor y
rápida respuesta ante incidentes en la red. Es necesario aclarar que cuando nos
referimos a agente, no debe entenderse como un agente SNMP, sino como un agente
de seguridad o adaptador, basado en SNMP para comunicarse. Referirse al Anexo 7
para la instalación de los componentes.
La Figura 27 muestra la red utilizada para simular una red corporativa y en donde va
a correr la implementación del modelo. Se puede apreciar que se utilizaron dos
enrutadores cada uno conectado a una subred diferente. En cada subred hay un IDS y
un firewall que pretenden mostrar varias herramientas de seguridad corriendo y como
va a ser la alerta de los eventos en la consola de seguridad. Adicionalmente permite
ser usada como un punto de referencia ya que podemos comparar el desempeño de la
herramienta en ambas subredes y evitar que el resultado sea afectado de alguna
manera por las configuraciones en los equipos y programas. En la red aparece una
consola de gestión que fue utilizada para validar que efectivamente la consola de
seguridad se puede comunicar con una consola de gestión, ya que debe brindar
soporte a SNMP para la integración con una herramienta de gestión.
Las redes cuentan tanto con sistemas operativos Windows como Linux. A
continuación se ve la configuración que tienen los equipos:
•
•
•
•
•
Marca: DELL
Procesador: Pentium 4 de 2.66 GHz
RAM: 256 MB a 333 MHz
Sistema operativo: Windows 2000 o Linux Mandrake 10
Tarjeta de red: 10/100 Mbps
En la máquina del atacante se utilizó un programa llamado GFI LANguard Network
Security Scanner, que se encarga de detectar vulnerabilidades en los equipos, provee
información detallada de las máquinas y permite administrar los parches del sistema
operativo y de los programas. Entre las pruebas de vulnerabilidades que hace, se
encuentran las siguientes: escaneo e identificación de puertos, detección de parches
instalados, detección de recursos compartidos, detección de usuarios y grupos no
84
utilizados, detección de vulnerabilidades CGI, detección de vulnerabilidades de RPC
y de correo, entre muchas otras vulnerabilidades. Algunas de las detecciones que el
enrutador impide que pasen son: descubrimiento de SNMP, escaneo de sesiones
nulas, entre otros.
Los switches utilizados son 3Com SuperStack 3 y los enrutadores son Cisco 2500 y
3600. Los concentradores utilizados fueron unos Cisco FastHub 400 series.
Se realizaron las siguientes pruebas con el modelo planteado:
1.
2.
3.
4.
Porcentaje de utilización de CPU por parte de los agentes
Utilización de la red de una herramienta comercial de gestión
Prueba de funcionalidad de la aplicación: desempeño y funcionalidad
Medición de la carga de red de la forma siguiente (en ambas subredes):
a. Sin agentes ni consola de seguridad en ejecución
b. Con agentes y consola de seguridad en ejecución, pero sin ataque
c. Con agentes y consola de seguridad en ejecución, pero con ataque
d. Sin agentes ni consola de seguridad, pero con ataque
5. Medición de la carga soportada por la consola de seguridad
6.2 DESARROLLO DE LAS PRUEBAS
Luego de efectuar las mediciones necesarias se obtuvieron los siguientes resultados
(las mediciones se realizaron cuatro veces para poder sacar estos resultados):
1) Porcentaje de utilización de CPU de los agentes:
1. IDS (Windows 2000):
a. Máquina 1 (subred 1): oscila entre 0% y 2%, según mediciones
sistema operativo
b. Máquina 2 (subred 2): oscila entre 0% y 3%, según mediciones
sistema operativo
2. Firewall (Linux Mandrake 10):
a. Máquina 1 (subred 1): utilización de 6%, según mediciones
sistema operativo
b. Máquina 2 (subred 2): utilización de 9%, según mediciones
sistema operativo
85
del
del
del
del
Figura 27. Diagrama de la red de prueba utilizada
86
Las mediciones de la utilización de CPU fueron obtenidas mediante el uso de
herramientas incorporadas en los sistemas operativos. Se realizaron mediciones cada
30 segundos por in intervalo de 5 minutos. Es importante aclarar que los servicios
que se estaban ejecutando en cada uno de los sistemas operativos de cada una de las
máquinas, son los que vienen por defecto tras la instalación de cada uno de los
sistemas operativos. Adicionalmente, en las máquinas de Windows 2000 se estaba
ejecutando el IDS (Kerio) y el agente. Por otro lado, en las máquinas con Linux se
estaba ejecutando Webmin, IpTables y el agente.
2) Utilización de la red de una herramienta comercial de gestión:
Antes de entrar a este punto es importante mostrar la carga de la red sin ninguna
herramienta de gestión ni de seguridad en ejecución. La Figura 28 muestra los
resultados obtenidos con una duración de la medida de aproximadamente de 10
minutos (en la subred 1). Teniendo en cuenta la velocidad de la tarjeta de red de la
máquina que realizó las mediciones en la subred 1 que es de 100 Mbps se puede
calcular la utilización (el porcentaje del ancho de banda disponible utilizado). En este
caso la utilización promedio es de 0.0005% aproximadamente.
Figura 28. Utilización de la red en la subred 1
Para esta prueba se utilizó una herramienta que provee la empresa AdventNet llamada
SNMP Trap Stormer, la cual se puede configurar para mandar Traps cada cierto
tiempo. Para que la herramienta se pueda comparar fácilmente con los agentes
utilizados, se configuró para que mandara Traps cada minuto (tiempo en el cual el
agente nuestro manda un Trap a la consola de seguridad diciendo que está vivo). La
herramienta también permite configurar los objetos y sus valores (varbinds) que va a
contener el Trap que, en este caso, se configuró de la misma forma en que lo
mandaría el agente. En la Figura 29 se puede observar la carga en la red bajo la
ejecución de la herramienta de gestión con una duración de la medida de
aproximadamente de 10 minutos en la misma subred. En este caso la utilización
promedio es de 0.0006% aproximadamente.
87
Figura 29. Utilización de la red en la subred 1
3) Prueba de funcionalidad de la aplicación: desempeño y funcionalidad
Luego de un ataque se compararon los registros encontrados en el log de las
herramientas generados por el ataque contra los eventos almacenados en la base de
datos.
a. IDS (Windows 2000):
a. Máquina 1: 5 entradas en el log y 5 eventos en la base de datos
b. Máquina 2: 5 entradas en el log y 5 eventos en la base de datos
b. Firewall (Linux Mandrake 10):
c. Máquina 1: 846 entradas en el log y 362 eventos en la base de datos
d. Máquina 2: 84 entradas en el log y 66 eventos en la base de datos
Ambos IDS reportaron cinco eventos de cinco entradas en el log, lo que indica un
100% de reportes de eventos desde los IDS. Por otro lado, el firewall de la máquina 1
y de la máquina 2 reportaron el 42.8% y 78.6% de eventos respectivamente.
Se realizaron pruebas adicionales para determinar la causa en la pérdida de eventos
no notificados. Una de las causas que lo afecta es el tiempo de procesamiento y de
notificación de los eventos, en primer lugar, la velocidad a la que funcionan los
lenguajes de programación utilizados: C y Java, siendo el segundo un poco más lento
por su velocidad de procesamiento. En segundo lugar, se observa que hubo más
pérdidas de eventos notificados en las máquinas que debían mandar los Traps de una
subred a otra, razón por la cual es muy importante el ancho de banda y la velocidad a
la que se comunican los enrutadores. En la máquina 2 hay menos entradas en el log
que en la máquina 1, debido a que el atacante está en otra subred y por consiguiente
se filtran varios tipos de ataques en los enrutadores. En la Tabla 9 las pruebas 1 y 2 de
las máquinas 1 y 2 se hicieron reportando por grupos de notificaciones de 100
eventos; las pruebas 3 y 4 de ambas máquinas se hicieron con grupos de a 50 eventos
y, por último, las pruebas 5 y 6 se hicieron con grupos de 25 eventos. Estos resultados
indican que el agente está enviando grupos de muchas notificaciones a la consola de
seguridad y en cierta manera la satura impidiendo que procese todos los grupos de
eventos recibidos. Bajando el número de eventos en cada grupo reportado, se logra
aumentar la capacidad de la consola de seguridad de procesar y analizar las
notificaciones recibidas. Adicionalmente se puede mejorar el envío de notificaciones
88
incluyendo algún tipo de “inteligencia” en el agente que pudiera decidir que notificar
y que no y que decida lo que es relevante añadir al grupo de notificaciones.
Prueba
1
2
3
4
5
6
Máquina 1
Máquina 2
Log
BD
%
Prueba
Log
BD
863
436
50.5
1
84
68
865
438
50.6
2
95
72
858
589
68.6
3
83
74
870
606
69.6
4
87
76
861
857
99.5
5
91
88
867
863
99.5
6
93
91
Tabla 9. Porcentaje de notificación de eventos en el log
%
80.9
75.8
89.1
87.3
96.7
97.8
4) Medición de la carga de red en estas condiciones (en ambas subredes):
a. Sin agentes ni consola de seguridad en ejecución:
Esta prueba se realizó para ver la utilización de la red en cada una de las subredes
para tener un punto de comparación con las pruebas siguientes. En la Figura 30
(a) se puede ver la utilización en la subred 1, mientras que en la Figura 30 (b) se
observa la utilización en la subred 2 con una duración de la medida de
aproximadamente de 10 minutos. Teniendo en cuenta la velocidad de la tarjeta de
red de la máquina que realizó las mediciones en la subred 2 que es de 10 Mbps se
puede calcular la utilización (el porcentaje del ancho de banda disponible
utilizado). En este caso la utilización promedio para la Figura 30 (a) es de
0.0005% aproximadamente y de 0.004% aproximadamente para la otra.
(a) – Subred 1
89
(b) – Subred 2
Figura 30. Utilización de la red
b. Con agentes y consola de seguridad en ejecución, pero sin ataque:
En esta prueba se puede observar la utilización de la red, en ambas subredes, tanto
de los agentes como de la consola de seguridad en ausencia de un ataque sobre los
equipos. En la Figura 31 (a) se aprecia la utilización en la subred 1, mientras que
en la Figura 31 (b) se observa la utilización en la subred 2 con una duración de la
medida de aproximadamente de 10 minutos. La última gráfica tiene esos picos
que indican la presencia de la consola de seguridad en esa subred, ya que cada
uno de los picos muestra cuando llegan los Traps de los agentes. Cada agente,
bajo ausencia de un ataque, manda un Trap cada minuto especificando que está en
ejecución y por tanto monitoreando la herramienta. Es por esto que cada minuto
un agente pone una carga adicional de aproximadamente 190 bytes en la red.
Cada uno de los picos tiene una duración de aproximadamente 10 segundos. En la
Figura 31 (c) podemos observar el tráfico generado en la subred 1, que a
diferencia de la figura (a), fue medida utilizando un concentrador, para que no
tuviéramos problemas en la medición debido a los dominios de colisión de un
switch. En este caso la utilización promedio aproximada para la Figura 31 (a) es
de 0.0005%, de 0.03% para la (b) y de 0.0009% para la (c).
(a) – Subred 1
90
(b) – Subred 2
(c) – Subred 1
Figura 31. Utilización de la red
c. Con agentes y consola de seguridad en ejecución, pero con ataque:
El siguiente paso en las pruebas es probar el desempeño de la red bajo el efecto de
un ataque sobre los equipos que están monitoreando los agentes, utilizando los
switches. En la Figura 32 (a) se observa la utilización en la subred 1, mientras que
en la Figura 32 (b) se muestra la utilización en la subred 2 con una duración de la
medida de aproximadamente de 15 minutos. En este caso la utilización promedio
aproximada durante la duración del ataque es para la Figura 32 (a) de 0.03% y de
1.5% para la gráfica (b). El ataque hacia todos los equipos tuvo una duración de
dos minutos y treinta segundos aproximadamente. La Figura 32 (b) tiene una
utilización del 1.5% ya que en la subred 2 se encuentra la consola de seguridad lo
que genera en esa subred más tráfico que el de un ataque normal, debido a las
notificaciones de los eventos por parte de los agentes en ambas subredes.
(a) – Subred 1
91
(b) – Subred 2
Figura 32. Utilización de la red
d. Sin agentes ni consola de seguridad, pero con ataque
Para poder determinar el tráfico adicional generado por la consola de seguridad,
bajo un ataque, es necesario medir la carga generada por el mismo tipo de ataque
que se hace sobre las máquinas con los agentes monitoreando, pero esta vez no
van a estar corriendo los agentes para no generar el tráfico adicional. En la Figura
33 (a) se puede ver la utilización en la subred 1, mientras que en la Figura 33 (b)
se observa la utilización en la subred 2, resultado que corresponde a una medición
en la máquina donde se tomaron las medidas. La duración de la medida fue de
aproximadamente de 10 minutos. La Figura 33 (c) muestra la utilización en la
subred 2 utilizando un concentrador, lo que muestra un resultado de medida total
de la subred. En este caso la utilización promedio aproximada durante el ataque
para la Figura 33 (a) es de 0.05%, de 0.004% para la (b) y de 0.15% para la (c).
(a) – Subred 1
(b) – Subred 2
92
(c) – Subred 2
Figura 33. Utilización de la red
5) Medición de la carga soportada por la consola de seguridad:
Esta prueba se realizó con el fin de determinar que tanta carga de información (en
este caso los Traps generados por los adaptadores) es capaz de soportar la consola de
seguridad hasta el punto de saturarse y dejar de funcionar correctamente. La finalidad
de la prueba es poder determinar cuántos adaptadores o Traps es capaz de soportar,
bajo el funcionamiento en el peor caso, que es cuando se está realizando un ataque
sobre las distintas máquinas monitoreadas y por ende se genera un gran número de
mensajes.
Vale la pena aclarar que la prueba tiene factores adicionales que pueden afectar el
umbral de mensajes que puede procesar la consola. Entre estos se encuentra que cada
Trap que recibe la consola debe ser procesada y analizada por el subsistema de
control de incidentes de seguridad y además debe ser almacenada la información en la
base de datos. Otro factor que entra en consideración es la velocidad con la que se
procesan las instrucciones de la aplicación dada la naturaleza de la herramienta de
desarrollo seleccionada, en este caso JAVA.
Para realizar la prueba se contó con una herramienta que genera Traps en ráfagas y
tiempos definibles. La herramienta a utilizar se llama SNMP Trap Stormer de
AdventNet. Permite configurar los Traps de la misma forma y con la misma
información como si fueran envidos desde los adaptadores.
Es importante mencionar que debido a la implementación de los adaptadores el
máximo número de Traps que se pueden a enviar desde los adaptadores desarrollados
es de 25 Traps por segundo. La prueba se realizó generando este tipo de tráfico desde
una estación hacia la consola de seguridad. Se configuraron los Traps de la misma
manera a como los enviaría un adaptador.
La Figura 34 muestra el tráfico normal de la red.
93
Figura 34. Tráfico normal de la red
La prueba se realizó enviando a la consola de seguridad 2000 y 3000 Traps para ver
si era capaz de soportar esta cantidad de mensajes. En el primer caso, la consola es
capaz de procesar y almacenar en la base de datos la información de un total de 1855
mensajes que los recibió en un periodo de 80 segundos, dando como resultado una
eficiencia del 92%. Para el último caso, se procesaron y almacenaron un total de 1872
mensajes durante 110 segundos, tiempo en el cual la aplicación dejó de responder. La
Figura 35 muestra la carga que recibió la consola de seguridad antes de dejar de
funcionar.
(a) 2000 Traps
(b) 3000 Traps
Figura 35. Gráficas del envío de un gran número de Traps a la consola
6.3 RESULTADOS DE LAS PRUEBAS
Como se puede observar, la utilización de CPU de los agentes es considerablemente
baja, lo cual no causa ninguna interferencia con el desempeño normal de la máquina,
ya que no consume recursos significativos.
94
Por otro lado, la carga adicional generada sobre la red debido a la utilización de los
agentes y de la consola de seguridad es baja. Cada agente pone aproximadamente 190
bytes en la red, en ausencia de un evento de seguridad, cada minuto para notificar que
está “vivo”. Con solo los adaptadores y la consola de seguridad en ejecución se
genera una utilización de menos de 0.001%. Que comparado con una herramienta de
gestión comercial, que tiene una utilización de 0.0006%, es muy similar, lo que nos
indica que la utilización de la red de la arquitectura desarrollada no es alta.
La carga adicional generada durante un ataque en la red debido a la arquitectura es de
aproximadamente un 10% debido a la notificación de eventos, carga que depende del
tipo de ataque realizado y del número de máquinas atacadas. Comportamiento
esperado durante un ataque.
La última prueba realizada permitió determinar el máximo número de Traps que la
consola de seguridad es capaz de recibir hasta dejar de funcionar. Según los
resultados, es capaz de soportar hasta 2500 Traps aproximadamente recibidos en un
periodo de 90 segundos. Un adaptador en el peor caso es capaz de generar hasta 25
mensajes en un segundo, por esta razón se puede decir que la consola soporta hasta
100 adaptadores aproximadamente. Para mejorar estos resultados puede ser necesaria
la utilización de un balanceador de carga y de un procesamiento distribuido de la
información que requiere la consola. Esto no quiere decir que se vayan a tener varias
consolas, por el contrario se va a tener una sola y el procesamiento de la información
recibida se va a hacer en forma distribuida. Permitiendo que de esta manera la
consola de seguridad consolide toda esta información. Recordemos que este análisis
es para el peor caso y se espera que solo suceda en condiciones extremas de ataques
similares a DDoS, sin embargo no se podrían procesar más de 2500 Traps.
En las pruebas realizadas se ve la importancia de utilizar switches con contraposición
a los concentradores. La característica principal de los switches es la de separar las
máquinas o subredes en dominios de colisión. La idea de los dominios de colisión es
separar el tráfico entre cada uno de ellos. Es decir que en un dominio de colisión no
se va a ver ningún tráfico proveniente de otros dominios, disminuyendo la cantidad
de tráfico que va a estar fluyendo hacia otras máquinas o subredes. Caso que se ve
perfectamente ilustrado en las Figuras 31 (a) y 33 (b) donde no se ve el tráfico que se
genera en los otros dominios y es por esto que no se pudo medir y fue necesario la
utilización de un concentrador. De aquí surge la importancia de utilizar los switches
antes de los concentradores.
95
7 CONCLUSIONES
El modelo de seguridad propuesto puede ser utilizado sin importar el costo de las
herramientas de gestión de red (ya que soporta cualquier herramienta para la
integración con la consola de seguridad), que soportan SNMP o de las herramientas
de seguridad, que lo verdaderamente importante es que utilicen logs legibles para
poder ser interpretados por los adaptadores.
La unificación de la gestión de red y de seguridad es posible mediante la utilización
del protocolo de aplicación SNMP, que, mediante la versión 3 se garantiza
confidencialidad, autenticación, encripción e integridad en las notificaciones que
hagan los agentes de seguridad. La Figura 36 muestra la respuesta de un mensaje
SNMPv3 de tipo Get. Como se puede observar, todos los campos correspondientes al
OID, valor y otros campos adicionales, se encuentran encriptados lo que garantiza la
confidencialidad de las notificaciones que envían los agentes.
Bajo este hecho se logra consolidar un modelo que permite plantear la integración de
la gestión de red y de la seguridad de la red de una manera muy segura y que va a
permitir facilitar la administración de los recursos de red, en ambos niveles, sean
elementos de gestión o de seguridad.
Los patrones de ataques identifican que un atacante normalmente accede una serie de
máquinas hasta llegar a la víctima, en donde puede tratar de violentar el sistema
mediante la explotación de alguna vulnerabilidad del sistema operativo o de alguna
aplicación que se esté ejecutando en el equipo. En este caso es de suma importancia
poder detectar de una manera centralizada el patrón que está siguiendo un atacante en
nuestra red para ganar acceso a un equipo. Esto se puede realizar de una manera muy
simple mirando los logs de cada una de las herramientas de seguridad y/o sistemas
operativos de las máquinas o elementos de red utilizados, procedimiento arduo y que
consume mucho tiempo del administrador de la red, tiempo que podría ser utilizado
en otras actividades. Mediante la utilización de un modelo de seguridad como el
propuesto, es posible hacer que el proceso de consolidación y auditoria de logs sea
mucho más sencillo y a tiempo, ya que estamos centralizando en la consola de
seguridad todas las notificaciones que se reciben de los adaptadores, o sea, de las
herramientas que estamos monitoreando. Disminuyendo drásticamente el tiempo de
respuesta ante un incidente distribuido en toda la red monitoreada.
Adicionalmente se provee la utilización de procedimientos en los incidentes de
seguridad y eventos que permiten detallar exactamente lo sucedido y la acción
tomada para su solución. Se permite guardar un histórico de los hechos que han
acontecido en la red, mediante los incidentes de cada una de las máquinas.
96
El uso de los incidentes y eventos le da al modelo una riqueza mayor. A partir de la
secuencia de eventos se pueden construir herramientas que analicen esos datos y
detecten en ellos nuevos patrones de ataques y hasta nuevas firmas que podrían llegar
a servirle a un IDS. Los incidentes y eventos le trae a la empresa un valor agregado
que le permite hacerle un seguimiento a los eventos y ver que fue lo que pasó,
facilitando procesos de auditorías e inclusive procesos de análisis forense.
Adicionalmente, los procedimientos para la solución de los eventos se pueden utilizar
para la creación de documentos que pueden servirle a la empresa como capacitación,
entrenamiento o documentación a los nuevos empleados.
Se puede minimizar el tiempo de respuesta frente a un nuevo incidente, ya que se
cuenta con una base de datos de incidentes anteriores que pueden confrontarse para
llegar a la solución del nuevo incidente.
Para que este modelo sea más efectivo los proveedores de las herramientas de
seguridad deben poner en los logs la mayor cantidad de información de un evento
para que su aporte sea aún más y permita notificar más información relevante de cada
hecho. Con el fin de alcanzar este objetivo, es importante tender a una
estandarización de los logs, de tal forma que todos los desarrolladores de
herramientas de seguridad tiendan a utilizar este estándar y así facilitar la integración
de las herramientas de seguridad. También deben proveer en el log un campo de
procesado para poder identificar los registros en el log que fueron procesados por el
agente y cuales no, para que se pueda garantizar que no se pierda ningún registro o
ninguna notificación de un evento importante.
Es bien importante que los desarrolladores de las herramientas de seguridad incluyan
otros medios de notificación como por ejemplo vía correo, mandando un mensaje a
un celular o una PDA, etc. adicionales a las alertas generadas en el entorno de ella
misma o inclusive al log mismo, para notificar cualquier evento de seguridad
detectado. Se recomienda adicionar a la aplicación desarrollada un agente SNMP que
genere alertas vía este protocolo para que de esta forma se pueda integrar con mayor
facilidad la gestión de red y de seguridad, seguramente, sin la necesidad de una
consola de seguridad. Para lograr esto es necesario guiarse por algún estándar de
manera que junto con los otros desarrolladores se cierre con mayor facilidad la brecha
entre la gestión de red y seguridad.
97
Figura 36. Estructura de un mensaje SNMPv3
98
8 CONTINUIDAD DEL PROYECTO
8.1 POSIBLES TRABAJOS FUTUROS
1. Plantear un estándar para que la generación de logs se aplique a las
herramientas, mediante la utilización de estándares como el de Syslog. Una
idea puede ser la de utilizar el formato propuesto por Syslog y definir los
campos importantes que pueden ir en el mensaje. Es importante mencionar los
separadores de campos y los identificadores de campos, que permiten
identificar el campo y su valor.
2. Plantear y crear nuestra arquitectura como una librería a incluir dentro de otro
desarrollo para que nuestra arquitectura sirva de plataforma para proyectos
futuros y así puedan utilizarla independiente de nuestra implementación. De
esta forma nuestra arquitectura puede ser una capa más en otra arquitectura.
3. Mediante la integración de los logs, poder hacerle un seguimiento cronológico
a un atacante que accede a una serie de máquinas hasta ingresar a su objetivo
y determinar su patrón de ataque.
4. Poner un tipo de inteligencia en los agentes de seguridad para que puedan
tomar decisiones sobre lo que notifican y lo que no es necesario notificar de
los logs de cada una de las herramientas de seguridad. De acuerdo a si es
tráfico normal en la red o si es un rastro o una firma de un ataque.
5. A partir de los datos almacenados en la base de datos, se puede construir una
herramienta que analice estos datos y detecte patrones de ataques. Una
herramienta que de alguna manera analice los incidentes de seguridad
almacenados y sepa detectar lo que quieren decir. Esto debe ser un análisis
con base en las herramientas de seguridad y debe ser capaz de tomar
decisiones sobre lo que analiza.
6. Implementar un método de filtrado de mensajes en la consola de seguridad
para evitar que se guarden en los incidentes mensajes de tipos de tráficos
similares a los ya existentes, para evitar que se vean eventos iguales y que la
base de datos se sature de información duplicada, pero que quede registrado
que ha habido eventos subsiguientes. Por ejemplo bajo un ataque DoS.
7. Crear una herramienta que haga el análisis de datos para determinar
estadísticas de ataques. Como por ejemplo la máquina que más ha sido
99
infectada con virus, los virus más abundantes en la red, tipos de ataques que
ha recibido una máquina, usuarios más peligrosos, entre otras estadísticas.
8. Desarrollar un mecanismo para manejar la distribución de la carga en varios
puntos de procesamiento de la información que necesita la consola de
seguridad. De esta forma se puede mejorar el rendimiento y el soporte de más
adaptadores del modelo propuesto.
100
BIBLIOGRAFIA
[1] “La proactividad: clave de la gestión de red”, disponible en:
http://www.redestelecom.com/Actualidad/An%C3%A1lisis/Comunicaciones/Telefon
%C3%ADa/20030731011
[2] Herráez, Mª Blanca. “Introducción a los sistemas de gestión de red”, disponible
en: http://www.info-ab.uclm.es/asignaturas/42621/transpas/dmrTema1x1.pdf
[3] Mª Blanca Herráez. “Herramientas de gestión de red”, disponible en:
http://www.info-ab.uclm.es/asignaturas/42621/transpas/dmrTema6x2.pdf
[4] Northcutt, Stephen. “Guía avanzada: Detección de intrusos”, 2ª edición, Madrid,
2001.
[5] Zielger, Robert L. “Guía avanzada: Firewalls Linux”, 1ª edición, Madrid, 2000.
[6] “GFI: Intrusion Detection software”, disponible en: http://www.gfi.com/lanselm/
[7] Terplan, Kornel. Communication Networks Management, Prentice Hall, New
Jersey, 1992.
[8] Baiba Marti, Antoni. Gestión de red, Edicions OPC, Universita Politècnica de
Catalunya, España, 2001
[9] SNMP Tutorial Series: 5 Quick Steps to Understanding SNMP and its Role in
Network
Alarm
Monitoring,
tomado
de
http://www.dpstele.com/layers/l2/snmp_tutorials.html
[10] Stallings, William. SNMP, SNMPv2, SNMPv3, and RMON 1 and 2, 3ª edición,
Addison Wesley, 1999.
[11] Perkins, David T. Understanding SNMP MIBs, 1993
[12] How to Eliminate Spyware to Protect Your Business, disponible en:
http://ca.com/smb/howcani/eliminate_spyware.pdf
[13] Information Security 101: Security for
http://www.sans.org/rr/whitepapers/basics/444.php
Newbies,
disponible
en:
[14] GIAC Security Essentials Certifications (GSEC) Practical Assignment,
disponible en: http://www.sans.org/rr/whitepapers/basics/1071.php
101
[15] Protecting the Network without Breaking the Bank, disponible en:
http://www.sans.org/rr/whitepapers/firewalls/809.php
[16]
Security
in
PracticeReducing
the
http://www.sans.org/rr/whitepapers/bestprac/1106.php
[17]
Threats
to
Enterprise
http://www.securitydocs.com/library/3211
Effort,
Security,
disponible
disponible
en:
en:
[18] Spyware and Adware – Threats and Countermeasures, disponible en:
http://www.finjan.com/company/whitepapers/Spyware_White_Paper.pdf
[19] Especificado en la recomendación X.690 y X.691 de la ITU-T
[20] RFC 2271 - An Architecture for Describing SNMP Management Frameworks,
disponible en: http://www.ietf.org/rfc/rfc2271.txt
[21] RFC 3164 - The
http://www.ietf.org/rfc/rfc3164.txt
BSD
102
syslog
Protocol,
disponible
en:
ANEXO 1: TÉRMINOS DE LICENCIAMIENTO
Various copyrights apply to this package, listed in various separate
parts
below. Please make sure that you read all the parts. Up until
2001,
the project was based at UC Davis, and the first part covers all
code
written during this time. From 2001 onwards, the project has been
based at SourceForge, and Networks Associates Technology, Inc hold
the
copyright on behalf of the wider Net-SNMP community, covering all
derivative work done since then. An additional copyright section
has
been added as Part 3 below also under a BSD license for the work
contributed by Cambridge Broadband Ltd. to the project since 2001.
An additional copyright section has been added as Part 4 below also
under a BSD license for the work contributed by Sun Microsystems,
Inc.
to the project since 2003.
Code has been contributed to this project by many people over
the years it has been in development, and a full list of
contributors
can be found in the README file under the THANKS section.
---- Part 1: CMU/UCD copyright notice: (BSD like) ----Copyright 1989, 1991, 1992 by Carnegie Mellon University
Derivative Work - 1996, 1998-2000
Copyright 1996, 1998-2000 The Regents of the University of
California
All Rights Reserved
Permission to use, copy, modify and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appears in all copies and
that both that copyright notice and this permission notice appear in
supporting documentation, and that the name of CMU and The Regents
of
the University of California not be used in advertising or publicity
pertaining to distribution of the software without specific written
permission.
CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR
103
THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY
SPECIAL,
INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
RESULTING
FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
---- Part 2: Networks Associates Technology, Inc copyright notice
(BSD) ----Copyright (c) 2001-2003, Networks Associates Technology, Inc
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice,
this list of conditions and the following disclaimer.
*
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the
documentation and/or other materials provided with the
distribution.
* Neither the name of the Networks Associates Technology, Inc nor
the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF
104
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---- Part 3: Cambridge Broadband Ltd. copyright notice (BSD) ----Portions of this code are copyright (c) 2001-2003, Cambridge
Broadband Ltd.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice,
this list of conditions and the following disclaimer.
*
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the
documentation and/or other materials provided with the
distribution.
* The name of Cambridge Broadband Ltd. may not be used to endorse
or
promote products derived from this software without specific
prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---- Part 4: Sun Microsystems, Inc. copyright notice (BSD) ----Copyright © 2003 Sun Microsystems, Inc., 4150 Network Circle, Santa
Clara,
California 95054, U.S.A. All rights reserved.
Use is subject to license terms below.
This distribution may include materials developed by third parties.
105
Sun, Sun Microsystems, the Sun logo and Solaris are trademarks or
registered
trademarks of Sun Microsystems, Inc. in the U.S. and other
countries.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice,
this list of conditions and the following disclaimer.
*
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the
documentation and/or other materials provided with the
distribution.
*
Neither the name of the Sun Microsystems, Inc. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior
written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---- Part 5: Sparta, Inc copyright notice (BSD) ----Copyright (c) 2003-2004, Sparta, Inc
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
106
* Redistributions of source code must retain the above copyright
notice,
this list of conditions and the following disclaimer.
*
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the
documentation and/or other materials provided with the
distribution.
* Neither the name of Sparta, Inc nor the names of its contributors
may
be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---- Part 6: Cisco/BUPTNIC copyright notice (BSD) ----Copyright (c) 2004, Cisco, Inc and Information Network
Center of Beijing University of Posts and Telecommunications.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice,
this list of conditions and the following disclaimer.
*
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the
documentation and/or other materials provided with the
distribution.
107
*
Neither the name of Cisco, Inc, Beijing University of Posts and
Telecommunications, nor the names of their contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
108
ANEXO 2: ESTRUCTURA DE UNA MIB
APPLICATION-MIB DEFINITIONS ::= BEGIN
IMPORTS
DisplayString FROM RFC1213-MIB
MODULE-IDENTITY, OBJECT-TYPE, enterprises
FROM SNMPv2-SMI;
modSeg MODULE-IDENTITY
LAST-UPDATED "0502031400Z"
ORGANIZATION "Proyecto de Investigación"
CONTACT-INFO
"
Nicolás Botero A.
Director: Enrique Ruiz.
Pontificia Universidad Javeriana
Ingeniería de sistemas
e-mail: [email protected]"
DESCRIPTION
"Modulo MIB que contendra las MIB's de las herramientas a
monitorear."
REVISION
"0502031400Z"
DESCRIPTION
"Definición de la estructura en el árbol."
::= { modSegSNMP 3 }
modSegSNMP
agente
consola
OBJECT IDENTIFIER ::= { enterprises 1 }
OBJECT IDENTIFIER ::= { modSegSNMP 1 }
OBJECT IDENTIFIER ::= { modSegSNMP 2 }
END
KERIO-MIB DEFINITIONS ::= BEGIN
IMPORTS
DisplayString FROM RFC1213-MIB
MODULE-IDENTITY, OBJECT-TYPE, enterprises
agente FROM APPLICATION-MIB;
FROM SNMPv2-SMI
modSeg MODULE-IDENTITY
LAST-UPDATED "0502031400Z"
ORGANIZATION "Proyecto de Investigación"
CONTACT-INFO
"
Nicolás Botero A.
Pontificia Universidad Javeriana
Ingeniería de sistemas
e-mail: [email protected]"
DESCRIPTION
"Modulo MIB para monitorear el IDS de la aplicación Kerio."
REVISION
"0502031400Z"
DESCRIPTION
"Implementación de los objetos que se van a monitorear de la
aplicación Kerio."
::= { enterprises 1 }
109
kerio
OBJECT IDENTIFIER ::= { agente 1 }
kDate OBJECT-TYPE
SYNTAX
MAX-ACCESS
STATUS
DESCRIPTION
"La fecha
::= { kerio 1 }
OCTET STRING
read-only
current
del registro en el log de la aplicación."
kTime OBJECT-TYPE
SYNTAX
OCTET STRING
MAX-ACCESS read-only
STATUS
current
DESCRIPTION
"La hora del registro en el log de la aplicación."
::= { kerio 2 }
kHost OBJECT-TYPE
SYNTAX
MAX-ACCESS
STATUS
DESCRIPTION
"El nombre
::= { kerio 3 }
OCTET STRING
read-only
current
del equipo en donde se está ejecutando la aplicación."
kActionTaken OBJECT-TYPE
SYNTAX
OCTET STRING
MAX-ACCESS read-only
STATUS
current
DESCRIPTION
"La acción que tomó la aplicación cuando sucedió el evento registrado
en el log."
::= { kerio 4 }
kRemoteAddress OBJECT-TYPE
SYNTAX
OCTET STRING
MAX-ACCESS read-only
STATUS
current
DESCRIPTION
"Dirección remota desde donde se originó el evento registrado en el
log."
::= { kerio 5 }
kMessage OBJECT-TYPE
SYNTAX
OCTET STRING
MAX-ACCESS read-only
STATUS
current
DESCRIPTION
"Mensaje que describe cual fue el evento ocurrido en la aplicación."
::= { kerio 6 }
kDirection OBJECT-TYPE
SYNTAX
OCTET STRING
MAX-ACCESS read-only
STATUS
current
DESCRIPTION
"Dirección que tuvo el evento registrado en el log. Puede ser originada
hacia el equipo o desde el equipo."
::= { kerio 7 }
kClassification OBJECT-TYPE
SYNTAX
OCTET STRING
MAX-ACCESS read-only
STATUS
current
DESCRIPTION
110
"La clasificación que le asignó la aplicación al evento ocurrido. Es el
nombre bajo el que se clasificó el evento. Normalmente
y según el tipo de ataque, se puede clasificar en determinadas
categorías."
::= { kerio 8 }
kPriority OBJECT-TYPE
SYNTAX
OCTET STRING
MAX-ACCESS read-only
STATUS
current
DESCRIPTION
"La prioridad (importancia o relevancia) que le asignó la palicación al
evento."
::= { kerio 9 }
kStateOfInterface OBJECT-TYPE
SYNTAX
Integer32
MAX-ACCESS read-write
STATUS
current
DEFVAL { 1 }
DESCRIPTION
"El estado en el que se encuentra la interface que conecta el equipo a
la red. Arriba (1) y abajo (0)."
::= { kerio 10 }
END
111
ANEXO 3: IMPLEMENTACIÓN DE UNA MIB
#include
#include
#include
#include
#include
static
static
static
static
static
static
static
static
static
static
<net-snmp/net-snmp-config.h>
<net-snmp/net-snmp-includes.h>
<net-snmp/agent/net-snmp-agent-includes.h>
"kerio.h"
"kerioLogAnalyzer.h"
char *data_kDate="";
char *data_kTime="";
char *data_kHost="";
char *data_kActionTaken="";
char *data_kRemoteAddress="";
char *data_kMessage="";
char *data_kDirection="";
char *data_kClassification="";
char *data_kPriority="";
int data_kStateOfInterface=1;
#define SYS_STRING_LEN 256
char
version_descr1[SYS_STRING_LEN] = VERS_DESC;
char
sysName1[SYS_STRING_LEN] = SYS_NAME;
void
init_kerio(void)
{
static oid kDate_oid[] = { 1,3,6,1,4,1,1,1,1,1 };
static oid kTime_oid[] = { 1,3,6,1,4,1,1,1,1,2 };
static oid kHost_oid[] = { 1,3,6,1,4,1,1,1,1,3 };
static oid kActionTaken_oid[] = { 1,3,6,1,4,1,1,1,1,4 };
static oid kRemoteAddress_oid[] = { 1,3,6,1,4,1,1,1,1,5 };
static oid kMessage_oid[] = { 1,3,6,1,4,1,1,1,1,6 };
static oid kDirection_oid[] = { 1,3,6,1,4,1,1,1,1,7 };
static oid kClassification_oid[] = { 1,3,6,1,4,1,1,1,1,8 };
static oid kPriority_oid[] = { 1,3,6,1,4,1,1,1,1,9 };
static oid kStateOfInterface_oid[] = { 1,3,6,1,4,1,1,1,1,10,0 };
data_kDate=(char *)malloc(sizeof(char *) + 1);
data_kTime=(char *)malloc(sizeof(char *) + 1);
data_kHost=(char *)malloc(sizeof(char *) + 1);
data_kActionTaken=(char *)malloc(sizeof(char *) + 1);
data_kRemoteAddress=(char *)malloc(sizeof(char *) + 1);
data_kMessage=(char *)malloc(sizeof(char *) + 1);
data_kDirection=(char *)malloc(sizeof(char *) + 1);
data_kClassification=(char *)malloc(sizeof(char *) + 1);
data_kPriority=(char *)malloc(sizeof(char *) + 1);
readFileK();
#ifdef HAVE_UNAME
struct utsname utsName;
uname(&utsName);
snprintf(version_descr1, sizeof(version_descr1),
"%s %s %s %s %s", utsName.sysname,
utsName.nodename, utsName.release, utsName.version,
utsName.machine);
version_descr1[ sizeof(version_descr1)-1 ] = 0;
#else
#if HAVE_EXECV
struct extensible extmp;
sprintf(extmp.command, "%s -a", UNAMEPROG);
extmp.type = EXECPROC;
extmp.next = NULL;
112
exec_command(&extmp);
strncpy(version_descr1, extmp.output, sizeof(version_descr1));
version_descr1[sizeof(version_descr1) - 1] = 0;
version_descr1[strlen(version_descr1) - 1] = 0;
#else
#endif
#endif
#ifdef HAVE_GETHOSTNAME
gethostname(sysName1, sizeof(sysName1));
#else
#ifdef HAVE_UNAME
strncpy(sysName1, utsName.nodename, sizeof(sysName1));
#else
#if HAVE_EXECV
sprintf(extmp.command, "%s -n", UNAMEPROG);
extmp.type = EXECPROC;
extmp.next = NULL;
exec_command(&extmp);
strncpy(sysName1, extmp.output, sizeof(sysName1));
sysName1[strlen(sysName1) - 1] = 0;
#else
strcpy(sysName1, "unknown");
#endif
/* HAVE_EXECV */
#endif
/* HAVE_UNAME */
#endif
/* HAVE_GETHOSTNAME */
strcpy(data_kHost,sysName1);
DEBUGMSGTL(("kerio", "Initializing\n"));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kDate", handle_kDate,
kDate_oid, OID_LENGTH(kDate_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kTime", handle_kTime,
kTime_oid, OID_LENGTH(kTime_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kHost", handle_kHost,
kHost_oid, OID_LENGTH(kHost_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kActionTaken", handle_kActionTaken,
kActionTaken_oid, OID_LENGTH(kActionTaken_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kRemoteAddress", handle_kRemoteAddress,
kRemoteAddress_oid, OID_LENGTH(kRemoteAddress_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kMessage", handle_kMessage,
kMessage_oid, OID_LENGTH(kMessage_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kDirection", handle_kDirection,
kDirection_oid, OID_LENGTH(kDirection_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_scalar(
netsnmp_create_handler_registration("kClassification", handle_kClassification,
kClassification_oid, OID_LENGTH(kClassification_oid),
HANDLER_CAN_RONLY
));
113
netsnmp_register_scalar(
netsnmp_create_handler_registration("kPriority", handle_kPriority,
kPriority_oid, OID_LENGTH(kPriority_oid),
HANDLER_CAN_RONLY
));
netsnmp_register_int_instance("kStateOfInterface",
kStateOfInterface_oid,
OID_LENGTH(kStateOfInterface_oid),
&data_kStateOfInterface,
handle_kStateOfInterface);
snmp_alarm_register(5,
SA_REPEAT,
call_log_analyzer_kerio,
NULL
);
snmp_alarm_register(60,
SA_REPEAT,
call_no_news_kerio,
NULL
);
snmp_alarm_register(1,
0,
call_startup_kerio,
NULL
);
}
int
handle_kDate(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kDate,
strlen(data_kDate));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kDate\n", reqinfo->mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
int
handle_kTime(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kTime,
strlen(data_kTime));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kTime\n", reqinfo->mode );
114
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
int
handle_kHost(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kHost,
strlen(data_kHost));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kHost\n", reqinfo->mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
int
handle_kActionTaken(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kActionTaken,
strlen(data_kActionTaken));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kActionTaken\n", reqinfo>mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
int
handle_kRemoteAddress(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kRemoteAddress,
strlen(data_kRemoteAddress));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kRemoteAddress\n", reqinfo>mode );
return SNMP_ERR_GENERR;
}
115
return SNMP_ERR_NOERROR;
}
int
handle_kMessage(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kMessage,
strlen(data_kMessage));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kMessage\n", reqinfo->mode
);
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
int
handle_kDirection(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kDirection,
strlen(data_kDirection));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kDirection\n", reqinfo>mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
int
handle_kClassification(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kClassification,
strlen(data_kClassification));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kClassification\n",
reqinfo->mode );
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
116
int
handle_kPriority(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
switch(reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *) data_kPriority,
strlen(data_kPriority));
break;
default:
snmp_log(LOG_ERR, "unknown mode (%d) in handle_kPriority\n", reqinfo->mode
);
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}
int
handle_kStateOfInterface(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info
*reqinfo,
netsnmp_request_info
*requests)
{
if(reqinfo->mode==MODE_GET)
{
snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
(u_char *) &data_kStateOfInterface,
sizeof(data_kStateOfInterface));
}
if(reqinfo->mode==MODE_SET_ACTION)
{
if(data_kStateOfInterface==0)
{
printf("Bring down interface");
system("ipconfig /release");
}
}
return SNMP_ERR_NOERROR;
}
void
call_log_analyzer_kerio(unsigned int clientreg, void *clientarg)
{
struct kerioIds *data;
int i=0;
data=(struct kerioIds *) calloc(1, sizeof(struct kerioIds));
data->rdate=(struct CDate *) calloc(1, sizeof(struct CDate));
strcpy(data->action,"a");
data=readAllK();
if(strcmp(data->action,"")!=0)
{
strcpy(data_kDate,data->rdate->date);
strcpy(data_kTime,data->rdate->time);
strcpy(data_kActionTaken,data->action);
strcpy(data_kRemoteAddress,data->raddr);
strcpy(data_kMessage,data->msg);
strcpy(data_kDirection,data->direc);
strcpy(data_kClassification,data->class1);
data->priority[strlen(data->priority)-1]='\0';
strcpy(data_kPriority,data->priority);
117
send_kNotifyTrap_trap();
}
}
void
call_no_news_kerio(unsigned int clientreg, void *clientarg)
{
char
name[SYS_STRING_LEN] = SYS_NAME;
char *tmp_kDate="99/Dec/9999";
netsnmp_variable_list *var_list = NULL;
oid kNotifyTrap_oid[] = { 1,3,6,1,4,1,1,1,1,11,1 };
size_t
kNotifyTrap_oid_len = OID_LENGTH(kNotifyTrap_oid);
oid
size_t
objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
objid_snmptrap_len = OID_LENGTH(objid_snmptrap);
oid kDate_oid[] = { 1,3,6,1,4,11,1,1,1,0 };
size_t
kDate_oid_len = OID_LENGTH(kDate_oid);
oid kHost_oid[] = { 1,3,6,1,4,1,1,1,1,3,0 };
size_t
kHost_oid_len = OID_LENGTH(kHost_oid);
gethostname(name, sizeof(name));
snmp_varlist_add_variable(&var_list,
objid_snmptrap, objid_snmptrap_len,
ASN_OBJECT_ID,
(u_char *) kNotifyTrap_oid, kNotifyTrap_oid_len * sizeof(oid));
snmp_varlist_add_variable(&var_list,
kDate_oid, kDate_oid_len,
ASN_OCTET_STR,
tmp_kDate, strlen(tmp_kDate));
snmp_varlist_add_variable(&var_list,
kHost_oid, kHost_oid_len,
ASN_OCTET_STR,
name, strlen(name));
send_v2trap( var_list );
snmp_free_varbind( var_list );
}
void
call_startup_kerio(unsigned int clientreg, void *clientarg)
{
char
name[SYS_STRING_LEN] = SYS_NAME;
char *tmp_kDate="STARTUP";
netsnmp_variable_list *var_list = NULL;
oid kNotifyTrap_oid[] = { 1,3,6,1,4,1,1,1,1,11,1 };
size_t
kNotifyTrap_oid_len = OID_LENGTH(kNotifyTrap_oid);
oid
size_t
objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
objid_snmptrap_len = OID_LENGTH(objid_snmptrap);
oid kDate_oid[] = { 1,3,6,1,4,11,1,1,1,0 };
size_t
kDate_oid_len = OID_LENGTH(kDate_oid);
oid kHost_oid[] = { 1,3,6,1,4,1,1,1,1,3,0 };
size_t
kHost_oid_len = OID_LENGTH(kHost_oid);
gethostname(name, sizeof(name));
snmp_varlist_add_variable(&var_list,
objid_snmptrap, objid_snmptrap_len,
ASN_OBJECT_ID,
(u_char *) kNotifyTrap_oid, kNotifyTrap_oid_len * sizeof(oid));
118
snmp_varlist_add_variable(&var_list,
kDate_oid, kDate_oid_len,
ASN_OCTET_STR,
tmp_kDate, strlen(tmp_kDate));
snmp_varlist_add_variable(&var_list,
kHost_oid, kHost_oid_len,
ASN_OCTET_STR,
name, strlen(name));
send_v2trap( var_list );
snmp_free_varbind( var_list );
}
int
send_kNotifyTrap_trap( void )
{
char *name="Kerio Personal Firewall";
char *type="IDS";
char *version="4.1";
netsnmp_variable_list *var_list = NULL;
oid kNotifyTrap_oid[] = { 1,3,6,1,4,1,1,1,1,11,1 };
size_t
kNotifyTrap_oid_len = OID_LENGTH(kNotifyTrap_oid);
oid
size_t
objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
objid_snmptrap_len = OID_LENGTH(objid_snmptrap);
oid kDate_oid[] = { 1,3,6,1,4,11,1,1,1,0 };
size_t
kDate_oid_len = OID_LENGTH(kDate_oid);
oid kTime_oid[] = { 1,3,6,1,4,1,1,1,1,2,0 };
size_t
kTime_oid_len = OID_LENGTH(kTime_oid);
oid kHost_oid[] = { 1,3,6,1,4,1,1,1,1,3,0 };
size_t
kHost_oid_len = OID_LENGTH(kHost_oid);
oid kActionTaken_oid[] = { 1,3,6,1,4,1,1,1,1,4,0 };
size_t
kActionTaken_oid_len = OID_LENGTH(kActionTaken_oid);
oid kRemoteAddress_oid[] = { 1,3,6,1,4,1,1,1,1,5,0 };
size_t
kRemoteAddress_oid_len = OID_LENGTH(kRemoteAddress_oid);
oid kMessage_oid[] = { 1,3,6,1,4,1,1,1,1,6,0 };
size_t
kMessage_oid_len = OID_LENGTH(kMessage_oid);
oid kDirection_oid[] = { 1,3,6,1,4,1,1,1,1,7,0 };
size_t
kDirection_oid_len = OID_LENGTH(kDirection_oid);
oid kClassification_oid[] = { 1,3,6,1,4,1,1,1,1,8,0 };
size_t
kClassification_oid_len = OID_LENGTH(kClassification_oid);
oid kPriority_oid[] = { 1,3,6,1,4,1,1,1,1,9,0 };
size_t
kPriority_oid_len = OID_LENGTH(kPriority_oid);
oid kStateOfInterface_oid[] = { 1,3,6,1,4,1,1,1,1,10,0 };
size_t
kStateOfInterface_oid_len = OID_LENGTH(kStateOfInterface_oid);
oid kToolName_oid[] = { 1,3,6,1,4,1,1,1,1,12,0 };
size_t
kToolName_oid_len = OID_LENGTH(kToolName_oid);
oid kToolType_oid[] = { 1,3,6,1,4,1,1,1,1,13,0 };
size_t
kToolType_oid_len = OID_LENGTH(kToolType_oid);
oid kToolVersion_oid[] = { 1,3,6,1,4,1,1,1,1,14,0 };
size_t
kToolVersion_oid_len = OID_LENGTH(kToolVersion_oid);
snmp_varlist_add_variable(&var_list,
objid_snmptrap, objid_snmptrap_len,
119
ASN_OBJECT_ID,
(u_char *) kNotifyTrap_oid, kNotifyTrap_oid_len * sizeof(oid));
snmp_varlist_add_variable(&var_list,
kDate_oid, kDate_oid_len,
ASN_OCTET_STR,
data_kDate, strlen(data_kDate));
snmp_varlist_add_variable(&var_list,
kTime_oid, kTime_oid_len,
ASN_OCTET_STR,
data_kTime, strlen(data_kTime));
snmp_varlist_add_variable(&var_list,
kHost_oid, kHost_oid_len,
ASN_OCTET_STR,
data_kHost, strlen(data_kHost));
snmp_varlist_add_variable(&var_list,
kToolName_oid, kToolName_oid_len,
ASN_OCTET_STR,
name, strlen(name));
snmp_varlist_add_variable(&var_list,
kToolType_oid, kToolType_oid_len,
ASN_OCTET_STR,
type, strlen(type));
snmp_varlist_add_variable(&var_list,
kToolVersion_oid, kToolVersion_oid_len,
ASN_OCTET_STR,
version, strlen(version));
snmp_varlist_add_variable(&var_list,
kActionTaken_oid, kActionTaken_oid_len,
ASN_OCTET_STR,
data_kActionTaken, strlen(data_kActionTaken));
snmp_varlist_add_variable(&var_list,
kRemoteAddress_oid, kRemoteAddress_oid_len,
ASN_OCTET_STR,
data_kRemoteAddress, strlen(data_kRemoteAddress));
snmp_varlist_add_variable(&var_list,
kMessage_oid, kMessage_oid_len,
ASN_OCTET_STR,
data_kMessage, strlen(data_kMessage));
snmp_varlist_add_variable(&var_list,
kDirection_oid, kDirection_oid_len,
ASN_OCTET_STR,
data_kDirection, strlen(data_kDirection));
snmp_varlist_add_variable(&var_list,
kClassification_oid, kClassification_oid_len,
ASN_OCTET_STR,
data_kClassification, strlen(data_kClassification));
snmp_varlist_add_variable(&var_list,
kPriority_oid, kPriority_oid_len,
ASN_OCTET_STR,
data_kPriority, strlen(data_kPriority));
snmp_varlist_add_variable(&var_list,
kStateOfInterface_oid, kStateOfInterface_oid_len,
ASN_INTEGER,
(u_char *)&data_kStateOfInterface, sizeof(data_kStateOfInterface));
120
send_v2trap( var_list );
snmp_free_varbind( var_list );
return SNMP_ERR_NOERROR;
}
121
ANEXO 4: MANUAL DEL USUARIO
Referirse al Anexo 7 para la instalación de los adaptadores y la ejecución de la
consola de seguridad.
1. CONSOLA DE SEGURIDAD
La consola de seguridad no requiere de ningún proceso de instalación.
Para ejecutar la consola de seguridad solo basta con hacer dos cosas: primero editar el
archivo ConfigurationParameters.properties que se encuentra en la raíz de la carpeta
<ruta>\consola en donde se debe colocar la dirección del servidor MySQL y del
servidor SMTP; segundo ejecutar el archivo run.bat que sube la aplicación.
Luego de ejecutar la aplicación aparece la imagen de la Figura 1 que indica que se
está cargando la aplicación.
Figura 1
122
Una vez termina de cargarse la aplicación aparece la siguiente pantalla en donde el
usuario debe validarse frente al sistema e ingresar su usuario y contraseña como lo
indica la Figura 2.
Figura 2
Una vez ingresado el usuario y la contraseña, se procede a darle clic en el botón
login. Proceso que permite ingresar a la aplicación y ver la pantalla principal del
programa. Por defecto existe un usuario para ingresar a la aplicación, cuyo nombre de
usuario es modseg y su contraseña es modseg.
123
(a) área de máquinas
(b) área de incidentes de seguridad
(c) área de eventos
Figura 3
En la Figura 3 se muestra la pantalla principal de la consola de seguridad. En el área
(a) aparecen las máquinas que se están monitoreando (las cuales se pueden arrastrar y
colocar en el sitio deseado, para agruparlas según la subred a la que pertenecen).
Cuando se da clic a una de las máquinas se muestran los incidentes de seguridad
activos, representados en el área (b) y si se hace clic a uno de los incidentes activos
nos despliega en el área (c) los eventos asociados a ese incidente. Si se deja el cursor
encima de la máquina se pude apreciar su dirección IP. Las máquinas aparecen en
color azul si el adaptador de esa máquina está en ejecución y enviando mensajes
correctamente. Si por algún motivo la consola de seguridad deja de recibir mensajes
de ese adaptador la aplicación cambia la máquina a color blanco indicando que el
adaptador no está reportando mensajes a la consola de seguridad. Cuando el
adaptador de una máquina está detectando incidentes de seguridad y se encuentra
enviando los Traps a la consola de seguridad, se va a observar que la máquina
generando las notificaciones intermitirá entre rojo y azul. Una máquina que ha tenido
sucesos de seguridad aparece en color naranja en la consola y una vez se hace clic en
esa máquina cambia a color azul, proceso que indica que se han analizado los
eventos, ya que ha habido nuevos eventos que se han recibido. En la Figura 4
124
aparecen dos máquinas siendo monitoreadas y una de ellas tiene un incidente abierto
con un evento asociado.
Figura 4
Si se desean ver los detalles de uno de los eventos debemos hacer clic en la columna
que dice datos del evento y se despliegan los datos como se muestra en la Figura 5.
125
Datos del
evento
Navegar entre
eventos
Figura 5
La Figura 5, permite observar los datos específicos de un evento. Se puede ver el
programa que lo originó, la acción tomada, entre otros campos adicionales. Se puede
navegar entre los otros eventos de ese incidente mediante los botones siguiente y atrás
o cerrar la ventana con su respectivo botón.
En la lista de incidentes de seguridad y en la de eventos es posible cambiar los
siguientes campos: fecha de cierre, procedimiento y estado. El campo estado sirve
para indicar el estado en el que se encuentra el evento o incidente, que puede ser
activo, cerrado o descartado (el primero indica que está abierto y el segundo que ha
sido solucionado). El último estado sirve para informar que el administrador luego de
haber analizado el incidente o el evento determinó que puede ser descartado ya que
no corresponde a un incidente de seguridad. Cuando el estado se pone en cerrado se
recomienda llenar la fecha de cierre y el procedimiento asociado a la solución de
dicho evento o incidente.
126
En la barra de menú aparecen tres categorías que corresponden a archivo, insertar y
ayuda. En la barra de menú archivo podemos apreciar las opciones que se muestran
en la Figura 6.
Figura 6
La primera permite editar los parámetros para enviar y recibir Traps v3.
Figura 7
En la Figura 7 se pueden editar los parámetros necesarios para recibir Traps y se
puede editar el usuario, la clave MD5 y DES a utilizar y el puerto en el cual se van a
escuchar los Traps que provienen de los adaptadores. En la Figura 8 se muestran los
parámetros de los Traps que se van a enviar a una consola de gestión. Estos son el
usuario, las claves MD5 y DES, la dirección IP de la máquina que tiene la consola de
gestión y el puerto por el cual va a escuchar esa consola los Traps enviados por la
consola de seguridad. Para cambiar los valores de cada uno de los Traps basta con
modificar los campos necesarios y darle clic en ingresar.
127
Figura 8
La siguiente opción en el menú nos permite administrar los usuarios que van a
acceder a la aplicación como se muestra en la Figura 9.
128
Figura 9
Para adicionar un usuario basta con llenar sus datos: nombre, apellido, login,
contraseña, el rol (que puede ser un usuario o administrador), el cargo, la dirección de
correo y por último el nivel que ocupa en la empresa (donde el nivel 1 corresponde al
nivel más bajo que puede ocupar el empleado). El rol de “Usuario” está destinado
únicamente a los usuarios que van a utilizar el programa vía Web, mientras que el
“Administrador” es el usuario que va a ingresar a esta aplicación. Para ingresar el
usuario basta con hacer clic en ingresar.
También se puede editar la clave de un usuario ya creado como se muestra en la
Figura 10, donde se presenta la opción de borrar el usuario seleccionado haciendo clic
en el botón borrar o cambiar la clave de un usuario ingresando la nueva clave y
haciendo clic en ingresar.
129
Figura 10
En el menú insertar, como se muestra en la Figura 11, se presenta la opción de
insertar un texto en el área de máquinas para identificar y agrupar las máquinas
gráficamente por subredes u otro criterio deseado.
Figura 11
130
Figura 12
La Figura 12 muestra la pantalla para ingresar la etiqueta. Para ingresarla basta con
escribir el texto deseado y hacer clic en insertar, luego se debe hacer un clic en el área
de las máquinas para que aparezca la etiqueta. Esta etiqueta se puede arrastrar y poner
en el sitio deseado.
De esta forma se pueden agrupar las máquinas como se muestra en la Figura 13.
Adicionalmente si se hace clic derecho sobre una etiqueta aparece la opción de borrar
la etiqueta deseada.
Figura 13
El menú ayuda, como se ve en la Figura 14, permite obtener información de contacto
de la aplicación como se muestra en la Figura 15.
Figura 14
131
Figura 15
2. PÁGINA WEB
Para aquellos usuarios que desean conocer información acerca de los incidentes de
seguridad y/o eventos se les da la opción de ingresar a una página Web donde pueden
consultar dicha información. Pueden ser los usuarios a los que les llega una
notificación de la consola de seguridad, como un correo, informando que se ha
vencido el plazo de solucionar un incidente. La primera página se encarga de validar
al usuario frente al sistema como se observa en la Figura 16. El usuario solo va a ver
información de los incidentes y eventos y no puede modificar ningún dato mostrado,
labor delegada a los administradores de red.
132
Figura 16
Se deben llenar el login del usuario y su contraseña y luego hacer clic en el botón
login para validar el usuario. Por defecto hay un usuario con login pruusu y
contraseña 1234567. Una vez validado se presentan siguientes opciones: consultar
todos los incidentes abiertos o cerrados, consultar incidentes por rango de fecha y
obtener los detalles de un incidente como lo indica la Figura 17.
133
Figura 17
Al hacer clic en el botón “consultar todos los incidentes abiertos y cerrados” aparece
una lista de los incidentes abiertos y cerrados de todas las máquinas almacenadas en
la base de datos (ver Figura 18).
134
Figura 18
En la opción de consultar incidentes por rango de fecha, se pueden ver los incidentes
en un rango de fecha seleccionando la fecha de inicio y de fin, opción que se permite
haciendo clic en el calendario al lado derecho de cada fecha y seleccionando la fecha
deseada según la Figura 19. Luego se hace clic en consultar para que aparezca una
lista de incidentes de seguridad en ese rango de fechas como se muestra en la Figura
20.
135
Selección
de fecha
Figura 19
136
Figura 20
Por último, en la opción de seleccionar los detalles de un incidente de seguridad se
pueden consultar todos los eventos que corresponden a ese incidente, ingresando el
ID del incidente (ver Figura 21). Para consultar los detalles se da clic en consultar y a
continuación se despliegan los detalles del incidente indicado como se observa en la
Figura 22.
137
Figura 21
138
Figura 22
139
ANEXO 5: INSTALACIÓN DEL PROGRAMA NET-SNMP
Para instalar el programa en Windows (Win32): Antes de instalar el programa se debe
tener “Active Perl” instalado para el funcionamiento de todos los scripts de Perl que
necesita el programa. Descargar el ejecutable de la página ejecutarlo y seguir las
instrucciones que se indican allí. El programa por default se instala en “c:\usr” y ahí
se encuentran los archivos relacionados con el programa. En la carpeta “bin”, se
encuentran los ejecutables del programa. El agente que proveen ellos, se puede
registrar como un servicio (ver los archivos registeragent.bat y unregisteragent.bat
para registrar y quitar el servicio). Es recomendable correr el siguiente comando para
generar el archivo de configuración para el agente: “snmpconf -g basic_setup”, el
cual guía para la configuración del agente. El archivo queda en la carpeta “c:\usr” y
se debe copiar a la carpeta “c:\usr\etc\snmp”, luego se debe reiniciar el servicio para
que lea el archivo. Este archivo (“snmpd.conf”), permite configurar el
comportamiento del agente. Se puede definir comunidades de escritura y/o lectura,
definir usuarios para SNMPv3, entre muchas otras opciones. Aquí vamos a ver las
más básicas (se asume que el lector ya ha ejecutado el comando mencionado
anteriormente y el archivo ya se encuentra en su ubicación).
Configurar una comunidad: el archivo debe incluir al menos una de las dos líneas
siguientes para crear una comunidad y poder hacer operaciones según el tipo de
comunidad definido:
rwcommunity <comunidad>
rocommunity <comunidad>
donde <comunidad> es el nombre de la comunidad que queremos definir para un
acceso de lectura y escritura (rwcommunity) o de solo lectura (rocommunity). De esta
forma el agente puede responder a un comando generado con SNMPv1 y SNMPv2,
que utilizan el concepto de comunidad. Veamos un ejemplo:
Definimos una comunidad de lectura y escritura, llamada “privada”:
rwcommunity privada
Que nos permite consultar y modificar valores de los objetos monitoreados.
Luego, ya podríamos hacer la siguiente consulta al agente (utilizando el
programa “snmpget”):
snmpget -v 2c -c privada localhost system.sysName.0
Que nos retorna el nombre del sistema que estamos solicitando. En este caso
nos retorna el nombre del sistema “localhost”. Adicionalmente, aquí estamos
utilizando SNMPv2 (especificado por el comando “-v 2c”); la comunidad
“privada” (especificada por el comando “-c privada”) y estamos solicitando la
variable sysName que pertenece al grupo “system” (especificado por el
140
parámetro “system.sysName.0”; recordemos que el “.0” se refiere a una
instancia en particular).
Para que funcione con soporte a encripción, es necesario indicarle al agente que use
encripción. Se debe instalar una distribución de OpenSSL en la ruta C:\OpenSSL. Se
debe copiar la carpeta openssl (C:\OpenSSL\include) a la carpeta de VC++
(C:\Program Files\Microsoft Visual Studio\VC98\include). También se debe copiar la
librería libeay32.lib (C:\OpenSSL\lib\VC) a la carpeta de VC++ (C:\Program
Files\Microsoft Visual Studio\VC98\lib).
Luego se debe editar el archivo de encabezado net-snmp-config.h (<instalación del
código>\win32\net-snmp) y añadir la siguiente línea para indicarle que use OpenSSL:
#define USE_OPENSSL 1. A continuación es necesario abrir VC++ y abrir el
proyecto win32.dsw. Seleccionar en la barra de menú Proyecto-> Configuración. Se
deben seleccionar todos los proyectos excepto libsnmp, libagent, libhelpers,
libnetsnmptrapd y netsnmpmibs. Luego en la opción de Enlace, se debe adicionar la
librería libeay32.lib en la parte que dice objetos/librerías módulos. Esto se debe hacer
tanto para las versiones “Debug” como “Release”.
A partir de aquí lo único que queda por hacer es compilar de nuevo todas las
aplicaciones. Se debe hacer de la siguiente manera: abrir el proyecto win32.dsw, en la
opción del menú “Build” seleccionar “Batch Build”. En la lista que aparece,
seleccionar si se desea la versión “release” y/o “debug” de los proyectos. Por último
hay que darle “ReBuild All”. Los archivos ejecutables quedan en la carpeta “Release”
o “Debug”, dependiendo de lo que se haya seleccionado en la lista (<carpeta de
código fuente>\win32\bin) los cuales deben ser copiados a la carpeta C:\usr.
Por otro lado, para utilizar SNMPv3 se debe incluir en el archivo un usuario del cual
se quiere clonar los otros usuarios, como se encuentra especificado en el RFC. En el
archivo deben encontrarse las siguientes líneas (los comentarios se hacen con el
carácter #):
# se crea el usuario “initial” para lectura y escritura
rwuser initial
# ponemos el nuevo usuario que vamos a crear para lectura y escritura
rwuser nuevo_usuario
# damos una configuración inicial al usuario “initial” que va a utilizar MD5 y
DES
createUser initial MD5 clave_usuario DES
Así se crea el usuario “initial” y se define un nuevo_usuario(aún no creado
totalmente), pero el cual debemos terminar de configurar de la siguiente
manera:
141
snmpusm -v 3 -u initial -n "" -l authPriv -a MD5 -A clave_usuario –x DES -X
clave_usuario -l authPriv localhost create nuevo_usuario initial
Se utiliza el programa “snmpusm”. Se especifica que se va a trabajar con el
protocolo SNMPv3 (usando “-v 3”); se va a usar el usuario “initial” como la
base de clonación (el parámetro “-u initial”); el contexto default (usando el
parámetro “-n ”” ”); el nivel de seguridad deseado, en este caso, autenticación
y privacidad (utilizando el parámetro “-l authPriv”); se va a utilizar como
algoritmo de autenticación MD5 (usando “-a MD5”) y se define la clave
asociada (usando “-A clave_usuario”); se especifica el uso del algoritmo DES
para encripción (con el parámetro “-x DES”) y su clave (usando “-X
clave_usuario”); en el agente “localhost” y se va a crear el usuario
nuevo_usuario clonado del usuario initial.
Adicional a esto, se debe cambiar la clave, ya que el nuevo usuario tiene las
claves del usuario base. Esto se hace de la siguiente manera:
snmpusm -v 3 -u nuevo_usuario -n "" -l authPriv -a MD5 -A clave_usuario -x
DES -X clave_usuario localhost passwd clave_usuario nuevaClave
Esta vez, se utiliza el parámetro “passwd” para cambiar la clave y se debe
digitar la clave anterior y luego la nueva clave. Ahora se puede hacer la
consulta de un valor de un objeto, de esta manera:
snmpget -v 3 -u nbatest -n "" -l authPriv -a MD5 -A nbaprueba -x DES -X
nbaprueba localhost system.sysName.0
Especificando la versión, el usuario, los protocolos y las claves y el nombre
de la variable que se va a utilizar.
Para instalarlo en Linux desde el código fuente, se debe hacer lo siguiente:
Ejecutar los siguientes comandos:
• ./ configure --with-openssl
Si se desea obtener información sobre los parámetros que recibe escribir:
./configure --help.
• make
• make install (esto se debe hacer como root)
• configurar el agente con el archivo snmpd.conf
El programa queda instalado en la ruta /usr/local.
Para incluir las MIB’s desarrolladas en el agente: luego de haber definido el árbol y la
ubicación de los nodos y hojas en el árbol, se procede a incluir las MIB’s dentro de
142
las MIB’s del programa a utilizar (Net-SNMP). Es necesario copiar los archivos a la
carpeta C:\usr\share\snmp\mibs, junto con los otros archivos. Luego se debe reiniciar
el agente (snmpd) para que lea las MIB’s. Se debe probar que el agente reconozca las
MIB’s de la siguiente manera utilizando el comando snmptranslate y los parámetros –
m (para decirle que utilice todas las MIB’s), -Tp (para que imprima en forma de
árbol), -IR (para hacer un acceso aleatorio al árbol) y la parte del árbol a consultar, en
este caso ipTables:
Y también se puede realizar la siguiente consulta con el mismo comando y los
parámetros –Td (imprimir todos los detalles).
Luego se debe utilizar la herramienta mib2c, para compilar las MIB’s y para que así
nos genere una plantilla en código C. Genera un archivo .c y uno .h. Esta plantilla se
debe modificar para definir de donde vienen los datos y que hacer con esos datos. De
143
la siguiente manera con los parámetros –c (para indicar la plantilla a utilizar) y la
MIB a compilar: para ver un ejemplo del archivo que genera ver el Anexo 3 (ya
muestra las modificaciones que se le deben hacer al archivo)
Paso siguiente, hay que modificar el archivo mib_module_includes.h (<directorio
código fuente>\win32) y añadirle una línea para que incluya los módulos creados:
#include "mibgroup/yy.h" (donde yy es en nombre del .h que generó mib2c)
y modificar el archivo mib_module_inits.h (<directorio código fuente>\win32) y
añadirle una línea para que inicialize el módulo:
if (should_init("yy")) init_yy(); (donde yy es en nombre del .h que generó
mib2c)
Después se deben copiar estos dos archivos a la carpeta donde se descomprimió el
código fuente de la aplicación. Por lo general se debe copiare a: <carpeta de código
fuente>\agent\mibgroup. Luego abrir VC++ y abrir el proyecto win32.dsw (en la
carpeta <carpeta de código fuente>\win32). En la barra de la mano izquierda sale una
lista de proyectos y es necesario añadir los dos archivos al proyecto netsnmpmibs.
Luego se deben compilar los proyectos libagent, libhelpers y libsnmp para luego
poder compilar el agente con los nuevos módulos (compilar snmpd).
144
ANEXO 6: MANUAL DE INSTALACIÓN
1. Adaptadores
En Windows se debe instalar el programa Net-SNMP y reemplazar la carpeta C:\usr
por la carpeta <cd>\Windows\Adaptador\usr que se encuentra en el CD, para
reemplazar el agente normal por el adaptador desarrollado y poner los archivos de
configuración necesarios. Adicionalmente toca instalar OpenSSL para poder utilizar
las librerías en el proceso de encripción. Luego se debe instalar Kerio para que el
adaptador monitoree ese programa.
En Linux es necesario descomprimir los archivos fuente del programa Net-SNMP,
ubicado en la ruta <cd>/Linux/Net-SNMP/net-snmp-5.2.1.tar.gz, y copiar la carpeta
<cd>/Linux/modsegsnmp a <ruta de archivo descomprimido>/agent/mibgroup luego
proceder con la instalación normal ya descrita en el Anexo 6. Luego se deben copiar
los archivos de configuración en la ruta <cd>/Linux/conf a la ruta
/usr/local/share/snmp y las MIB’s en la ruta <cd>/Linux/mibs a la ruta
/usr/local/share/snmp/mibs. Es necesario verificar que se tenga instalado IpTables en
el equipo.
2. Consola de seguridad
Debe estar instalado MySQL en un equipo y se debe correr el script de la base de
datos ubicado en la ruta <cd>\Base de datos\backup_all.sql. Para este proceso es
necesario ejecutar el programa mysql, ubicado en <ruta de instalación de
Mysql>\bin\mysql, de esta forma: mysql -u root -p < backup_all.sql. A continuación
se pide la contraseña del usuario root (indicada al instalar MySQL).
Instalar el JDK de Java y luego copiar la carpeta de la consola a la carpeta deseada en
el computador. Modificar los parámetros del archivo de configuración
ConfigurationParameters.properties ubicado en la ruta <ruta carpeta
consola>\Consola| para que quede con la dirección IP del servidor MySQL y SMTP.
Para habilitar el ingreso vía Web es necesario instalar Tomcat en un equipo y copiar
el archivo webUser.war ubicado en la carpeta <cd>\Consola\Webuser\Deploy\ a la
carpeta <ruta donde está Tomcat>/webapps. Posteriormente se debe editar el archivo
de configuración que se encuentra adentro del archivo webUser.war para poner la
dirección IP del servidor de MySQL. Para hacer esto es necesario abrir el archivo con
Winzip (seleccionar el archivo, darle clic derecho y seleccionar la opción abrir con y
en la lista que aparece seleccionar Winzip). Luego aparece la pantalla del programa
con la lista de los archivos contenidos en webUser.war. Editar el archivo
ConfigurationParameters.properties.
145
ANEXO 7: CONTENIDO DEL CD
La Figura 23 muestra la estructura de árbol del CD con sus respectivas carpetas y
archivos. En la derecha se muestra una descripción de que es cada archivo o carpeta.
Figura 23
146
ANEXO 8: DIAGRAMA DE CLASES GENERAL
La figura 24 muestra el diagrama de clases que permite el acceso a la base de datos.
La clase DBAccess se encarga de acceder a la base de datos. Utiliza un patrón
singleton ya que solo puede haber una instancia de acceso a la base de datos. Las
clases ConfigurationParametersManager y PropertiesReader se encargan de leer el
archivo de configuración ConfigurationParameters.properties.
DBAccess
-DRIVER_CLASS_NAME:String
-URL:String
-USER:String
-PASSWORD:String
-url:String
-user:String
-password:String
-con:Connection
-instance:DBAccess
ConfigurationParametersManager
-CONFIGURATION_FILE:String
-parameters:Map
-ConfigurationParametersManager
+getParameter:String
-DBAccess
+getInstance:DBAccess
+getMachineIp:String
+deleteComputerCasesClosed:Vector
+changeHistoricValue:void
+insertTrapData:void
+insertTrapData:void
+getTrapData:Vector
+deleteUser:void
+insertMachineData:void
+getMachineData:Vector
+modifyMachineData:void
+getMachines:Vector
+getAllMachines:Vector
+insertCaseData:void
+getCaseData:Vector
+getActiveCaseData:Vector
+getCaseDataDetails:Vector
+getActiveCasesDate:Vector
+getActiveCasesDate:Vector
+modifyCaseData:void
+insertEventData:void
+insertEventData:void
+getRecentIdCase:int
+getEventDataDetails:Vector
+modifyEventData:void
+insertNewUser:void
+getNextNotification:Vector
+setNextNotification:void
+getBasicNotification:Vector
+modifyUserData:void
+getUsers:Vector
+getUserDetails:Vector
+validateLogin:int
+getInterfaceOID:String
PropertiesReader
+getProperties:Propert
-getFile:InputStream
Figura 24
147
El diagrama de clases para la gestión y administración de los incidentes de seguridad
se muestra en la Figura 25. La clase ControlCasos se encarga del proceso de
creación, gestión y administración de los incidentes y eventos utilizados por la
consola de seguridad. Se apoya en la clase SendMail para mandar las notificaciones
vía correo.
SendMail
+SendMail
+send:void
ControlCasos
-SMTPhost:String
-smtphost:String
-maquinas:Vector
-db:DBAccess
-sm:SendMail
-instance:ControlCasos
-index:int
-statistics:Vector
-todayDate:String
-ct:consoleTest
-ControlCasos
+getInstance:ControlCaso
+setConsoleTest:void
+hasComputer:int
+processTrap:void
-hasActiveCase:boolean
-getStatisticsData:void
+getStatistics:Vector
+bringDownInterface:boole
Figura 25
En la Figura 26 se observa el diagrama de la parte gráfica de la consola de seguridad.
Al iniciar la consola se ejecuta la clase SplashScreen que se encarga de iniciar el
programa. Luego se ejecuta la clase Login que se encarga de validar al usuario. La
clase que administra todo el funcionamiento de la parte gráfica de la consola es
consoleTest.
148
AddUser
JDialog
-jLabel1:JLabel
-jLabel2:JLabel
-jLabel3:JLabel
-jLabel4:JLabel
-jLabel5:JLabel
-jLabel6:JLabel
-jLabel7:JLabel
-jLabel8:JLabel
-jLabel9:JLabel
-jLabel10:JLabel
-name:JTextField
-surname:JTextField
-login:JTextField
-pass:JPasswordField
-passCheck:JPasswordField
-role:JComboBox
-position:JTextField
-email:JTextField
-level:JComboBox
-jButton1:JButton
-jButton2:JButton
About
JDialog
-jLabel1:JLabel
-jLabel2:JLabel
-jLabel3:JLabel
-jLabel4:JLabel
-jLabel5:JLabel
-jLabel6:JLabel
-jLabel7:JLabel
-jLabel8:JLabel
-jLabel9:JLabel
-jSeparator1:JSeparator
-jSeparator2:JSeparator
-jLabel10:JLabel
-jButton1:JButton
+About
-jbInit:void
-jButton1_actionPerformed:v
+AddUser
-jbInit:void
-jButton2_actionPerformed:v
-jButton1_actionPerformed:v
JDialog
TrapOptions
-options:JTabbedPane
-send:JPanel
-receive:JPanel
-buttons:JPanel
-user:JLabel
-passMD5:JLabel
-passDES:JLabel
-addr:JLabel
-port:JLabel
-userData:JTextField
-passMD5Data:JPasswordFie
-passDESData:JPasswordFie
-addrData:JTextField
-portData:JTextField
-user1:JLabel
-passMD51:JLabel
-passDES1:JLabel
-port1:JLabel
-userData1:JTextField
-passMD5Data1:JPasswordF
-passDESData1:JPasswordF
-portData1:JTextField
-cancel:JButton
-insert:JButton
-db:DBAccess
-ct:consoleTest
+TrapOptions
-jbInit:void
-insert_actionPerformed:void
-cancel_actionPerformed:void
EditUser
JDialog
-jButton2:JButton
-jButton1:JButton
-email:JTextField
-position:JTextField
-role:JComboBox
-passCheck:JPasswordField
-pass:JPasswordField
-surname:JTextField
-name:JTextField
-jLabel10:JLabel
-jLabel9:JLabel
-jLabel8:JLabel
-jLabel7:JLabel
-jLabel6:JLabel
-jLabel5:JLabel
-jLabel4:JLabel
-jLabel3:JLabel
-jLabel2:JLabel
-jLabel1:JLabel
-level:JComboBox
-login:JComboBox
-db:DBAccess
-jButton3:JButton
+EditUser
-jbInit:void
+updateUsers:void
+getUserData:void
-jButton2_actionPerformed:v
-jButton1_actionPerformed:v
-jButton3_actionPerformed:v
JDialog
EventData
-listEventDataPanel:JPanel
-closeListEvent:JButton
-nextListEvent:JButton
-backListEvent:JButton
-eventIndex:int
-rowCount:int
-x:int
-y:int
-data:String
-parent:consoleTest
+EventData
+drawElements:void
-closeListEvent_actionPerformed:v
-nextListEvent_actionPerformed:vo
-backListEvent_actionPerformed:vo
MouseMotionListen
consoleTest
-db:DBAccess
-cc:ControlCasos
-jMenuBar1:JMenuBar
-jMenu1:JMenu
-jMenu2:JMenu
-jMenuItem1:JMenuItem
-jMenuItem2:JMenuItem
-jTabbedPane1:JTabbedPane
-estado:JPanel
-maquinas:JPanel
-info:JPanel
-vpane:JSplitPane
-casePane:JScrollPane
-eventPane:JScrollPane
-caseStateColumn:TableColumn
-eventStateColumn:TableColumn
-states:JComboBox
-activeCases:JTable
-events:JTable
-downInterface:JButton
-caseModel:CustomTableModelCase
-eventModel:CustomTableModelEven
-caseColumn:Vector
-eventColumn:Vector
-caseData:Vector
-eventData:Vector
-comp:JButton
-index:int
-computer:Vector
-jMenuItem3:JMenuItem
-jMenuItem4:JMenuItem
-au:AddUser
-eu:EditUser
-computerClicked:String
-x:int
-y:int
-about:About
-to:TrapOptions
-jMenuItem5:JMenuItem
-lt:listenThread
-ltr:ListenTrap
-st:sendThread
-deltaX:int
-deltaY:int
-buttonMoved:String
-ls:LabelSubred
-labels:Vector
-labelMoved:String
-jMenu3:JMenu
-jMenuItem6:JMenuItem
-menu:JPopupMenu
-item:JMenuItem
-threads:HashMap
send
+sendThread
JDialog
LabelSubred
-jLabel1:JLabel
-jTextField1:JTextField
-jButton1:JButton
-jButton2:JButton
-jTextPane1:JTextPane
-ct:consoleTest
listen
+listenThread
+ListenTrap
+LabelSubred
-jbInit:void
-jButton2_actionPerformed:
-jButton1_actionPerformed:
-StopInsertLabelThread
labelName:String
insertLabel:boolean
JFrame
Login
-jLabel3:JLabel
-jLabel2:JLabel
-jLabel1:JLabel
-jLabel4:JLabel
-jLabel5:JLabel
-jPasswordField1:JPasswordF
-jTextField1:JTextField
-jButton1:JButton
-jButton2:JButton
-db:DBAccess
-ct:consoleTest
-instance:int
+Login
-jbInit:void
-jButton2_actionPerformed:vo
-jButton1_actionPerformed:vo
+consoleTest
+updateTrapData:void
+removeComputer:void
+updateCaseRow:void
+displayEvents:void
+displayEventData:void
+savePosition:void
+updateEventRow:void
-jbInit:void
+addLabel:void
+eraseLabel:void
+addComputer:void
+checkComputer:int
+mouseDragged:void
+mouseMoved:void
+addButton:void
+blinkComputer:void
+computerActive:void
+updateDividerLocation:void
-button1_actionPerformed:void
-downInterface_actionPerformed:void
-comp_actionPerformed:void
-SendThread
-CustomTableModelCase
-CustomTableModelEvent
-CheckActiveCasesCompThread
-CheckDatesThread
+RefreshToolTip
-ComputerTimer
-ChangeColor
-BlinkThread
insertLabel:boolean
trapData:Vector
eventIndex:int
nextEventData:String
Figura 26
149
SplashScreen
+SplashScree
+main:void