Oracle® Fusion Middleware Oracle Directory Server Enterprise Edition開発者ガイド 11g リリース1 (11.1.1.7.0) B72440-01 |
|
![]() 前 |
![]() 次 |
この章では、Directory Serverがパスワード属性値を格納する仕組みを変更できるプラグインの作成方法について説明します。
この章の内容は、次のとおりです。
この項では、Directory Serverがパスワード記憶スキーム・プラグインをコールする状況について説明します。また、パスワード値がプラグインによってどのように処理されることが期待されているのかについても説明します。
pwdstoragescheme
とreverpwdstoragescheme
の2つのタイプのパスワード記憶スキーム・プラグインが、Directory Serverで機能します。pwdstoragescheme
タイプは、一方向です。サーバーがパスワードをエンコードおよび格納した後、パスワードはデコードされません。そのため、pwdstoragescheme
タイプには、格納されるパスワードをエンコードしたり、受信するパスワードをエンコードおよび格納されたパスワードと比較するためのプラグイン関数のみが含まれています。reverpwdstoragescheme
タイプは可逆であるため、プラグインによってDirectory Serverは値をエンコードおよびデコードできます。そのため、可逆のタイプには、エンコード、比較およびデコード・プラグイン関数が含まれます。
注意: この章では、一方向の 可逆のタイプは、内部使用のみです。 |
Directory Serverによって提供される既存のスキームは、パスワード記憶スキーム・プラグインとして提供されています。cn=config
で、DNにcn=Password Storage Schemes
が含まれるエントリを検索します。デフォルトのパスワード記憶スキームは、Salted Secure Hashing Algorithm (SSHA)を使用します。
ユーザー・パスワードのエンコードに使用されるパスワード記憶スキームを変更できます。詳細は、『Oracle Directory Server Enterprise Edition管理者ガイド』の第7章「Directory Serverのパスワード・ポリシー」を参照してください。
パスワード記憶スキーム・プラグイン関数は、userPassword
属性値に影響します。Directory Serverは、起動時にパスワード記憶スキーム・プラグインを登録します。起動後、登録されて有効になったパスワード記憶スキーム・プラグインを使用して、パスワード値をエンコードできます。また、プラグインを使用して、受信するパスワードとエンコードされた値を比較することもできます。Directory Serverがどのプラグインを起動するかは、該当のエントリに使用されているパスワード記憶スキームによって異なります。
追加および変更リクエストは、Directory Serverが入力パスワードをエンコードし、ディレクトリに格納することを示します。まず、Directory Serverは、パスワード値の記憶スキームを決定します。次に、適切なスキームのプラグイン・エンコード関数を呼び出します。エンコード関数は、エンコードされたパスワードをDirectory Serverに戻します。
バインド・リクエストは、Directory Serverが入力パスワード値と格納されたパスワード値を比較することを示します。追加および変更リクエストと同様に、Directory Serverは、パスワード値の記憶スキームを決定します。次に、サーバーは、適切なスキームのプラグイン比較関数を呼び出します。比較スキームは、「パスワードの比較」の説明に従って、2つのパスワードが一致するかどうかをDirectory Serverに伝えるint
を戻します。
パスワード記憶スキーム・プラグインは、通常、パスワードをエンコードし、入力パスワードを格納およびエンコードされたパスワードと比較するのみです。つまり、プラグインは、広範なパスワード・ポリシーの一部のみを表しています。セキュアなディレクトリ・サービスの設計に関する提案については、『Oracle Directory Server Enterprise Editionデプロイメント・プランニング・ガイド』を参照してください。
この項では、パスワードをエンコードするプラグインの作成方法について説明します。プラグインによって、Directory Serverは、格納されたパスワードとクライアント・アプリケーションによって提供されたパスワードを比較することもできます。
注意: この章の例では、セキュアなパスワード記憶スキームを構成しません。 |
この章で参照されるサンプル・プラグインのソースは、install-path
/examples/testpwdstore.c
にあります。エンコードと比較の場合、プラグインは、パスワードの各文字に対して42
との排他的or
を実行します。
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)」を参照してください。
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}
を考慮する必要はありません。
すべてのエンコーディング・アルゴリズムに、このような単純な比較関数があるわけではありません。
次の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; }
まだ実行していない場合は、ディレクトリ・インスタンスを設定してプラグインを構築します。
実行済でない場合には、サンプルのプラグイン・ライブラリを作成し、プラグイン情報のロギングとサンプル・プラグインの両方をアクティブ化します。
プラグインを構築します。
ヒント: install-path
/examples/Makefile
またはinstall-path
/examples/Makefile64
を使用します。
プラグイン情報メッセージがログに記録されるように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"
ヒント: 詳細は、プラグインのソース・ファイルに指定されたコマンドを使用して参照してください。
Directory Serverを再起動します。
$ dsadm restart instance-path
この項では、この章のサンプル・プラグインについて説明します。
まだ実行していない場合は、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
を試行します。このクイック・テストが機能しない場合は、サンプルを修正します。
ここでは、XORスキームを使用して、Barbara Jensenの新しいパスワードをエンコードします。
サフィックスのパスワード記憶スキームをXOR
に変更します。
$ dsconf set-server-prop -h localhost -p 1389 pwd-storage-scheme:XOR
Barbaraのパスワードをpassword
に変更します。
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エンコードされていることに注意してください。
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プラグインを使用している必要があります。すべてのプロセスが実行中と思われる場合は、比較関数も機能していると結論付けることができます。