ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Directory Server Enterprise Edition開発者ガイド
11g リリース1 (11.1.1.7.0)
B72440-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

11 パスワード記憶スキーム・プラグインの作成

この章では、Directory Serverがパスワード属性値を格納する仕組みを変更できるプラグインの作成方法について説明します。

この章の内容は、次のとおりです。

11.1 パスワード記憶スキーム・プラグインのコール

この項では、Directory Serverがパスワード記憶スキーム・プラグインをコールする状況について説明します。また、パスワード値がプラグインによってどのように処理されることが期待されているのかについても説明します。

11.1.1 パスワード記憶スキーム・プラグインのタイプ

pwdstorageschemereverpwdstorageschemeの2つのタイプのパスワード記憶スキーム・プラグインが、Directory Serverで機能します。pwdstorageschemeタイプは、一方向です。サーバーがパスワードをエンコードおよび格納した後、パスワードはデコードされません。そのため、pwdstorageschemeタイプには、格納されるパスワードをエンコードしたり、受信するパスワードをエンコードおよび格納されたパスワードと比較するためのプラグイン関数のみが含まれています。reverpwdstorageschemeタイプは可逆であるため、プラグインによってDirectory Serverは値をエンコードおよびデコードできます。そのため、可逆のタイプには、エンコード、比較およびデコード・プラグイン関数が含まれます。


注意:

この章では、一方向のpwdstorageschemeタイプのプラグインについて説明します。

可逆のタイプは、内部使用のみです。


11.1.2 事前インストールされるスキーム

Directory Serverによって提供される既存のスキームは、パスワード記憶スキーム・プラグインとして提供されています。cn=configで、DNにcn=Password Storage Schemesが含まれるエントリを検索します。デフォルトのパスワード記憶スキームは、Salted Secure Hashing Algorithm (SSHA)を使用します。

ユーザー・パスワードのエンコードに使用されるパスワード記憶スキームを変更できます。詳細は、『Oracle Directory Server Enterprise Edition管理者ガイド』の第7章「Directory Serverのパスワード・ポリシー」を参照してください。

11.1.3 パスワード属性値に対する影響

パスワード記憶スキーム・プラグイン関数は、userPassword属性値に影響します。Directory Serverは、起動時にパスワード記憶スキーム・プラグインを登録します。起動後、登録されて有効になったパスワード記憶スキーム・プラグインを使用して、パスワード値をエンコードできます。また、プラグインを使用して、受信するパスワードとエンコードされた値を比較することもできます。Directory Serverがどのプラグインを起動するかは、該当のエントリに使用されているパスワード記憶スキームによって異なります。

11.1.4 追加および変更リクエストの起動

追加および変更リクエストは、Directory Serverが入力パスワードをエンコードし、ディレクトリに格納することを示します。まず、Directory Serverは、パスワード値の記憶スキームを決定します。次に、適切なスキームのプラグイン・エンコード関数を呼び出します。エンコード関数は、エンコードされたパスワードをDirectory Serverに戻します。

11.1.5 バインド・リクエストの起動

バインド・リクエストは、Directory Serverが入力パスワード値と格納されたパスワード値を比較することを示します。追加および変更リクエストと同様に、Directory Serverは、パスワード値の記憶スキームを決定します。次に、サーバーは、適切なスキームのプラグイン比較関数を呼び出します。比較スキームは、「パスワードの比較」の説明に従って、2つのパスワードが一致するかどうかをDirectory Serverに伝えるintを戻します。

11.1.6 パスワード・ポリシーの一部

パスワード記憶スキーム・プラグインは、通常、パスワードをエンコードし、入力パスワードを格納およびエンコードされたパスワードと比較するのみです。つまり、プラグインは、広範なパスワード・ポリシーの一部のみを表しています。セキュアなディレクトリ・サービスの設計に関する提案については、『Oracle Directory Server Enterprise Editionデプロイメント・プランニング・ガイド』を参照してください。

11.2 パスワード記憶スキーム・プラグインの作成

この項では、パスワードをエンコードするプラグインの作成方法について説明します。プラグインによって、Directory Serverは、格納されたパスワードとクライアント・アプリケーションによって提供されたパスワードを比較することもできます。


注意:

この章の例では、セキュアなパスワード記憶スキームを構成しません


この章で参照されるサンプル・プラグインのソースは、install-path/examples/testpwdstore.cにあります。エンコードと比較の場合、プラグインは、パスワードの各文字に対して42との排他的orを実行します。

11.2.1 パスワードのエンコード

Directory Serverは、パスワード記憶スキーム・プラグインのエンコード関数をコールする場合、その関数に入力パスワードchar *を渡し、エンコードされたパスワードchar *が戻ることを期待します。エンコード関数xorenc()の例のプロトタイプは、次のとおりです。

static char * xorenc(char * pwd);

正規のmalloc()ではなく、slapi_ch_malloc()を使用してエンコードされたパスワード用の領域を割り当てます。slapi_ch_free()によって割当てでメモリーが不足する場合、Directory Serverは"メモリー不足"メッセージを表示して終了できます。

