Un serveur doit pouvoir extraire les justificatifs d'identité d'un client. La fonction rpc_gss_getcred(), illustrée dans Exemple 8-5, permet au serveur de récupérer des justificatifs d'identité UNIX ou RPCSEC_GSS (ou les deux). Pour ce faire, il utilise deux arguments qui sont définis si la fonction réussit. L'un d'eux est un pointeur de structure rpc_gss_ucred_t, qui contient les justificatifs d'identité UNIX du demandeur, s'ils existent :
typedef struct {
uid_t uid; /* ID d'utilisateur */
gid_t gid; /* ID de groupe */
short gidlen;
git_t *gidlist; /* liste des groupes */
} rpc_gss_ucred_t;
L'autre argument est un pointeur de structure rpc_gss_raw_cred_t, dont voici un exemple :
typedef struct {
u_int version ; /* Version du programme RPCSEC_GSS */
char *mechanism;
char *qop ;
rpc_gss_principal_t client_principal; /* nom du principal de client */
char *svc_principal; /* nom de principal du serveur */
rpc_gss_service_t service ; /* confidentialité, enum d'intégrité */
} rpc_gss_rawcred_t;
(Voir "Création de noms de principal de clients" pour une description de la structure rpc_gss_principal_t et de sa création.) Comme rpc_gss_rawcred_t contient les noms de principal du client et du serveur, rpc_gss_getcred() peut renvoyer ces deux noms.
Exemple 8-5 est un exemple de procédure d'expédition côté serveur simple, où le serveur obtient les justificatifs d'identité du demandeur. La procédure obtient les justificatifs d'identité UNIX du demandeur, puis vérifie son identité à l'aide du mécanisme, de la qualité de protection et du type de service indiqué dans l'argument rpc_gss_rcred_t.
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;
}
/*
* authentifier toutes les autres requêtes */
*/
switch (rqstp->rq_cred.oa_flavor) {
case RPCSEC_GSS:
/*
* obtenir les informations sur les justificatifs d'identité
*/
rpc_gss_getcred(rqstp, &rcred, &ucred, NULL);
/*
* vérifier que l'utilisateur est autorisé à accéder
* au moyen des paramètres de sécurité reçus en
* lisant le fichier de configuration
*/
if (!authenticate_user(ucred->uid, rcred->mechanism,
rcred->qop, rcred->service)) {
svcerr_weakauth(xprt);
return;
}
break; /* permettre à l'utilisateur d'entrer */
default:
svcerr_weakauth(xprt);
return;
} /* fin du commutateur */
switch (rqstp->rq_proq) {
case SERV_PROC1:
. . .
}
/* traitement de requête ordinaire ; envoyer une réponse ... */
return;
}
|
Pour de plus amples renseignements, consultez la page de manuel rpc_gss_getcred(3N)
Dans Exemple 8-5, le dernier argument de rpc_gss_getcred() (ici, NULL) est un cookie défini par l'utilisateur, dont la valeur de retour sera celle spécifiée par le serveur lors de la création du contexte. Ce cookie, une valeur à quatre octets, peut être employé de n'importe quelle manière convenant à l'application -- RPC ne l'interprète pas. Par exemple, le cookie peut être un pointeur ou un index relatif à une structure qui représente l'initiateur du contexte. Plutôt que de calculer cette valeur lors de chaque requête, le serveur la calcule au moment de la création du contexte (afin de réduire le temps de traitement des requêtes).