Monday, September 12, 2011

SNMP (Protocolo Simple de Administración de Red - Simple Network Management Protocol)

Como una araña en su red, una estación de administración de red SNMP tiene la tarea de monitorear un grupo de dispositivos en una red, dichos dispositivos administrados son servidores, enrutadores, hubs, switches, estaciones de trabajo, impresoras, etc; los cuales poseen un software llamado Agente de gestión (Managment Agent) que proporciona información de su estado y ademas permite su configuración.
  

SNMP hace parte de la suite de protocolos de Internet (TCP/IP) y está compuesto por un conjunto de normas de gestión de redes, incluyendo un protocolo de capa de aplicación, un esquema de base de datos, y un conjunto de objetos de datos. SNMP expone la gestión de datos en forma de variables que describen la configuración del sistema administrado. Estas variables pueden ser consultadas y configuradas por  medio de sus aplicaciones de gestión. 

Algunos de los objetivos SNMP
  • Gestión, configuración y monitoreo remoto de los dispositivos de red
  • Detección, localización y corrección de errores
  • Registro y estadísticas de utilización
  • Inventario y Topología de red
  • Planificación del crecimiento de la red.
Componentes SNMP
Una red con aplicaciones SNMP posee al menos uno o varias estaciones de Administración, cuya función es supervisar y administrar un grupo de dispositivos de red por medio de un software denominado NMS (Network Management System- Sistema de gestión de redes), este se encarga de proporciona los recursos de procesamiento y memoria requeridos para la gestión de la red administrada, la cual a su vez puede tener una o más instancias NMS.
El dispositivo administrado es un nodo de red que implementa la interfaz SNMP, este tambien intercambia datos con el NMS y permite el acceso (bidireccional o unidimensional -solo lectura) a la información específica del nodo. Cada dispositivo administrado ejecuta permanentemente un componente de software llamado agente, el cual reporta y traduce información a través de SNMP con la estación de administración.
En esencia, los agentes SNMP exponen los datos de gestión a las estaciones de administración en forma de variables organizadas en jerarquías, dichas jerarquías junto con  otros metadatos (como el tipo y la descripción de las variables), son descritos en una Base de Gestión de Información (MIB Managment Information Base).El protocolo también permite ejecutar tareas de gestión activa, como la modificación y la aplicación de una nueva configuración de forma remota, a través de la modificación de dichas variables. 

OID Object Identifier
Es el identificador único para cada objeto en SNMP, que proviene de una raíz común en un namespace jerárquicamente asignado por la IANA, Los OIDs están organizados sucesivamente para identificar cada nodo del árbol MIB desde la raíz hasta los nodos hojas.

MIB Management  Information Base

Base de datos con información jerárquicamente organizada en forma de arbol con los datos de todos los dispositivos que conforman una red. Sus principales funciones son: la asignación de nombres simbólicos, tipo de datos, descripción y parámetros de accesibilidad de los nodos OID.

PDU (Protocol Data Unit - Unidad de datos del Protocolo)
SNMP utiliza un servicio no orientado a conexión como UDP (User Datagram Protocol) para realizar las operaciones básicas de administración de la red, especialmente el envío de pequeños grupos de mensajes (denominados PDUs) entre las estaciones de administración y los agentes. Este tipo de mecanismo asegura que las tareas de gestión no afectan el rendimiento global de la red.  SNMP utiliza comúnmente los puertos 161 UDP para obtener y establecer mensajes y 162 UDP para capturar mensajes y traps.

 =============================================================
| Tipo de  | ID de     | ... | ... |  ... Variables  ...      |
| PDU      |Petición   | ... | ... |        MIB               |
 =============================================================

Petición y Respuesta GET (SNMPv1)
La estación de administración hace UNA petición al agente para obtener el valor de una o muchas variables del MIB, las cuales se especifican mediante asignaciones (los valores no se utilizan). el agente recupera los valores de las variables con operaciones aisladas y envía una respuesta indicando el éxito o fracaso de la petición. Si la petición fue correcta, el mensaje resultante contendrá el valor de la variable solicitada.

Petición  GETNext


La estación de administración hace una petición al agente para obtener los valores de las variables disponibles. El agente retorna una respuesta con la siguiente variable según el orden alfabético del MIB. Con la aplicación de una petición GetNextRequest es posible recorrer completamente la tabla MIB si se empieza con el ID del Objeto 0. Las columnas de la tabla pueden ser leídas al especificar las columnas OIDs en los enlaces de las variables de las peticiones.

Petición  GETBulk (SNMPv2)

La estación de administración hace una petición al agente para obtener  múltiples iteraciones de GetNextRequest. El agente retorna una respuesta con múltiples variables MIB enlazadas. Los campos non-repeaters y max-repetitions se usan para controlar el comportamiento de las respuesta.





