Diseñando un sistema de autentificación: un dialogo en 4 escenas

Introducción

Este dialogo provee un relato ficticio del diseño de un sistema de autentificación para redes abiertas llamado "Charon". En el transcurso del dialogo, los personajes Athena y Eurípides descubren los problemas de seguridad inherentes en un ambiente de red abierto. En el diseño de Charon se deben dirigir a cada uno de sus problemas. Athena y Eurípides no terminan su trabajo hasta que se cierra el dialogo.

Cuando terminan de diseñar el sistema, Athena le cambia el nombre a "Kerberos", coincidentemente el mismo nombre del sistema de autentificación que fue diseñado en el proyecto del MIT llamado Athena. El sistema Kerberos del dialogo lleva una notable resemblansa al sistema descrito en: "Kerberos: un servicio de autentificación para sistemas de redes abiertos", presentado en Dallas Texas en el USENIX en 1988.

Escena I

Escena II

Escena III

Escena IV

Personajes:

Athena Desarrolladora de sistemas joven y prometedora
Eurípides Un desarrollador experimentado y loco

Escena I

En un área de cubículos Athena y Eurípides están trabajando en terminales vecinas.

Athena Oye Rip este sistema de tiempo compartido es un fastidio. No puedo trabajar porque todo mundo esta conectado
Eurípides No vengas a quejarte conmigo. Yo solo trabajo aquí
Athena Sabes qué necesitamos?, necesitamos darle a cada quien su propia estación de trabajo de manera que no se tengan que preocupar de compartir ciclos de proceso. Y usaríamos una red para conectar a todas las estaciones de trabajo para que se puedan comunicar todos
Eurípides Bien, a si es que.... Cuantas necesitas?, mas o menos 1000 estaciones de trabajo?
Athena Mas o menos
Eurípides Conoces el tamaño de un disco duro de una estación de trabajo típica?, no hay espacio suficiente para todo el software que tienes en una maquina de tiempo compartido .
Athena Si, pero podemos solucionar esto. Podemos guardar copias del software en varias máquinas servidores. Cuando tú te conectes en una estación de trabajo, la estación de trabajo va a accesar este software haciendo una conexión de red con uno de los servidores. De esta manera permites que un buen de estaciones de trabajo usen la misma copia del software, y así las actualizaciones del software son sencillas. No tienes que andar cambiando software de estación en estación. Solo modificar el software de los servidores
Eurípides Esta bien. Pero que vas a hacer con los archivos personales? Con los sistemas de tiempo compartido puedes conectarte y accesar a mis archivos desde cualquier terminal que este conectada al sistema. ¿Podré subir a cualquier estación de trabajo y automáticamente accesar a mis archivos? ¿ O tengo que hacerle como un usuario de una PC, guardar mis archivos en un diskette? Espero que no
Athena Pienso que podemos usar otras máquinas para proveer almacenamiento de archivos personales, y así puedes conectarte a cualquier estación de trabajo y accesar a tus archivos
Eurípides ¿ y qué pasa con la impresión? ¿toda estación de trabajo tiene su propia impresora? ¿y el correo electrónico? ¿Como vas a distribuir el correo a todas estas estaciones de trabajo?
Athena: Ah... Obviamente no tenemos dinero para dar a todos una impresora, pero podríamos tener maquinas dedicadas al servicio de impresión, es decir envías un trabajo a la impresora servidor, y esta lo imprime por ti. Podrías hacer este tipo de cosas con el correo. Tener una maquina dedicada al servicio de correo, si tu quieres tu correo, te conectas al servidor de correo y lo recoges.
Eurípides: Tu sistema de estación de trabajo realmente suena bien. ¿Cuándo puedo tener el mío, que tengo que hacer? Voy averiguar tu username, y tener mi estación de trabajo pensando, entonces que yo soy tu. Después me voy a conectar al servido de correo y voy a recoger tu correo, voy a conectarme al servidor de archivos y borrar tus archivos, y ....
Athena Qué puedes hacer que?
Eurípides: Claro! Cómo van a saber estos servidores de red que yo no soy tu?
Athena: No se, pero creo que necesito pensar en hacer algo
Eurípides: Déjame saberlo cuando lo tengas.

Escena II

La mañana siguiente en la oficina de Eurípides. Eurípides esta sentado en su escritorio, leyendo su correo. Athena toca la puerta.

Athena: Ya se como asegurar un ambiente de red abierto de tal manera que una persona tan aprovechada como tú no pueda usar los servios de red con el nombre de otra persona.
Eurípides Es eso? Toma asiento

Ella lo hace

Athena: Antes de describirlo, ¿puedo poner una condición acerca de esta discusión?
Eurípides: Cuál es tu condición?
Athena: Bien, supón que digo algo como lo siguiente: "Quiero mi correo electrónico, a si que contacto al servidor de correo y le pido que mande el correo a mi estación de trabajo". En realidad yo no soy la entidad que contacta el servidor de correo. Estoy usando un programa que accesa al servidor de correo y recupera mi correo, un programa que es un CLIENTE del programa del servicio de correo.

Pero no quiero decir "que el cliente hace esto y aquello" cada vez que me refiero a una transacción entre el usuario y el servidor de red. Yo había dicho "yo hago esto y esto", teniendo en mente desde luego que un programa cliente esta haciendo cosas en mi representación. ¿te parece bien?

