ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris 11 セキュリティーサービス開発ガイド Oracle Solaris 11.1 Information Library (日本語) |
1. Oracle Solaris の開発者向けセキュリティー機能 (概要)
3. PAM アプリケーションおよび PAM サービスの記述
test_import_export_context() 関数の使用
8. Oracle Solaris 暗号化フレームワークの紹介
資格は、クライアントアプリケーション、サーバーアプリケーション、または GSS-API によって作成されるのではなく、基盤となる機構によって作成されます。クライアントプログラムは通常、ログイン時に取得された資格を持ちます。サーバーは常に、資格を明示的に獲得する必要があります。
gss-server プログラムには、提供されるサービスの資格を取得するための関数 server_acquire_creds() があります。server_acquire_creds() 関数は、使用するサービスの名前およびセキュリティー機構を入力として取得します。server_acquire_creds() 関数はその後、サービスの資格を返します。server_acquire_creds() 関数は、GSS-API 関数 gss_acquire_cred() を使用して、サーバーが提供するサービスの資格を取得します。
server_acquire_creds() が gss_acquire_cred() にアクセスする前に、server_acquire_creds() は次の 2 つのタスクを行う必要があります。
資格を取得できるように、機構リストの中身を検査し、そのリストに単一の機構だけが含まれるようにします。
1 つの資格を複数の機構で共有できる場合、gss_acquire_cred() 関数はこのような機構すべての資格を戻します。したがって、gss_acquire_cred() は入力として機構の「セット」を受け取ります。「GSS-API における資格の操作」を参照してください。しかしながら、この例も含めてほとんどの場合、単一の資格が複数の機構で動作することはありません。gss-server プログラムでは、コマンド行から単一の機構が指定されるか、またはデフォルトの機構が使用されます (指定されなかった場合)。したがって、最初のタスクは、gss_acquire_cred() に渡される機構セットに 1 つの機構 (デフォルトまたはそれ以外) だけが入っていることを確認することです。次にコードを示します。
if (mechOid != GSS_C_NULL_OID) { desiredMechs = &mechOidSet; mechOidSet.count = 1; mechOidSet.elements = mechOid; } else desiredMechs = GSS_C_NULL_OID_SET;
GSS_C_NULL_OID_SET は、デフォルトの機構を使用することを示します。
サービス名を GSS-API 形式に変換します。
gss_acquire_cred() が受け取るサービス名は gss_name_t 構造体の形式であるため、サービス名をその形式にインポートする必要があります。gss_import_name() 関数がこの変換作業を行います。ほかの GSS-API 関数と同様に、この関数でも引数は GSS-API 型である必要があるため、まず、サービス名を GSS-API バッファーにコピーする必要があります。次にコードを示します。
name_buf.value = service_name; name_buf.length = strlen(name_buf.value) + 1; maj_stat = gss_import_name(&min_stat, &name_buf, (gss_OID) GSS_C_NT_HOSTBASED_SERVICE, &server_name); if (maj_stat != GSS_S_COMPLETE) { display_status("importing name", maj_stat, min_stat); if (mechOid != GSS_C_NO_OID) gss_release_oid(&min_stat, &mechOid); return -1; }
今度も標準でない関数 gss_release_oid() を使用していることに注意してください。
入力は、name_buf の文字列として指定されたサービス名です。出力は、gss_name_t 構造体 server_name へのポインタです。3 番目の引数 GSS_C_NT_HOSTBASED_SERVICE は name_buf に格納されている文字列の名前型です。この場合、文字列が service@host というサービスの形式で解釈されることを示します。
これらのタスクが完了すると、サーバープログラムは次の gss_acquire_cred() を呼び出せます。
maj_stat = gss_acquire_cred(&min_stat, server_name, 0, desiredMechs, GSS_C_ACCEPT, server_creds, NULL, NULL);
min_stat は関数から戻されるエラーコードです。
server_name はサーバーの名前です。
0 は、プログラムが資格の有効期間の最大値を知る必要がないことを示します。
desiredMechs は、この資格が適用される機構のセットです。
GSS_C_ACCEPT は、資格がセキュリティーコンテキストを受け入れるためだけに使用できることを示します。
server_creds は関数から戻される資格ハンドルです。
NULL は、適用される機構や資格の有効期間をプログラムが知る必要がないことを示します。
server_acquire_creds() 関数のソースコードを、次に示します。
注 - このソースコード例は、Oracle ダウンロードセンターからダウンロードすることも可能です。http://www.oracle.com/technetwork/indexes/downloads/sdlc-decommission-333274.html を参照してください。
例 6-2 server_acquire_creds() 関数のコード例
/* * Function: server_acquire_creds * * Purpose: imports a service name and acquires credentials for it * * Arguments: * * service_name (r) the ASCII service name mechType (r) the mechanism type to use * server_creds (w) the GSS-API service credentials * * Returns: 0 on success, -1 on failure * * Effects: * * The service name is imported with gss_import_name, and service * credentials are acquired with gss_acquire_cred. If either operation * fails, an error message is displayed and -1 is returned; otherwise, * 0 is returned. */ int server_acquire_creds(service_name, mechOid, server_creds) char *service_name; gss_OID mechOid; gss_cred_id_t *server_creds; { gss_buffer_desc name_buf; gss_name_t server_name; OM_uint32 maj_stat, min_stat; gss_OID_set_desc mechOidSet; gss_OID_set desiredMechs = GSS_C_NULL_OID_SET; if (mechOid != GSS_C_NULL_OID) { desiredMechs = &mechOidSet; mechOidSet.count = 1; mechOidSet.elements = mechOid; } else desiredMechs = GSS_C_NULL_OID_SET; name_buf.value = service_name; name_buf.length = strlen(name_buf.value) + 1; maj_stat = gss_import_name(&min_stat, &name_buf, (gss_OID) GSS_C_NT_HOSTBASED_SERVICE, &server_name); if (maj_stat != GSS_S_COMPLETE) { display_status("importing name", maj_stat, min_stat); if (mechOid != GSS_C_NO_OID) gss_release_oid(&min_stat, &mechOid); return -1; } maj_stat = gss_acquire_cred(&min_stat, server_name, 0, desiredMechs, GSS_C_ACCEPT, server_creds, NULL, NULL); if (maj_stat != GSS_S_COMPLETE) { display_status("acquiring credentials", maj_stat, min_stat); return -1; } (void) gss_release_name(&min_stat, &server_name); return 0; }