通常、エンコードされたパスワードの前に、中カッコ{および}で囲まれたパスワード記憶スキームの名前を付けます。つまり、サンプル・プラグインは、XORと呼ばれます。

例では、次のように名前が宣言されています。

static char * name = "XOR";   /* Storage scheme name */

接頭辞{XOR}が付いたエンコードされた文字列を戻します。また、その名前をDirectory Serverに登録します。

例11-1 userPassword値のエンコード(testpwdstore.c)

#include "slapi-plugin.h"

static char * name           ="XOR";   /* Storage scheme name */

#define PREFIX_START '{'
#define PREFIX_END   '}'

static char *
xorenc(char * pwd)
{
    char * tmp    = NULL;              /* Used for encoding   */
    char * head   = NULL;              /* Encoded password    */
    char * cipher = NULL;              /* Prefix, then pwd    */
    int i, len;
  
    /* Allocate space to build the encoded password           */
    len = strlen(pwd);
    tmp = slapi_ch_malloc(len + 1);
    if (tmp == NULL) return NULL;

    memset(tmp, '\0', len + 1);
    head = tmp;

    /* Encode. This example is not secure by any means.       */
    for (i = 0; i < len; i++, pwd++, tmp++) *tmp = *pwd ^ 42;
  
    /* Add the prefix to the cipher                           */
    if (tmp != NULL) {
        cipher = slapi_ch_malloc(3 + strlen(name) + strlen(head));
        if (cipher != NULL) {
            sprintf(cipher,"%c%s%c%s",PREFIX_START,name,PREFIX_END,head);
        }
    }
    slapi_ch_free((void **) &head);
  
    return (cipher);                   /* Server frees cipher */
}

一時的な使用に割り当てられたメモリーのみを解放することに注意してください。Directory Serverは、プラグインではなく、戻されるchar *のメモリーを解放します。slapi_ch_malloc()slapi_ch_free()の詳細は、第15章「Directory Server関数リファレンス(パートI)」を参照してください。

11.2.2 パスワードの比較

Directory Serverは、パスワード記憶スキーム・プラグインの比較関数をコールする場合、その関数に入力パスワードchar *と、ディレクトリからの格納およびエンコードされたパスワードchar *を渡します。入力パスワードがディレクトリからのパスワードと一致する場合、比較関数はゼロ(0)を戻します。それ以外の場合、関数は1を戻します。比較関数xorcmp()の例のプロトタイプは、次のとおりです。

static int xorcmp(char * userpwd, char * dbpwd);

ここで、userpwdは入力パスワードです。dbpwdは、ディレクトリからのパスワードです。比較関数は、入力パスワードをエンコードし、結果をディレクトリからのパスワードと比較する必要があります。

例11-2 userPassword値の比較(testpwdstore.c)

#include "slapi-plugin.h"

static int
xorcmp(char * userpwd, char * dbpwd)
{
    /* Check the correspondence of the two char by char       */       
    int i, len = strlen(userpwd);
    for (i = 0; i < len; i++) {
        if ((userpwd[i] ^ 42) != dbpwd[i])
            return 1;                  /* Different passwords */
    }
    return 0;                          /* Identical passwords */
}

Directory Serverは値を比較関数に渡す前に、パスワードから接頭辞を削除することに注意してください。つまり、この場合、{XOR}を考慮する必要はありません。

すべてのエンコーディング・アルゴリズムに、このような単純な比較関数があるわけではありません。

11.2.3 パスワード記憶スキーム・プラグインの登録

次の4つのパスワード記憶スキーム固有の項目をDirectory Serverに登録する必要があります。

  • 接頭辞に使用される記憶スキームの名前

  • エンコード関数

  • 比較関数

  • デコード関数

デコード関数は提供しないことに注意してください。この場合、Directory Serverは、ユーザー・パスワードを格納した後、それらをデコードしません。

例11-3 パスワード記憶スキーム・プラグインの登録(testpwdstore.c)

#include "slapi-plugin.h"

static char * name           ="XOR";   /* Storage scheme name */

static Slapi_PluginDesc desc = {
    "xor-password-storage-scheme",     /* Plug-in identifier  */
    "Oracle Corporation (test)",       /* Vendor name         */
    "11.1.1.3.0",                      /* Revision number     */
    "Exclusive-or example (XOR)"       /* Plug-in description */
};

#ifdef _WIN32
__declspec(dllexport)
#endif
int
xor_init(Slapi_PBlock * pb)
{
    int rc = 0;                        /* 0 means success     */
    rc |= slapi_pblock_set(            /* Plug-in API version */
        pb,
        SLAPI_PLUGIN_VERSION,
        (void *) SLAPI_PLUGIN_CURRENT_VERSION
    );
    rc |= slapi_pblock_set(            /* Plug-in description */
        pb,
        SLAPI_PLUGIN_DESCRIPTION,
        (void *) &desc
    );
    rc |= slapi_pblock_set(            /* Storage scheme name */
        pb,
        SLAPI_PLUGIN_PWD_STORAGE_SCHEME_NAME,
        (void *) name
    );
    rc |= slapi_pblock_set(            /* Encode password     */
        pb,
        SLAPI_PLUGIN_PWD_STORAGE_SCHEME_ENC_FN,
        (void *) xorenc
    );
    rc |= slapi_pblock_set(            /* Compare password    */
        pb,
        SLAPI_PLUGIN_PWD_STORAGE_SCHEME_CMP_FN,
        (void *) xorcmp
    );
    rc |= slapi_pblock_set(            /* Never decode pwd    */
        pb,
        SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DEC_FN,
        NULL
    );
    return rc;
}