Eurípides: Seguro. No hay problema
Athena: Bueno, esta bien, Voy empezar diciendo el problema que ya he resuelto. En un ambiente de red abierto, las maquinas que proveen servicios debes ser capaces de confirmar la identidad de la gente que requiere servicio, si contacto el servidor de correo y le pido mi correo, el programa de servicio debe ser capaz de identificar que soy quien digo ser, de acuerdo?
Eurípides De acuerdo
Athena: Tu podrías resolver el problema tontamente, requiriendo que el servidor de correo pida un password antes de poder usarlo. Yo pruebo quien soy al servidor dándole mi password.
Eurípides: Eso esta tontamente bien. En un sistema como ese. Cada servidor debe saber tu password. Si la red tiene mil usuarios, cada servidor tiene que saber mil password. Si quieres cambiar tu password tienes que contactar a todos los servidores y notificarles el cambio. Pensare que tu sistema no es así de estúpido
Athena: Mi sistema no es estúpido. Funciona así: No solo la gente tiene password, los servicios tienen password también, cada usuario sabe su password, cada programa de servicio sabe su password y existe un SERVICIO DE AUTENTIFICACIÒN que sabe TODOS los password, cada password de cada usuario y cada password de cada servicio, este servicio de autentificación guarda todos los password en una sola base de datos centralizada
Eurípides: Tienes un nombre para este servicio de autentificación?
Athena: No he pensado en uno todavía, ¿tienes idas?
Eurípides: ¿Cuál es el nombre de aquel tipo quien transporta a los muertos a través del Río Styx?
Athena: Charon?
Eurípides: Si es él. El no te cruzará el río hasta que puedas probar tu identidad.
Athena: Ahí vas de nuevo Rip, tratando de reescribir la mitología Griega otra vez. A Charon no le interesa tu identidad, el sólo quiere asegurarse de que estas muerto.
Eurípides Tienes un mejor nombre?

Pausa

Athena: No, no realmente.
Eurípides Entonces llamemos al servicio de autentificación "Charon."
Athena: OK, creo que solo describiré el sistema, verdad?,

Digamos que tu quieres usar un servicio, el servicio de correo. En mi sistema tu no puedes usar un servicio a menos que, ah, Charon le diga al servicio que tu eres quien dices que eres. Y tu no puedes recibir el permiso para usar un servicio hasta que te hayas autentificado con Charon. Cuando tu requieres a Charon que te autentifique, tienes que decirle a Charon el servicio para el cual quieres la autorización. Si quieres utilizar el servicio de correo debes decircelo a Charon.

Charon te pide que pruebes tu identidad. Tu lo haces dándole tu password secreto. Charon toma tu password y lo compara con el que tiene registrado en su base de datos. Si los dos passwords concuerdan, Charon considera que tu identidad ha sido aprobada.

Charon ahora tiene que convencer al servidor de correo de que tu eres, quien dices que eres. Debido que Charon sabe todos los password de los servicios , sabe el password del servicio de correo. Es concebible de que Charon pudiera darte el password, el cual puedes mandar el servicio de correo como prueba de que tu te haz autentificado ante Charon.

El problema es, que Charon no puede darte el password directamente porque entonces tu lo sabrías. La siguiente vez que tu quisieras correo podrías darle la vuelta a Charon y usar el servidor de correo sin identificarte correctamente. Inclusive podrías pretender ser otra persona y usar el servidor de correo con el nombre de otra persona.

Así que en lugar de darte el password del servidor de correo Charon te da un TICKET de servicio de correo. Este ticket contiene una versión de tu username que ha sido ENCRIPTADO USANDO EL PASSWORD DEL SERVIDOR DE CORREO

Ahora con tu ticket en mano, puedes pedir al servidor de correo tu correo. Haces tu petición diciéndole al servidor quien eres, y entregándole el ticket que prueba que tu eres quien dices que eres.

El servidor usa su password para desencriptar el ticket, y si el ticket se desencripta apropiadamente el servidor va obtener el nombre el username que Charon puso en el ticket

El servido compare este nombre con el nombre que tu enviaste con el ticket. Si los nombres coinciden el servidor de correo considera que tu entidad ha sido probada y procede a darte tu correo

¿Qué piensas de esas manzanas¿

Eurípides Tengo algunas preguntas
Athena: Lo imagine, bueno adelante
Eurípides Cuando un programa de servido desencripta un ticket, ¿Cómo sabe que lo ha encriptado apropiadamente?
Athena: No lo se
Eurípides Quizás deberías incluir el nombre del servicio en el ticket, de esa manera cuando un servido desencripte un ticket puede medir su éxito, si encuentra su nombre en el nombre en el ticket desencriptado
Athena: Eso suena bien. En tonces un ticket se vería más o menos así:

(Ella escribe sobre un pedazo e papel)

TICKET - {username:servicename}