Set-Request & -Response
La estación de administración hace una petición al agente para cambiar el valor de una variable, una lista de variables MIB o para la configuración de los agentes. El acceso a las variables se especifica dentro de la petición para que el agente cambie las variables especificadas por medio de operaciones atómicas., despues se retorna una respuesta con los valores actualizados de las variables preestablecidas y  con los valores de las nuevas variables creadas. Así mismo existen conjunto de parámetros de configuración (por ejemplo, direcciones IP, switches, ...)

Notificaciones y Trampas(Traps)
Son mensaje SNMP generados por el agente que opera en un dispositivo monitoreado, estos mensajes no son solicitados por la consola y están clasificados según su prioridad  (Muy importante, urgente,... ) . Estas notificaciones se producen cuando el agente SNMP detecta un cambio de parámetros en las variables MIB. Estos mensajes son utilizados por los sistemas de alerta sin confirmación. Los tipos estándar de trampas indican los siguientes eventos:
  • (0) Coldstart:  El agente se ha reiniciado
  • (1) Warmstart: La configuración del agente ha cambiado.
  • (2) Linkdown: Alguna interfaz de comunicación está fuera de servicio (inactiva)
  • (3) Linkup: Alguna interfaz de comunicación está en servicio (activa).
  • (4) Authenticationfailure: El agente ha recibido una solicitud de un NMS no autorizado
  • (5) EGPNeighborLoss: Un equipo, junto a un sistema donde los routers están utilizando el protocolo EGP, está fuera de servicio;
  • (6) Enterprise:  Incluye nuevas traps configuradas manualmente por el administrador de red.
Versiones SMNP
Las versiones más utilizadas son la versión SNMPv1 y SNMPv2. El SNMPv3 última versión tiene cambios importantes con relación a sus predecesores, sobre todo en temas de seguridad, sin embargo, no ha sido ampliamente aceptada en la industria.
 
SNMPv1 
Esta es la versión inicial y la mas utilizada, principalmente debido a la simplicidad del esquema de autenticación y a las políticas de acceso que utiliza el agente SNMP para determinar cuales estaciones de administración pueden acceder a las variables MIB. Una política de acceso SNMP es una relación administrativa, que supone asociaciones entre una comunidad SNMP, un modo de acceso, y una vista MIB.
  • Una comunidad SNMP es un grupo de uno o más dispositivos y el nombre de comunidad (cadena de octetos que una estación de administración debe agregar en un paquete de solicitud SNMP con fines de autenticación).
  • El modo de acceso especifica como se accede a los dispositivos de la comunidad se les permite con respecto a la recuperación y modificación de las variables MIB de un agente SNMP específico. El modo de acceso: ninguno, sólo lectura, lectura-escritura o sólo escritura. 
  •  Una vista MIB define uno o más sub-árboles MIB a los cuales una comunidad SNMP específica puede tener acceso. La vista MIB puede ser el árbol MIB o un subconjunto limitado de todo el árbol MIB.
Cuando el agente SNMP recibe una solicitud de una estación de administración, este verifica el nombre de la comunidad a la que pertenece y la dirección IP para determinar si el host solicitante en realidad  es miembro de la comunidad que dice pertenecer. El agente SNMP determina si concede el acceso hasta las variables MIB según lo defina la política de acceso asociada a esa comunidad. Si todos los criterios son verificados y se cumplen. De lo contrario, el agente SNMP genera una captura authenticationFailure o devuelve el mensaje de error correspondiente a la máquina solicitante.  
Formato del mensaje SNMP
 ======================================================================
| Versión    | Nombre de Comunidad | ...           PDU   ...           |
| (Integer)  | (Octet Str.)        |             (Sequence)            |
 ======================================================================
  El diseño de esta versión fue realizado en los años 80, cuando la prioridad era atender la  demanda de protocolos generado por el rápido crecimiento de las redes, así que es de esperarse que nadie se haya preocupado por los problemas de autenticación y de seguridad, siendo estas sus principales falencias. La autenticación de los clientes se realiza sólo por la cadena de octetos de Comunidad, en efecto tenemos un tipo de contraseña, que se transmite en texto plano.

SNMPv2
Incluye mejoras en rendimiento, seguridad, confidencialidad y comunicación entre estaciones de administración. Introduce GetBulkRequest, una alternativa a GetNextRequests iterativo para la recuperación de grandes cantidades de datos de administración en una sola solicitud. Sin embargo, no fue ampliamente aceptado debido a su complejidad y a la poca compatibilidad con los  NMSs de la versión anterior; sin embargo este inconveniente se soluciono utilizando agentes proxy y NMS bilingües para ambas versiones de NMS; adicionalmente se desarrolló la versión SNMPv2c un poco mas simple, pero sin embargo mas segura que la primera versión.

SNMPv3
Proporciona importantes características de seguridad y configuración remota:
  • Autenticación: Firmas digitales MD5 y SHA1 basadas en usuarios garantiza que el mensaje proviene de una fuente segura.
  • Confidencialidad: Cifrado de paquetes DES y AES para garantizar mayor privacidad
  • Integridad: Asegurar que el paquete no ha sido alterado en tránsito, incluye un mecanismo opcional de protección de paquetes reenviados. 
 Mas Información sobre herramientas SNMP aqui
