Plan 9 from Bell Labs’s /usr/web/sources/contrib/nemo/sys/src/cmd/omero/Runetext

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


Como consecuencia de la generalización del ordenador personal y la aparición de la gran 
cantidad de dispositivos móviles disponibles hoy en día,  el número de máquinas que utiliza
al mismo tiempo un usuario ha crecido sustancialmente. Estos dispositivos son básicamente
ordenadores, que aunque poseen distintas cualidades físicas y funcionales, ejecutan un sistema
operativo convencional y están sometidos a las mismas necesidades de configuración y administración
que un ordenador común. Entre esas necesidades se encuentra el proceso de identificación del usuario 
y su posterior autenticación.

El proceso de autenticación se realiza normalmente mediante la introducción de contraseñas 
por teclado, aunque se han propuesto métodos que proporcionan menos obstrucción al usuario, como la
autenticación mediante tarjetas Smartcard\cite{smartcard}, Ibuttons\cite{ibutton}, USB Tokens\cite{rsasecurity}
o dispositivos biométricos como lectores de huellas digitales. 
Esos métodos, aun siendo menos incómodos para el usuario que la introducción de contraseñas, siguen proporcionando
obstrucción. Por otra parte, dependen de dispositivos lectores específicos que normalmente
no están integrados en los propios dispositivos. Esto supone un problema a la hora de usar 
dispositivos móviles y máquinas de propósito general. 

Los sistemas tradicionales que proporcionan entrada simple al sistema ({\em Single Sign-On})
están diseñados para entornos cliente/servidor en los que los usuarios trabajan con un único terminal,
desde el que acceden a todos los servicios del entorno distribuido. Sin embargo, los usuarios de un entorno 
de computación como el presentado en capítulos anteriores
no trabajan en un sólo ordenador, sino que utilizan e interaccionan físicamente con un grupo de 
ordenadores interconectados. De esta forma, el usuario necesitará autenticarse ante cada uno de los ordenadores
que integran el espacio  con el que está interaccionando. 
Teniendo en cuenta que la aparición de nuevos dispositivos en el sistema tiende a crecer
debido a la progresiva miniaturización y el abaratamiento de los dispositivos móviles que
dictó Moore\cite{moore65cramming}, el problema de la autenticación adquiere un importante papel 
en este tipo de entornos. 

Bajo estas circunstancias, los sistemas tradicionales de entrada simple al sistema que se han
tratado en el capítulo dedicado al estado de la cuestión proporcionan una gran obstrucción 
al usuario. 
La autenticación explícita por parte del usuario rompe la ilusión de que el entorno ubicuo es 
un único sistema y no un grupo de sistemas interconectados. 
Por lo tanto, el uso de este tipo de sistemas de entrada simple al sistema no es propicio 
para un entorno ubicuo.

SHAD propone una solución para este problema basada en agentes que actúan como servidores 
personales de claves para el usuario. Estos agentes tienen como objetivo proporcionar al usuario un acceso simple y 
sin obstrucción al entorno de computación ubicuo, haciendo el uso de varias máquinas a la vez cómodo, 
seguro y parcialmente transparente (dependiendo de las necesidades y preferencias plasmadas por el usuario)
en lo que respecta a la autenticación. 
Mediante los agentes SHAD, los dispositivos que pertenecen a un mismo usuario pueden compartir 
sus secretos (claves, contraseñas, etc.), 
propiciando un acceso simple al entorno ubicuo y conservando la ilusión de que se está trabajando en un único
sistema. A continuación, se presentará la arquitectura de SHAD para ofrecer una entrada simple al sistema. 


\section{Arquitectura del agente de SSO}
\label{sso_cond}

La arquitectura general del sistema se presenta en la figura \ref{arch0}. 
Como se puede observar, la arquitectura
se compone de  entidades principales:

\begin{figure*}[t!]
\centering
\epsfig{file=figuras/sso_0.png, width=\textwidth}
\caption{Arquitectura global del sistema de entrada simple (Single Sign-On) al sistema basada 
en SHAD}
\label{arch0}
\end{figure*}