Eurípides ¿Así es que el ticket de servicio contiene solo tu nombre de usuario y el nombre del servicio?
Athena: Encriptado con el password de servicio
Eurípides No creo que sea suficiente información para hacer el ticket seguro
Athena: Qué quieres decir?
Eurípides Supongamos que le pides a Charon un ticket para el servicio de correo. Charon prepara ese ticket de manera que tiene tu username "tina" en el. Supón que yo copio ese ticket en el camino a través de la red desde Charon hasta ti. Supón que convencía a mi insegura estación de trabajo de que mi nombre de usuario es "tina". El programa Clinte de correo en mi estación de trabajo piensa que soy tú. En tu nombre, el programa envía el ticket robado al servidor de correo. El servidor desencripta el ticket y ve que es valido el username en el ticket coincide con el username quien envió el ticket. El servido de correo me da tu correo...
Athena: Oh! Eso no esta muy bien.
Eurípides Pero creo que se una manera para arreglar este problema. O por lo menos para proveer un arreglo parcial a el. Creo que Charon deberá incluir mas información en los ticket de servicio que produzca. Además del username, el ticket deberá incluir la DIRECCIÓN DE RED desde la cual es usuario pidió a Charon el Ticket. Esto te da un nivel más información adicional

Lo ilustraré. Supón que me robo tu ticket de correo en este momento. El ticket tiene la dirección de red de tu estación de trabajo, y esta dirección no coincide con la dirección de mi estación de trabajo. En tu nombre yo le mando el ticket robado al servidor de correo. El programa servidor extrae el username y la dirección de red del ticket e intenta comparar esa información con el username y la dirección de red de la entidad que envío el ticket. El username coincide pero la dirección de red no. El servidor rechaza el ticket porque obviamente fue robado.

Athena: Bravo, bravo!!! Quisiera haber ideado eso.
Eurípides Para eso estoy no?
Athena: Entonces el diseño revisado del ticket se ve así:

Ella escribe lo siguiente en un pizarrón

TICKET -   {username:ws_address:servicename}

Ahora estoy realmente emocionada. Construyamos un sistema Charon y veamos si funciona!!

Eurípides No tan rápido. Tengo algunas otras preguntas acerca de tu sistema
Athena: Bueno, Dispara
Eurípides Suena como que tengo que pedir un ticket cada vez que quiera usar un servicio. Si tengo un día de trabajo completo, probablemente necesite checar mi correo mas de una vez. Tengo que sacar un ticket nuevo cada vez que quiera mi correo? Si eso es cierto, no me gusta tu sistema
Athena: Ah... bueno, no veo porque los tickets no puedan ser reusables. Si el servidor de correo te da un Ticket, debe ser capaz de usarlo uno y otra vez. Por ejemplo, cuando el programa cliente de correo hace una petición de servicio en tu nombre, le manda una COPIA del ticket al servidor de correo
Eurípides Eso esta mejor. Pero todavía hay problemas capaces de implicar que tengo que darle a Charon mi password cada vez que quiero usar un servicio para el cual no tengo un ticket. Me conecto al sistema y quiero accesar a mis archivos. Le mando una requisición a Charon para el ticket apropiado y esto significa que tengo que usar mi password. Entonces quiero leer mi correo . Otro requerimiento a Charon, y tengo que darle mi password otra vez . Ahora supón que quiero enviar mis mensajes de correo al servidor de impresión, otra requisición a charon y, bueno ya checaste a escena
Athena: Si, entiendo.
Eurípides: Y por si eso fuera poco, considera esto: suena como cuando tu te autentificas ante Charon, tu mandas tu password sobre la red en texto. Gente inteligente como tu verdaderamente podría monitorear la red y robar copias de los password de la gente. Si tengo tu password, puedo usar cualquier servicio en tu nombre.

Athea suspira

Athena: Estos son problemas serios. Creo que necesito regresar a mi escritorio

 

Escena III

La mañana siguiente. Athena encuentra a Eurípides en el área del café. Ella le da una palmadita en el hombro mientras el llena su taza.

Athena: Tengo una nueva versión de Charon que resuelve nuestros problemas
Eurípides Realmente? Eso estuvo rápido
Athena: Bien, tu sabes, que los problemas de esta naturaleza me mantienen despierta toda la noche
Eurípides Debe ser tu conciencia culpable. Nos vamos a ese pequeño cuarto de conferencias?
Athena: ¿Por qué no?

Los dos se dirigieron al pequeño cuarto de conferencias

Eurípides Empezaré describiendo los problemas nuevamente. Pero los invertiré de tal manera que serán los requerimientos del sistema

Athena aclara su garganta

Athena: Primer requerimiento: los usuarios solo tienen que ingresar sus passwords una sola vez, al comienzo de sus sesiones en su estación de trabajo. Este requerimiento implica no meter tu password cada vez que necesites un nuevo ticket de servicio. Segundo requerimiento: los passwords no deberán ser enviados sobre la red en texto
Eurípides Okey
Athena: Empezaré con el primer requerimiento: Deberás solo usar tu password una sola vez. He cumplido este requerimiento inventando un nuevo servicio de red. Es llamado el servicio de "entrega de ticket", un servicio que emite tickets de Charon a usuarios quienes hallan probado su identidad a Charon, tu puedes usar este servicio de entrega de ticket si tienes un tickets para esto, es decir , un ticket para emisión de ticket

El servicio de entrega de tickets en realidad es una versión de Charon tanto que tiene acceso a la base de datos de Charon es una parte de Charon que permite autentificarte con un tickets en lugar de un password.

De todas manera, el sistema de autentificación ahora trabaja de manera siguiente: tu te conectas en una estación de trabajo y usas un programa llamado Kinit para contactar al servidor de Chanon. Tu pruebas tu identidad a Charon, y el programa Kinit te da un ticket para entrega de ticket

