Oracle Solaris セキュリティーサービス開発ガイド

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

Solaris 暗号化フレームワークは、Solaris オペレーティングシステム上のアプリケーションが暗号化サービスを使用または提供できるようにするためのアーキテクチャーです。このフレームワークとの相互作用はすべて、RSA Security Inc. PKCS#11 Cryptographic Token Interface (Cryptoki) に基づいています。PKCS#11 は、RSA Security Inc. の研究部門である RSA Laboratories によって開発された製品です。この章で説明する Solaris 暗号化フレームワークに関する内容は、次のとおりです。

Oracle Solaris の暗号化に関する用語

暗号化サービスを取得するアプリケーション、ライブラリ、またはカーネルモジュールは「コンシューマ」と呼ばれます。フレームワーク経由でコンシューマに暗号化サービスを提供するアプリケーションは「プロバイダ」または「プラグイン」と呼ばれます。暗号化処理を実装するソフトウェアは「機構」と呼ばれます。機構は単なるアルゴリズムではなく、アルゴリズムの適用方法をも含みます。たとえば、DES アルゴリズムを認証に適用する場合、それは 1 つの独立した機構であるとみなされます。DES をブロック単位の暗号化に適用する場合、それは別の機構になります。

「トークン」とは、暗号化機能を持つデバイスを抽象化した概念です。 また、トークンには暗号化処理で使用する情報を格納することもできます。1 つのトークンで 1 つ以上の機構をサポートできます。トークンは、アクセラレータボードの場合と同様に、ハードウェアを表現できます。純粋なソフトウェアを表現するトークンは「ソフトトークン」と呼ばれます。トークンは溝穴 (スロット) に差し込む (プラグイン) ことができます (これも物理的なたとえです)。スロットは、暗号化サービスを使用するアプリケーションに対する接続ポイントです。

プロバイダ用の特定のスロットのほかに、Solaris 実装は「メタスロット」と呼ばれる特殊なスロットを提供します。メタスロットは、Solaris 暗号化フレームワークライブラリ (libpkcs11.so) のコンポーネントです。メタスロットは、フレームワークにインストールされているすべてのトークンとスロットの機能を結合させて単一の仮想スロットで提供するコンポーネントです。メタスロットにより、事実上、アプリケーションから利用可能なすべての暗号化サービスに単一のスロットを通じて透過的に接続できるようになります。アプリケーションが暗号化サービスを要求すると、メタスロットはもっとも適したスロットを示し、これによりスロットの選択処理が簡単になります。それとは異なるスロットが必要となる場合がありますが、その場合はアプリケーションが個別に明示的な検索を実行する必要があります。メタスロットは自動的に有効になり、システム管理者の明示的な操作によってのみ無効にできます。

「セッション」とは、暗号化サービスを使用するアプリケーションとトークン間に確立される接続のことです。PKCS #11 標準で使用されるオブジェクトには、次の 2 種類があります。 トークンオブジェクトとセッションオブジェクトです。「セッションオブジェクト」は一時的なオブジェクト、つまりセッション期間内でのみ存在できるオブジェクトです。セッション終了後も存続するオブジェクトが「トークンオブジェクト」と呼ばれます。

トークンオブジェクトのデフォルトの格納場所は、$HOME/.sunw/pkcs11_softtoken です。また、トークンオブジェクトを $SOFTTOKEN_DIR/pkcs11_softtoken に格納することも可能です。非公開のトークンオブジェクトは個人識別番号 (Personal Identification Number、PIN) によって保護されます。トークンオブジェクトを作成または変更するユーザーは、非公開のトークンオブジェクトにアクセスするのでない限り、必ず認証を受ける必要があります。

暗号化フレームワークの概要

暗号化フレームワークは Solaris OS の一部であり、Sun Microsystems, Inc. および第三者の開発元による暗号化サービスを提供します。このフレームワークは、次のようなさまざまなサービスを提供します。

次の図は、暗号化フレームワークの概要を示したものです。図の淡いグレーの部分は、暗号化フレームワークのユーザーレベル領域を示します。濃いグレーの部分は、フレームワークのカーネルレベル領域を表します。非公開のソフトウェアは、背景に斜線が入っています。

図 8–1 Oracle Solaris 暗号化フレームワークの概要

Oracle Solaris 暗号化フレームワークの主要コンポーネントを示しています。

暗号化フレームワークのコンポーネント

暗号化フレームワークの各コンポーネントの説明は、次のとおりです。

暗号化技術を扱う開発者が知っておくべきこと

ここでは、Solaris 暗号化フレームワークにプラグイン可能な 4 種類のアプリケーションを開発するための要件について説明します。

ユーザーレベルのコンシューマ開発者に対する要件

ユーザーレベルのコンシューマを開発する開発者は、次の点に留意する必要があります。

詳細については、第 9 章ユーザーレベルの暗号化アプリケーションとプロバイダの記述を参照してください。

ユーザーレベルのプロバイダ開発者に対する要件

ユーザーレベルのプロバイダを開発する開発者は、次の点に留意する必要があります。

カーネルレベルのコンシューマ開発者に対する要件

カーネルレベルのコンシューマを開発する開発者は、次の点に留意する必要があります。

カーネルレベルのプロバイダ開発者に対する要件

カーネルレベルのプロバイダを開発する開発者は、次の点に留意する必要があります。

ユーザーレベルのプロバイダにおけるデータクリーンアップ衝突の回避

暗号化フレームワークにプラグインするユーザーレベルライブラリでは、_fini() 関数を提供する必要があります。_fini() 関数は、ライブラリの読み込み解除時にローダによって呼び出されます。_fini() 関数は、すべてのクリーンアップが正しいタイミングで正しく実行されるために必要です。libpkcs11 を使用するライブラリが C_Finalize() を呼び出すことは想定されていません。なぜなら、libpkcs11 はアプリケーションによって使用されている可能性がある共有ライブラリだからです。

_fini() 関数を提供するには、再配置可能オブジェクトのプログラムデータセクション内に .fini セクションを作成する必要があります。.fini セクションは実行時終了コードブロックを提供します。『リンカーとライブラリ』を参照してください。次のコード例は .fini セクションの設計方法を示しています。


例 8–1 PKCS #11 ライブラリへの _fini() の提供

#pragma fini(pkcs11_fini)
static void pkcs11_fini();

/* [... (other library code omitted)] */

static void
pkcs11_fini()
{
        (void) pthread_mutex_lock(&pkcs11mutex);
        
        /* If CRYPTOKI is not initialized, do not clean up */
        if (!initialized) {
                (void) pthread_mutex_unlock(&pkcs11mutex);
                return;
        }
        
        (void) finalize_routine(NULL_PTR);
        
        (void) pthread_mutex_unlock(&pkcs11mutex);
}