miércoles, 22 de noviembre de 2017

RMI

RMI

Introducción

Existen varias herramientas para la invocación remota entre servidores, tales como los sockets (orientados y no orientados a conexión), los procedimientos remotos (RPC) y la invocación remota de métodos (RMI).

Los sockets y RPC presentan una gran desventaja: el rendimiento, esta razón motivó el diseño de RMI, cuyo principal objetivo era soportar llamadas a procedimientos remotos entre objetos que se ejecutan sobre Máquinas Virtuales Java (JVM).

Al ser RMI la herramienta más útil para la comunicación entre servidores remotos, sus características y el proceso que se lleva a cabo al implementarla son el tema a tratar en esta ocasión.

RMI

El mecanismo RMI (Remote Method Invocation) permite que una aplicación o applet se comunique con objetos que residen en programas que se ejecutan en máquinas remotas.

En RMI, un servidor de objeto exporta un objeto remoto y lo registra en un servicio de directorios. El objeto proporciona métodos remotos, que pueden invocar los programas clientes.

Sintácticamente, un objeto remoto se declara como una interfaz remota una extensión de la interfaz Java. El servidor de objeto implementa la interfaz remota. Un cliente de objeto accede al objeto mediante la invocación de sus métodos, utilizando una sintaxis similar a las invocaciones de los métodos locales.

Componentes
  • Cliente: Conduce el flujo de la aplicación. Localiza e invocamétodos ofertados como remotos por los servidores.
  • Servidor: Conjunto de objetos que ofrecen interfaces remotas públicas cuyos métodos pueden ser invocados clientes de cualquier procesador de la plataforma.
  • Registro: Servicio estático que se establece en cada nudo, en el que se registran los servidores con un nombre, y donde los clientes los localizan por él.
Proceso

Conclusiones

