Oracle® Fusion Middleware Oracle Directory Server Enterprise Editionリファレンス 11g リリース1 (11.1.1.7.0) B72441-01 |
|
前 |
次 |
Directory ServerでのDSMLv2の詳細は、次の各項を参照してください。
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クライアントがデータを変更するリクエストを出すデプロイメント例を示しています。
このデプロイメント例で、非LDAPクライアント・アプリケーションから到着したDSML形式の更新リクエストは、HTTPポート80を介してファイアウォールを通過します。Webプロキシ・サーバーはポート443経由のセキュアなHTTPの使用を強制し、リクエストは2番目のファイアウォールを通過してイントラネット・ドメインに入ります。リクエストはDSMLに対応していないコンシューマCおよびDにレプリケートされる前に、2つのマスター・レプリカによってMaster AおよびMaster Bで処理されます。
Directory ServerでのDSMLv2仕様の実装には次の制限があります。
DSMLv2は2つの標準バインディング、SOAPリクエスト/レスポンス・バインディング、およびLDIFのDSMLv2版として機能するファイル・バインディングを定義します。Directory ServerではSOAPリクエスト/レスポンス・バインディングがサポートされています。
Directory ServerではDSML modDNRequest
操作およびmodDNResponse
操作がサポートされています。
abandonRequest
操作は、HTTPでは役立たないため、Directory Serverではサポートされていません。
一部のDSMLクライアントは、所在の一致が意図されている場合に、値*
を使用した等価一致を誤って送信します。Directory Serverは、こうした誤った書式の問合せからゼロの結果を返します。アクセス・ログで文字=\2a
を検索することにより、こうした誤ったクライアントを検出できます。
DSMLフロント・エンドは制限付きのHTTPサーバーを構築します。サーバーはDSMLポスト操作のみを受け入れ、DSMLv2 SOAPバインディング仕様に準拠しないリクエストを拒否します。
DSMLのセキュリティは、次のサーバー・プロパティ、dsml-client-auth-mode
、dsml-port
、dsml-secure-port
およびdsml-relative-root-url
により構成されます。これらのプロパティの詳細は、「server」を参照してください。
追加セキュリティについては、次の事項を検討してください。
ファイアウォールを実装することにより、DSML対応のディレクトリ・サーバーを保護します。
クライアントでHTTP over SSLを設定しない場合は、非武装地帯を実装します。
アイデンティティ・マッピングは次のメカニズムで必要です: 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が含まれる場合があります。最初に、いずれかのカスタム・マッピングが成功するまで、すべてのカスタム・マッピングが順不同で評価されます。すべてのカスタム・マッピングが失敗した場合、デフォルト・マッピングが適用されます。デフォルト・マッピングが失敗すると、そのクライアントの認証は失敗します。
マッピング・エントリにはオブジェクト・クラスtop
、container
およびdsIdentityMapping
が含まれている必要があります。
エントリには次の属性を含めることができます。
dsMappedDN:
DNディレクトリ内のDNを定義するリテラル文字列。マッピングの実行時にこのDNが存在する場合、このDNはバインディングに使用されます。このDNが存在しない場合は、検索を実行するために次の属性を定義することもできます。
dsSearchBaseDN:
DN検索のベースDN。これを省略した場合、マッピングではディレクトリ・ツリー全体で、すべてのルートサフィックスが検索されます(cn=config
、cn=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つの非常に汎用的で許容性の高いマッピングを作成するよりも、複数のマッピングを定義する方が安全です。クライアント接続は必ず、クライアント資格証明に従って特定のユーザーにマップするようにしてください。 |
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でサポートされている場合、その値はデフォルトに優先します。それらのフィールドがサポートされていない場合、リクエストがサーバーにより拒否されることはありませんが、フィールドは無視されます。
次の例は、DSMLリクエストを使用してディレクトリにアクセスし、検索する方法を示しています。
これらの例のcontent-length:
ヘッダーにはDSMLv2リクエストの正確な長さが含まれています。これらの例が正常に機能するためには、このコンテンツ長を守るエディタを使用するか、または必要に応じてコンテンツ長を変更する必要があります。
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」を参照してください。
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-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\>