서버는 클라이언트의 증명서를 가져올 수 있어야 합니다. 예 8-5에 나와 있는 rpc_gss_getcred() 함수를 사용하면 서버에서 UNIX 증명서나 RPCSEC_GSS 증명서(또는 둘 다)를 검색할 수 있습니다. 이 검색은 함수가 성공적으로 실행될 경우 설정되는 두 개의 인수를 통해 수행됩니다. 하나는 rpc_gss_ucred_t 구조에 대한 포인터로서, 증명서가 있을 경우 호출자의 UNIX 증명서를 포함합니다.
typedef struct {
uid_t uid; /* user ID */
gid_t gid; /* group ID */
short gidlen;
git_t *gidlist; /* list of groups */
} rpc_gss_ucred_t;
나머지 인수는 rpc_gss_raw_cred_t 구조에 대한 포인터로서 다음과 같습니다.
typedef struct {
u_int version; /* RPCSEC_GSS program version */
char *mechanism;
char *qop;
rpc_gss_principal_t client_principal; /* client principal name */
char *svc_principal; /* server principal name */
rpc_gss_service_t service; /* privacy, integrity enum */
} rpc_gss_rawcred_t;
rpc_gss_principal_t에 대한 자세한 내용은 "클라이언트 주체 이름 생성"을 참고하십시오. rpc_gss_rawcred_t는
클라이언트와 서버 주체 이름을 모두 포함하므로 rpc_gss_getcred()함수는 두 이름을 모두
반환할 수 있습니다.
예 8-5 는 서버가 호출자에 대한 증명서를 얻는 단일 서버 디스패치 프로시저의 예입니다. 이 프로시저는 호출자의 UNIX 증명서를 읽은 다음 rpc_gss_rcred_t 인수에 있는 메커니즘, QOP, 서비스 유형을 사용하여 사용자 ID를 확인합니다.
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;
}
/*
* authenticate all other requests */
*/
switch (rqstp->rq_cred.oa_flavor) {
case RPCSEC_GSS:
/*
* get credential information
*/
rpc_gss_getcred(rqstp, &rcred, &ucred, NULL);
/*
* verify that the user is allowed to access
* using received security parameters by
* peeking into my config file
*/
if (!authenticate_user(ucred->uid, rcred->mechanism,
rcred->qop, rcred->service)) {
svcerr_weakauth(xprt);
return;
}
break; /* allow the user in */
default:
svcerr_weakauth(xprt);
return;
} /* end switch */
switch (rqstp->rq_proq) {
case SERV_PROC1:
. . .
}
/* usual request processing; send response ... */
return;
}
|
자세한 내용은 rpc_gss_getcred(3N) 매뉴얼 페이지를 참고하십시오.
예 8-5에서 rpc_gss_getcred() 함수의 마지막 인수(여기서는NULL)는 사용자 정의 쿠키로서 반환값은 콘텍스트가 작성될 때 서버에서 지정했던 값이 됩니다. 이 쿠키는 4바이트 값으로, 해당 응용 프로그램에 적합한 모든 방식으로 사용될 수 있습니다. RPC는 이를 해석하지 않습니다. 예를 들어, 쿠키는 구조에 대해 콘텍스트 개시 프로그램을 나타내는 포인터나 인덱스일 수 있습니다. 서버는 요청 때마다 이 값을 계산하는 대신 콘텍스트 작성 시 이 값을 계산하여 요청 처리 시간을 단축합니다.