JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris 11 セキュリティーサービス開発ガイド     Oracle Solaris 11 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.  Oracle Solaris 鍵管理フレームワークの紹介

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

B.  GSS-API リファレンス

C.  OID の指定

D.  SASL ソースコード例

E.  SASL リファレンス

用語集

索引

資格の獲得

資格は、クライアントアプリケーション、サーバーアプリケーション、または 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() 関数のソースコードを、次に示します。


注 - このソースコード例は、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;
}