References
http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol
http://h18000.www1.hp.com/products/quickspecs/10757_div/10757_div.HTML
Class Slides: N_Netzwerk-Management SNMP.pdf

Si tienes información adicional sobre este tema, tus comentarios son bienvenidos.

Thursday, September 08, 2011

Agregar un Archivo JAR a Eclipse

En el caso de querer desarrollar aplicaciones usando una IDE como es el caso de Eclipse, es necesario agregar los archivos libvirt-0.4.7.jar and jna.jar al class path. A continuación describo paso a paso como hacerlo:

  • Creamos un nuevo proyecto en File>New>Project, Aparece un asistente, seleccionamos Java Project y click en el boton Next>
  • Asignamos un nombre al nuevo proyecto y y click en el boton Next>, se genera una carpeta con el nombre que hemos asignado
  • Sobre esta nueva carpeta con el nombre del proyecto abrimos el menú desplegable con el click derecho del mouse y elegimos "propiedades"
  • En la ventana que se abre, hay un menú a la izquierda elegimos "Java Build Path".
  • En el lado derecho de la ventana, elegimos la pestaña "Libraries"
  • Click al botón "Add External JARs"
  • Vamos a la carpeta que previamente hemos descomprimido en el post anterior: libvirt-java-0.4.7_compiled/target/jars 
  • buscamos libvirt-0.4.7.jar y jna.jar las seleccionamos una por una. click en OK y listo ya forma parte de nuestro proyecto Eclipse y podemos usarlo en nuestro programa 
  • Si tienes información adicional sobre este tema, tus comentarios o links de referencia son bienvenidos. 

    Wednesday, September 07, 2011

    Como vincular la librería Libvirt con Java

    Ya que este es el punto de partida para empezar a desarrollar aplicaciones con herramientas de virtualización, me parece importante describir el proceso paso a paso para instalar la librería Libvirt y vincularla con Java. Estas instrucciones van dirigidas a sistemas operativos como debian o Ubuntu.
    1. Verificar si el procesador del equipo en el que trabajamos tiene hardware de soporte para virtualización. El hecho de no obtener salida alguna, indica que no hay soporte para esta característica, sin embargo, es posible trabajar con algunas aplicaciones pero con bajo rendimiento, se recomienda usar con propósitos de investigación pero nunca para correr servidores reales.
      sudo egrep '(vmx|svm)' /proc/cpuin
    2. Libvirt está escrita en C y se instala con el siguiente comando:
      sudo apt-get install libvirt-dev
    3. Para editar las características del paquete escribimos:
      apt-get source -d libvirt
      sudo apt-get build-dep libvirt
      dpkg-source -x libvirt*dsc
    4. Es necesario instalar Los siguientes paquetes adicionales:
      sudo apt-get install sun-java6-jdk libjna-java junit ant
      sudo update-alternatives --config java
    5. Para confirmar la versión de Java y apache Ant
      javac -version
      ant -version 
    6. Crear una carperta llamada source para guardar el paquete a descargar
      mkdir -p ~/source
      cd ~/source 
    7. Ahora es necesario indexar la librería livbirt para utilizarla en Java. El paquete de archivos para vincular dicha librería se pueden descargar aqui.
    8. Guárdelo en la carpeta source y extráigalo con la siguiente línea de comandos:
      tar xvfz libvirt-java-0.4.7_compiled.tar.gz 
    9. La carpeta "libvirt-java-0.4.7_compiled.tar.gz" provee un archivo precompilado .jar. A continuación ingresamos a la carpeta y construimos el archivo .jar
      cd libvirt-java-0.4.7_compiled.tar.gz
      ant build
    10. El archivo construido se copia en el directorio que contiene las librerías de Java
      sudo cp libvirt-java-0.4.7_compiled.jar /usr/share/java/
      sudo ln -s /usr/share/java/libvirt-java-0.4.7_compiled.jar /usr/share/java/libvirt.jar
      
    11. El CLASSPATH debe apuntar al directorio actual y el directorio que contiene los archivos jna.jar y libvirt.jar.
      export CLASSPATH=.:/usr/share/java/*

    12. La variable LD_LIBRARY_PATH debe apuntar al archivo libjnidispatch.so.
      export LD_LIBRARY_PATH=/usr/lib/jni/
    13. El test descrito a continuación debe trabajar en cualquier maquina sin que se haya instalado previamente algún hipervisor ya que Libvirt provee un hypervisor de prueba.
    14. En la carpeta libvirt-java-0.4.7_compiled vaya al directorio target/testclasses para correr el siguiente shell script:
      cd
      cd ~/libvirt-java-0.4.7_compiled/target/testclasses
      ./run_test.sh

    Si libvirt está correctamente instalada, obtendremos una larga lista de salidas, si no, Java mostrará un mensaje de error.



    Si tienes información adicional sobre este tema, tus comentarios o links de referencia son bienvenidos.