\begin{itemize}
	
	\item {\bf  repositorio de secretos} del usuario es un fichero cifrado que contiene 
	los secretos de usuario en un formato legible para
	los humanos. El repositorio de secretos además incluye información que 
	describe y restringe el uso de los mismos. 
	Este fichero se encuentra cifrado con un algoritmo fuerte, y su contenido 
	nunca se almacena en un soporte no volátil en claro.
	El repositorio se puede almacenar de un soporte externo (p.e. de una tarjeta de 
	memoria SD Card) o en  un servidor centralizado \footnote{Nótese que si se obtiene de un servidor 
	centralizado, el usuario deberá tener interconexión
	con esa partición de la red en el momento de obtenerlo, pudiendo peder la conectividad después
	de obtener el repositorio. En el caso de usar un soporte externo, como 
	una tarjeta SD card, el repositorio se puede
	obtener sin tener conectividad con el resto del sistema}. Además de los secretos del usuario,
	el repositorio contendrá las claves necesarias para contactar y autenticar las máquinas
	del usuario.
	
	\item {\bf Aplicaciones.} Las aplicaciones son programas de usuario que acceden a los 
	servicios disponibles en el
	entorno ubicuo y fuera del mismo.. Comúnmente, estas aplicaciones necesitan autenticarse de alguna 
	forma (mediante contraseñas, respuestas
	de retos, obtención de credenciales, etc.) ante los servidores del sistema. Para llevar a 
	cabo dicha autenticación,
	los programas necesitan conocer secretos que normalmente les proporciona el usuario
	 mediante un dispositivo de entrada.
	Las aplicaciones pueden elegir entre: 
	(i) intentarán obtener los secretos del agente SHAD local
	y gestionar ellas mismas la autenticación o
	(ii) delegar la autenticación en el agente SHAD local, de tal forma
	que la lógica de la aplicación esté totalmente desacoplada de la lógica de seguridad. 
	En el caso de que el agente SHAD no responda o no pueda llevar a cabo la autenticación,
	las aplicaciones reclamarán el 
	secreto al usuario de la forma tradicional.
	
	\item {\bf Sistema Operativo.} El sistema operativo proporcionará a las aplicaciones el acceso 
	al agente SHAD local.
	
	\item {\bf El usuario.} El usuario del sistema es un humano que interacciona físicamente 
	con el entorno ubicuo. El 
	humano es el encargado de administrar sus propios dispositivos, como ya se ha explicado 
	en el capítulo anterior.
	Además, debe realizar una primera y única autenticación explicita para entrar en el sistema,
	que servirá para descifrar el repositorio de secretos. 
	También puede añadir nuevos secretos (que no están almacenados en el 
	repositorio) a sus agentes.
	Por último, el usuario puede 
	proporcionar confirmaciones, que pueden requerirse para permitir la delegación
	de ciertos secretos. 
	El usuario puede cancelar y confirmar operaciones interactuando con el 
	agente SHAD principal. 

	\item {\bf El espacio inteligente} o entorno ubicuo, que puede ofrecer servicios tales como 
	localización física de personas y objetos. El sistema de Single Sing-On puede sacar partido
	de la información de localización, por ejemplo para pedir confirmación al usuario en 
	ciertas situaciones. En todo caso, la arquitectura no puede depender de la información
	suministrada por el espacio inteligente, ya que puede provocar dependencias de servicios
	centralizados. Por lo tanto, el agente de SHAD debe ser capaz de operar sin los servicios 
	que le ofrece el entorno ubicuo. 
	Ell agente principal accederá a dicha información usando mecanismos
	estándar que quedan fuera del ámbito de la arquitectura, por tanto la seguridad relacionada
	con dicha información no se tratará en este capítulo. Además, el agente SHAD principal 
	podrá comunicar notificaciones al espacio inteligente para aprovechar las infrastructuras
	que ofrece para avisar al usuario de ciertas incidencias.
	
	\item{\bf Agentes SHAD.} Los agentes SHAD son los encargados de manejar la autenticación 
	del usuario, normalmente
	sin la necesidad de interactuar con este, dependiendo de la configuración. Como se detallará 
	más adelante, 
	el usuario es capaz de configurar el comportamiento de los agentes según sus preferencias 
	y  su valoración
	 del compromiso entre obstrucción y nivel de seguridad.  Un agente SHAD puede actuar de
	dos formas distintas: como {\it agente principal} o como agente común. 

\end{itemize}

Un agente de SHAD que actua como {\it agente principal} ofrece los secretos del usuario 
a los otros agentes SHAD, dependiendo de ciertas restricciones que serán tratadas más
adelante.
Cualquier agente puede asumir el  rol de agente principal, dependiendo de los 
siguientes factores:

%% solo puede haber un agente principal por partición de red <- falso, porque puede
%% haber uniones posteriores y juntarse más de uno.

\begin{itemize}
	\item El descubrimiento de otro agente SHAD actuando como agente principal.
	Cada dispositivo  ejecutará su agente al arrancar, y este iniciará un proceso 
	de descubrimiento del  agente principal. Si el proceso de descubrimiento 
	fracasa, el agente intentará adoptar el papel de agente principal. 

	\item La capacidad de obtener el repositorio de claves del usuario.
	Si el repositorio de secretos se encuentra en un sistema remoto, el agente debe tener 
	conectividad con dicho sistema. En caso de que el repositorio se encuentre en una tarjeta
	insertada en el dispositivo donde ejecuta el agente, este debe ser capaz de obtenerlo y 
	copiar su contenido en la memoria principal. 

	\item Una vez obtenido el repositorio, el agente 
	debe ser capaz de descifrar su contenido. Para ello, el usuario debe realizar la {\bf única
	autenticación explícita} que se requiere para operar en el sistema. Si el usuario no 
	se autentica explicitamente ante el agente SHAD, este no puede proclamarse como 
	agente principal. Dicha autenticación explíta puede consistir en la introducción de 
	una contraseña, o la utilización de alguna tecnoloía biométrica o de algún otro dispositivo
	de autenticación..
\end{itemize}


Aunque cualquier dispositivo del usuario es capaz de ejecutar el agente principal, este 
está ideado para ejecutar en un dispositivo móvil que siempre se encuentra con el 
usuario. 
De esa forma, el usuario es capaz de atender a mensajes informativos relativos
a la delegación de sus secretos y confirmar la delegación de determinados
secretos.  
A su vez, el repositorio de secretos está ideado para obtenerse de  una tarjeta de memoria
directamente desde el dispositivo móvil, y de esa forma no  depender de 
la conectividad para ofrecer {\em Single Sign-On} en 
una partición separada del resto del sistema.
No obstante, el usuario es libre
de ejecutar su agente principal en cualquiera de sus máquinas, y de obtener su repositorio
de secretos desde un servidor centralizado si así lo desea. 

Una vez que un agente SHAD ha adoptado el papel de agente principal, 
entonces puede suministrar secretos a los agentes SHAD que ejecutan en otros
dispositivos pertenecientes al usuario, que actuarán como clientes.
Los agentes cliente solicitarán al agente principal los secretos 
requeridos por las aplicaciones que ejecutan en su dispositivo. 
La delegación de los 
secretos del usuario se lleva a cabo  dependiendo 
de restricciones que tiene asociadas en el repositorio. En ningún caso se
delegarán secretos a agentes SHAD que no puedan autenticarse ante el agente
principal. Tampoco se podrán delegar secretos a agentes que no estén ejecutando
en nombre del mismo usuario que el agente principal.

En caso de fallo del agente principal, los 
agentes clientes pueden intentar contactar entre ellos para poder 
obtener secretos.  Si un agente SHAD cliente intenta contactar con
su agente principal para obtener un secreto y no recibe respuesta, entonces
iniciará un protocolo para intentar obtener el secreto de otros agentes
SHAD de su mismo tipo. Si finalmente no obtiene respuesta de algún
agente que posea dicho secreto, el agente intentará obtenerlo
directamente del usuario. En ese caso se  preguntará al usuario mostrando
un mensaje a través
de la interfaz gráfica o de la consola del sistema local. 



\section{Diseño del Agente SHAD}

\subsection{Modelado de flujo de datos }