Ahora digamos que quieres obtener tu correo del servidor de correo. No tienes un ticket para servicio de correo, todavía, así que usas el ticket de entrega de tickets para que obtenga el ticket del servidor de correo por ti. No tienes que usar tu password para obtener el nuevo ticket

Eurípides: ¿Tengo que tener un nuevo ticket de entrega de tickets cada vez que necesite usar otro servicio red?
Athena: No recuerda que acordamos que los tickets puedes ser reutilizados. Una vez que hallas adquirido un ticket para entrega de tickets no necesitas obtener otro. Tu usas el ticket para entrega de tickets para obtener los otros tickets que necesites
Eurípides: Okey, eso tiene sentido. Y ya que puedes reutilizar los tickets, una vez que el servicio de entrega de tickets te ha dado un ticket, para un servicio en particular no necesitas obtener ese ticket en particular otra vez
Athena: Si, ¿No es elegante’
Eurípides: Okey, lo compro hasta ahora... Siempre y cuando no tengas que enviar tu password en texto sobre la red cuando obtengas el ticket para entrega de tickets.
Athena: Como dije, he resuelto ese problema también. La cosa es, cuando digo que tienes que contactar a Charon para obtener el ticket para entrega de tickets, sonó como si tuvieras que enviar tu password en texto sobre la red, al servidor de Charon. Pero no tiene que ser de esa manera.

Esto es lo que realmente pasa. Cuando tu uses el programa Kinit para obtener el ticket para entrega de tickets, kinit no manda tu password al servidor de Charon. Knit manda solo tu username

Eurípides: Bien
Athena: Charon utiliza el username para buscar tu password. En seguida Charon construye un paquete de datos que contiene el ticket para entrega de tickets. Antes de que mande el paquete, Charon utiliza tu password para encriptar el contenido del paquete.

Tu estación de trabajo recibe el paquete del ticket, tu ingresas tu password, kinite intenta desencriptar el ticket con el password que ingresaste, Si kinit tiene éxito, te haz autentificado ante Charon. Ahora posees un ticket para entrega de tickets, y ese ticket puede darte los demás tickets que requieras.

Qué tal esas modernas ideas?

Eurípides: No se... Estoy tratado de pensar. Tu sabe, pienso que las partes del sistema que me acabas de describir funcionan muy bien. Tu sistema requiere que me autentifique solo una vez. Después de eso Charon me puede emitir tickets de servicio sin que yo me de cuenta, muy bien, muy bien en ese sentido, Pero hay algo acerca del diseño del ticket de servicio que me incomoda de alguna manera. Tiene que ver con el hecho de que los tickets son reutilizables, Ahora estoy de acuerdo que tienen que ser reutilizables, pero los tickets reutilizables son por su naturaleza muy peligrosos.
Athena: ¿Qué quieres decir?
Eurípides: Míralo de esta forma. Supón que esta usando una estación de trabajo insegura. En el transcurso de tu sesión, tu adquieres un ticket de servicio de correo, un ticket de servicio de impresión, y un ticket de servicio de archivos. Supón que inadvertidamente dejas esos tickets e la estación de trabajo cuando te sales del sistema.

Ahora supón que me conecto en la estación de trabajo y encuentro esos tickets. Y me siento con ganas de causar problemas, entonces hago que la estación de trabajo piense que soy tu. Debido que los tickets están hechos a tu nombre, puedo usar el programa cliente de correo para accesar a tu correo, puedo usar el servicio de archivos y borrar tus archivos, y puedo usar el comando de impresión para causar cargos a tu cuenta. Y todo gracias a esos tickets que se dejaron accidentalmente.

Y nada puede detenerme de copias estos tickets a mi lugar. Puedo seguir usándolos por toda la eternidad.

Athena: Pero es fácil de arreglar. Solo escribimos un programa que destruya los tickets de un usuario cada vez que el usuario se desconecte. No puedes usar tickets que se han destruido
Eurípides: Bueno obviamente tu sistema debe tener un programa para destruir los tickets, pero es tonto confiar en los usuarios para que hagan una cosa así. No puedes contar con que los usuarios recuerden destruir sus tickets, cada vez que terminen una sesión. Y aunque pudieras confiar en los usuarios para destruir sus tickets, considera el siguiente escenario.

Tengo un programa que vigila la red y copia los tickets de servicio cuando están viajando en la red. Supón que quiero hacerte mi víctima. Espero a que inicies una sesión, activo mi programa y copio un montón de tus tickets.

Espero que termines tu sesión, y eventualmente tu te sales y te vas. Yo juego con el software de red de mi estación de trabajo y cambio su dirección de tal manera que concuerde con la dirección de la estación de trabajo que estabas usando cuando te robe los tickets. Hago creer a mi estación de trabajo que yo soy tu. Tengo tus tickets, tu username, y la dirección de red correcta. Puedo mandar estos tickets y usar servicios en tu nombre.

No importa que hallas destruido tus tickets antes de haber terminado tu sesión. Los tickets que he robado son validos tanto como tenga cuidado para usarlos, ya que tu diseño actual de tickets no pone un límite en el número de veces que puedes reutilizar un ticket, o cuanto tiempo permanece vigente un ticket.

