Oracle® Fusion Middleware Oracle Directory Server Enterprise Edition開発者ガイド 11g リリース1 (11.1.1.7.0) B72440-01 |
|
前 |
次 |
Directory Serverは、構成可能なパスワード品質チェック・プラグインを提供しています。プラグインによって、ユーザーが一般的な英語言語の辞書攻撃を受けやすい値にパスワードを変更しないようにすることができます。しかし、パスワード品質チェックをさらに拡張することを決定する場合もあります。この章では、パスワードを変更するときにパスワード品質をチェックするカスタム・プラグインの作成方法について説明します。
この章の内容は、次のとおりです。
この項では、Directory Serverのパスワード・ポリシー構成がどのようにパスワード品質チェックに影響するのかを説明します。また、作成するパスワード品質チェック・プラグインに対するDirectory Serverの実行要件についても説明します。
パスワード・ポリシーには、品質基準を満たさないパスワードを拒否するという側面があります。ユーザーがパスワード値を送信すると、その値はuserPassword属性のエントリに格納されます。パスワード値が推測または検出されにくいものであるかをサーバーで確認したい場合があります。また、サーバーで、弱いパスワードが受け入れられたときに警告を記録したり、弱いパスワードを拒否するようにしたい場合があります。パスワード・ポリシーを設定する際には、何を実行するかを決定します。
サーバーがパスワード品質をどの程度までチェックするかを制御するパスワード・ポリシー・エントリ属性は、pwdCheckQualityです。この属性がパスワード品質をチェックするよう設定されている場合、サーバーはそのためのプラグインをコールできます。この章では、パスワード品質をチェックするプラグインの作成方法について説明します。
パスワード・ポリシー構成の詳細は、『Oracle Directory Server Enterprise Edition管理者ガイド』の第7章「Directory Serverのパスワード・ポリシー」を参照してください。
Directory Serverとともに提供される強固なパスワード・チェック・プラグインを使用してパスワード・ポリシー要件を達成できる場合は、独自のプラグインを作成しないでください。
Directory Serverとともに提供される強固なパスワード・チェック・プラグインは、デプロイメント用に構成でき、重要と思われるパスワード品質の側面をチェックします。次の項目を設定できます。
パスワード値に必要な小文字、大文字、数値および特殊文字の数
特別な構成設定によって、文字の混在を強制することもできます。
辞書ファイルから読み取られる、禁止文字列がないこと
提供されているデフォルトの英語言語ファイルを使用できます。または、独自のファイルを追加したり、それで置き換えることができます。
これらの構成設定は、その他のチェックに加えて行われるものです。そのようなチェックでは、パスワード長、パスワードがエントリの共通属性に一致しているかどうかなどが制御されます。
多くの場合は、独自のパスワード・チェック・プラグインを作成しなくても済みます。
独自のパスワード・チェック・プラグインを実装することを決定した場合、タイプをpasswordcheck
にする必要があります。プラグインは、少なくとも、パスワード・チェック関数SLAPI_PLUGIN_PASSWDCHECK_FN
を実装する必要があります。この関数は、パラメータ・ブロック配列SLAPI_PASSWDCHECK_VALS
に指定されたすべてのパスワードが品質チェックを満たしていることを確認します。SLAPI_PASSWDCHECK_VALS
には、2つ以上のパスワード値が含まれることがあります。
チェックするパスワード値に応じて、関数は次の値を戻す必要があります。
-1
品質チェックの失敗以外の理由で、クライアント・アプリケーションに失敗結果を送信する必要がある場合はこの値を戻します。たとえば、サーバーが大きな辞書ファイルのロードによりビジー状態の場合にこの値を戻すことができます。この場合、サーバーは、パスワード品質チェックの準備が整っていません。
この値を戻すと、サーバーは進行中の追加または変更操作を中止します。
0
SLAPI_PASSWDCHECK_VALS
のすべてのパスワードがパスワード品質チェックを満たす場合は、この値を戻します。
>0
SLAPI_PASSWDCHECK_VALS
の少なくとも1つのパスワードがパスワード品質チェックに失敗した場合は、正の整数を戻します。
正の整数を戻す場合、slapi_pblock_set ()
を使用してパラメータ・ブロックのSLAPI_RESULT_TEXT
を介してエラー・メッセージを渡します。slapi_ch_malloc()
を使用してメッセージ用の領域を割り当てます。メッセージに割り当てられたメモリーの解放はサーバーによって行われます。
メッセージ文字列は、ここで示すとおり、invalid password syntax:
で始める必要があります。
サーバーは、クライアント・アプリケーションにLDAP_CONSTRAINT_VIOLATION
の結果、19を送信します。ただし、ディレクトリ・ルートDNユーザーを含むパスワード管理者がパスワード・ポリシー・チェックに関係なくパスワードを変更できるようにpasswordRootdnMayBypassModsChecksが設定されている場合、サーバーはそのユーザーによる変更を許可します。
この章で使用される単純なケースでは、作業は最小限です。ただし実際には、特に独自の辞書チェックを実装する場合は、作業が膨大になることがあります。独自の辞書チェックを実装する場合は、プラグインが大きなファイルから辞書コンテンツをキャッシュすることがあります。この場合、プラグイン初期化の一部ではなく、プラグイン開始関数の一部として辞書をロードします。キャッシュの構成中は、サーバーの起動を阻止しないようにします。
この項では、単純なパスワード品質チェックを実行するプラグインの作成方法について説明します。
この章では、コードのみを示します。完全なサンプル・コードは、Directory Serverをインストールしたinstall-path
/examples/pwdcheck.c
にあります。
Directory ServerがuserPassword
値を追加または変更するリクエストを受け取ると、サーバーは登録されたpasswordcheck
プラグインをコールします。サーバーは、パラメータ・ブロックの一連のSlapi_Value
構造体として1つ以上の値を渡します。slapi_pblock_get ()
を使用してこれらの値を取得できます。
#include "slapi-plugin.h" static int check_pwd(Slapi_PBlock * pb) { Slapi_Value ** pwdvals = NULL; slapi_pblock_get(pb, SLAPI_PASSWDCHECK_VALS, &pwdvals;); }
パスワード値が受入れ可能なら、コードはゼロ(0
)を戻す必要があります。パスワード値が受け入れられないときは、コードはゼロ以外を戻す必要があります。この単純なケースでは、不正なパスワード値がsecret12
と等しい値のみであるため、コードは迅速なstrcmp
になります。
#include "slapi-plugin.h" /* Reject password values equal to secret12. */ static int check_pwd(Slapi_PBlock * pb) { Slapi_Value ** pwdvals = NULL; … /* Do not check values if none exist. */ if (pwdvals == NULL) return 0; for (i=0 ; pwdvals[i] != NULL; i++) { const char * password = slapi_value_get_string(pwdvals[i]); if (strcmp("secret12", password) == 0) { slapi_pblock_set(pb, SLAPI_RESULT_TEXT, slapi_ch_strdup("invalid password syntax: Bad password!")); return 1; } } return 0; }
これで、値がsecret12
の場合のみ、コードによってDirectory Serverがパスワードを拒否します。
パスワード・チェック・プラグインは、初期化中にパスワード・チェック関数SLAPI_PLUGIN_PASSWDCHECK_FN
をサーバーに登録します。
#include "slapi-plugin.h" int pwdcheck_init(Slapi_PBlock * pb) { int rc = 0; rc |= slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION, SLAPI_PLUGIN_CURRENT_VERSION ); rc |= slapi_pblock_set( pb, SLAPI_PLUGIN_DESCRIPTION, (void *) &pwd_desc; /* See the code for pwd_desc. */ ); rc |= slapi_pblock_set( pb, SLAPI_PLUGIN_PASSWDCHECK_FN, (void *) check_pwd ); return rc; }
大きなファイルから辞書コンテンツをキャッシュする独自の辞書チェックを実装できます。この場合、プラグイン初期化の一部ではなく、プラグイン開始関数の一部として辞書をロードします。キャッシュの構成中は、サーバーの起動を阻止しないようにします。
Directory Serverとともに提供されるサンプル・データを使用してプラグインをテストします。プラグインを設定および登録するには、コマンドライン・ツールを使用します。
実行済でない場合には、サフィックスdc=example,dc=com
を使用して、サンプルのLDIFファイルinstall-path
/resources/ldif/Example.ldif
からロードされたデータを含むディレクトリ・インスタンスを設定します。
新規Directory Serverインスタンスを作成します。
次に例を示します。
$ dsadm create -h localhost -p 1389 /local/ds Choose the Directory Manager password: Confirm the Directory Manager password: $
新規Directory Serverインスタンスを開始します。
次に例を示します。
$ dsadm start /local/ds Server started: pid=4705 $
サフィックスdc=example,dc=com
を作成します。
たとえば、長い行は印刷ページに合わせて折り返します。
$ dsconf create-suffix -h localhost -p 1389 dc=example,dc=com Enter "cn=directory manager" password: Certificate "CN=defaultCert, CN=hostname:1636" presented by the server is not trusted. Type "Y" to accept, "y" to accept just once, "n" to refuse, "d" for more details: Y $
サンプルLDIFをロードします。
たとえば、長い行は印刷ページに合わせて折り返します。
$ dsconf import -h localhost -p 1389 \ install-path/resources/ldif/Example.ldif dc=example,dc=com Enter "cn=directory manager" password: New data will override existing data of the suffix "dc=example,dc=com". Initialization will have to be performed on replicated suffixes. Do you want to continue [y/n] ? y ## Index buffering enabled with bucket size 16 ## Beginning import job... ## Processing file "install-path/resources/ldif/Example.ldif" ## Finished scanning file "install-path/resources/ldif/Example.ldif" (160 entries) ## Workers finished; cleaning up... ## Workers cleaned up. ## Cleaning up producer thread... ## Indexing complete. ## Starting numsubordinates attribute generation. This may take a while, please wait for further activity reports. ## Numsubordinates attribute generation complete. Flushing caches... ## Closing files... ## Import complete. Processed 160 entries in 5 seconds. (32.00 entries/sec) Task completed (slapd exit code: 0). $
関連項目
Directory Service Control Centerを使用して、このタスクを実行できます。
実行済でない場合には、サンプルのプラグイン・ライブラリを作成し、プラグイン情報のロギングとサンプル・プラグインの両方をアクティブ化します。
プラグインを構築します。
ヒント: 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
開始する前に
サフィックスdc=example,dc=com
をサンプル・データに移入します。また、プラグインをDirectory Serverに登録します。
Directory Serverがパスワード・チェック・プラグインをコールするように、パスワード品質チェックを実施します。
$ dsconf set-server-prop -h localhost -p 1389 \ pwd-check-enabled:on pwd-strong-check-enabled:off
情報メッセージのロギングを有効にします。
$ dsconf set-log-prop -h localhost -p 1389 error level:err-plugins
パスワード品質チェックをテストするエントリを準備します。
$ cat quentin.ldif
dn: uid=qcubbins,ou=People,dc=example,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
uid: qcubbins
givenName: Quentin
sn: Cubbins
cn: Quentin Cubbins
mail: quentin.cubbins@example.com
userPassword: secret12
ディレクトリにエントリを追加します。
$ ldapmodify -a -D uid=kvaughan,ou=people,dc=example,dc=com \ -w bribery -h localhost -p 1389 -f quentin.ldif adding new entry uid=qcubbins,ou=People,dc=example,dc=com ldap_add_s: Constraint violation
その他の情報についてerrors
ログをチェックします。
$ grep secret12 /local/ds/logs/errors [16/Feb/2006:18:13:06 +0100] - INFORMATION - Sample password check plug-in - conn=0 op=1 msgId=2 - Invalid password: secret12
示されているログ・メッセージの例は、読みやすいようにこの文書の印刷版に含まれています。