JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris 10 セキュリティー開発者ガイド     Oracle Solaris 10 1/13 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  Oracle Solaris の開発者向けセキュリティー機能 (概要)

2.  特権付きアプリケーションの開発

3.  PAM アプリケーションおよび PAM サービスの記述

4.  GSS-API を使用するアプリケーションの記述

5.  GSS-API クライアント例

6.  GSS-API サーバー例

GSS-API サーバー例の概要

GSS-API サーバー例の構造

GSS-API サーバー例の実行

GSSAPI サーバー例: main() 関数

資格の獲得

inetd の検査

クライアントからのデータの受信

コンテキストの受け入れ

メッセージのラップ解除

メッセージへの署名とメッセージの返送

test_import_export_context() 関数の使用

GSS-API サーバー例のクリーンアップ

7.  SASL を使用するアプリケーションの記述

8.  Oracle Solaris 暗号化フレームワークの紹介

9.  ユーザーレベルの暗号化アプリケーションとプロバイダの記述

10.  スマートカードフレームワークの使用

A.  C ベース の GSS-API プログラム例

B.  GSS-API リファレンス

C.  OID の指定

D.  SASL ソースコード例

E.  SASL リファレンス

F.  暗号化プロバイダのパッケージ化と署名

用語集

索引

資格の獲得

資格は、クライアントアプリケーション、サーバーアプリケーション、または 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. 資格を取得できるように、メカニズムリストの中身を検査し、そのリストに単一のメカニズムだけが含まれるようにします。

    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 は、デフォルトのメカニズムを使用することを示します。

  2. サービス名を 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_SERVICEname_buf に格納されている文字列の名前型です。この場合、文字列が service@host というサービスの形式で解釈されることを示します。

これらのタスクが完了すると、サーバープログラムは次の gss_acquire_cred() を呼び出せます。

maj_stat = gss_acquire_cred(&min_stat, server_name, 0,
                                 desiredMechs, GSS_C_ACCEPT,
                                 server_creds, NULL, NULL);

server_acquire_creds() 関数のソースコードを、次に示します。

例 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;
}