Athena: Oh veo lo que estas diciendo!, los tickets no pueden ser validos por siempre, porque constituirían un gran riesgo en la seguridad. Debemos restringir la longitud de tiempo por el cual un ticket puede ser usado, quizás darle a cada ticket alguna clase de fecha de expiración.
Eurípides: Exactamente, pienso que cada tickets necesita tener dos piezas adicionales de información, una duración media que indique la longitud de tiempo para la cual el ticket es válido, un sello de tiempo que indique la fecha y la hora en la cual Charon emitió el ticket. Así que el ticket se vera algo así :

Eurípides se dirige al pizarrón escribe lo siguiente:

TICKET   {username:address:servicename:lifespan:timestamp}

Ahora cuando un servicio desencripte tickets, compara el username y la dirección del ticket contra el username y la dirección de la persona que esta enviando el ticket, y usa la información de la duración media y el sello de tiempo para ver si el ticket ha expirado.

Athena: Bien, ¿Qué clase de tiempo de vida debería tener un ticket de servicio típico?
Eurípides: No lo se. Probablemente la longitud de una sesión típica en una estación de trabajo. Digamos, ocho horas.
Athena: Así que si me siento en mi estación de trabajo por mas de ocho horas, todos mis tickets expiran, eso incluye el ticket para entrega de tickets. Así que tengo reutentificarme después de ocho horas.
Eurípides: Eso no es irrazonable o si?
Athena: Pues creo que no, entonces ya quedamos, los tickets expiran después de ocho horas. Ahora te tengo una pregunta, imagínate que copie tus tickets de la red...
Eurípides: Ahh Tina! Tu no harías eso verdad?
Athena: Esto es solo por el bien del argumento. Ya copie tus tickets. Ahora espero a que te vayas. Imagínate, que tienes una cita con el doctor, o una clase, o algo por el estilo, y terminas tu sesión después de un par de horas. Tu eres un chico listo y haz destruido tus copias de los tickets antes de irte.

Pero te robe los tickets y son buenos por cerca de seis horas. Eso me da un buen de tiempo para jugar con tus archivos e imprimir mil copias de quien sabe que, a tu nombre.

Checas?, el arreglo del sello de tiempo y del periodo de expiración funcionan bien en el evento de que un ladrón de tickets elija mandar un ticket después de que ha expirado. Si el ladrón puede mandar el ticket antes de eso...

Eurípides: Mhh, bueno... Estas en lo correcto.
Athena: Creo que nos hemos metido en un problema mayor, ahh.

Pausa

Eurípides:
Creo que eso significa que vas a estar ocupada esta noche. Más café?
Athena: Por qué no?

Escena IV

A la mañana siguiente, en la oficina de Eurípides. Athena toca la puerta.

 

Eurípides: Esta mañana tienes ojeras.
Athena: Bueno, tu sabes una de esas largas noches.
Eurípides: ¿Resolviste el problema?
Athena: Eso creo.
Eurípides: Toma asiento.
Athena: Como ya es costumbre, me sentí forzada a volver a plantear el problema. Los tickets son reutilizables dentro de un periodo de tiempo limitado, digamos, ocho horas. Si alguien roba tus tickets y elige mandarlos antes de que expire no podemos hacer nada para detenerlo.
Eurípides: Ese es el problema.
Athena: Podríamos solucionar el problema si diseñáramos los tickets de manera que no fueran reutilizables.
Eurípides: Pero entonces tu tendrías que tener un ticket nuevo cada vez que quisieras usar un servicio de la red.
Athena: Cierto, esa es a lo más una solución tonta. (pausa) Ah, y como procedo con mi argumento? (ella piensa por un momento.)

Bien, voy a replantear el problema otra vez, esta vez en la forma de un requerimiento. Un servicio de red debe ser capaz de probar que la persona que esta usando un ticket es la misma para la cual el ticket fue expedido.

Déjame trazar de nuevo el proceso de autentificación y ver si puedo encontrar una manera apropiada para ilustrar mi solución a este problema.

Quiero usar un cierto servicio de red. Acceso ese servicio iniciando un programa cliente en mi estación de trabajo. El cliente manda tres cosas al servidor, mi nombre, la dirección de red de mi estación de trabajo, y el ticket de servicio apropiado.

El ticket contiene el nombre de la persona a quien fue emitido y la dirección de la estación de trabajo que la persona estaba usando cuando el o ella adquirió el ticket. Además contiene una fecha de expiración en forma de un tiempo de vida y un sello de tiempo. Toda esta información ha sido encriptada con el password del servicio Charon

Nuestro esquema de autentificación actual descansa sobre las siguientes pruebas:

  • El servicio puede desencriptar el ticket?
  • Ha expirado el ticket?
  • Coinciden el username y la dirección de la estación de trabajo especificadas en el ticket con el nombre y dirección de la persona que lo envió?

Qué arrojan estas pruebas?. la primera prueba, dice si el ticket vino o no vino de Charon. Si el ticket no puede ser desencriptado no viene de Charon. El Charon real habría encriptado el ticket con el password del servicio. Charon y el servicio son las únicas dos entidades que saben el password del servicio. Si el ticket se desencripta correctamente, el servicio sabe si vino de Charon realmente. Estas pruebas previenen de que alguien construya tickets falsos de Charon.

La segunda prueba checa el tiempo de vida y el sello de tiempo. Si ya expiro el servicio rechaza el ticket. Esta prueba detiene a gente usando tickets viejos, tickets que tal vez fueron robados.

