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

前
 
次
 

12 パスワード品質チェック・プラグインの作成

Directory Serverは、構成可能なパスワード品質チェック・プラグインを提供しています。プラグインによって、ユーザーが一般的な英語言語の辞書攻撃を受けやすい値にパスワードを変更しないようにすることができます。しかし、パスワード品質チェックをさらに拡張することを決定する場合もあります。この章では、パスワードを変更するときにパスワード品質をチェックするカスタム・プラグインの作成方法について説明します。

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

12.1 Directory Serverがパスワード品質チェック・プラグインを使用する仕組み

この項では、Directory Serverのパスワード・ポリシー構成がどのようにパスワード品質チェックに影響するのかを説明します。また、作成するパスワード品質チェック・プラグインに対するDirectory Serverの実行要件についても説明します。

12.1.1 パスワード品質をチェックするパスワード・ポリシー

パスワード・ポリシーには、品質基準を満たさないパスワードを拒否するという側面があります。ユーザーがパスワード値を送信すると、その値はuserPassword属性のエントリに格納されます。パスワード値が推測または検出されにくいものであるかをサーバーで確認したい場合があります。また、サーバーで、弱いパスワードが受け入れられたときに警告を記録したり、弱いパスワードを拒否するようにしたい場合があります。パスワード・ポリシーを設定する際には、何を実行するかを決定します。

サーバーがパスワード品質をどの程度までチェックするかを制御するパスワード・ポリシー・エントリ属性は、pwdCheckQualityです。この属性がパスワード品質をチェックするよう設定されている場合、サーバーはそのためのプラグインをコールできます。この章では、パスワード品質をチェックするプラグインの作成方法について説明します。

パスワード・ポリシー構成の詳細は、『Oracle Directory Server Enterprise Edition管理者ガイド』の第7章「Directory Serverのパスワード・ポリシー」を参照してください。

12.1.2 パスワード・チェック・プラグインを実装するかどうか

Directory Serverとともに提供される強固なパスワード・チェック・プラグインを使用してパスワード・ポリシー要件を達成できる場合は、独自のプラグインを作成しないでください。

Directory Serverとともに提供される強固なパスワード・チェック・プラグインは、デプロイメント用に構成でき、重要と思われるパスワード品質の側面をチェックします。次の項目を設定できます。

  • パスワード値に必要な小文字、大文字、数値および特殊文字の数

    特別な構成設定によって、文字の混在を強制することもできます。

  • 辞書ファイルから読み取られる、禁止文字列がないこと

    提供されているデフォルトの英語言語ファイルを使用できます。または、独自のファイルを追加したり、それで置き換えることができます。

これらの構成設定は、その他のチェックに加えて行われるものです。そのようなチェックでは、パスワード長、パスワードがエントリの共通属性に一致しているかどうかなどが制御されます。

多くの場合は、独自のパスワード・チェック・プラグインを作成しなくても済みます。

12.1.3 パスワード・チェック・プラグインが実行する必要があること

独自のパスワード・チェック・プラグインを実装することを決定した場合、タイプを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が設定されている場合、サーバーはそのユーザーによる変更を許可します。

この章で使用される単純なケースでは、作業は最小限です。ただし実際には、特に独自の辞書チェックを実装する場合は、作業が膨大になることがあります。独自の辞書チェックを実装する場合は、プラグインが大きなファイルから辞書コンテンツをキャッシュすることがあります。この場合、プラグイン初期化の一部ではなく、プラグイン開始関数の一部として辞書をロードします。キャッシュの構成中は、サーバーの起動を阻止しないようにします。

12.2 カスタム・パスワード品質チェック・プラグインの作成

この項では、単純なパスワード品質チェックを実行するプラグインの作成方法について説明します。

この章では、コードのみを示します。完全なサンプル・コードは、Directory Serverをインストールしたinstall-path/examples/pwdcheck.cにあります。

12.2.1 パスワード値のチェック

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がパスワードを拒否します。

12.2.2 パスワード・チェック・プラグインの初期化

パスワード・チェック・プラグインは、初期化中にパスワード・チェック関数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;
}

大きなファイルから辞書コンテンツをキャッシュする独自の辞書チェックを実装できます。この場合、プラグイン初期化の一部ではなく、プラグイン開始関数の一部として辞書をロードします。キャッシュの構成中は、サーバーの起動を阻止しないようにします。

12.2.3 パスワード・チェック・プラグインのテスト

Directory Serverとともに提供されるサンプル・データを使用してプラグインをテストします。プラグインを設定および登録するには、コマンドライン・ツールを使用します。

12.2.3.1 サンプル・サフィックスを設定するには

実行済でない場合には、サフィックスdc=example,dc=comを使用して、サンプルのLDIFファイルinstall-path/resources/ldif/Example.ldifからロードされたデータを含むディレクトリ・インスタンスを設定します。

  1. 新規Directory Serverインスタンスを作成します。

    次に例を示します。

    $ dsadm create -h localhost -p 1389 /local/ds
    Choose the Directory Manager password:
    Confirm the Directory Manager password:
    $ 
    
  2. 新規Directory Serverインスタンスを開始します。

    次に例を示します。

    $ dsadm start /local/ds
    Server started: pid=4705
    $ 
    
  3. サフィックス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
    $ 
    
  4. サンプル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を使用して、このタスクを実行できます。

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

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

  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
    

12.2.3.3 パスワード・チェック・プラグインを使用するには

開始する前に

サフィックスdc=example,dc=comをサンプル・データに移入します。また、プラグインをDirectory Serverに登録します。

  1. Directory Serverがパスワード・チェック・プラグインをコールするように、パスワード品質チェックを実施します。

    $ dsconf set-server-prop -h localhost -p 1389 \
     pwd-check-enabled:on pwd-strong-check-enabled:off
    
  2. 情報メッセージのロギングを有効にします。

    $ dsconf set-log-prop -h localhost -p 1389 error level:err-plugins
    
  3. パスワード品質チェックをテストするエントリを準備します。

    $ 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
    
  4. ディレクトリにエントリを追加します。

    $ 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
    
  5. その他の情報について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
    

    示されているログ・メッセージの例は、読みやすいようにこの文書の印刷版に含まれています。