Referencias

  • Liu, M. L. (2004). Computación Distribuida: Fundamentos y Aplicaciones. Madrid: PEARSON EDUCACIÓN, S.A.
  • domingo, 19 de noviembre de 2017

    Funciones hash

    Funciones hash

    Introducción

    La tecnología se ha desarrollado tan rápidamente en la mayoría de las áreas de informática que es fácil pasar por alto las áreas que no se han desarrollado en las últimas décadas. La autenticación basada en contraseña es probablemente una de las funciones técnicas más importantes que todos usamos todos los días, sin embargo, no ha evolucionado mucho desde los primeros sistemas informáticos de usuarios múltiples.

    El término autenticación (o autentificación) se refiere al servicio que trata de asegurar que una comunicación sea auténtica, es decir, verificar que el origen de los datos es el correcto, quién los envió y cuándo fueron enviados y recibidos también sean correctos.

    Anteriormente se había tratado el tema de la autenticación con el uso de Kerberos, esta vez el método a abordar son las funciones hash.

    Hash

    Una función Hash es un algoritmo matemático que, con una entrada A, nos da una salida B. Son también llamadas funciones de resumen y se emplean en el área de la criptografía para asegurar la autenticidad de un documento (como firma digital), para proteger contraseñas o para asegurar la integridad de la información.

    Puede ser cualquier algoritmo matemático pero tiene que cumplir una serie de propiedades:

    1. Para una misma función hash, sea cual sea la longitud de la entrada A la salida B tiene que ser de un tamaño fijo
    2. Para cada A, B tiene que ser única.
    3. Tiene que ser rápido y fácil de calcular.
    4. No se puede volver a A desde B.
    5. No puede presentar colisiones. Esto quiere decir que para dos A diferentes no se puede dar un mismo B. Esto como tal es imposible, pero es muy importante que las colisiones sean mínimas y que encontrarlas sea muy difícil.
    • Se requiere de forma adicional que sean uniformes (para una A elegida aleatoriamente todos los valores hash son equiprobables) y con efecto avalancha (un cambio de un único bit en A supone una B completamente diferente).
    SHA-1 (Secure Hash Algorithm)

    Este algoritmo fue desarrollado por el NIST y publicado como estándar federal para el procesamiento de la información; en 1995 se publicó una versión revisada conocida como SHA-1.

    El algoritmo toma como entrada mensajes de longitud máxima de 264 bits que son procesados en bloques de 512 bits; el resultado que produce es de 160 bits.

    Proceso:

    1. Se incorporan bits de relleno al mensaje de entrada de tal modo que cumpla: longitud=448mod512. El relleno consiste en un uno seguido de los ceros que sean necesarios. Aunque el mensaje ya tenga la longitud deseada, se debe efectuar el relleno, por lo que el número de bits de dicho relleno está en el rango de 1 a 512 bits.
    2. Se le añade un bloque de 64 bits que represente la longitud del mensaje original antes de ser rellenado.
    3. Se inicializa la memoria temporal MD, la cual consta de 160 bits y su finalidad es almacenar los resultados intermedios y finales de la función de dispersión. La MD consta de 5 registros (A,B,C,D,E) de 32 bits cada uno, los valores con los que se inicializan son los siguientes (valores hexadecimales):
      1. 67452301
      2. EFCDAB89
      3. 98BADCFE
      4. 10325476
      5. C3D2E1F0
    4. Se procesa el mensaje por bloques de 512 bits, cada uno pasa por un módulo que consta de 4 rondas de procesamiento de 20 pasos cada una. Las rondas tienen una estructura similar, con la excepción de que cada una ocupa una función lógica primitiva diferente (f1, f2, f3 y f4).
      • La entrada a cada ronda consta del bloque de 512 bits que se esté procesando (Yq) y los 160 bits de la memoria MD, cada bloque de 512 bits actualizará el valor de la memoria temporal. Cada ronda también hace uso de la constante aditiva Kt, donde t indica uno de los 80 pasos a lo largo de las cuatro rondas.
    5. Una vez que se procesan los L bloques de 512 bits, el resumen del mensaje son los 160 bits de salida del último bloque.

    Esquema:
    MD5

    El algoritmo MD5 fue desarrollado por Ron Rivest en 1992 en el MIT con la finalidad de robustecer el MD4 y a la fecha se trata del algoritmo hash más seguro y de mayor uso en el mundo.

    MD5 procesa mensajes de cualquier longitud y procesa bloques uniformes de 512 bits a la vez, hasta concluir con el mensaje total a fin de entregar a la salida un bloque "resumen" de 128 bits.

    Proceso:

    1. En principio, para que el mensaje sea procesado en bloques de tamaño fijo se requiere que su longitud en bits sea: longitud=448mod512, de manera que su longitud sea de no menos de 64 bits de diferencia para completar un múltiplo de 512, así, de ser necesario se aplica un relleno, el cual varía en longitud en cada caso, esto es, el número de bits adicionados está en un rango de 1 a 512 bits con el formato 10000…0.
    2. Una representación de 64 bits de la longitud del mensaje original (antes de aplicar el relleno) se añade al resultado del paso 1.
    3. Da inicio el proceso de reducción, para ello se utiliza un registro de 128 bits que permite almacenar y mantener los resultados intermedios y final de la función hash. El registro se divide en cuatro secciones de 32 bits cada una, las cuales corresponden a las variables A, B, C, y D que son inicializadas con los valores hexadecimales:
      1. 67452301
      2. EFCDAB89
      3. 98BADCFE
      4. 10325476
      Estas variables son llamadas variables de concatenación o variables de encadenamiento y se almacenan en formato little-endian de manera que aparecen:
      1. 01 23 45 67
      2. 89 AB CD EF
      3. FE DC BA 98
      4. 76 54 32 10
    4. El mensaje se procesa en bloques de 512 bits a la vez a través de 16 bloques de 32 bits cada uno, para lo cual las cuatro variables de concatenación se copian en variables distintas: a = A, b = B, c = C, d = D.
      La parte medular del algoritmo es una función de compresión que consta de cuatro rondas, las cuales tienen una estructura similar; pero cada una utiliza operaciones distintas durante 16 iteraciones; cada operación realiza una función no lineal sobre tres de las variables a, b, c y d, y el resultado es sumado a la cuarta variable que no fue elegida, un sub-bloque del texto y una constante.
      A ese resultado se le aplica una rotación circular a la izquierda un número variable de bits y se suma el resultado a una de las variables a, b, c o d. Finalmente el resultado reemplaza a una de las variables a, b, c o d. La salida de la cuarta ronda se suma a la entrada de la primera en una operación modular 232.
      Hay cuatro operaciones no lineales utilizadas, una para cada ronda:
      Estas funciones son designadas de forma que si los bits que corresponden a, b, c y d son independientes y no perjudiciales, cada bit del resultado también será independiente y no perjudicial. La función F es una función condicional: If b then c else d, de manera similar G: If d then b else c, en tanto la función H genera un bit de paridad.
    5. Al final de todos los ciclos, a, b, c y d son sumados a A, B, C y D respectivamente y el algoritmo continúa con el siguiente bloque de datos. Y después de que todos los bloques de 512 bits (cada uno) han sido procesados se obtiene la salida final, esto es, la concatenación de A, B, C y D que produce un bloque de 128 bits.

    Conclusiones

    Las funciones hash tienen varias ventajas además de la facilidad de implementación, son versátiles y muy útiles para cualquiera de sus posibles aplicaciones, por estas razones son altamente utilizadas para proporcionar servicios de seguridad. A pesar de que fueron creadas hace más de dos décadas, su uso sigue vigente y muy probablemente seguirá así, ya que son confiables y díficiles de vulnerar.

    Referencias

  • Facultad de Ingeniería. (2012). Fundamentos de Criptografía. Noviembre 19, 2017, de UNAM Sitio web: http://redyseguridad.fi-p.unam.mx/proyectos/criptografia/criptografia/
  • Corrales, H., Cilleruelo, C. & Cuevas, A. (2014). Criptografía y Métodos de Cifrado. Noviembre 19, 2017, de Universidad de Alcalá Sitio web: http://www3.uah.es/libretics/concurso2014/files2014/Trabajos/Criptografia%20y%20Metodos%20de%20Cifrado.pdf
  • Stallings, W. (2004). Fundamentos de Seguridad en Redes, Aplicaciones y Estándares. España: PEARSON EDUCACIÓN, S.A.
  • lunes, 13 de noviembre de 2017

    Socket Stream

    Socket Stream

    Introducción

    Un socket es una interfaz de entrada­-salida de datos que permite la intercomunicación entre procesos. Anteriormente se trató el tema de sockets datagrama (no orientados a conexión), sin embargo los sockets stream son los más utilizados y es el tema que se tratará en esta entrada.

    Mientras que el API de sockets datagrama permite el intercambio de unidades discretas de datos (es decir, datagramas), el API de sockets en modo stream proporciona un modelo de transferencia de datos basado en la E/S en modo stream de los sistemas operativos Unix. Por definición, un socket en modo stream proporciona sólo comunicaciones orientadas a conexión.

    Socket Stream

    Los sockets son mecanismos de comunicación entre procesos que permiten que un proceso hable ( emita o reciba información ) con otro proceso incluso estando en distintas máquinas.

    Propiedades

    Fiabilidad de la Transmisión. No se pierden los datos transmitidos.

    Conservación del Orden de los Datos. Los datos llegan en el orden en que se emitieron.

    No Duplicación de los Datos. El Dato sólo llega una vez.

    Comunicación en modo conectado. La conexión está establecida antes de iniciar la comunicación. De este modo, la emisión desde un extremo va destinada al otro (implícitamente).

    Componentes de la Arquitectura

    Servidor: es el programa que permanece pasivo a la espera de que alguien solicite conexión con él.

    • Está ejecutándose y esperando a que otro quiera conectarse a él.
    • Sirve la información que se le pida.

    Cliente: es el programa que solicita la conexión para pedir datos al servidor

    • En el momento de ejecutarlo o cuando lo necesite, intenta conectarse al servidor.
    • Solicita información al servidor.

    Proceso

    El servidor creará un socket, utilizando ServerSocket, le asignará un puerto y una dirección, una vez haga el accept para esperar llamadas, se quedará bloqueado a la espera de las mismas. Una vez llegue una llamada el accept creará un Socket para procesarla.

    A su vez, cuando un cliente desee establecer una conexión, creará un socket y establecerá una conexión al puerto establecido. Sólo es en este momento, cuando se da una conexión real y se mantendrá hasta su liberación mediante close().

    Para poder leer y escribir datos, los sockets disponen de unos stream asociados, uno de entrada (InputStream) y otro de salida (OutputStream) respectivamente. Para obtener estos streams a partir del socket se utiliza:

    • ObjetoDeTipoSocket.getInputStream ()
      Devuelve un objeto de tipo InputStream.
    • ObjetoDeTipoSocket.getOutputStream ()
      Devuelve un objeto de tipo OutputStream.

    Para leer los datos se necesita un BufferedReader y para escribirlos un PrintWriter.

    Al momento de enviarlos debe invocarse el método objPrintWriter.flush()

    Conclusiones

    Los sockets stream presentan muchas ventajas frente a los socket datagrama, por esta razón son el tipo de sockets más utilizado. Además, su funcionamiento es fácil de entender y sencillo de implementar, por lo tanto, a pesar de que existen otras herramientas como RMI o web socket siguen siendo utilizados.

    Referencias

  • Martin Santana, A. & Martínez Santana, L. (2008). Diseño de Sistemas Operativos. Noviembre 11, 2017, de Universidad de las Palmas de Gran Canaria Sitio web: http://sopa.dis.ulpgc.es/ii-dso/leclinux/ipc/sockets/sockets.pdf
  • Liu, M. L. (2004). Computación Distribuida: Fundamentos y Aplicaciones. Madrid: PEARSON EDUCACIÓN, S.A.
  • Arias, J. ( 2000). Programación de aplicaciones distribuidas usando sockets. Noviembre 10, 2017, de Universidad de Oviedo Sitio web: http://www.atc.uniovi.es/inf_superior/atc/DISTRIBUIDAS/prog_ap_dist_sock.pdf
  • domingo, 12 de noviembre de 2017

    Kerberos

    Kerberos

    Introducción

    La autenticación de clientes de acceso remoto es una cuestión de gran importancia para la seguridad de un sistema.

    Cuando se tenía un sólo ordenador compartido entre varias personas, para ayudar a mantener los archivos individuales privados, se desarrolló el concepto de contraseña, para que los usuarios solo pudieran acceder a sus propios contenidos. Fue Fernando Corbató quien introdujo la idea mientras trabajaba en el Massachusetts Institute of Technology (MIT) en 1960.

    En aquellos tiempos, el uso de contraseñas con este fin era bastante limitado, principalmente reducido a personas como Corbató y su equipo, que estaban entre los primeros que realmente exploraron el poder de las computadoras, por lo que no era importante o preocupante el hecho de que las contraseñas fueran simples y por lo tanto vulnerables.

    En la actualidad, en un entorno de computación de red abierta, una estación de trabajo no es confiable para identificar correctamente a sus usuarios en los servicios de red. Kerberos proporciona un enfoque alternativo por el que se utiliza un servicio confiable de autenticación de terceros para verificar las identidades de los usuarios.

    Kerberos

    Kerberos es un servicio de autentificación que se desarrolló como parte del Proyecto Athena en el MIT. Fue diseñado para abordar el problema que plantea el hecho de que en un entorno abierto distribuido, los usuarios de las estaciones de trabajo quieran acceder a servicios de servidores distribuidos por toda la red.

    El objetivo de éste es evitar solicitudes/respuestas fraudulentas entre servidores y usuarios que deben tener índole confidencial y en grupos de al menos un usuario y un servicio.

    ¿Cómo funcionan?

    En el sistema Kerberos, el cliente que desea contactar con un servidor para que le dé un servicio, debe pedir primero un ticket de una tercera parte de mutua confianza, el KAS("Kerberos Authentication Server"). Este ticket se obtiene como una función en la que uno de los componentes es una llave privada conocida sólo por el servicio y el KAS, de modo que el servicio puede estar seguro de que el ticket procede sólo de Kerberos. El KAS conoce al cliente por su nombre principal(c). La llave privada(K(c)) es la llave de autentificación conocida sólo por el usuario y el KAS.

    Proceso detallado:
    1. Cliente -> KAS: El cliente envía un mensaje {c, tgs, n}, al KAS, que contiene su identidad(c), una palabra temporal o "nonce"(un sello de tiempo u otro forma de identificar su solicitud), y solicita un ticket para usarlo con el servidor de tickets(TGS).
    2. KAS -> Cliente: El servidor de autentificación busca el nombre del cliente(c) y el nombre del servicio(TGS, el servidor de tickets) en la base de datos de Kerberos, y obtiene una llave de encriptación para cada uno de ellos K(c) y K(TGS).

      El KAS crea a continuación una respuesta para enviársela al cliente.

      Esta respuesta contiene un ticket inicial T(c,TGS) que garantiza al cliente acceso al servidor solicitado(el TGS). T(c, TGS) contiene k(c,TGS), c, TGS, el "nonce", el tiempo de vida y otra información.

      El KAS también genera una llave aleatoria de encriptación K(c, TGS), llamada llave de sesión. Luego encripta este ticket usando la llave de encriptación del TGS(K(TGS)). Este procedimiento es lo que se denomina un ticket sellado {T( c,tgs)}K( tgs).

      Inmediatamente se crea un mensaje consistente en el ticket sellado y la llave de sesión de TGS K(c, TGS).
    3. Cliente -> TGS: A la recepción del mensaje, el cliente lo desencripta usando su llave secreta K(c) que es la única que él y el KAS conocen. Comprueba que el "nonce" (n) coincide con la solicitud específica, y entonces guarda la llave de sesión K (c,tgs) para futuras comunicaciones con el TGS.

      El cliente envía a continuación un mensaje al TGS. Este mensaje contiene el ticket inicial {T(c,tgs)}K(tgs), el nombre del servidor(s), un "nonce", y un nuevo autentificador A(c) que lleva un sello de tiempo. A(c) es {c, nonce}.

      El mensaje es: {A(c)}K(c,tgs), {T(c,TGS)}K(TGS), s, n
    4. TGS -> Cliente: El TGS recibe el mensaje anterior del cliente(c), y descifra primero el ticket sellado usando su llave de encriptación TGS(este ticket fue sellado originalmente por el KAS usando la misma llave). El TGS obtiene la llave de sesión para TGS de del ticket descifrado, y la emplea a su vez para descifrar el autentificador sellado (la validez se chequea comparando el nombre del cliente tanto en el ticket como en el autentificador, el nombre del servidor TGS que figura en el ticket, la dirección de red que debe ser igual en el ticket, en el autentificador y en el mensaje recibido).

      Finalmente, chequea la hora actual en el autentificador para cerciorarse de que el mensaje es reciente. Esto requiere que todos los clientes y servidores mantengan sus relojes dentro de cierto margen prescrito de tolerancia. Ahora el TGS busca el nombre del servidor que aparece en el mensaje en la base de datos de Kerberos, y obtiene la llave de encriptación(K(s)) para el servicio especificado.

      El TGS crea una nueva llave aleatoria de sesión K(c,s) para el cliente(c) y el servidor, para generar a continuación un nuevo ticket. T(c,s) que contiene: K(c,s), n, "nonce", tiempo de vida.

      Luego ensambla un mensaje y lo envía al cliente.
    5. Cliente -> Servidor: El cliente recibe este mensaje y lo descifra usando la llave de sesión para el TGS que sólo comparten él y el TGS.

      De este mensaje calcula una nueva llave de sesión K( c,s) que comparte con el servidor(s) y un ticket sellado que no puede descifrar porque está cifrado con la llave secreta del servidor K(s).

      El cliente construye un autentificador y lo sella con la nueva llave de sesión K(c,s). Por último, envía un mensaje que contiene el ticket sellado y el autentificador al servidor(s) para solicitar su servicio.

      El servidor(s) recibe este mensaje y descifra primero el ticket sellado con su llave de encriptación, conocida sólo por él y el KAS. Luego usa la nueva llave de sesión contenida en el ticket para descifrar el autentificador y realiza el mismo proceso de validación que el descrito en el paso 4.

      Una vez que el servidor ha validado a un cliente, el cliente tiene la opción de validar a su vez al servidor. Esto evita que un intruso suplante al servidor.

      El cliente requiere que el servidor le devuelva un mensaje con el sello de tiempo(procedente del autentificador del cliente, incrementado en uno). Este mensaje se cifra con la llave de sesión que pasó del cliente al servidor.
    Especificaciones:
    • Con el fin de que la estación de trabajo emplee cualquier servidor, se requiere un ticket. Todos los tickets, a excepción del primero(también llamado ticket inicial) se obtienen del TGS. El primer ticket es especial: es un ticket para el propio TGS y se obtiene del KAS.
    • Cada ticket está asociado con una llave de sesión que se asigna cada vez que se concede un ticket.
    • Los tickets son reutilizables. Cada ticket tiene un tiempo de vida, típicamente de ocho horas. Después de que un ticket ha expirado, el usuario ha de identificarse de nuevo al Kerberos, introduciendo el nombre de usuario y el password.
    • A diferencia de un ticket, que puede ser reutilizado, hace falta un nuevo autentificador cada vez que el cliente inicia una conexión con el servidor. El autentificador contiene un sello de tiempo que expira a los pocos minutos de haber sido expedido(esta es la razón por la que los relojes de clientes y servidores deben estar sincronizados).

      Un servidor debería mantener un seguimiento de las solicitudes anteriores de los clientes para las que el sello de tiempo en el identificador es aún válido. De este modo el servidor puede rechazar solicitudes duplicadas que podrían surgir de un ticket y un identificador robados.

    Conclusiones

    Los kerberos ofrecen muchas ventajas, como es, por ejemplo, que en vez de crear protocolos elaborados de autentificación en cada servidor, proporciona un servidor centralizado de autentificación cuya función es la de autentificar los usuarios al servidor y los servidores a los usuarios, por esta razón es un método muy utilizado.

    Sin embargo, existen otras opciones de autenticación que probablemente seguirán mejorando, por lo que es recomendable probar todas las consideradas confiables para saber manejar alternativas.

    Referencias

  • MIT. (12 de 11 de 2017). MIT. Recuperado el 12 de 11 de 2017, de Kerberos: http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-es-4/ch-kerberos.html
  • Oracle. (12 de 11 de 2017). Oracle. Recuperado el 12 de 11 de 2017, de Cómo funciona el servicio Kerberos: https://docs.oracle.com/cd/E24842_01/html/E23286/intro-25.html
  • Stallings, W. (2004). Fundamentos de Seguridad en Redes, Aplicaciones y Estándares. España: PEARSON EDUCACIÓN, S.A.
  • Sistemas Heredados

    Conclusiones Los sistemas heredados pueden llegar a representar la base de la funcionalidad de una empresa, además de contener informa...