La tercera prueba checa el username y la dirección del ticket contra el username y la dirección de la persona especificada en el ticket. Si la prueba falla el usuario del ticket ha obtenido el ticket de otra persona. El ticket es rechazado

Si los nombre y las direcciones coinciden, qué se probo? Nada. los chicos malos pueden robar tickets de la red, cambiar la dirección de su estación de trabajo y su username y saquear los recursos de otras personas. Como señale ayer, los tickets pueden ser reenviados siempre y cuando no hayan expirado. Pueden ser reenviados porque un servicio no puede determinar que la persona que esta enviando el ticket es su dueño legitimo.

El servicio no puede hacer esta determinación debido a que no comparte un secreto con el usuario. Veámoslo de esta forma. Si estoy vigilando Elsinore, tu sabes, el castillo en Hamlet, y se supone que me vas a relevar, no te voy a dejar tomar mi lugar hasta que me des el password correcto. Ese es el caso donde los dos compartimos un secreto. Y es probablemente un secreto que alguien mas invento para cualquier vigía.

Así que estaba pensando anoche, porque no hacer que Charon invente un password para el dueño legitimo del ticket para compartirlo con el servicio? Charon le da una copia de esta llave de sesión al servicio, y una copia al usuario. Cuando el servicio recibe un ticket de un usuario. Puede usar la llave de sesión para probar la identidad del usuario.

Eurípides: Espera un segundo. Como les va a dar Charon la llave de sesión a ambas partes?
Athena: El dueño del ticket obtiene la llave de sesión como parte de la respuesta de Charon. Como esto:

CHARON REPLY - [sessionkey|ticket]

La copia de la llave de sesión del servicio viene dentro del ticket, y el servio obtiene la llave cuando desencripta el ticket así es que el ticket se ve así:

TICKET - {sessionkey:username:address:servicename:lifespan:timestamp}

Cuando quieras obtener un servicio, el programa cliente que tu incias construye a lo que yo le llamo AUTENTIFICADOR. El autentificador contiene tu nombre y tu dirección. El cliente encripta esta información con la llave de sesión, la copia de la llave de sesión que tu recibiste cuando pediste ese ticket

AUTHENTICATOR - {username:address} encrypted with session key

Después de construir el autentificador, el cliente lo manda con el ticket al servicio. El servicio no puede desencriptar el autentificador todavía porque no tiene la llave de sesión. Esa llave esta en el ticket así que el servicio primero desencripta el ticket.

Después de que se descripta el ticket, el servicio termina con la siguiente información.

  • El periodo de vida del ticket y el sello de tiempo
  • El nombre del dueño del ticket
  • La dirección de red del dueño del ticket
  • La llave de sesión

El servicio checa si el ticket ha expirado. Si todo va bien en ese sentido, El servicio entonces utiliza la llave de sesión para desencriptar el autentificador. Si la desencriptación procede sin obstáculo el servicio termina con un username y una dirección de red. El servicio prueba esta información contra el nombre y dirección encontrados en el ticket, Y el nombre y dirección de la persona quien envió el ticket y el autentificador. Si todo concuerda, el servicio ha determinado que quien envió el ticket es el verdadero dueño del ticket.

Athena se detiene, aclara su garganta y toma café

Creo que la llave de sesión y el autentificador se hacen cargo del problema del reenvío.

Eurípides: Quizás pero me pregunto... Para violar esta versión del sistema, debe tener el autenficador apropiado para el servicio
Athena: No. Debes de tener el autentificador y el ticket para el servicio. El autentificador no tiene valor sin el ticket porque el servicio no puede desencriptar el autentificador sin tener primero la llave de sesión apropiada, y el servicio no puede obtener la llave de sesión apropiada sin primero desencriptar el ticket
Eurípides: Okey. Entiendo, pero no dijiste que cuando el programa cliente contacta al servidor, le manda el ticket y el autentificador juntos?
Athena: Si creo que eso fue lo que dije
Eurípides: Si eso es lo que pasa realmente, que me impide robar el ticket y el autentificador al mismo tiempo? Estoy seguro que podría escribir un programa para hacer el trabajo. Si tengo el ticket y su autentificador, creo que puede usar los dos siempre y cuando el ticket no expire. Solo tengo que cambiar mi dirección y mi username apropiadamente cierto?
Athena: Cierto, que desesperante
Eurípides: Espera, espera, espera! No es tanto problema. Los tickets son reutilizables siempre y cuando no hayan expirado, pero eso no significa que los autentificadores tienen que ser reutilizables. Supón que diseñamos el sistema de manera que los autentificadores puedan ser usados sólo una vez. Eso nos da algo?
Athena: Bueno, podría. Veamos el programa cliente construye el autentificador, entonces lo manda con el ticket al servicio. Tu copias el ticket y el autentificador mientras se mueven de mis estación de trabajo al servidor. Pero el ticket y el autentificador llegan al servidor antes de que tu puedas enviar tus copias. Si el autentificador puede usarse sólo una vez tu copia no es buena y tu pierdes cuando tratas de reenviar tu ticket y tu autentificador.

Eso es un alivio. Así que todo lo que tenemos que hacer es inventar una manera en que el autentificador sea útil una sola vez.