El diseño del prototipo se ha llevado a cabo mediante Diagramas de 
Flujo de Datos \cite{demarco79structured}.  Los diagramas de este tipo
tienen dos funciones principales: (i) describir la forma en la que los datos
se transforman según pasan por el sistema, y (ii) definir las funciones que 
transforman o manejan los datos \cite{pressman97software}. Mediante 
estos diagramas, se pretende modelar la funcionalidad de los procesos
y definir las entidades internas de los agentes SHAD\footnote{Sin embargo, en esta
sección no se pretende realizar un análisis o modelado exhaustivo del sistema.}.

La figura \ref{arch0} muestra
las entidades externas con las que los agentes de SHAD intercambian
información. Por lo tanto esa figura es lequivalente a un diagrama de 
contexto (diagrama de flujo de datos de nivel cero). Las entidades externas
a un agente SHAD ya han sido definidas en la sección anterior.

En los diagramas de nivel uno presentados en las figuras \ref{sso_dfdcli} y
\ref{sso_dfdpri}
se describe con más detalle el flujo de los 
datos entre las entidades internas de los agentes. 
Se han realizado dos diagramas distintos para describir el comportamiento
del agente de SHAD, debido a que aunque los agentes son exactamente
el mismo programa, pueden adoptar dos funcionalidades distintas dependiendo
de las circunstancias que se den en tiempo de arranque.

La figura \ref{sso_dfdcli}
muestra el diagrama de flujo de datos de primer nivel de un agente SHAD
común. Las entidades internas a un agente SHAD común son:

\begin{itemize}
	\item {\bf Anillo de secretos (RI).} Es un almacén de datos  
	que contiene los secretos del usuario. 
	También almacena las claves de las máquinas pertenecientes al usuario.
	La memoria
	en la que se almacena el anillo de secretos debe estar lo más  protegida posible
	(no  debe poder depurarse ni volcarse a área de intercambio).

	\item {\bf Módulo de descubrimiento (DM).}  Se encarga de descubrir al agente
	principal en tiempo de arranque.  
	Cada dispositivo capaz de arrancar agentes de SHAD tiene que tener una clave
	privada asignada. Dicha clave privada ha debido asignarse en tiempo de 
	configuración, y debe incluirse en el repositorio de secretos. De esta forma,
	el agente principal puede autenticar mensajes de cualquier dispositivo configurado
	para usar SHAD. La clave de la máquina se leerá de un componente hardware
	local.
	Si el módulo no es capaz de descubrir al agente principal, entonces
	intentará obtener el repositorio de secretos para convertirse él mismo
	en agente principal. Si logra descubrirlo, intentará establecer una sesión 
	con él para poder reclamar secretos  cuando sea necesario.

	\item {\bf Módulo de secretos (SM).} Es la entidad encargada de proporcionar
	autenticación a las aplicaciones. Puede proporcionar auteticación encargándose
	de la lógica de autenticación del servicio o proporcionando el secreto necesario
	para que la aplicación se encargue de ella. El usuario debe ser capaz de añadir 
	nuevos secretos en el anillo a través de esta entidad. 
	El módulo necesita usar un secreto para proporcionar autenticación a 
	una aplicación. En primera instancia, intenta obtener el secreto del 
	anillo. Si no es capaz de obtenerlo, insta al {\bf módulo recolector} para
	obtenerlo.

	\item {\bf Módulo recolector (RM).} Es el encargado de conseguir los secretos
	necesarios del agente principal. Para ello, se pone en contacto con el agente 
	principal e inicia el protocolo de obtención de secretos. Si el protocolo no prospera,
	entonces pide al {\bf módulo Peer to Peer} que intente obtener el secreto..

	\item {\bf Módulo Peer to Peer (P2PM).} Cuando el módulo recolector no es
	capaz de conseguir un secreto del agente principal, entonces el 
	{\bf módulo de secretos} pide al {\bf módulo Peer to Peer} que intente conseguir
	el secreto de otros agentes SHAD comunes. El módulo P2P se pondrá en contacto
	con el módulo P2P de los otros agentes SHAD con este fin. El módulo P2P sólo podrá
	ofrecer los secretos marcados especialmente para ello mediante un atributo especial.  
\end{itemize}

\begin{figure*}[t!]
\centering
\epsfig{file=figuras/sso_dfd1cli.png, width=\textwidth}
\caption{Diagrama de flujo de datos de nivel  correspondiente a un agente SHAD común.}
\label{sso_dfdcli}
\end{figure*}

En la figura \ref{sso_dfd1pri} se
pueden identificar las siguientes entidades internas dentro del 
agente principal:

\begin{figure*}[t!]
\centering
\epsfig{file=figuras/sso_dfd1pri.png, width=\textwidth}
\caption{Diagrama de flujo de datos de primer nivel del agente SHAD principal.}
\label{sso_dfd1pri}
\end{figure*}

\begin{itemize}
	\item {\bf Anillo de secretos (RI).} Cumple la misma función que en un agente 
	SHAD común.

	\item {\bf Módulo de secretos (SM).} Esta entidad cumple las mismas funciones que 
	en un agente común, pero en el agente principa además obtiene el repositorio
	de secretos  y lo descifra mediante la información obtenida mediante
	la única autenticación explícita del usuario. Acto seguido, almacena su contenido en el 
	{\bf anillo de secretos}.

	\item {\bf Módulo proveedor (PM).} Esta entidad es la encargada de suministrar
	secretos a los agentes SHAD comunes, dependiendo de los atributos ligados
	a estos, la información de localización que obtiene del espacio inteligente, y 
	la confirmación del usuario en los casos que sea necesario.
	
	\item {\bf Módulo de descubrimiento (DM).}  Cumple la misma función que en un agente 
	SHAD común.

	\item {\bf Módulo de anuncios (AM).} Es la entidad encargada de responder a los
	descubrimientos de los agentes del usuario que arrancan, y de establecer la 
	sesión con ellos.
\end{itemize}  

Varios de los flujos de datos mostrados en los diagramas de flujo se realizan entre entidades internas
de distintos agentes: 