11.2.4 パスワード記憶スキーム・プラグインの設定

まだ実行していない場合は、ディレクトリ・インスタンスを設定してプラグインを構築します。

11.2.4.1 プラグインを登録するには

実行済でない場合には、サンプルのプラグイン・ライブラリを作成し、プラグイン情報のロギングとサンプル・プラグインの両方をアクティブ化します。

  1. プラグインを構築します。

    ヒント: install-path/examples/Makefileまたはinstall-path/examples/Makefile64を使用します。

  2. プラグイン情報メッセージがログに記録されるようにDirectory Serverを構成し、プラグインをロードします。

     $ dsconf create-plugin -F custom-plugin-init-function -G custom-plugin-argument -H lib-path \
    -Y custom-plugin-type "Custom Plugin"
    $ dsconf enable-plugin "Custom Plugin"
    

    ヒント: 詳細は、プラグインのソース・ファイルに指定されたコマンドを使用して参照してください。

  3. Directory Serverを再起動します。

    $ dsadm restart instance-path
    

11.2.5 パスワード記憶スキーム・サンプルの試行

この項では、この章のサンプル・プラグインについて説明します。

11.2.5.1 クイック・テストの実行

まだ実行していない場合は、XORパスワード記憶スキームをDirectory Serverに接続します。

他のことを実行する前に、Directory Serverが期待どおりにプラグイン・エンコード関数をコールしていることを簡単にチェックします。このクイック・テストを実行するには、pwdhashツールを使用します。pwdhashツールによって、Directory Serverはパスワードをエンコードし、その結果を表示します。

例11-4 パスワード記憶スキームのテスト

$ pwdhash -D /local/ds -s XOR password
{XOR}ZKYY]EXN

結果として生じるエンコードされたパスワードの正確な値は気にしないでください。ただし、出力は{XOR}で始まる必要があります。

Directory Serverは動的にエンコード関数をコールするため、プラグイン・ライブラリを修正できます。Directory Serverに対して何も実行せずに、pwdhashを試行します。このクイック・テストが機能しない場合は、サンプルを修正します。

11.2.5.1.1 XORスキームを使用してパスワードをエンコードするには

ここでは、XORスキームを使用して、Barbara Jensenの新しいパスワードをエンコードします。

  1. サフィックスのパスワード記憶スキームをXORに変更します。

    $ dsconf set-server-prop -h localhost -p 1389 pwd-storage-scheme:XOR
    
  2. Barbaraのパスワードをpasswordに変更します。

  3. Barbaraの新しくエンコードされたパスワードを表示します。

    $ ldapsearch -h localhost -p 1389 -b dc=example,dc=com uid=bjensen
    version: 1
    dn: uid=bjensen, ou=People, dc=example,dc=com
    cn: Barbara Jensen
    cn: Babs Jensen
    sn: Jensen
    givenName: Barbara
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    ou: Product Development
    ou: People
    l: Cupertino
    uid: bjensen
    mail: bjensen@example.com
    telephoneNumber: +1 408 555 1862
    facsimileTelephoneNumber: +1 408 555 1992
    roomNumber: 0209
    userPassword: {XOR}ZKYY]EXN
    

    BarbaraのパスワードはXORエンコードされていることに注意してください。

11.2.5.2 XORエンコードされたパスワードの比較

Barbaraには、dc=example,dc=comの下の他のエントリを検索する権限があります。ここでは、bjensenとしてKirsten Vaughanのエントリを検索します。

例11-5 新しいパスワードを使用したバインド

$ ldapsearch -h localhost -p 1389 -b dc=example,dc=com
 -D uid=bjensen,ou=People,dc=example,dc=com -w password uid=kvaughan
version: 1
dn: uid=kvaughan, ou=People, dc=example,dc=com
cn: Kirsten Vaughan
sn: Vaughan
givenName: Kirsten
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
ou: Human Resources
ou: People
l: Sunnyvale
uid: kvaughan
mail: kvaughan@example.com
telephoneNumber: +1 408 555 5625
facsimileTelephoneNumber: +1 408 555 3372
roomNumber: 2871

Directory Serverはプラグインを使用して、バインド中にBarbaraのパスワードをチェックします。このように、BarbaraのパスワードはXORエンコードされたことがわかっているため、Directory ServerはXORプラグインを使用している必要があります。すべてのプロセスが実行中と思われる場合は、比較関数も機能していると結論付けることができます。