EJERCICIO PRCTICO ABRIL 2003

Un servicio de autenticacin en una red de rea local funciona mediante un 
mecanismo de comunicacin basado en Remote Procedure Calls, RPCs genricas. 
Dispone de las siguientes funciones: 

- Autenticacin de usuario: Recibe como parmetros un identificador de usuario y 
su contrasea, y devuelve un cdigo de retorno 0 si usuario y contrasea son 
correctos, y -1 en caso contrario. 

- Cambio de contrasea: Recibe como parmetros un identificador de usuario, su 
contrasea actual y la nueva contrasea que se desea registrar. Devuelve un 
cdigo de retorno 0 si se ha realizado correctamente la actualizacin, y -1 en 
caso contrario. 

- Obtencin de lista de privilegios asociados a un usuario: Recibe como 
parmetro un identificador de usuario. Si dicho usuario existe en el sistema, 
devuelve un cdigo de retorno 0 y dos listas de longitud variable: la primera 
con todos los atributos definidos en el sistema para el usuario, separados por 
espacios, y la segunda con los nombres de todos los servidores de la red a los 
que tiene acceso, tambin separados por espacios. Si el usuario no existe, 
devuelve un cdigo de retorno -1. 

Los identificadores de usuario, contraseas, atributos de usuario y nombres de 
servidores son cadenas de caracteres ASCII que tienen un tamao mximo de 16 
caracteres. 

1.(2 puntos) Suponiendo que la red es homognea (el mismo tipo de sistema para 
clientes y servidor), proponer una estructura de mensaje de peticin y una 
estructura de mensaje de respuesta para la comunicacin entre client stub y 
server stub adecuado a las tres RPCs. (Describir la estructura en pseudocdigo o 
en lenguaje C, de modo que quede suficientemente clara). 

2.(1.5 puntos) Introducir los cambios necesarios en el mensaje de peticin de la 
RPC de autenticacin de usuario para soportar una red no homognea (clientes y 
servidor de distintos tipos). 

3.(1.5 puntos) Comentar los problemas de seguridad que presenta el diseo 
elegido para esta aplicacin, y proponer alternativas para resolverlo.


SOLUCIN:

1. Red homognea
   Estructura del mensaje de peticin:
        int tipoPeticion (=1,2,3)
        char usuario[16] // Identificador de usuario
        char contra[16]  // Contrasea
        char nueva[16]   // Nueva contrasea
     Si tipoPeticion=1, nueva no se usa.
     Si tipoPeticion=2, se usan todos los campos.
     Si tipoPeticion=3, slo se usa el campo usuario.
   Estructura del mensaje de respuesta:
        int codigo (=0,-1)
        int lattr // Longitud de la lista de atributos (bytes)
        int lserv // Longitud de la lista de servidores (bytes)
        char attr[lattr] // Lista de atributos (separados por espacios)
        char serv[lserv] // Lista de servidores (separados por espacios)

2. Red no homognea
   Es preciso aadir campos que definan los tipos de datos enviados:
        Tipo de caracteres (ASCII, unicode, etc)
        Tipo de enteros (little endian/big endian)
   O bien un campo nico que defina mediante un solo nmero la combinacin
   de tipos de datos.

3. Problemas de seguridad
   1. Las contraseas viajan por la red sin cifrar.
      Solucin: encriptarlas.
   2. Con tipoPeticion=3, cualquiera puede pedir los privilegios de otro.
      Solucin: enviar tambin la contrasea.