\begin{itemize}
	\item Descubrimiento del agente principal y establecimiento de sesión  por 
	parte del {\bf módulo de descubrimiento}, 
	que es procesado por el {\bf módulo de anuncios} del agente principal.

	\item Petición de un secreto por parte del {\bf módulo recolector} de un agente común 
	al {\bf módulo proveedor} del agente principal.

	\item Petición de un secreto por parte del {\bf módulo Peer to Peer} de un agente común 
	al {\bf módulo Peer to Peer} de los agentes comunes disponibles.
\end{itemize}

Esos flujos de datos se deben implementar en un protocolo seguro, debido a que son flujos entre 
distintos dispositivos interconectados mediante una red insegura en la que puede haber terceros 
escuchando, replicando o inyectando mensajes,  y donde la propia red  puede  perder  o duplicar 
mensajes. 

En la siguiente sección se describirá  en profundidad  el protocolo diseñado para la transmisión 
segura de los secretos entre el agente 
servidor y los agentes clientes. 

\section{Protocolo}

\subsection{Claves}

El protocolo entre agentes SHAD se compone de varios tipos de mensajes, que a la 
vez se apoyan en tres claves privadas:

\begin{itemize}

	\item \textbf{Clave dispositivo: } Cada dispositivo debe tener asignado un 
	secreto que usará para autenticarse ante su
	agente principal. Ese secreto tiene que ser conocido por el agente 
	principal del usuario para que se pueda establecer un
	canal seguro entre ambos. 
	Para un terminal $Z$, la clave secreta de ese terminal será 
	representada como $KT_{z}$.
	
	\item \textbf{Clave de sesión: } Es la clave que proporciona un canal seguro entre
	un agente común y su agente principal. Esta clave
	se genera aleatoriamente y se usa solo para una sesión. La clave
	la genera el agente principal de forma aleatoria, y se representa
	como $KS_{t^a}$ para un terminal $T^a$.

	\item \textbf{Clave de encarnación: } Junto con la clave de sesión, el agente
	principal proporciona una clave de encarnación a todos los agentes que
	inician una sesión con él. Esta es común para todos los agentes que inician
	su sesión con la misma encarnación del agente principal, y se utiliza para 
	proporcionar seguridad al protocolo Peer to Peer realizado por el módulo
	MP2P.
	La encarnación del agente principal se define mediante el identificador de
	encarnación, que se representa como $E_{id}$, y su clave se representa como 
	$KE_{id}$.
	Cuando el agente
	principal reinicia o decide cambiar de encarnación,  genera otra clave de este tipo.
	Los agentes que arranquen
	desde ese momento obtendrán la nueva clave de encarnación. Los agentes que
	arrancaron en una encarnación anterior no podrán pedir servicio a la nueva encarnación.
	Un agente tampoco podrá usar su módulo MP2P con agentes de una encarnación 
	diferente a la suya. 

\end{itemize}

Para el diseño del protocolo, se usará el algoritmo de cifrado de clave simétrica AES~\cite{AES},
que es el algoritmo estándar de este tipo en la actualidad. Dicho algoritno se utilizará en modo
CBC. A su vez, se usará el algoritmo  SHA-1~\cite{SHA-1} para realizar los resúmenes. 

\subsubsection{ Terminología }
\begin{itemize}
	\item El identificador del usuario $A$ se representa
	 como $username_a$.

	\item El agente principal de un usuario $A$ se representa
	 como $P^a$.

	\item Un agente cliente de un usuario $A$ se representa como $T^a$.

	\item Como ya se ha comentado con anterioridad, el algoritmo AES se usa
	en modo CBC, por lo que se necesitará utilizar
	un vector de inicialización. 
	Este vector de inicialización se representa  como $IV$, y se genera de forma
	aleatoria para cada mensaje enviado.

	\item Supongamos los datos $D$, \{$D$\}$_{K_s}$ representa  los datos 
	$D$ cifrados con el algoritmo AES usando  $K_s$ como clave. 

	\item Supongamos los datos $D$, \{$D$\}$_{SHA1}$ representa
	el resumen SHA-1 de los datos $D$.

	\item En todos los mensajes del protocolo se insertan datos 
	generados aleatoriamente para evitar ciertos ataques
	relacionados con el vector de inicialización para el modo CBC de AES. Esos datos 
	tendrán la longitud de un bloque
	AES y se representan como $random_b$.

	\item En el protocolo se usan números aleatorios que se incrementan
	en las respuestas, con el fin de verificar que la
	respuesta se corresponde con el mensaje enviado.
	Esos números, comúnmente denominados {\it nonces}, son
	números enteros sin signo de 32 bits de longitud. Se 
	representan como $n_1$, $n_2$.. $n_n$. 

	\item Con el fin de evitar ataques de replicación de mensajes, los agentes 
	insertan marcas de tiempo en los mensajes. Esas
	marcas de tiempo se representan como $timestamp_{t^a}$ para 
	una máquina $T^a$ .
\end{itemize}



\subsubsection{ Descarte de mensajes }

Los mensajes se descartarán y el protocolo no prosperará siempre que:

