ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Directory Server Enterprise Editionリファレンス
11g リリース1 (11.1.1.7.0)
B72441-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

13 Directory ServerのDSMLv2

Directory ServerでのDSMLv2の詳細は、次の各項を参照してください。

13.1 DSMLの概要

Directory Services Markup Languageバージョン2 (DSMLv2)は、eXtensible Markup Language (XML)ドキュメントでのディレクトリ操作を記述するマークアップ言語です。DSMLv2標準の詳細は、Directory Services Markup Language (DSML) v2.0 [OASIS 200201] (http://www.oasis-open.org/specs)を参照してください。

DSMLv2の完全な仕様およびサポート・ドキュメントは次の場所にあります。

Directory ServerではDSMLv2 SOAP over HTTPバインディングがサポートされています。DSMLリクエストおよびレスポンスはSOAP v1.1の本文に埋め込まれ、HTTP/1.1ペイロードで転送されます。

Directory Serverリソース・キットにはDSMLv2を使用してディレクトリを検索および変更するツールが含まれています。「dsmlsearch」および「dsmlmodify」を参照してください。

DSMLを使用することにより、LDAPクライアント以外のクライアントがディレクトリ操作を実行できます。次の図は、DSMLを有効にしたディレクトリ・サーバーで非LDAPクライアントがデータを変更するリクエストを出すデプロイメント例を示しています。

図13-1 DSML有効化ディレクトリのデプロイメント例

図13-1の説明が続きます
「図13-1 DSML有効化ディレクトリのデプロイメント例」の説明

このデプロイメント例で、非LDAPクライアント・アプリケーションから到着したDSML形式の更新リクエストは、HTTPポート80を介してファイアウォールを通過します。Webプロキシ・サーバーはポート443経由のセキュアなHTTPの使用を強制し、リクエストは2番目のファイアウォールを通過してイントラネット・ドメインに入ります。リクエストはDSMLに対応していないコンシューマCおよびDにレプリケートされる前に、2つのマスター・レプリカによってMaster AおよびMaster Bで処理されます。

13.2 DSMLv2標準の実装

Directory ServerでのDSMLv2仕様の実装には次の制限があります。

バインディング

DSMLv2は2つの標準バインディング、SOAPリクエスト/レスポンス・バインディング、およびLDIFのDSMLv2版として機能するファイル・バインディングを定義します。Directory ServerではSOAPリクエスト/レスポンス・バインディングがサポートされています。

DNの変更

Directory ServerではDSML modDNRequest操作およびmodDNResponse操作がサポートされています。

廃棄リクエスト

abandonRequest操作は、HTTPでは役立たないため、Directory Serverではサポートされていません。

検索操作

一部のDSMLクライアントは、所在の一致が意図されている場合に、値*を使用した等価一致を誤って送信します。Directory Serverは、こうした誤った書式の問合せからゼロの結果を返します。アクセス・ログで文字=\2aを検索することにより、こうした誤ったクライアントを検出できます。

13.3 DSMLのセキュリティ

DSMLフロント・エンドは制限付きのHTTPサーバーを構築します。サーバーはDSMLポスト操作のみを受け入れ、DSMLv2 SOAPバインディング仕様に準拠しないリクエストを拒否します。

DSMLのセキュリティは、次のサーバー・プロパティ、dsml-client-auth-modedsml-portdsml-secure-portおよびdsml-relative-root-urlにより構成されます。これらのプロパティの詳細は、「server」を参照してください。

追加セキュリティについては、次の事項を検討してください。

13.4 DSMLアイデンティティ・マッピング

アイデンティティ・マッピングは次のメカニズムで必要です: DSML over HTTP、DIGEST-MD5およびGSSAPI SASLアイデンティティ・マッピングは、クライアントにより指定されるプロトコル固有の資格証明に基づき、バインドDNを判別するために使用されます。

アイデンティティ・マッピングではcn=identity mapping, cn=config構成ブランチのエントリを使用します。このブランチには、アイデンティティ・マッピングを実行するプロトコル用に次のコンテナが含まれています。

cn=HTTP-BASIC, cn=identity mapping, cn=config

DSML-over-HTTP接続のためのマッピングが含まれています。

cn=DIGEST-MD5, cn=identity mapping, cn=config

DIGEST-MD5 SASLメカニズムを使用したクライアント認証用のマッピングが含まれています。

cn=GSSAPI, cn=identity mapping, cn=config

GSSAPI SASLメカニズムを使用したクライアント認証用のマッピングが含まれるように作成する必要があります。

マッピング・エントリは、検索操作で使用するための、プロトコルに関する資格証明を抽出する方法を定義します。検索でユーザー・エントリが1つ返された場合、マッピングは成功しており、接続ではすべての操作のバインドDNとしてこのマッピング・エントリが使用されます。検索でゼロが返された場合、または複数のエントリが返された場合は、マッピングは失敗し、接続はマッピング・エントリをバインドDNとして使用しません。

アイデンティティ・マッピングを実行するプロトコルにはデフォルト・マッピングが含まれている必要があります。さらに、プロトコルには任意の数のカスタム・マッピングが含まれている場合があります。デフォルト・マッピングにはcn=defaultというRDNが含まれ、カスタム・マッピングにはネーミング属性としてcnを使用する、その他のRDNが含まれる場合があります。最初に、いずれかのカスタム・マッピングが成功するまで、すべてのカスタム・マッピングが順不同で評価されます。すべてのカスタム・マッピングが失敗した場合、デフォルト・マッピングが適用されます。デフォルト・マッピングが失敗すると、そのクライアントの認証は失敗します。

マッピング・エントリにはオブジェクト・クラスtopcontainerおよびdsIdentityMappingが含まれている必要があります。

エントリには次の属性を含めることができます。

dsMappedDN: DN

ディレクトリ内のDNを定義するリテラル文字列。マッピングの実行時にこのDNが存在する場合、このDNはバインディングに使用されます。このDNが存在しない場合は、検索を実行するために次の属性を定義することもできます。

dsSearchBaseDN: DN

検索のベースDN。これを省略した場合、マッピングではディレクトリ・ツリー全体で、すべてのルートサフィックスが検索されます(cn=configcn=monitorおよびcn=schema以外のすべてのネーミング・コンテキストを含む)。

dsSearchScope: base|one|sub

検索の適用範囲。検索ベース、ベースの1つ下の子レベル、またはベースの下にあるサブツリー全体を指定できます。この属性を省略した場合、マッピング検索のデフォルトの範囲はサブツリー全体です。

dsSearchFilter: filterString

マッピング検索を実行するためのフィルタ文字列。LDAP検索フィルタはRFC 4515 (http://www.ietf.org/rfc/rfc4515.txt)に定義されています。

さらに、マッピング・エントリには、次の属性を使用できるdsPatternMatchingオブジェクト・クラスを含めることもできます。

dsMatching-pattern: patternString

パターン一致が実行される文字列。

dsMatching-regexp: regularExpression

パターン文字列に適用する正規表現。

dsSearchScopeを除く、上記の属性値にはすべて、${keyword}という形式のプレースホルダを含めることができます(keywordはプロトコル固有の資格証明の要素名)。マッピング時に、プレースホルダはクライアントにより指定される、要素の実際の値で置き換えられます。

プレースホルダの置換がすべて終了すると、パターン一致が実行されます。一致するパターンは、次のように正規表現と比較されます。

たとえば、次のマッピングをSASL用に定義できます。

dsMatching-pattern: ${Principal}
dsMatching-regexp: (.*)@(.*)\\.(.*)
dsMappedDN: uid=$1,ou=people,dc=$2,dc=$3

クライアントがbjensen@example.comというプリンシパルを使用して認証を行う場合、このマッピングはバインドDN uid=bjensen,ou=people,dc=example,dc=comを定義します。このDNがディレクトリに存在する場合、マッピングは成功し、クライアントが認証されます。そしてこの接続で実行されるすべての操作には、このバインドDNが使用されます。

dsMatching-patternは、POSIX regexec(3C)およびregcomp(3C)関数コールを使用して、dsMatching-regexpと比較されます。Directory Serverでは拡張正規表現が使用され、すべての比較では大文字小文字が区別されません。詳細は、これらの関数のmanページを参照してください。

プレースホルダが含まれる可能性がある属性値では、プレースホルダが使用されない場合でも、プレースホルダ部分以外に${および}の文字がある場合、それらの文字をエンコードする必要があります。これらの文字は次の値にエンコードする必要があります。$\\24に、{\\7Bに、そして}\\7Dにエンコードします。

プレースホルダと置換を使用することにより、ユーザーはプロコル固有の資格証明からユーザー名やその他の値を抽出するマッピングを作成できます。資格証明を使用してマップ先DNを定義したり、ディレクトリ内の任意の場所にある対応するDNの検索を実行できます。


注意:

作成するマッピングの定義が不十分だとセキュリティ・ホールが生じます。たとえば、パターン一致を実行しないでハード・コーディングしたDNへのマッピングは常に成功しますが、その場合、ディレクトリ・ユーザーではない可能性があるクライアントを認証してしまいます。様々な形式のクライアント資格証明を処理するには、1つの非常に汎用的で許容性の高いマッピングを作成するよりも、複数のマッピングを定義する方が安全です。クライアント接続は必ず、クライアント資格証明に従って特定のユーザーにマップするようにしてください。


13.5 HTTPヘッダーの内容

Directory ServerではHTTPポスト操作のみがサポートされています。次の例は、HTTPを介してDSMLリクエストをサーバーに送信するために必要な最小フィールドを示しています。

POST /dsml HTTP/1.1
content-length: 450
HOST: hostname
SOAPAction: ""
Content-Type: text/xml
Connection: close

Connectionフィールドはオプションです。HTTP 1.0では、このフィールドのデフォルト値は「close」です。ただし、HTTP 1.1では、デフォルト値は「keep-alive」です。したがって、HTTP 1.1を使用している場合は、ダイアログを速く進めるために最後のリクエストでこのフィールドに「close」の値を入れることを推奨します。

追加のフィールドがHTTPヘッダーに含まれる場合があります。これらがDirectory Serverでサポートされている場合、その値はデフォルトに優先します。それらのフィールドがサポートされていない場合、リクエストがサーバーにより拒否されることはありませんが、フィールドは無視されます。

13.6 DSMLv2使用によるディレクトリへのアクセス

次の例は、DSMLリクエストを使用してディレクトリにアクセスし、検索する方法を示しています。

これらの例のcontent-length:ヘッダーにはDSMLv2リクエストの正確な長さが含まれています。これらの例が正常に機能するためには、このコンテンツ長を守るエディタを使用するか、または必要に応じてコンテンツ長を変更する必要があります。

13.6.1 空の匿名DSML Pingリクエスト

DSMLフロント・エンドはデフォルトで無効になっています。これを有効化する方法については、『Oracle Directory Server Enterprise Edition管理者ガイド』DSMLの構成に関する説明を参照してください。DSMLフロント・エンドが有効かどうかをチェックするには、例13-1に示すように、空のDSMLバッチ・リクエストを送信します。

例13-1 空の匿名DSMLリクエスト

POST /dsml HTTP/1.1
 content-length: 451
 HOST: hostname
 SOAPAction: ""
 Content-Type: text/xml
Connection: close
<?xml version='1.0' encoding='UTF-8'?\>
 <soap-env:Envelope
    xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'\>
   <soap-env:Body\>
       <batchRequest
           xmlns='urn:oasis:names:tc:DSML:2:0:core'           requestID='Ping!'\>
           <!-- empty batch request --\>
      </batchRequest\>
    </soap-env:Body\>
 </soap-env:Envelope\>

このDSMLリクエストの最初のセクションにはHTTPメソッド行POST /dsml HTTP/1.1が含まれ、これに複数のHTTPヘッダーが続きます。HTTPメソッド行は、HTTPメソッド・リクエストおよびDSMLフロント・エンドが使用するURLを指定します。POSTは、DSMLフロント・エンドが受け入れる唯一のHTTPメソッド・リクエストです。/dsml URLはDirectory ServerのデフォルトのURLですが、その他の任意の有効なURLを設定できます。これ以降のHTTPヘッダーで、DSMLリクエストの残りの詳細を指定します。

  • content-length: 451は、SOAP/DSMLリクエストの正確な長さを指定します。

  • HOST: hostnameは、接続するホストDirectory Serverの名前を指定します。

  • SOAPAction:は、必須であり、HTTP/SOAPスタックでDSMLリクエストを実行することをディレクトリに通知します。ただし、これは空のままにすることができます。

  • Content-Type: text/xmlは、コンテンツがXMLであることを定義する、text/xmlの値を持つ必要があります。

  • Connection: closeは、リクエストが満たされた場合に接続が閉じることを指定します。HTTP/1.1のデフォルトの動作では、接続は開いたまま維持されます。

    リクエストの残りの部分はSOAP/DSMLセクションです。DSMLリクエストはXMLプロローグ・ヘッダーで始まります。

    <?xml version='1.0' encoding='UTF-8'?\>
    

    これで、リクエストはUTF-8文字セットでエンコードされる必要があることを指定します。このヘッダーの後にSOAPエンベロープおよび、必須のXMLスキーマ、XMLスキーマ・インスタンス、そしてSOAPネームスペースが含まれる本文要素が続きます。

    DSMLバッチ・リクエスト要素はDSMLバッチ・リクエストの開始を示し、その直後に必須のDSMLv2ネームスペースが続きます。

    xmlns='urn:oasis:names:tc:DSML:2:0:core'.
    

    オプションで、次のリクエストIDにより、このリクエストを識別します。

    requestID='Ping!'
    

    空のバッチ・リクエスト

    <!-- empty batch request --\>
    

    は、このようにXMLでコメントし、SOAP/DSMLバッチ・リクエストはバッチ・リクエスト終了、SOAP本文終了およびSOAPエンベロープ要素終了により閉じられます。

    DSMLフロント・エンドが有効な場合は、例13-2に示すように空のDSMLレスポンスが返されます。

例13-2 空の匿名DSMLレスポンス

HTTP/1.1 200 OK
Cache-control: no-cache
Connection: close
Date: Mon, 11 Dec 2006 13:56:49 GMT
Accept-Ranges: none
Server: Directory Server Enterprise Edition/11g Release 1 (11.1.1.6.0)
Content-Type: text/xml; charset="utf-8"
Content-Length: 500
<?xml version='1.0' encoding='UTF-8' ?\>
<soap-env:Envelope
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'
   \>
<soap-env:Body\>
<batchResponse
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns='urn:oasis:names:tc:DSML:2:0:core'
   requestID='Ping!'
   \>
</batchResponse\>
</soap-env:Body\>
</soap-env:Envelope\>

何も返されない場合、フロント・エンドは無効であると結論付けることができます。

ディレクトリに同時に接続できるクライアント数とDSMLリクエストのサイズには上限があります。クライアント数の制限は、dsml-max-parser-countおよびdsml-min-parser-countサーバー・プロパティで指定し、リクエストのサイズの制限はdsml-request-max-sizeサーバー・プロパティで指定します。「server」を参照してください。

13.6.2 特定のユーザーとしてバインドするDSMLリクエストの発行

DSMLリクエストを発行するために、指定されたユーザーとして、または匿名でディレクトリにバインドできます。指定されたユーザーとしてバインドするには、例13-3に示すように、DNにマップされるUIDとパスワードを含むHTTP認証ヘッダーがリクエストに含まれている必要があります。

例13-3 DSML拡張操作: 特定ユーザーとしてのバインド

POST /dsml HTTP/1.1
content-length: 578
content-Type: text/xml; charset="utf-8"
HOST: hostname
Authorization: Basic ZWFzdGVyOmVnZw==
SOAPAction: ""
Connection: close
<?xml version='1.0' encoding='UTF-8'?\>
<soap-env:Envelope
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'\>
   <soap-env:Body\>
     <batchRequest
        xmlns='urn:oasis:names:tc:DSML:2:0:core'\>
        <extendedRequest\>
          <requestName\>1.3.6.1.4.1.4203.1.11.3</requestName\>
        </extendedRequest\>
     </batchRequest\>
   </soap-env:Body\>
</soap-env:Envelope\>

この例で、HTTP認証ヘッダーはユーザーID easterおよびパスワードegg (クリア・テキストではeaster:eggと表示されます)を送信していますが、これはbase64でエンコードされてAuthorization: Basic ZWFzdGVyOmVnZw==となっています。

LDAP拡張操作を指定するために、<extendedRequest\>タグが使用されています。拡張操作のOIDを指定するために、<requestName\>タグが使用されています。この例では、OID 1.3.6.1.4.1.4203.1.11.3によりwhoami拡張操作が識別されます。

DSML拡張操作に対するレスポンスは、バインド・リクエストを発行したユーザーのDNを示します。例13-4では、DNが含まれたwhoamiレスポンスがレスポンス行に表示されています。

<response\>dn:uid=easter,ou=people,dc=example,dc=com</response\>

例13-4 DSML拡張操作に対するレスポンス

HTTP/1.1 200 OK
Cache-control: no-cache
Connection: close
Date: Fri, 15 Dec 2006 09:15:09 GMT
Accept-Ranges: none
Server: Directory Server Enterprise Edition/11g Release 1 (11.1.1.6.0)
Content-Type: text/xml; charset="utf-8"
Content-Length: 697

<?xml version='1.0' encoding='UTF-8' ?\>
<soap-env:Envelope
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'
   \>
<soap-env:Body\>
<batchResponse
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns='urn:oasis:names:tc:DSML:2:0:core'
   \>
   <extendedResponse\>
      <resultCode code='0' descr='success'/\>
   <responseName\>1.3.6.1.4.1.4203.1.11.3</responseName\>
   <response\>dn:uid=easter,ou=people,dc=example,dc=com</response\>
   </extendedResponse\>
</batchResponse\>
</soap-env:Body\>
</soap-env:Envelope\>

匿名アクセスではHTTP認証ヘッダーは不要です。ただし、匿名アクセスにはたいてい厳しいアクセス制御があり、また、場合によりデータへのアクセスも制限されます。同様に、LDAPプロキシによるLDAP操作を実行するためにDSMLリクエストを発行することができます。

DSMLリクエストはバッチ・ベースで管理されるため、LDAPプロキシによるリクエストを発行する場合は、必要なDSMLプロキシ認可リクエストを、所定のリクエスト・バッチの最初に指定する必要があります。

13.6.3 DSML検索リクエスト

例13-5は、ルートDSEエントリに対するDSMLベース・オブジェクト検索リクエストを示しています。

例13-5 DSML検索リクエスト

POST /dsml HTTP/1.1
HOST: hostname
Content-Length: 1081
Content-Type: text/xml
SOAPAction: ""
Connection: close
<?xml version='1.0' encoding='UTF-8'?\>
<soap-env:Envelope
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'
   \>
   <soap-env:Body\>
      <batchRequest
        xmlns='urn:oasis:names:tc:DSML:2:0:core'
        requestID='Batch of search requests'
        \>
        <searchRequest
            dn=""
            requestID="search on Root DSE"
            scope="baseObject"
            derefAliases="neverDerefAliases"
            typesOnly="false"
            \>
            <filter\>
               <present name="objectClass"/\>
            </filter\>
            <attributes\>
               <attribute name="namingContexts"/\>
               <attribute name="supportedLDAPversion"/\>
               <attribute name="vendorName"/\>
               <attribute name="vendorVersion"/\>
               <attribute name="supportedSASLMechanisms"/\>
            </attributes\>
        </searchRequest\>
      </batchRequest\>
   </soap-env:Body\>
</soap-env:Envelope\>
  • dn=""requestID="search on Root DSE"は、検索操作がルートDSEエントリ(空のDN)下のデータを要求し、オプションのリクエストID属性で識別されることを指定しています。

  • scope="baseObject"は、検索がベース・オブジェクト検索であることを指定しています。

  • derefAliases="neverDerefAliases"は、検索のベース・オブジェクトの検索中または探索中に、別名が間接参照されないことを指定しています。これはDirectory Serverでサポートされている唯一のderefAliases値です。

  • typesOnly="false"は、属性名とその値の両方が返されることを指定します。typesOnly="true"は、属性名だけが返されることを指定します。この属性のデフォルト値はfalseです。

    エントリがフィルタに一致するには、objectclassフィルタの存在を次のように使用する必要があります。

    <filter\>
       <present name="objectClass"/\>
    </filter\>
    

    これはLDAPのフィルタ文字列(objectclass=*)と同じ働きをします。フィルタの後に、使用する属性のリストが続きます。

    <attributes\>
       <attribute name="namingContexts"/\>
       <attribute name="supportedLDAPversion"/\>
       <attribute name="vendorName"/\>
       <attribute name="vendorVersion"/\>
       <attribute name="supportedSASLMechanisms"/\>
    </attributes\>
    

例13-6 DSML検索レスポンス

HTTP/1.1 200 OK
Cache-control: no-cache
Connection: close
Date: Fri, 15 Dec 2006 09:21:43 GMT
Accept-Ranges: none
Server: Directory Server Enterprise Edition/11g Release 1 (11.1.1.6.0)
Content-Type: text/xml; charset="utf-8"
Content-Length: 1287

<?xml version='1.0' encoding='UTF-8' ?\>
<soap-env:Envelope
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'
   \>
<soap-env:Body\>
<batchResponse
   xmlns:xsd='http://www.w3.org/2001/XMLSchema'
   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns='urn:oasis:names:tc:DSML:2:0:core'
   requestID='Batch of search requests'
   \>
   <searchResponse requestID='search on Root DSE'\>
   <searchResultEntry\>
      <attr name='namingContexts'\>
      <value\>dc=example,dc=com</value\>
      </attr\>
      <attr name='supportedLDAPVersion'\>
      <value\>2</value\>
      <value\>3</value\>
      </attr\>
      <attr name='vendorName'\>
      <value\>Sun Microsystems, Inc.</value\>
      </attr\>
      <attr name='vendorVersion'\>
      <value\>Directory Server Enterprise Edition/11g Release 1 (11.1.1.6.0)</value\>
      </attr\>
      <attr name='supportedSASLMechanisms'\>
      <value\>EXTERNAL</value\>
      <value\>GSSAPI</value\>
      <value\>DIGEST-MD5</value\>
      </attr\>
   </searchResultEntry\>
   <searchResultDone\>
      <resultCode code='0' descr='success'/\>
   </searchResultDone\>
   </searchResponse\>
</batchResponse\>
</soap-env:Body\>
</soap-env:Envelope\>