Eurípides: No hay problema. Pongamos un tiempo de vida y un sello de tiempo en el. Supón que cada autentificador tiene un tiempo de vida de un par de minutos. Cuando quieres usar un servicio tu programa cliente construye el autentificador, lo sella con la hora actual y se envía junto con el ticket al servidor.

El servidor recibe el ticket y el autentificador y se pone a trabajar. Cuando el servidor desencripta el autentificador checa su tiempo de vida y el sello de la hora. Si el autentificador no ha expirado y todo lo demás checa, el servidor te considera autentificado.

Imagina que copie el autentificador y el ticket mientras cruzaban la red. Tengo que cambiar mi dirección de red y mi username, y lo tengo que hacer en un par de minutos. Esta muy difícil que se pueda. De hecho no creo que sea posible. A menos...

Bueno aquí hay un problema potencial. Supón que en lugar de copiar el ticket y el autentificador mientras viaja de tu estación de trabajo al servidor copia el paquete original del ticket que viene de Charon, el paquete que recibes cuando le pides a Charon un ticket.

Este paquete según recuerdo, tiene dos copias de la llave de sesión, una para ti y otra para el servicio. La del servicio esta escondida en el ticket y no la puedes obtener, pero que hay de la otra, la que usas para construir autentificadores?

Si puedo obtener esa copia de la llave de sesión, entonces puedo construir mis propios autentificadores, si los puedo construir, puedo irrumpir en el sistema

Athena: Eso es algo que pensé anoche, pero entonces seguí el proceso de adquisición de tickets y encontré que no es posible robar autentificadores de esa manera.

Tu te sientas en una estación de trabajo y utilizas el programa kinit para obtener tu ticket para entrega de tickets. Kinit te pide tu username, y después de que lo ingresas, kinit le manda el nombre a Charon.

Charon usa tu nombre para buscar tu password, entonces procede a construir un ticket de entrega de ticket para ti. Como parte de este proceso, Charon crea una llave de sesión que tu compartirás con el servicio de entrega de ticket. Charon pone una copia de la llave de sesión en el ticket de entrega de ticket, y pone tu copia en el paquete del ticket que estas a punto de recibir. Pero antes de que te envíe este paquete, Charon encripta todo con tu password.

Charon envía el paquete a través de la red. Alguien puede copiar el paquete en su camino, pero no pueden hacer nada con el, porque ha sido encriptado con tu password, específicamente, nadie puede robar la llave de sesión de la entrega de ticket.

Kinit recibe el paquete del ticket y te pide un password, el cual tu ingresas. Si tu ingresas el password correcto Kinit puede desencriptar el paquete y darte tu copia de la llave de sesión.

Ahora que haz hecho cargo del rollo de kinit, quieres obtener tu correo. Tu inicias el programa cliente de correo. Este programa busca un ticket de servicio de correo y no lo encuentra. El cliente debe usar el ticket para entrega de ticket para pedirle al servicio de entrega de tickets un ticket de servicio de correo.

El cliente construye un autentificador para la transacción de entrega de tickets y encripta el autentificador con tu copia de la llave de sesión de la entrega de ticket. El cliente manda a Charon el autentificador, el ticket para entrega de tickets, tu nombre, la dirección de tu estación de trabajo y el nombre de servicio de correo.

El servicio de entrega de correo recibe estas cosas y ejecuta los chequeos de autentificación. Si todo checa apropiadamente. El servicio de entrega de ticket finaliza con una copia de la llave de sesión que comparte contigo Ahora el servicio de entrega de ticket te construye un ticket de servicio de correo, y durante este proceso, crea una nueva llave de sesión para ti, para compartir con el servicio de correo

El servicio de entrega de ticket ahora prepara un paquete de ticket para mandarlo a tu estación de trabajo. El paquete contiene el ticket y tu copia de la llave de sesión del servicio de correo. Pero antes de que mande el paquete, el servicio de entrega de ticket encripta el paquete con su copia de la llave de sesión de la entrega de ticket. Hecho esto, el paquete es enviado.

Entonces viene el paquete del ticket del servicio de correo, a través de la red. Supón que un ogro de la red lo copia en su camino. El ogro no tiene suerte porque el paquete esta encriptado con la llave de sesión de entrega de ticket, tu y el servicio de entrega de ticket son las únicas entidades que conocen esta llave. Ya que el ogro no puede desencriptar el paquete del ticket de correo, el ogro no puede descubrir la llave de sesión de correo. Sin esta llave de sesión el ogro no puede usar ninguno de los ticket de servicio de correo que e puedan mandar subsecuentemente a través de la red.

Creo que estamos a Salvo, Que piensas?

Eurípides: Tal vez
Athena: Tal vez! Es todo lo que vas a decir
Eurípides: No te enojes. Ya deberías conocerme. Creo que eso significa para mi y para ti estar despierta a mitad de la noche
Athena: Pthhhhh!
Eurípides: Bien, tres cuartos de noche. Hasta el momento esta empezando a sonar aceptable. Esta llave de sesión resuelve un problema que pense anoche: El problema de la autentificación mutua

Te importa si hablo por un minuto?

Athena: No hay problema.
Eurípides: Muy amable. Anoche, mientras danzaban en tu cabeza visiones de llave de sesión y autentificadores. Estaba tratando de encontrar nuevos problemas en el sistema, y encontré uno que es bastante serio. Te lo ilustrare en el siguiente escenario.