\begin{itemize}

	\item El número aleatorio ({\em nonce}) que se ha devuelto
	no coincide con el valor del {\em nonce} que se envió incrementado.

	\item El {\em nonce} que se recibe se encuentra en la lista (o cache)
	de {\em nonces} usados recientemente. 
	Esa  cache  es  lo suficientemente grande
	\footnote{ El número máximo de {\it nonces} en la cache se ha 
	fijado en 2048, un número muy 
	superior al que se llegaría a alcanzar en condiciones extraordinarias 
	de uso. Ese valor ha sido por la experiencia y es
	un número razonable teniendo en cuenta la memoria que puede estar 
	disponible en el dispositivo, incluso si es un 
	dispositivo móvil.} 
	como para albergar los números aleatorios usados en un intervalo
	 de tiempo $\Delta$. 
	Si en algún momento la cache de 
	{\it nonces} llega a su límite, se entenderá que se está sufriendo 
	un ataque de denegación de servicio mediante inundación y 
	se abortará la ejecución del agente, informando antes al usuario de 
	esta situación 
	\footnote{ Nótese que para que un {\it nonce} llegue
	a entrar en cache, antes se ha tenido que verificar que el mensaje 
	se ha creado con la clave necesaria (clave de terminal,  clave de sesión,
	o clave de encarnación, dependiendo del tipo de mensaje). Por lo tanto, 
	un ataque de estas
	características tan sólo puede llevarse a cabo generando mensajes 
	maliciosos pero correctos (y eso implica el conocimiento de la
	clave utilizada para ese tipo de mensaje).}.

	\item La marca de tiempo insertada en el mensaje se considere 
	desfasada. Siendo $time$ el reloj local, $timestamp$ estará
	desfasada sssi 
	\begin{displaymath} 
		 |time - timestamp| \geq \Delta
	\end{displaymath}

	Por esa razón, los relojes de los dispositivos del entorno tienen que estar 
	relativamente sincronizados
	\footnote{ La experiencia de uso 
	nos muestra que un valor de 1800 segundos para $\Delta$ es razonable,  
	ya que el margen de sincronización de 
	relojes para los distintos dispositivos usados es bastante amplio 
	(pueden estar desfasados un total de 30 minutos)
	y la cache de {\it nonces} es lo suficientemente grande como para no 
	llenarse en ese tiempo incluso en situaciones
	de uso extremo.}.

	\item Los datos esperados en ciertas partes del mensaje no sean correctos.  
	Por ejemplo, si la cadena de caracteres que identifica
	el tipo de mensaje no corresponde a ninguna de los tipos conocidos, 
	se descarta el mensaje.

	\item Las firmas que se envían junto al mensaje no sean correctas. Una firma 
	no es correcta si el receptor no puede crear una 
	firma similar usando los mismos algoritmos, los mismos datos y la misma clave.
\end{itemize}



\subsection{ Protocolo de descubrimiento del agente principal}

Supongamos que el usuario A posee un dispositivo que actúa como 
agente principal ($P^a$), y 
arranca un terminal $T^a$ que le pertenece. 

En este caso sólo se utilizan dos tipos de mensajes. Los mensajes se identifican 
mediante un identificador en forma de cadena de caracteres:

