서버는 클라이언트의 증명서를 가져올 수 있어야 합니다. 예 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는 이를 해석하지 않습니다. 예를 들어, 쿠키는 구조에 대해 콘텍스트 개시 프로그램을 나타내는 포인터나 인덱스일 수 있습니다. 서버는 요청 때마다 이 값을 계산하는 대신 콘텍스트 작성 시 이 값을 계산하여 요청 처리 시간을 단축합니다.