Supón que estas harto de tu trabajo actual y haz decido cambiarte, quieres imprimir tu curriculum en la impresora láser de tu compañía de manera que los buscadores de talentos y empleadores potenciales puedan tomar nota de la clase que tienes.

Así es que ingresas al comando de impresión, y lo direccionas al servidor de impresión adecuado. El comando obtiene el ticket de servicio apropiado, si no lo tiene todavía, entonces manda el ticket en tu nombre al servidor de impresión. Al menos eso es lo que tu crees que esta pensado. Tu no sabes que el requerimiento es direccionado al servidor de impresión correcto.

Imagina que algún hacker sin escrúpulos (digamos que es tu jefe) ha arreglado el sistema de manera tal que redirecciona tu petición y el ticket al servidor de impresión a su oficina. El programa de servicio de impresión no le importa el ticket o su contenido. Tira el ticket y envía un mensaje a tu estación de trabajo indicando que el ticket pasa, y que el servidor esta listo, esperando imprimir tu trabajo. El comando de impresión manda el trabajo al servidor de impresión fraudulento y el enemigo termina con tu curriculum.

Mostraré el problema por medio del contraste. Sin llaves de sesión y autentificadores, Charon pueden proteger a sus servidores de usuarios falsos, pero no puede proteger a loa usuarios de servidores falsos. El sistema necesita una manera para que los programas cliente autentifique el servidor antes de enviar información al servicio. El sistema debe permitir autentificación mutua

Pero la llave de sesión resuelve este problema siempre y cuando diseñes los programas cliente apropiadamente. Regresando al escenario del servidor de impresión, Quiero un programa cliente de impresión que se asegure de mandar los trabajos al servicio legitimo.

Esto es lo que hace un programa así. Ingreso el programa de impresión y le doy el nombre del archivo, el nombre de mi curriculum. Asumo que tengo un ticket de servicio de impresión y una llave de sesión. El programa cliente usa la llave de sesión para construir un autentificador, Después manda el autentificador y el ticket al "supuesto" servidor de

impresión. El cliente NO MANDA el curriculum todavía, espera una respuesta del servicio

El servicio real recibe el ticket y el autentificador, desencripta el ticket y extrae la llave de sesión, entonces usa la llave la sesión para desencriptar el autentificador. Hecho esto, el servicio corre todas las pruebas de autentificación apropiadas.

Asumo que las pruebas confirmaron mi identidad. Ahora el servidor prepara un paquete de respuesta de manera que pueda probar su identidad, al programa cliente. Usa su copia de llave de sesión para encriptar el paquete de respuesta, y envía el paquete al cliente que esta esperando.

El cliente recibe el paquete e intenta desencriptarlo con mi copia de la llave de sesión. Si el paquete se desencripta apropiadamente y produce el mensaje de respuesta correcto del servidor , mi programa cliente sabe que el servidor que encriptó el paquete es el servidor real. Ahora el cliente manda el curriculum al servicio de impresión.

Supón que mi jefe arreglo el sistema de manera tal que su servidor de impresión parece al que yo quiero. Mi cliente manda el autentificador y el ticket al servicio de impresión y espera su respuesta. El servicio de impresión falso no puede generar la respuesta correcta porque no puede desencriptar el ticket y obtener la llave de sesión. Mi cliente no mandará el trabajo hasta que reciba la respuesta correcta. Eventualmente el cliente se da por vencido.

Mi trabajo de impresión no se completa, pero al menos mi curriculum no termino en el escritorio del enemigo..

Sabes, creo que tenemos bases sólidas sobre las cuales implementar el Sistema de Autentificación Charon.

Athena: Quizá, de cualquier manera, no me gusta el nombre "Charon".
Eurípides: No? Desde cuando?
Athena: Nunca me gusto, por que el nombre no tiene sentido. El otro día estaba hablando de esto con mi tío Hades, y me sugirió otro nombre, el nombre de su perro guardián de tres cabezas
Eurípides: Oh, te refieres a "Cerberus".
Athena: Comete tu lengua Rip! "Cerberus"
Eurípides: No es ese el nombre?
Athena: Si, si tu fueras romano! Soy una diosa Griega, el es un perro guardián Griego, y su nombre es "Kerberos", "Kerberos" con K
Eurípides: Esta bien, esta bien, No dispares rayos, me gusta el nombre. De hecho le queda bien: Adiós Charon y hola Kerberos.

 

El diálogo fue escrito en 1988 para ayudar a sus lectores a entender las razones fundamentales por las cuales el protocolo Kerberos V4 estaba implementado de esa manera. A través de los años ha hecho muy bien su trabajo.

Espero que hayas disfrutado de esta pequeña introducción a Kerberos.

Theodore Ts'o, Febrero 1997.

Traducido por: Ana Liz González Bautista, Rocío Razo Menchaca y Arturo Rivera Avalos, como material de apoyo para la clase de Sistemas Distribuidos, impartida por el Ing. José Luis Carreño, en el Instituto Tecnológico de Querétaro. 1998.

Se puede encontrar el documento fuente y más en: http://web.mit.edu/Kerberos

Permission to use, copy, modify, and distribute this documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Massachussets Institute of Technology not be used in advertising or publicity pertaining to distribution of the documentation without specific, written prior permission. M.I.T. makes no representations about the suitability of this documentation for any purpose. It is provided "as is" without express or implied warranty.