\begin{itemize}

	\item \textbf{``ineedmainagent" (INMA)}: mensaje de descubrimiento 
	del agente principal del usuario. Cuando un terminal arranca, debe 
	localizar a su agente principal. 
	Si pasa un tiempo determinado y no obtiene respuesta, el agente 
	considerará que no existe un agente principal e intentará adoptar 
	este papel él mismo.
	El agente podrá llegar a ser agente principal si 
	y sólo si se cumplen las condiciones explicadas en la 
	sección \ref{sso_cond}.

	\item \textbf{``iammainagent" (IAMA)}: mensaje con la respuesta 
	al descubrimiento. En este mensaje
	se adjunta una clave de sesión $KS_{t^{a}}$ que se utiliza de 
	aquí en adelante por $T^a$ para solicitar
	servicio a $P^a$.  También se proporciona el identificador de la 
	encarnación del agente principal  $E_{id}$ y la clave de 
	encarnación $KE_{eid}$, que se usa para el protocolo de compartición
	de secretos entre agentes comunes.
	
	El mensaje se compone de dos partes: (i) una parte en la que se
	se incluye la dirección del agente principal que se ofrece a dar servicio
	al agente que envió el mensaje INMA, y (ii) otra parte que contiene
	la clave de sesión que se va a utilizar para establecer contacto con
	el agente principal, el identificador de encarnación y la clave de 
	encarnación.
	
	La  descomposición del mensaje en dos partes se debe a razones 
	de diseño; se desacopla la asignación de agente principal del servicio
	que procesa el mensaje INAM. De esta forma el protocolo puede 
	seguir siendo válido
	en una arquitectura formada por diferentes agentes principales (este
	tipo de arquitectura se tratará más adelante).
\end{itemize}


Para envíar estos mensajes, $T^a$ tiene que tener asignada 
una clave $KT_{t^{a}}$, y $P^a$ debe conocerla. Esa 
clave se debe almacernar en el repositorio de claves que 
obtiene el agente principal al arrancar.
El protocolo es el siguiente:

\begin{quote}
	$T^a \longrightarrow  BROADCAST$\\
	$``ineedmainagent",  username_a, T^a$\\  
	$IV$, \{$random_b, ``ineedmainagent", username_a, T^a, n_1, n_2, timestamp_{t^{a}}$\}$_{KT_{t^{a}}}$\\
	\{\{$``ineedmainagent", username_a, T^a, n_1, n_2, timestamp_{t^a}$\}$_{SHA1}$\}$_{KT_{t^{a}}}$\\

	$P^{a} \longrightarrow  T^a $\\
	$``iammainagent"$\\
	$IV'$, \{$random_b',``iammainagent", username_a, T^a, address, n_1+1, timestamp_{p^{a}}$\}$_{KS_{t^{a}}}$\\ 
	\{\{$``iammainagent", username_a, T^a, address, n_1+1,  timestamp_{p^{a}}$\}$_{SHA1}$\}$_{KS_{t^{a}}}$\\
	$IV''$, \{$random_b'', ``fromowner", username_a, T^a, n_2+1, timestamp_{P^{a}},KS_{t^{a}}, E_{id}, KE_{eid}$\}$_{KT_{t^{a}}}$\\
	\{\{$``fromowner", username_a, T^a, n_2+1timestamp_{p^a}, KS_{t^{a}, E_{id}, KE_{eid}}$ \}$_{SHA1}$\}$_{KT_{t^{a}}}$\\
\end{quote}


\subsection{ Protocolo de servicio de secretos }

Este protocolo está formado por dos  mensajes:

\begin{itemize}
	\item \textbf{``tomainagent" (TMA)}: mensaje de petición de 
	un secreto al agente principal.  
	
	\item \textbf{``frommainagent" (FMA)}: mensaje con la 
	respuesta a la petición.  
\end{itemize}


Al agente principal se le envía un comando, representado como $cmd$. 
Ese comando puede ser:

\begin{itemize}
	\item  \textbf{listkeys}: pide al agente principal que le envíe 
	la lista de secretos que tiene en su anillo. En la lista
	se envía la descripción de los secretos que tiene el agente
	principal, pero nunca la información secreta (claves y 
	contraseñas).

	\item \textbf{haskey tupla}: pregunta al agente si posee el 
	secreto representado por esa tupla.
	Los secretos se representan mediante tuplas de atributos de 
	una manera similar al Factotum original.
	  
	\item \textbf{givekey tupla}: le dice al agente que le devuelva 
	el secreto correspondiente a esa tupla.
	Si el agente no posee ese secreto, le devolverá un 
	mensaje de error.  
\end{itemize}

En el mensaje ``frommainagent" se devuelve una respuesta al comando, 
que representamos como $cmdresponse$. 
Esa respuesta puede ser la tupla solicitada o un 
mensaje de error.


\begin{quote}
	
	$T^a \longrightarrow  PCM^a$\\
	$``tomainagent", username_a, T^a$\\  
	$IV$, \{$random_b, ``tomainagent", username_a, T^a, n_4, timestamp_{t^a}, cmd$\}$_{KS_{t^{a}}}$\\
	\{\{$``tomainagent", username_a, T^a, n_4, timestamp_{t^a}, cmd$\}$_{SHA1}$\}$_{KS_{t^{a}}}$\\

	$PCM^{a} \longrightarrow  T^a $\\
	$``frommainagent", username_s$\\
	$IV'$, \{$random_b',``frommainagent", username_a, T^a, n_4+1, timestamp_{p^a}, cmdresponse$\}$_{KS_{t^{a}}}$\\ 
	\{\{$``frommainagent", username_a, T^a, n_4+1, timestamp_{p^a}, cmdresponse$\}$_{SHA1}$\}$_{KS_{t^{a}}}$\\

\end{quote}


\subsection{Protocolo Peer to Peer}


El  protocolo está formado por dos  mensajes:

\begin{itemize}
	\item \textbf{``topeers" (TPE)}: mensaje de petición de 
	un secreto a los  agentes comunes. 
	
	\item \textbf{``frompeer" (FPE)}: mensaje con la 
	respuesta a la petición.  
\end{itemize}



\begin{quote}
	$T^a$ y $Z^a$ son terminales de A.

	$T^{a} \longrightarrow  BROADCAST$\\
	$``topeers", username_a, E_{id}$\\  
	$IV$, \{$random_b, ``topeers", username_a, E_{id}, n_5, timestamp_t, tuple$\}$_{KE_{eid}}$\\
	\{\{$``topeers", username_a, E_{id}, n_5, timestamp, tuple$\}$_{SHA1}$\}$_{KE_{eid}}$\\

	$Z^{a} \longrightarrow  T^a $\\
	$``frompeer", E_{id}$\\
	$IV'$, \{$random_b',``frompeer", username_a,  E_{id},  n_5+1, timestamp_z, tuple$\}$_{KE_{eid}}$\\ 
	\{\{$``frompeer", username_a,  E_{id},  n_5+1, timestamp, tuple$\}$_{SHA1}$\}$_{KE_{eid}}$\\

\end{quote}



\section{Implementación de prototipo: NetFactotum}

En esta sección se comentarán detalles de una implementación 
del agente SHAD  para  el sistema
operativo Plan B~\cite{3eov,3e}.  

Este prototipo se basa en Factotum~\cite{cox02security}, el agente
de seguridad del sistema operativo Plan 9.  En el capítulo \ref{facto} 
del capítulo dedicado al estado de la cuestión se describe el funcionamiento
y el esquema que sigue Factotum.

La arquitectura de la implementación del prototipo de SHAD se 
presenta en la figura \ref{sso_proto}. 

En concreto, Factotum conforma practicamente la totalidad del
 módulo de secretos de 
un agente SHAD. De ahora en adelante, nos referiremos al prototipo
del agente SHAD como {\bf Netfactotum}. 

El resto del prototipo lo forman los siguientes componentes:

\begin{itemize}

	\item Servidor {\it unicast}. Sólo está activo en el agente
	principal y posee flujo de ejecución propio.
	Se encarga de servir los secretos a los agentes principales
	procesando las peticiones que recibe en un puerto TCP bien
	conocido (tcp!unicast!10023)
	\footnote{Se utiliza una notación similar a la utilizada en el 
	sistema operativo Plan 9: {\it protocolo!dirección!puerto}}.

	\item Servidor {\it broadcast}. Está activo tanto en agentes
	comunes como en el agente principal. El servidor posee
	flujo de ejecución propio y escucha en un puerto UDP bien
	conocido de la dirección de broadcast de la subred 
	En el agente principal, se encarga
	de procesar los mensajes de descubrimiento de los agentes
	comunes (udp!broadcast!10023). 
	En los agentes comunes, se encarga de procesar
	las peticiones Peer To Peer (udp!broadcast!10024). 

	\item Módulo recolector (RM). Se encarga de intentar obtener
	las claves de los otros agentes. Se pone en contacto con
	los servidores descritos anteriormente a través de conexiones
	TCP (agente principal) o radiando datagramas UDP en la 
	dirección de broadcast (agentes comunes).

	\item Módulo descubridor (DM). Su función es descubrir al
	agente principal radiando mensajes de broadcast en un puerto
	(udp!broadcast!10023). 
\end{itemize}

Los distintos flujos de ejecución deben acceder concurrentemente a
la estructura de datos que alberga las tuplas de Factotum (el anillo
de secretos). Para coordinar el acceso concurrente se han utilizado
cierres con espera activa ({\it spin locks}), debido a que la espera
que deben realizar es corta. Por otra parte, la probabilidad de encontrar
el cierre echado en el anillo es baja, debido a la naturaleza del propio
agente y el tipo de uso para el que está diseñado.

\begin{figure*}[t!]
\centering
\epsfig{file=figuras/sso_proto.png, width=\textwidth}
\caption{Esquema del prototipo de agente SHAD para SSO (NetFactotum)}
\label{sso_proto}
\end{figure*}

La implementación aprovecha los servicios que ofrece en espacio
inteligente del Laboratorio de Sistemas~\cite{lssmartspace}, en concreto
la infrastructura de localización y la de mensajes de voz. 
Aunque el 
prototipo haga uso de estos servicios, no depende de ellos para su
funcionamiento, esto es, tolera el fallo o la ausencia de 
dichos servicios.

\subsection{Representación de las claves}

NetFactotum utiliza el mismo método para almacenar las claves 
que Factotum.  Las claves se almacenan en tuplas, que además
contienen atributos que aportan información sobre la clave.  
Las claves de Factotum tienen un atributo común,  \texttt{proto}, que 
especifica el tipo de secreto.
Los otros  atributos  varían según el tipo de clave (el servicio para
el que sirve el secreto, o campo de una tupla)~\cite{factotum-man}). 

Los atributos secretos de una tupla van precedidos por el carácter '!'. 
Estos atributos secretos nunca se presentan en claro por pantalla. 
Factotum almacena las tuplas en su memoria principal. La memoria
principal de Factotum está protegida contra depuración y nunca se
vuelca a área de intercambio. 

\subsubsection{ Claves para el protocolo SHAD }

Para almacenar los secretos relacionados con el protocolo de 
NetFactotum, se ha creado un nuevo tipo de tupla que
se  identifica mediante el campo  \texttt{proto=shad}. 

Estas tuplas almacenan las claves privadas de las máquinas que
pertenecen al usuario ($KT_z$ para un terminal $Z$):

\begin{center} 
	\texttt{ proto=shad 
	type=term 
	machine={\it máquinaZ}  
	!tsecret=}$KT_z$
	%%forrent=[yes|no] askforpermission=[opción]
\end{center}
	

\subsubsection{ Campos para claves convencionales }
\label{restric}

Se han añadido varios atributos a las tuplas convencionales de Factotum.
Mediante el uso del estos atributos, el usuario es capaz de 
ajustar el nivel de seguridad para sus secretos.
Ell usuario deberá aceptar el compromiso entre comodidad 
de uso y nivel de seguridad de sus secretos. Por tanto, el usuario 
tendrá que tener
en cuenta que los secretos que no están disponibles desde ciertos 
terminales tendrán que proporcionarse explícitamente, con la obstrucción 
que conlleva.
A la vez tendrá que asumir que los secretos que están disponibles desde 
terminales 
vulnerables a ataques estarán menos seguros que los no accesibles. 

Respecto a las restricciones, SHAD aplica siempre la más restrictiva. En el 
caso de los atributos que utilizan información de localización, si dicha información
no está disponible, el agente principal no sirve el secreto. 


Supongamos la siguiente tupla que contiene un  secreto para el protocolo SSH:

	\begin{center} 
		\texttt{ proto=pass 
		server=s1 
		service=ssh 
		user={\it usuario}
		machine={\it máquina}  
		[noremoteaccess] 
		[nopeeraccess] 
		[needconfirm]
		[samelocation] 
		[userlocation={\it localización}] 
		[clientlocation={\it localización}]
		[accesiblefrom={\it opción}] 
		!password }
	\end{center}

\begin{itemize}
	\item \texttt{noremoteaccess}: indica que ningún agente 
	puede compartir ese secreto con otro agente. Si una tupla
	no contiene este atributo, el agente principal considera
	que puede enviarla a un agente común.

	\item \texttt{nopeeraccess}: indica que el secreto no
	puede compartirse entre agentes comunes a través del
	protocolo Peer to Peer. El agente principal sí puede enviar
	el secreto a los agentes que lo requieran.

	\item \texttt{needconfirm}: obliga a que la acción tenga
	que confirmarse explícitamente por el usuario en el agente
	principal. 

	\item \texttt{userlocation={\it localización}}:  el secreto se sirve
	sólo si el usuario se encuetra en la localización especificada
	en el atributo. En caso de que la tupla contenga también
	el atributo \texttt{needconfirm}, se pedirá confirmación 
	sólo si el usuario se encuentra en esa ubicación. En caso contrario,
	se denegará el acceso al secreto.
	Puede haber más de una instancia de este
	atributo dentro de una tupla para especificar varias 
	localizaciones desde donde el secreto está disponible.

	\item  \texttt{clientlocation={\it localización}}: funciona igual
	que el atributo anterior pero comprobando la localización de
	la máquina cliente. Puede haber más de una instancia de este
	atributo en una tupla.

	\item \texttt{samelocation}: es accesible si la
	localización física del usuario y de la máquina 
	cliente es la misma. Respecto a las confirmaciones, se aplica
	el mismo criterio que en los dos atributos anteriores.

	\item \texttt{accesiblefrom={\it máquina}}: el 
	secreto sólo es accesible desde las máquina indicada en
	el atributo. Puede haber más de una instancia de este
	atributo en una tupla.
\end{itemize}
	
\subsection{Control de los agentes}

Factotum ofrece una interfaz de control a través de un sistema de ficheros. 
El prototipo de SHAD posee la misma interfaz, pero con dos  ficheros de
control adicionales.

El fichero \texttt{getkey} fichero proporciona una interfaz 
para ordenar a un
agente común que adquiera un secreto. El fichero de control admite
una cadena de caracteres con formato de tupla de Factotum, sin
el atributo secreto especificado. . 
Si la cadena escrita en el fichero tiene una sintaxis correcta, entonces
el agente intenta conseguir la tupla completa del agente principal o
de los otros agentes comunes de su misma encarnación. Si el agente
consigue obtener la tupla completa, la almacena en el anillo de secretos.
El fichreo \texttt{getkey} no está disponible en el agente principal.

El fichero  \texttt{hold}  hace que los hilos servidores del agente no
acepten peticiones, y por tanto, el agente SHAD actúe como un agente
Factotum convencional.

\subsection{ Repositorio de claves }

En el prototipo NetFactotum, el repositorio de claves se obtiene 
mediante Secstore\cite{secstore-man}, de la misma forma que lo 
hace Factotum.  Cuando un agente 
NetFactotum arranca
y asume el papel de agente principal , adquiere su almacén de 
claves de un servidor de autenticación a través de la red. La principal 
diferencia con Factotum 
radica en que sólo el primer agente en arrancar necesita obtener 
el Secstore. Por tanto, sólo se depende de una entidad centralizada
(el servidor de Secstore) en el momento de arrancar el agente principal.

Para eliminar esa dependencia, se 
podría obtener el almacén de claves de un dispositivo local, por ejemplo 
de una tarjeta de memoria SD Card. La tarjeta tendría el mismo fichero
de Secstore, crifrado con un algoritmo fuerte de clave simétrica.


\subsection{Confirmaciones: Oshad}

El usuario necesita una interfaz para recibir avisos de su agente principal
y poder consentir la cesión de un secreto cuando sea necesario. Para ello
se ha desarrollado un programa, Oshad, que ofrece una interfaz gráfica a través 
del sistema gráfico de Plan B,  Omero~\cite{omero}.  

Oshad ofrece una interfaz sencilla para que el usuario pueda confirmar las
operaciones tan sólo pulsando un botón. A la vez, Oshad ofrece una interfaz
para su control desde NetFactotum que se basa en un pequeño sistema de 
ficheros virtual, siguiendo con las lineas generales de diseño de Plan B. 

El sistema de ficheros de Oshad  ofrece tres  ficheros de control:  \texttt{confirm},
\texttt{ads}, y \texttt{voice}. 

\texttt{Confirm} es el fichero de control en el que se indican las operaciones 
que el usuario debe confirmar. 
Este fichero de control espera 
una cadena de caracteres con el siguiente formato:

	\begin{center} 
		\texttt{
		``nonce
		cliente
		protocolo
		servidor''
		}
	\end{center}

\texttt{Nonce} es un entero sin signo de 32 bits generado de forma aleatoria
que identifica la petición de confirmación que se le pasa a Oshad. \texttt{Cliente}
es el nombre de la máquina donde ejecuta el agente que está pidiendo 
servicio al principal. \texttt{Protocolo} especifica el tipo de secreto que
solicita el agente remoto. Por último, \texttt{servidor} es el nombre de la 
máquina que ofrece el servicio para el que se va a usar el secreto reclamado.

Cuando se escribe una cadena con esta sintaxis en el fichero \texttt{confirm},
Oshad pregunta al usuario a través de su interfaz gráfica integrada en Omero. 
En la figura \ref{oshad} se muestra una captura de pantalla de Oshad pidiendo
confirmación para ceder un secreto a un agente SHAD que lo solicita. Cuando el
usuario se pronuncia al respecto, su decisión se puede leer del mismo fichero: la lectura
del fichero de control devuelve el \texttt{nonce} junto con la decisión del usuario.

\begin{figure*}[t!]
\centering
\epsfig{file=figuras/oshad.png, width=\textwidth}
\caption{Captura de pantalla de Oshad pidiendo confirmación para ceder al agente 
SHAD de la máquina 'osiris' la 
contraseña de acceso al servidor SSH de la máquina 'ronin' .}
\label{oshad}
\end{figure*}

Por tanto,  cuando una aplicación (que comúnmente será NetFactotum, aunque 
otras aplicaciones pueden usar Oshad de la misma manera, ya que están totalmente
desacoplados) necesita confirmación, sigue los pasos enumerados a continuación:

\begin{enumerate}
	\item Abre el fichero \texttt{confirm} en modo lectura/escritura.
	\item Escribe en el fichero \texttt{confirm} la cadena de control.
	\item Lee del fichero \texttt{confirm} en repetidas ocasiones
	 la confirmación o cancelación de la
	operación, identificando en contenido mediante el \texttt{nonce}
	utilizado en la cadena de control. Cada aplicación definirá su tiempo
	de espera máximo (timeout) para considerar que la 
	confirmación ha fallado.
\end{enumerate}

El fichero \texttt{ads} espera cadenas de caracteres correspondientes a  avisos 
destinados al usuario. Estos avisos se imprimen en la interfaz gráfica de Oshad. Por
otra parte, Oshad saca partido de la infrastructura de voz de 
Plan B~\cite{lssmartspace}, avisando a través de esta al usuario. Cuando un 
programa escribe un aviso en el fichero \texttt{ads}, Oshad lo reenvía a la infrastructura
de voz del entorno inteligente. La infrastructura de voz de Plan B redirige el mensaje 
a la localización actual del usuario, donde un sintetizador de voz lo reproduce por un
altavoz. Oshad  es capaz de usar la infrastructura de voz si esta está disponible, pero 
no depende de ella  para su funcionamiento: el usuario puede seguir confirmando operaciones
y recibiendo mensajes a través de la interfaz  aunque no esté disponible ninguna infrastructura
del entorno inteligente (localización o voz).

Por último, Oshad ofrece un fichero \texttt{voice} que sirve para indicar si el usuario
desea utilizar la infrastructura de voz del espacio inteligente o no. El fichero   
admite sólo dos cadenas de control, \texttt{on} y \texttt{off}, que activan y desactivan
el servicio de voz respectivamente.


\subsection{Información de localización}

Mediante el uso de información de localización y de las restricciones descritas en 
la sección \ref{restric}, el agente principal de 
SHAD es capaz de 
ceder secretos a los demás agentes en base al contexto físico de las personas y máquinas.

El prototipo implementado  accede a la información de localización  que 
ofrece el espacio inteligente
del Laboratorio de Sistemas mediante dos servicios:  \texttt{/who} ofrece información
de contexto sobre personas y  \texttt{/what} ofrece información de localización sobre
objetos. Estos servicios se describen en profundidad en otros 
trabajos~\cite{ballesteros04traditional,lssmartspace}.
 
El servicio \texttt{/who}  ofrece una interfaz de sistema
de ficheros a través de la cual proporciona información de contexto sobre usuarios.
El sistema ofrece los siguientes ficheros con información de localización
para cada usuario del sistema:

\begin{itemize}
	\item \texttt{status}: muestra si el usuario está presente en el sistema.
	\item \texttt{where}: ofrece la localización del usuario. 
\end{itemize}

La infrastructura de localización obtiene dicha información de distintas fuentes, como
sensores de X10~\cite{x10}, balizas emisoras de  ultrasonidos, programas que 
implementan heurísticas definidas para usuarios concretos y otros métodos.

Por otra parte, \texttt{/what} ofrece  un sistema de ficheros con un directorio
para cada uno de las máquinas del entorno ubicuo que contien una serie de ficheros
con información de contexto. Dentro de ese directorio 
se sirve un fichero llamado \texttt{where} que indica la localización de dicha máquina.

\subsection{Experiencia de uso}


Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].