Sun Guía de Sun Enterprise Authentication Mechanism

Recepción de credenciales en el servidor

Un servidor debe poder recuperar las credenciales de un cliente. La función rpc_gss_getcred(), que se muestra en Ejemplo 8-5, permite al servidor que recupere las credenciales de UNIX o las de RPCSEC_GSS (o ambas). Lo hace mediante dos argumentos, que estarán definidos si la función es satisfactoria. Uno es un puntero a una estructura rpc_gss_ucred_t, que contiene las credenciales de UNIX del llamante en caso que existan:

typedef struct { 
uid_t   uid;          /* ID de usuario */ gid_t   
gid;          /* ID de grupo */ short   gidlen;       
git_t   *gidlist;     /* lista de grupos */ 
} rpc_gss_ucred_t;

El otro argumento es un puntero a una estructura rpc_gss_raw_cred_t, que tiene el aspecto siguiente:

typedef struct { u_int     version;           /* versión de programa de RPCSEC_GSS */ 
char                   *mechanism; char                   *qop; 
rpc_gss_principal_t    client_principal;     /* nombre de principal 
de cliente */ 
char                   *svc_principal;        /* nombre de principal de servicio */ 
rpc_gss_service_t			service;               /* enum de privacidad e integridad */ 
} rpc_gss_rawcred_t;
(Véase "Generación de nombres de principal de cliente" para obtener una descripción de la estructura rpc_gss_principal_t y de cómo se crea). Como rpc_gss_rawcred_t contiene los nombres de principal del cliente y del servidor, rpc_gss_getcred() puede devolver ambos.

Ejemplo 8-5 ilustra un procedimiento sencillo de despacho del lado del servidor, en el que el servidor obtiene las credenciales del llamante. El procedimiento obtiene las credenciales de UNIX del llamante y luego verifica la identidad del usuario mediante mediante el mecanismo, QOP y el tipo de servicio encontrados en el argumento rpc_gss_rcred_t.


Ejemplo 8-5 Obtención de credenciales

static void server_prog(struct svc_req *rqstp, SVCXPRT *xprt) 
{ 
rpc_gss_ucred_t *ucred; 
rpc_gss_rawcred_t *rcred; 

if (rqst->rq_proq == NULLPROC) { 
svc_sendreply(xprt, xdr_void, NULL); 
return; 
} 
/* 
* autenticar el resto de solicitudes 
*/ 
*/ 

switch (rqstp->rq
_cred.oa_flavor) { 
case RPCSEC_GSS: 
/* 
* obtener la información de credenciales 
*/
 rpc_gss_getcred(rqstp, &rcred, &ucred, NULL); 
/* 
* verificar que el usuario tiene el permiso de acceso 
* mediante los parámetros de seguridad recibidos 
* examinando mi archivo de configuración 
*/ 
if (!authenticate_user(ucred->uid, rcred->mechanism, 
rcred->qop, rcred->service)) { 
svcerr_weakauth(xprt); 
return; 
} 
break; 	/* permitir la entrada del usuario 
*/ default: 
svcerr_weakauth(xprt); 
return; 
} /* fin de switch */ 

switch (rqstp->rq_proq) { 
case SERV_PROC1: 
. . . 
} 

/* proceso habitual de solicitudes; enviar respuesta ... */ 

return; 

}

Para obtener más información, véase la página del comando man rpc_gss_getcred(3N).

Cookies

En Ejemplo 8-5, el último argumento de rpc_gss_getcred() (en este caso, NULL) es una cookie definida por el usuario, cuyo valor al retornar será lo que especificó el servidor cuando se creó el contexto. Esta cookie, un valor de cuatro bytes, se puede utilizar como se considere apropiado para la aplicación; RPC no lo interpreta. Por ejemplo, la cookie puede ser un puntero o un índice a una estructura que representa al iniciador del contexto; en lugar de calcular este valor para cada solicitud, el servidor lo calcula en el momento de la creación del contexto (con lo que ahorra así tiempo de proceso de solicitudes).