Servidor de nombres En un sistema distribuido, se usa algún nombre para hacer referencia a algún recurso como nodos de procesamiento (computadoras), puertos, servicios y usuarios. Los nombres son útiles al momento en que se desea establecer una comunicación o compartir recursos en un sistema distribuido. A continuación se listan algunos tipos de nombres: • Identificadores de puertos y procesos. • Nombres textuales de servicios. • Identificadores de recursos. • Nombres de archivos. • Direcciones físicas y lógicas de redes. Muchos de los nombres usados en un sistema distribuido se refieren a un servicio en particular; por ejemplo, un cliente (usuario o proceso) usa tal nombre para solicitar un determinado servicio para ejecutar alguna operación sobre un objeto o recurso con un nombre propio. A la asociación entre un nombre y un objeto se llama liga o conexión. Cada objeto en un sistema tiene ciertos atributos. Por ejemplo, los servicios y las computadoras tienen direcciones físicas; los usuarios cuentan con direcciones de correo electrónico, números telefónicos y direcciones de sus computadoras personales, agregando llaves de acceso, directorios de trabajo, etc. En general, los valores de los atributos o son valores primitivos tales como enteros o son en sí nombres, o una dirección de Internet como 221.230.321.111. Servicio de nombres. Un servicio de nombres administra una base de datos con las ligas que guardan entre sí un conjunto de nombres textuales (legibles a primera vista por humanos) y atributos de objetos tales como computadoras y usuarios. La operación que se presenta más comúnmente en un servicio de nombres es la resolución de un nombre; operación que consiste en encontrar sus atributos en la base de datos. En sistemas distribuidos, el uso de nombres para propósitos de comunicación no es del todo suficiente, por que los procesos de comunicación van de una computadora a otra, y es necesario el conocimiento de su ubicación. Esto nos lleva al problema de los nombres en un sistema de comunicaciones. Existen tres conceptos básicos en esta área: • El nombre de un objeto, por ejemplo un recurso o servidor; especifica lo que busca un proceso. • Una dirección especifica dónde se encuentra el objeto. • Una ruta especifica cómo llegar ahí. Por lo regular, los nombres no consisten en simples cadenas, sino que también se forman de varios componentes llamados contextos; por ejemplo, itm@itm.andromeda.mx. 4.2. Seguridad, criptografía La seguridad y la protección se encargan del control del uso y del acceso no autorizado a los recursos de hardware y software de un sistema de computación, ya que organizaciones de negocios y oficinas de servicios usan en gran medida a las computadoras para almacenar información, por lo que es necesario prevenir su uso y acceso no autorizado. 1 Podemos clasificar a las violaciones de seguridad en tres categorías [Sing−Shiv94]: • Liberación no autorizada de información. Ocurre cuando una persona no autorizada tiene la posibilidad de leer y tomar ventaja de la información almacenada en una computadora. También se incluye el uso no autorizado de un programa. • Modificación no autorizada de información. Este tipo de violación se da cuando una persona tiene la posibilidad de alterar la información almacenada en un sistema computacional. • Bloqueo no autorizado de servicios. Se da cuando una persona no autorizada bloquea la capacidad de algún usuario autorizado, a accesar la información almacenada en un sistema computacional. La seguridad en los sistemas computacionales puede dividirse en dos tipos: seguridad externa y seguridad interna. La seguridad externa (llamada comúnmente seguridad física), se encarga de regular el acceso al hardware del sistema, incluyendo: discos, cintas, reguladores y no−breaks, acondicionadores de aire, terminales, procesadores. La seguridad interna se encarga del acceso y uso del software almacenado en el sistema. A diferencia de la seguridad física, existe el tema de autenticación, en el cual el usuario se registra (login) en el sistema para accesar a los recurso de hardware y software del mismo. Protección y seguridad. Cabe distinguir entre los conceptos de protección y seguridad. Se deben adoptar varias políticas de seguridad, que sean diseñadas para todas las actividades realizadas en el sistema. Se emplean los mecanismos de seguridad para implementar las políticas diseñadas. Debemos notar que las políticas de seguridad son independientes de la tecnología usada en el sistema. Las políticas se refieren a lo que debería hacerse y los mecanismos se refieren a cómo deberían hacerse las cosas. Ejemplo: Sistema de seguridad Kerberos Kerberos es un sistema de autenticación basado en el protocolo Needham y Schroeder [Sing−Shiv94]. El sistema fue desarrollado en el Instituto de Tecnología de Massachussets (MIT, por sus siglas en inglés) para proveer de un variado número de servicios de autenticación y seguridad. Este protocolo es usado en el MIT para proveer acceso seguros a NFS, el sistema de archivos Andrew y muchos otros servicios. Principalmente, Kerberos trata con tres diferentes tipos de objetos de seguridad: • Un boleto que es un token emitido al cliente por el servicio de entrega de tokens, con fines de presentación a un servidor, verificando que el emisor ha sido recientemente autentificado por Kerberos. • Se usa un autentificador, que es un token construido por un cliente y enviado a un servidor para probar la identidad del usuario y la comunicación en uso con el servidor. El autentificador, que puede ser usado sólo una vez, contiene el nombre del cliente y una marca de tiempo y es encriptado en la sesión en que es usado. • Existe una llave de sesión, que es una llave secreta generada aleatoriamente por Kerberos y es enviada al cliente, para ser usada durante la comunicación con determinado servidor. Un servidor Kerberos es conocido como un centro de distribución de llaves (KDC, por sus siglas en inglés). Cada KDC ofrece un Servicio de Autenticación (AS, por sus siglas en inglés) un Servicio de Concesión de Boletos (TGS, por sus siglas en inglés). Siempre que un usuario se registra en un servidor (login), el usuario es autentificado por el Servicio de Autenticación y se provee al proceso, que actúa a favor del usuario, con un boleto otorgado y una llave de sesión para comunicarse con el Servicio de Entrega de Boletos (TGS). Subsecuentemente, el proceso cliente original y sus descendientes pueden usar el boleto concesionado para 2 obtener boletos y llaves de sesión para obtener otros servicios específicos. El sistema Kerberos usa en los boletos valores de tiempo (enteros que representan una fecha y una hora), los cuales sirven para dos propósitos: • Proteger contra las réplicas de mensajes viejos interceptados en la red, o la reutilización de boletos viejos almacenados en la memoria de computadoras usadas por usuarios autorizados, y que fueron desconectados (logged−out). • Aplicar un tiempo de vida a los boletos, permitiendo la revocación de los derechos de un usuario, cuando por ejemplo, los boletos expiran para autorizar a un usuario a seguir usando el sistema. La mayoría de los servidores registrados en una red, solicitan un boleto a cada cliente al inicio de cada interacción cliente−servidor, incluyendo almacenamiento de archivos (NFS o Argus), correo electrónico, enlace e impresión remotos. Las llaves de acceso (passwords) de los usuarios son sólo conocidas por cada uno de ellos y por el sistema de autenticación de Kerberos. Los servicios poseen llaves secretas que son conocidas solamente por Kerberos y por los servidores proveedores del servicio. Criptografía En un sistema en el que participan varios usuarios, existe la posibilidad de que algún usuario no autorizado intente tener acceso a información confidencial [Mullender89]. Por ejemplo, un usuario puede traspasar el mecanismo de protección de un sistema o intervenir un canal físico, para robar información que se transporta en la red. Debido a esto, es necesario agregar otros mecanismos de protección para que los intrusos (usuarios no autorizados), si logran irrumpir en el sistema; no entiendan o hagan uso de la información que puedan obtener de manera no autorizada. La criptografía es un proceso para transformar datos [Sing−Shiv94], generalmente de datos representados como un texto claro a un texto clave o cifrado, y que sólo puede ser convertido nuevamente en un texto claro y entendible usando una llave en particular y aplicándole un algoritmo apropiado. Por lo general, las técnicas de criptografía se aplican antes de que la información sea almacenada o transmitida por algún canal físico, en el caso de una red. Existen varios tipos o categorías en que se clasifican las técnicas de encriptación de información. Sistemas de encriptación • Sistemas convencionales • Sistemas modernos ♦ Sistemas de llave pública ♦ Sistemas de llave privada Sistemas convencionales de encriptación. Este tipo de encriptación se basa en la sustitución de cifras, en la cual, cada caracter en un texto claro o base es sustituido por otro caracter. Existen varias técnicas que a continuación se discuten: Cifra Caesar. En éste método, cada letra del texto original se transforma en la tercer letra siguiente en el alfabeto o tabla de códigos. Por ejemplo, el texto "CASA" es transformado en "FDVD", de acuerdo al equivalente en la tabla de códigos ASCII. Sustitución simple. 3 En este método, cualquier permutación de letras puede ser identificado al lenguaje Español o Inglés y elimina la relación posicional de la Cifra Caesar, debido a que cada permutación de letras es una llave, hay 26! (>1026) llaves en una cifra como ésta, lo que hace muy costosa una búsqueda exhaustiva. Sin embargo, la cifra por sustitución simple preserva la frecuencia de sustitución de las letras de un alfabeto porque se ejecuta la misma sustitución en todas las ocurrencias de una letra, y puede usarse un análisis estadístico para desencriptar la cifra. Cifra polialfabética. La cifra polialfabética usa una secuencia periódica de n letras de sustitución, es decir; el método actúa con n sustituciones alfabéticas periódicamente. Este método puede tener un mayor impacto si se escoge apropiadamente la sustitución. Una forma de aplicar este método es usar la Cifra Caesar con diferentes llaves. Por ejemplo, se puede tener la secuencia de enteros 11, 19, 4, 22, 9, 25 y se obtendría el texto cifrado agregando repetidamente cada entero al texto original. Sistemas modernos de encriptación Los métodos de criptografía moderna van más allá de los métodos tradicionales y usan información representada en forma binaria (el texto original −plain text− y el texto cifra −cipher text− se mantienen en forma binaria). Generalmente, en estos métodos se conocen las técnicas de encriptación y desencriptación, pero la llave requerida para desencriptar el texto cifra se mantiene en secreto. Los esquemas de criptografía moderna se basan en el principio de la búsqueda exhaustiva, aunque se conozca el mecanismo de desencriptación, el procedimiento de desencriptación es tan intensivo computacionalmente, que tomaría un tiempo prohibitivo para encontrar la llave. Método de llave privada La criptografía por llave privada se ha convertido en un estándar. Fue desarrollado por IBM y ha sido el estándar usado por el gobierno de los Estados Unidos. Este método es conocido como el Estándar de Encriptación de Datos (DES, por sus siglas en inglés), y utiliza básicamente dos operaciones: Se usa una operación de permutación para permutar los bits de una palabra y su objetivo es difundir o esparcir la correlación y las dependencias entre los bits de una palabra. Una operación de sustitución reemplaza una entrada de m bits por una salida n de bits, sin que exista una relación directa entre ambas. Generalmente, una operación de sustitución consta de tres pasos: primero, la entrada de m bits se convierte a una forma decimal; segundo, se permuta la forma decimal (para obtener otro número decimal); y finalmente, la salida decimal se convierte en una salida de n bits. Procedimiento de encriptación. El método consiste en encriptar bloques de datos de 64 bits usando una llave de 56 bits, que por detección de errores se incrementa en 8 bits de paridad. Hay tres pasos básicos envueltos en la encriptación: primero, el bloque del texto original sufre una permutación inicial PI, en la cual se permuta el bloque de 64 bits; segundo, el bloque permutado sufre una transformación compleja, esta transformación usa la llave y se envuelve en 16 iteraciones; tercero, la salida del segundo paso sufre una permutación final PI−1, que resulta la inversa de la permutación del primer paso y el resultado de este tercer paso es el bloque cifrado. Ahora se describirá la transformación iterativa del segundo paso, que resulta la parte principal de este método. Asignar a Li y Ri las mitades izquierda y derecha de 32 bits del bloque criptado de 64 bits, después de la i−ésima iteración (1 <= i <= 16). Li−1, Ri−1 y ki son las entradas para la i−ésima iteración, donde ki es una 4 llave de 48 bits usada en la i−ésima iteración y es derivada de llave y el número de iteración, ki = ð(llave,i). Para la iteración 0, L0 y R0 son respectivamente la parte izquierda y derecha del bloque de 64 bits después de la permuta 4.3. Protección Los usuarios de un sistema ya sea centralizado o distribuido, confían en que el sistema mantendrá segura su información [Sing−Shiv94]. La seguridad en los sistemas de computadoras incluye muchos aspectos: confiabilidad, autenticidad, integridad, privacía; y se relaciona con la prevención de que usuarios no autorizados hagan uso de los datos y recursos. El fin de estos mecanismos es el de prevenir que algunos usuarios puedan robar espacio en disco, ciclos de procesamiento, que los archivos no sean leídos por personas ajenas o que modifiquen bases de datos que no les pertenezcan. Los mecanismos de protección sólo resultan seguros en principio, ya que en ocasiones no son usados propiamente y la mayoría de los problemas son causados por errores humanos. Los mecanismos de protección tienen que poner atención en los siguientes temas: • Privacidad de almacenamiento. Se refiere a que los usuarios deben poder mantener su información en secreto; dicho en otras palabras, prevenir que otros usuarios la vean. • Privacidad en el paso de mensajes. La privacidad tiene que ver con que a los usuarios se les garantice que la información que entreguen sea usada solamente para los propósitos para los que fue remitida. • Autenticidad. La información que se entregue a algún usuario debe ser auténtica, es decir; se debe poder verificar y asegurar la fuente de donde proviene la información. • Integridad. La información almacenada por el sistema no debe ser corrupta ya sea por el sistema o por algún usuario no autorizado. Es común que asociemos los derechos para accesar ciertos objetos a cierta persona en específico y los derechos de acceso comúnmente son pasados de un usuario (o servidor), a cualquier proceso ejecutado por ese usuario. Se usa el término dominio para indicar al conjunto de cosas (usuarios, servidores y procesos) que pueden accesar a ciertos objetos; por ejemplo, el derecho de un usuario para escribir en su propio directorio es parte del dominio de protección de cada usuario; y sin embargo, no es parte del dominio de protección de otros usuarios, así que los procesos ejecutados por otros usuarios no heredarán el derecho de escribir sobre ése directorio. Los objetos resguardados por los mecanismos de protección van desde los archivos y los directorios, hasta los procesos, y aún los mismos dominios de protección. 4.4. Archivos distribuidos; NFS Todos los usuarios en un sistema distribuido son creadores y consumidores potenciales de información [Mullender89]. En ocasiones, los usuarios desearían modificar o consultar su información desde una terminal remota; lo que trae que la ubicación física o territorial del usuario requiere que la información esté disponible desde cualquier lugar. El gran reto técnico a esta necesidad, es lograr que la información que sea compartida o no, esté segura, sea confiable y eficiente, en una forma en que no importe el tamaño del sistema distribuido. Al hablar de archivos, debemos tener en cuenta el medio de almacenamiento para éstos; y debemos hablar de medios de almacenamiento permanente. Los medios de almacenamiento permanente consisten en un conjunto de objetos que explícitamente desde su creación, son inmunes a fallas del sistema, y persisten hasta que son físicamente destruidos. 5 En un modelo de un sistema de computación con un sólo usuario, en un sólo sitio de procesamiento; se observan cuatro apartados clave en el sistema de archivos [Mullender89]: • Nombres. Tiene que ver con la forma en que los usuarios pueden nombrar a los archivos, que tan largos pueden ser los nombres de los archivos o si tienen alguna extensión. • Interfaz de programación. Contempla la forma en los archivos serán accesados desde las aplicaciones, ya sea por un mapa en donde se dirigen los archivos a una dirección de memoria usada por un proceso y accesar su contenido como si fuese memoria virtual, o incorporar en el sistema operativo una serie de operaciones para tratar a los archivos. • Almacenamiento físico. Trata en la forma en que será llevada a cabo la organización de los archivos en los medios de almacenamiento físico, si la interfaz de programación es independiente del medio de almacenamiento, como se balancean los requerimientos de ejecución con los problemas de fragmentación. • Integridad. Se debe considerar la consistencia de los archivos en contra de fallas en la alimentación eléctrica, hardware, medio de almacenamiento y software. Otro nivel que se considera en el diseño, es lo referido a un sistema computacional de un sólo usuario con múltiples procesos en un sólo nodo de procesamiento [Tanenbaum96]. En este nivel toma mucha importancia el control de concurrencias, ya que el sistema tiene que trabajar con varias reglas de sincronización. 4.5. Duplicidad Se usa la duplicidad de los datos para mantener en línea copias de información y de otros recursos. La duplicidad resulta un campo clave en los sistemas distribuidos, ya que provee un mejor desempeño, alta disponibilidad y tolerancia a fallas. Por ejemplo, el sistema USENET administra copias de partidas o mensajes emitidos a mesas de boletines a través de Internet, el sistema de nombres DNS administra copias de mapas de nombres de direcciones de computadoras y otros recursos y es usado día a día en Internet. Otro ejemplo donde se usa la duplicidad es en el caché de información, ya que éstos representan réplicas de un servidor en otro [Mullender89]. A continuación se mencionan algunas de las razones principales de la duplicidad [Mullender89]. • Desempeño. La réplica de información puede ser usada para incrementar el tiempo de respuesta a un servicio, ya que la información compartida por un número grande de usuarios no debería ser almacenada en un sólo sitio, pues esa computadora se convertiría en un cuello de botella y aumentarían los tiempos de respuesta. Es preferible distribuir varias copias de información en varios servidores y lograr que cada uno de ellos atienda a un número de usuarios más reducido. • Disponibilidad. Al tener varias copias de información en dos o más servidores independientes a fallas ejecutando software similar, disponibles por líneas de conexión independientes, y si llegase a fallar el servidor por defecto, el software cliente puede accesar a un servidor alternativo y obtener los servicios requeridos. • Tolerancia a fallas. Si cada uno de los servidores de una colección procesa en paralelo cada petición de un cliente, entonces es posible garantizar el procesamiento correcto de una petición, aún si uno o más de los servidores llegaran a fallar. El mayor requerimiento que se presenta al duplicar información, es la transparencia de almacenamiento. Esto quiere decir que los usuarios no deben preocuparse o tener en cuenta de que existen varias copias físicas de la información. Fallas de partición 6 Cuando llega a fallar la comunicación entre dos sitios que contienen copias de los mismos datos lógicos, se hace difícil asegurar la consistencia mutua entre las copias[Mullender89] . Las fallas más dañinas son las fallas de partición, las cuales fragmentan la red en subredes aisladas llamadas particiones. A menos que las fallas de partición sean detectadas y reconocidas por todos los procesadores afectados, las modificaciones independientes y no coordinadas pueden aplicarse a las diferentes copias de la información, comprometiendo la correctitud (integridad) de ella. El diseño de un algoritmo para administración de información duplicada y tolerante a fallas es notoriamente difícil. Típicamente, las causas o extensión de las fallas de partición no pueden ser percibidas por los propios procesadores. En el mejor de los casos, un procesador tiene la posibilidad de identificar a un procesador dentro de su partición; pero para los aquellos que se encuentran fuera de su partición, no podrá distinguir el caso donde se encuentran aislados. Agregando a esto, las respuestas lentas pueden causar que la red parezca particionada cuando no lo está, complicando el diseño de un sistema tolerante a fallas. Sin embargo, los problemas relacionados con el funcionamiento correcto de un sistema de archivos distribuidos particionado no se limita sólo a aquellos asociados con que la información almacenada sea correcta. Debido al costo y la complejidad de mantener información duplicada, la mayoría de los sistemas de archivos distribuidos limitan la cantidad de réplicas a algunas cuantas copias. Ya que la información no se encuentra duplicada en todos los sitios de la red, se pueden montar consultas (queries, − transacciones que ejecutan operaciones para la lectura de información−) durante una partición de la red, por lo que no toda la información se encuentre disponible en determinado momento. Beneficios de la duplicidad En un sistema distribuido, es común que la información se duplique para mejorar el desempeño y la disponibilidad. Almacenando copias de información compartida en procesadores donde sea frecuentemente accesada, se decrementará el uso de accesos de lectura remotos [Mullender89] . Además, almacenando copias de la información que resulta crítica en procesadores con modos de falla independientes, se aumentará la probabilidad de que estará disponible al menos una copia de la información crítica. Es común que la duplicidad resulte central al resolver algunos problemas de computación distribuida. Por ejemplo, las consideraciones de modularidad y precio − desempeño que surgen en una fábrica automatizada. Sin embargo, muchas fábricas usan dispositivos controlados por procesadores dedicados que requieren de respuestas en tiempo real. Cualquier demora impuesta por la red a los controladores debe ser resuelta, pero en un sistema donde la información no es duplicada o almacenada en caché, esto es difícil de garantizar debido a la perdida de paquetes. Por lo anterior, los sistemas distribuidos de tiempo real necesitan de algún método para duplicar información crítica requerida en rutas críticas. La duplicidad de la información beneficia altamente el trabajo en red, ya que en el caso de alguna caída de alguna máquina se puede propagar la falla a otras más. Puede ser necesario tener respaldos de procesos que se restablecerán para completar el proceso interrumpido. 7