この章は、ディレクトリ・サーバーのアクセス制御モデルに関する参照情報を含みます。ディレクトリ・サーバーでのアクセス制御の構成の詳細は、第22章「データへのアクセス制御」を参照してください。
この章では、次のトピックを取り扱います:
この項では、ディレクトリ・サーバーで提供されているアクセス制御メカニズムの原則について説明します。
第22.1項「dsconfig
を使用したグローバルACIの管理」も参照してください。
ディレクトリ·サーバーがリクエストを受信すると、バインド操作でユーザーが提供する認証情報、およびサーバーで定義されたアクセス制御命令(ACI)を使用して、ディレクトリ情報へのアクセスが許可または拒否されます。サーバーは、読取り、書込み、検索、比較などの権限を許可または拒否できます。ユーザーに付与される権限のレベルは、ユーザーが入力する認証情報によって異なります。
アクセス制御を利用すると、ディレクトリ全体、ディレクトリのサブツリー、ディレクトリ内の特定のエントリ(構成タスクを定義するエントリを含む)、エントリ属性の特定のセット、あるいは特定のエントリ属性値へのアクセスを制御できます。特定のユーザー、特定のグループまたはロールに属するすべてのユーザー、またはそのディレクトリのすべてのユーザーに対して権限を設定できます。さらに、(そのIPアドレスまたはDNS名で識別される)特定のクライアントのアクセス権を定義できます。
アクセス制御の方法はエントリの属性としてディレクトリに保存されます。aci
属性は操作属性で、エントリのオブジェクト・クラス用に定義されているかどうかにかかわらず、ディレクトリ内のすべてのエントリに使用できます。この属性は、ディレクトリ・サーバーがクライアントからLDAPリクエストを受け取るときに、どの権限が付与、または拒否されるかを評価するためにディレクトリ・サーバーに使用されます。明確にリクエストされている場合のみ、aci
属性はldapsearch
操作で戻されます。
ACI文は3つの主要部分を含みます:
権限が適用されるエントリまたは属性を決定します。
どの操作が許可または拒否されるかを定義します。
バインドDNに基づいて、ACIの対象を決定します。
ACIの権限とバインド・ルールの部分は、ペアで設定されます。これは、アクセス制御ルール(ACR)とも呼ばれています。ターゲットにアクセスするために指定される権限は、付随するルールがtrueと評価されるかどうかによって付与されるか拒否されるかが決定されます。詳細は、第8.2項「ACI構文」を参照してください。
ACIを含むエントリが子エントリを持たない場合は、ACIはそのエントリにのみ適用されます。エントリが子エントリを持つ場合は、ACIはそのエントリ自身およびその下位のすべてのエントリに適用されます。したがって、ディレクトリ・サーバーがエントリへのアクセス権を評価するときは、リクエストされたエントリとそのルート接尾辞のベースとの間のすべてのエントリのACIを検証します。
aci
属性は複数値です。つまり、同じエントリまたはサブツリーに対して、複数のACIを定義できます。
直接そのエントリではなく、その下のサブツリー内の一部またはすべてのエントリに適用されるACIを作成することができます。この利点は、ツリーで下位に位置する可能性の高いエントリに効果的に適用する一般的なACIを、ディレクトリ・ツリーの高いレベルに設定できることです。たとえば、organizationalUnit
エントリまたはlocality
エントリのレベルでは、inetorgperson
オブジェクト・クラスを含むエントリをターゲットとするACIを作成できます。
この機能を使用すると、高いレベルの分岐点で一般的なルールを設定することでディレクトリ・ツリー内のACIの数を最小にできます。より具体的なルールの範囲を制限するには、できるだけリーフ・エントリに近い位置にそのルールを設定します。
注意: ルートのDSEエントリ(DN |
アクセス制御ハンドラのプロパティを変更するdsconfig
を使用することによって、一元的にアクセス制御を構成することができます。
ルールではtarget
式が指定されないので、次のデフォルトのグローバルACIは、ディレクトリ・サーバーに定義されているすべての接尾辞に適用されます:
Property : Value(s) -----------:------------------------------------------------------------------- global-aci : "(targetattr!="userPassword||authPassword")(version 3.0; acl : "Anonymous read access"; allow (read,search,compare) : userdn="ldap:///anyone";)", (targetattr="*")(version 3.0; acl : "Self entry modification"; allow (write) userdn="ldap:///self";), : "(targetattr="createTimestamp||creatorsName||modifiersName||modify : Timestamp||entryDN||entryUUID||subschemaSubentry")(version 3.0; : acl "User-Visible Operational Attributes"; allow : (read,search,compare) userdn="ldap:///anyone";)",
詳細は、第22.1項「dsconfig
を使用したグローバルACIの管理」を参照してください。
特定のエントリへのアクセス権を評価するためには、サーバーはエントリ自身およびエントリのルート接尾辞のベースに戻る親エントリに存在するACIのリストをコンパイルします。評価中、サーバーはこの順番でACIを処理します。ACIは、エントリとそのルート接尾辞のベースの間のすべての接尾辞およびサブ接尾辞内で評価されます(他のサーバー上の連鎖接尾辞間では評価されません)。
注意: アクセス制御は |
デフォルトでは、ACIがエントリに適用されない場合、アクセスはbypass-acl
権限を持つユーザー以外のすべてのユーザーに拒否されます。ユーザーがディレクトリ内のエントリにアクセスするためには、ACIによってアクセス権が明示的に付与される必要があります。デフォルトACIは匿名の読取りアクセスを定義し、セキュリティのために必要な属性を除いて、ユーザーが自分のエントリを変更することができます。詳細は、第22.1.1項「デフォルトのグローバルACI」を参照してください。
ディレクトリ·サーバーは、最初にターゲット・エントリに最も近いACIを処理しますが、エントリに適用されるすべてのACIの影響は累積されます。他のACIが拒否しないかぎり、任意のACIによって付与されたアクセス権が許可されます。アクセスを拒否するACIは、リストのどこにそれが現れても、同じリソースにアクセスを許可するACIよりも優先されます。
たとえば、ディレクトリのルート・レベルで書込み権限を拒否すると、ユーザーに特定の権限を与えても、どのユーザーもディレクトリに書き込めなくなります。特定のユーザーにディレクトリへの書込み権限を付与するには、そのユーザーを除外するように書込み権限の元の拒否の有効範囲を制限する必要があります。
ディレクトリ・サービスにアクセス制御ポリシーを作成するときは、次の制限事項に注意してください:
ディレクトリ・ツリーが複数のディレクトリ・サーバー上に分散している場合、いくつかの制限はアクセス制御文で使用できるキーワードに適用されます。グループ・エントリ(groupdn
キーワード)に依存するACIは、グループ・エントリと同じディレクトリ・サーバー上に配置する必要があります。そのグループが動的である場合は、そのグループのすべてのメンバーはディレクトリ・サーバー上にエントリを持つ必要があります。グループが静的である場合は、メンバーのエントリはリモート・ディレクトリ・サーバー上に配置することができます。ただし、ターゲット·エントリに格納される値とバインド・ユーザーのエントリに格納される値のマッチングを行うことができます(たとえば、userattr
キーワードを使用)。ACIを保持するディレクトリ・サーバーにバインド・ユーザーがエントリを持っていなくても、アクセスは通常どおりに評価されます。
アクセス制御ルールは、常にローカル・ディレクトリ・サーバー上で評価されます。ACIキーワードで使用されるLDAP URLでは、ディレクトリ・サーバーのホスト名またはポート番号を指定することはできまん。指定する場合は、LDAP URLはまったく考慮されません。
ACIはエントリの属性として格納されます。したがって、ACIを含んでいるエントリがレプリケートされた接尾辞の一部である場合、ACIは他の属性のようにレプリケートされます。
ACIは多数の可能性のバリエーションを持つ複雑な構造です。次の項では、ACIの構文の詳細を説明します。
aci
属性には、次の構文があります:
aci: (target)(version 3.0;acl "name";permissionBindRules;)
ここで:
targetは、アクセス制御するエントリ、属性、またはエントリと属性のセットを指定します。targetには、識別名、1つ以上の属性、または単一のLDAPフィルタを指定できます。targetはオプションです。targetが指定されていない場合は、ACIは定義されているエントリとそのすべての子のエントリ全体に適用されます。
version 3.0
はACIバージョンを識別する必須の文字列です。
nameはACIの名前です。nameはACIを識別する任意の文字列です。ACI名は必須であり、ACIの影響を示す必要があります。名前に制約はありませんが、ACIには一意の名前を使用することをお薦めします。一意の名前を使用すると、実効権限取得制御によって、有効になっているACIを判別することができます。
permissionは、許可または拒否する権限(たとえば読取り権限や検索権限)を明示します。
bindRulesは、ユーザーがアクセス権を付与されるために提供する必要がある資格証明およびバインド・パラメータを指定します。バインド・ルールは、ユーザー・メンバーシップ、グループ・メンバーシップ、またはクライアントの接続プロパティに基づいて指定することもできます。
複数のターゲットおよび権限とバインド・ルールのペアを指定することができます。これにより、ターゲットとなるエントリおよび属性の両方を詳細に指定し、ここに示すように、特定のターゲットに対して複数のアクセス制御を効率的に設定できます:
aci: (target)...(target)(version 3.0;acl "name"; permissionBindRule; permissionBindRule; ...; permissionBindRule;)
次の例は、完全なLDIF ACIを示しています:
aci: (target="ldap:///uid=bjensen,dc=example,dc=com") (targetattr="*")(version 3.0; acl "example"; allow (write) userdn="ldap:///self";)
この例では、ACIは、ユーザーbjensen
は、自身のディレクトリ・エントリ内のすべての属性を変更する権限を持つことを指定しています。
ターゲットは、ACIの適用対象を識別します。クライアントがエントリ内の属性の操作をリクエストする場合は、ディレクトリ・サーバーはACIが操作を許可または拒否するために評価される必要があるかを確認するためにターゲットを評価します。ターゲットが指定されていない場合は、ACIはaci
属性を含むエントリのすべての属性、およびその下位のエントリに適用されます。
次の項では、ターゲットの定義方法を説明します:
ターゲットの一般的な構文は、次のいずれかです:
(keyword = "expression")
(keyword != "expression")
ここで:
keywordはターゲットのタイプを示します。ターゲットの次のタイプは表8-1のキーワードで定義されます:
ディレクトリ・エントリまたはそのサブツリー
エントリの属性
LDAPフィルタとマッチングするエントリまたは属性のセット
LDAPフィルタとマッチングする属性値または値の組合せ
ACIの有効範囲
LDAP制御
拡張操作
等号(=)は、ターゲットが式で指定されたオブジェクトであることを示し、非等号(!=)は、ターゲットが式で指定されていない任意のオブジェクトであることを示します。
注意: 非等号演算子は |
expressionは、キーワードに依存し、ターゲットを識別します。構文上、expression
の前後には引用符("")が必要です。ただし、現在の実装では、targetattr=*
のような表現も受け入れています。将来のバージョンでは、構文チェックがより厳密になる可能性があるので、常に引用符を使用する必要があります。
次の表は、各キーワードとそれに関連する式を示します。
表8-1 LDIFターゲット・キーワード
キーワード | 有効な式 | ワイルドカード使用の可否 |
---|---|---|
|
|
使用可能 |
|
属性 |
使用可能 |
|
LDAPfilter |
使用可能 |
|
LDAPoperation |
使用可能 |
|
|
使用不可 |
|
oid |
使用不可 |
|
oid |
使用不可 |
ターゲット・キーワードおよびLDAP URL内部のDNを使用すると、特定のディレクトリ・エントリおよびその下位の任意のエントリをターゲット指定することができます。ターゲットDNは、ACIが定義されているエントリ、またはエントリの下のサブツリーに配置される必要があります。ターゲット式の構文は次のとおりです:
(target = "ldap:///distinguishedName") (target != "ldap:///distinguishedName")
識別名は、ACIが定義されているエントリ、またはエントリの下のサブツリーに配置される必要があります。たとえば、ou=People,dc=example,dc=com
上のACIでは、次のようなターゲットを使用できます:
(target = "ldap:///uid=bjensen,ou=People,dc=example,dc=com")
キーワードtarget
はオプションです。それが存在しない場合は、ACIのデフォルト・ターゲットはACIが格納されているエントリです。
注意: エントリのDNは、文字列表現の識別名とする必要があります(RFC 4514 ( (target="ldap:///uid=cfuentes,o=Example Bolivia\, S.A.") |
LDAP URLに一致する任意の数のエントリをターゲットにするために、DNでワイルドカードを使用することもできます。ワイルドカードの正しい使用例を次に示します:
(target="ldap:///uid=*,dc=example,dc=com")
は、エントリのRDNにuid
属性を持つexample.com
分岐エントリのすべての直近の子と一致します。次に例を示します。
uid=tmorris,dc=example,dc=com uid=yyorgens,dc=example,dc=com uid=bjensen,dc=example,dc=com
(target="ldap:///uid=*,**,dc=example,dc=com")
は、エントリのRDNにuid
属性を持つexample.com
分岐エントリよりも複数レベル下のすべてのエントリと一致します。次に例を示します。
uid=tmorris,ou=sales,dc=example,dc=com uid=yyorgens,ou=marketing,dc=example,dc=com uid=bjensen,ou=eng,ou=east,dc=example,dc=com
(target="ldap:///uid=*Anderson,ou=People,dc=example,dc=com")
は、uid
がAndersonで終了するou=People
分岐エントリのすぐ下のすべてのエントリと一致します。
(target="ldap:///*=*Anderson,ou=People,dc=example,dc=com")
は、ネーミング属性に関係なく、AndersonでRDNが終了するou=People
分岐のすぐ下のすべてのエントリと一致します。
uid=*,ou=*,dc=example,dc=com
のように複数のワイルドカードを使用できます。この例は、指定された位置で識別名がuid
およびou
属性を含むexample.com
ツリーのすべてのエントリと一致します。
ディレクトリ・エントリをターゲットにすることに加えて、ターゲットのエントリに発生する1つ以上の属性(またはすべて(1つ以上)の属性)をターゲットにすることができます。この機能は、エントリに関する部分的な情報へのアクセスを拒否または許可したい場合に便利です。たとえば、特定のエントリの共通名、名字および電話番号の属性にのみアクセスを許可できます。同様に、個人情報などの機密情報へのアクセスを拒否できます。
targetattr
ルールがない場合は、デフォルトではどの属性にもアクセスすることはできません。すべての属性にアクセスするには、ルールはtargetattr="*"
である必要があります。
ターゲット属性は、ターゲット・エントリまたはそのサブツリーに存在する必要はありませんが、存在すればACIが適用されます。ターゲットにする属性は、このスキーマで定義する必要はありません。スキーマ・チェックを行わないことにより、データとそのスキーマをインポートする前にアクセス制御ポリシーを実装できます。
属性をターゲット指定するには、targetattr
キーワードを使用し、属性名を入力します。targetattr
キーワードでは、次の構文を使用します:
(targetattr = "attribute") (targetattr != "attribute")
次の構文でtargetattr
キーワードを使用することで、複数の属性をターゲットにすることができます:
(targetattr = "attribute1 || attribute2 ... || attributeN") (targetattr != "attribute1 || attribute2 ... || attributeN")
たとえば、エントリの共通名、名字およびUID属性をターゲットにする場合は、次のように指定します:
(targetattr = "cn || sn || uid")
carlicense
を除く、エントリのユーザー属性のすべてをターゲットにするには、次のターゲットを使用します:
(targetattr != "carlicense")
前述の例では、操作属性を返しません。
ターゲット属性には、指定された属性のすべてのサブタイプが含まれます。たとえば、(targetattr = "locality")
はlocality;lang-fr
もターゲットになります。たとえば、(targetattr = "locality;lang-fr-ca")
のように、具体的にサブタイプをターゲットにすることもできます。
targetattr
ルール(たとえばtargetattr="*"
)でスタンドアロン文字としてワイルドカードを使用できますが、特定の目的を果たさず、パフォーマンスに悪影響を与える可能性があるため、この使用はお薦めしません。
デフォルトでは、targetattr
キーワードを含むACIにターゲット指定されたエントリは、ACIが配置されたエントリです。つまり、ACI aci: (
targetattr = "
uid")(
accessControlRules;)
をou=Marketing, dc=example,dc=com
エントリに適用する場合は、ACIはMarketingサブツリー全体に適用されます。ただし、次の例のように、ターゲット・キーワードを使用して明示的にターゲットを指定することもできます:
aci: (target="ldap:///uid=*,ou=Marketing,dc=example,dc=com")
(targetattr="uid") (accessControlRules;)
ターゲットおよびtargetattr
キーワードを指定する順番は重要ではありません。
一定基準に一致するエントリのセットをターゲットにするために、LDAPフィルタを使用することができます。このためには、LDAPフィルタとともにtargetfilter
キーワードを使用します。ACIは、ターゲットDNのレベルおよびその下位のサブツリーでフィルタに一致するすべてのエントリに適用されます。
targetfilter
キーワードは次の構文を使用します:
(targetfilter = "
LDAPfilter")
ここで、LDAPfilterは標準のLDAP検索フィルタです。フィルタの構文の詳細は、付録D「検索フィルタ」を参照してください。
たとえば、従業員を示すすべてのエントリには、正社員または契約社員のステータスと、労働時間数を(フルタイムに対する割合として)示す属性があると仮定します。契約社員またはパート社員を示すすべてのエントリをターゲットにするには、次のフィルタを使用できます:
(targetfilter = "(|(status=contractor)(fulltime<=79))")
ACIでは、Netscapeが拡張したフィルタ構文はサポートされません。たとえば、次のターゲット・フィルタは有効ではありません:
(targetfilter = "(locality:fr:=<= Qu?bec)")
ターゲット・フィルタはACIのターゲットとしてエントリ全体を選択します。ターゲット・エントリの属性のサブセットに適用されるACIを作成するために、targetfilter
およびtargetattr
キーワードを組み合せることができます。
次に示すLDIFの例では、Engineering Adminグループのメンバーは、Engineeringのビジネス・カテゴリ内のすべてのエントリのdepartmentNumber
およびmanager
属性を変更できます。この例では、LDAPフィルタを使用して、businessCategory
属性がEngineering
に設定されたすべてのエントリを選択します:
dn: dc=example,dc=com objectClass: top objectClass: organization aci: (targetattr="departmentNumber || manager") (targetfilter="(businessCategory=Engineering)") (version 3.0; acl "eng-admins-write"; allow (write) groupdn ="ldap:///cn=Engineering Admins, dc=example,dc=com";)
ディレクトリ内に分散したエントリおよび属性をターゲットにする場合、LDAPフィルタの使用は便利ですが、フィルタでは、アクセス管理対象のオブジェクトが直接指定されないので、思わぬ結果を招くことがあります。フィルタ処理済のACIでターゲット指定されたエントリのセットは、属性の追加や削除によって変化することがあります。したがって、ACIでLDAPフィルタを使用する場合は、ldapsearch
操作で同じフィルタを使用して適切なエントリと属性がターゲット指定されていることを確認する必要があります。
アクセス制御を使用すると、特定の属性値をターゲットに指定できます。つまり、属性値がACIで定義された条件を満たす場合、属性に対する権限を付与または拒否できます。属性の値に基づいてアセスを許可または拒否するACIは、値ベースACIと呼ばれています。
たとえば、組織内のすべてのユーザーに、ユーザー自身のエントリ内のroomNumber
属性を変更する権限を付与することができます。ただし、ユーザーが予約済の部屋番号(12
から始まるすべての番号)を指定できないようにすることも必要です。LDAPフィルタは、属性値の条件が満たされていることを確認するために使用されます。
値ベースACIを作成するには、次の構文でtargattrfilters
キーワードを使用する必要があります:
(targattrfilters="
Op=
attr1:
F1[(&&
attr2:
F2)*][;
Op=
attr:
F[(&&
attr:
F)*]")
ここで:
Opは、add
またはdelete
操作のいずれかです:
add
は属性を作成する操作を示します。
delete
は属性を削除する操作を示します。
attrはターゲット属性を示します。
Fは、関連付けられた属性のみに適用する「検索フィルタ」(付録D)を示します。
エントリを作成するとき、フィルタが新しいエントリの属性に適用される場合は、その属性のすべての値はフィルタを満たす必要があります。エントリを削除するとき、フィルタがエントリの属性に適用される場合は、その属性のすべての値もフィルタを満たす必要があります。
エントリを変更するとき、操作で属性を追加する場合は、その属性に適用される追加フィルタを満たす必要があります。操作で属性を削除する場合は、その属性に適用される削除フィルタを満たす必要があります。エントリ内にすでに存在する属性の各値が置き換えられる場合は、追加および削除フィルタの両方を満たす必要があります。
次の例の属性フィルタは、12
の接頭辞を持つ予約済の部屋番号を除いて、ユーザー自身のエントリに任意のroomNumber
属性を追加することをユーザーに許可します。またこれにより、ユーザーは123
という接頭辞を持つ電話番号を追加できます。
(targattrfilters="add=roomNumber:(!(roomNumber=12*)) && telephoneNumber:(telephoneNumber=123*)")
単一のエントリをターゲットとする明示的な方法はありません。ただし、次の2つのうちのいずれかの方法で可能です:
バインド・リクエストでのユーザー入力が、ターゲット・エントリ内に格納された属性値に一致するバインド・ルールを作成する
targetfilter
キーワードを使用する
targetfilter
キーワードを使用すると、目的のエントリにのみ表示される属性値を指定することができます。たとえば、ディレクトリ・サーバーをインストールする間に次のACIが作成されます:
aci: (targetattr="*")(targetfilter=(o=example)) (version 3.0; acl "Default anonymous access"; allow (read, search) userdn="ldap:///anyone";)
属性o
が値example
を持つ唯一のエントリのため、このACIはo=example
エントリにのみ適用されます。
これらのメソッドに関連付するリスクは、ディレクトリ・ツリーは、将来変更される可能性があるということと、このACIを変更することを忘れないようにしなければならないことです。
通常、ACIの範囲はサブツリーです。次の構文でtargetscope
キーワードを使用することでACIの有効範囲を制限できます:
(targetscope="
expression")
ここで、expressionは次のいずれかです:
base
ACIは、ターゲット・リソースにのみ適用されます。
onelevel
ACIは、ターゲット・リソースの第1世代の子に適用されます。
subtree
ACIは、ターゲット・リソースとその下にあるサブツリーに適用されます。
subordinate
ACIは、ターゲット・リソースの下にあるサブツリーにのみ適用されます。
targetscope
が指定されていない場合、デフォルト値はsubtree
です。次の例では、ACIターゲット一致は、識別名uid=bjensen,ou=People,dc=example,dc=com
のエントリ、およびその1レベル下の任意の子のエントリのみに制限されます:
(target = "ldap:///uid=bjensen,ou=People,dc=example,dc=com")(targetscope="onelevel")
注意: 非等号演算子は |
LDAP制御をターゲットに指定するには、targetcontrol
キーワードを使用し、制御(付録D「オブジェクト識別子」)を入力します。targetcontrol
キーワードは次の構文を使用します:
(targetcontrol="
oid")
(targetcontrol!="
oid")
次の構文でtargetcontrol
キーワードを使用することで、複数のLDAP制御をターゲットにすることができます:
(targetcontrol="
oid1 ||
oid2...
||
oidN")
(targetcontrol!="
oid1 ||
oid2...
||
oidN")
たとえば、「実効権限取得制御」(付録D)および「プロキシ設定された認可制御」(付録D)の両方をターゲットに指定するには、次のtargetcontrol
式を使用します:
(targetcontrol = "1.3.6.1.4.1.42.2.27.9.5.2 || 2.16.840.1.113730.3.4.18")
注意: 実効権限取得制御は1.3.6.1.4.1.42.2.27.9.5.2のOID値を持ちます。プロキシ認可V2制御は2.16.840.1.113730.3.4.18のOID値を持ちます。 |
拡張操作をターゲットに指定するには、extop
キーワードを使用し、操作(付録D「オブジェクト識別子」)を指定します。extop
キーワードは次の構文を使用します:
(extop= "
oid")
(extop!= "
oid")
次の構文でextop
キーワードを使用することにより、複数の拡張操作をターゲットにすることができます:
(extop = "
oid1 ||
oid2...
||
oidN")
(extop!= "
oid1 ||
oid2...
||
oidN")
たとえば、「StartTLS拡張操作」(付録D)および「パスワード変更拡張操作」(付録D)の両方をターゲットにするには、次のextop
式を使用します:
(extop = "1.3.6.1.4.1.1466.20037 || 1.3.6.1.4.1.4203.1.11.1.")
注意: StartTLS拡張操作ターゲットで |
権限では、許可または拒否するアクセスのタイプを指定します。ディレクトリ内で特定の操作を実行する権限を許可または拒否することができます。割り当てられる様々な操作は、権限として知られています。
権限の設定には2つの手順があります:
アクセスの許可または拒否
権限の割当て
次の項では、権限の定義方法を説明します:
allow
またはdeny
キーワードを使用して、アクセス権を明示的に許可または拒否できます。
権限は、ユーザーがディレクトリ・データで実行できる特定の操作の詳細を説明します。すべての権限を許可または拒否するか、または次に示す権限の1つ以上を割り当てることができます:
ユーザーがディレクトリ・エントリおよびACIに指定されたエントリの属性を読み取ることができるかを示します。この権限は、検索操作のみに適用されます。(読取り権限を次の検索権限の説明と比較してください。)
ユーザーが属性を追加、変更または削除することでエントリを変更できるかを示します。この権限は、変更およびmodRDN操作に適用されます。
ユーザーがエントリを作成できるかを示します。この権限は、追加操作のみに適用されます。
ユーザーがエントリを削除できるかを示します。この権限は、削除操作のみに適用されます。
ACIに指定されたターゲット上でユーザーが検索できるかを示します。この権限は、検索操作のみに適用されます。検索権限は、一度確認され、検索が許可または拒否された後は再び確認されません。検索が許可された場合、読取り権限は検索の結果として返される各エントリおよび各エントリの各属性に適用されます。
ユーザーは、ユーザーが指定するデータとディレクトリに格納されたデータを比較できるかを示します。比較権限を使用すると、ディレクトリが問合せの応答として成功または失敗のメッセージを返しますが、ユーザーはエントリまたは属性の値を参照できません。この権限は、比較操作のみに適用されます。
ユーザーがターゲット・エントリの属性に自分自身のDNを追加または削除できるかを示します。この属性の構文は、識別名である必要があります。この権限は、グループ管理でのみ使用されます。自己書込みは、プロキシ認可で機能します。これは、(バインドされたユーザーのDNではなく)グループ・エントリからプロキシDNを追加または削除する権限を付与します。
指定されたDNが別のエントリの権限でターゲットにアクセスできるかを示します。ディレクトリ・マネージャDNを除くディレクトリ内の任意のユーザーのDNを使用して、プロキシ・アクセス権を付与できます。なお、ディレクトリ・マネージャにはプロキシ権限を付与できません。第22.6項「プロキシ認可のACI」に例があります。
変更DN操作で使用されます。このアクセス権限は、エントリを特定のDNにインポートできるかどうかを示します。
変更DN操作で使用されます。このアクセス権限は、エントリを特定のDNからエクスポートできるかどうかを示します。
指定されたDNが、ターゲット・エントリに対して次の権限を持つことを示します: 読取り、書込み、検索、削除、比較、自己書込み。すべてのアクセス権限は、ターゲット・エントリに次の権限を与えません: プロキシ、インポートおよびエクスポート。
rightは、互いに独立して付与されます。つまり、たとえば、削除権限が明確に付与されていない場合は、追加権限を付与されるユーザーはエントリを作成することができますが、それを削除することはできません。したがって、ディレクトリに対するアクセス制御ポリシーを計画している場合、ユーザーに対して合理的に権利を付与することを確認することが必要です。たとえば、読取りおよび検索権限を付与せずに書込み権限を付与しても、合理的ではありません。
この項では、実行を許可するLDAP操作のタイプに応じて、ユーザーに付与する必要のある権限について説明します。
エントリの追加
追加されるエントリに対する追加権限を付与します。
エントリの各属性値に対する書込み権限を付与します。この権限はデフォルトで付与されますが、targattrfilters
キーワードを使用して制限することもできます。
エントリの削除
削除されるエントリに対する削除権限を付与します。
エントリの各属性値に対する書込み権限を付与します。この権限はデフォルトで付与されますが、targattrfilters
キーワードを使用して制限することもできます。
エントリ内の属性の変更
属性タイプに対する書込み権限を付与します。
各属性タイプの値に対する書込み権限を付与します。この権限はデフォルトで付与されますが、targattrfilters
キーワードを使用して制限することもできます。
エントリのRDNの変更
エントリに対する書込み権限を付与します。
新しいRDNで使用される属性タイプに対する書込み権限を付与します。
古いRDNを削除する権限を付与する場合、古いRDNで使用される属性タイプに対する書込み権限を付与します。
新しいRDNで使用される属性タイプの値に対する書込み権限を付与します。この権限はデフォルトで付与されますが、targattrfilters
キーワードを使用して制限することもできます。
別のサブツリーへのエントリの移動
移動するエントリに対するエクスポート権限を付与します。
移動するエントリの新しい上位エントリに対するインポート権限を付与します。
属性の値の比較
属性タイプに対する比較権限を付与します。
エントリの検索
検索フィルタで使用される各属性タイプに対する検索権限を付与します。
エントリが確実に返されるようにエントリで使用される最低1つの属性タイプに対する読取り権限を付与します。
エントリで返される各属性タイプに対する読取り権限を付与します。
ユーザーがディレクトリを検索するために設定する必要のある権限を簡単に理解できるように、次に例を示します。次の検索について考えてみます:
$ ldapsearch -h host -p port -D "uid=bjensen,dc=example,dc=com" \ -j pwd-file -b "dc=example,dc=com" \ "(objectclass=*)" mail
次のACIは、ユーザーbjensen
に、自身のエントリを検索するためのアクセス権を付与できるかどうかを決定します:
aci: (targetattr = "mail")(version 3.0; acl "self access to \ mail"; allow (read, search) userdn = "ldap:///self";)
このACIではbjensen
にobjectclass
属性で検索する権限を許可していないため、検索結果リストは空になります。正常な検索操作のためには、次の例のようにACIを変更する必要があります:
aci: (targetattr = "mail || objectclass")(version 3.0; acl \ "self access to mail"; allow (read, search) userdn = \ "ldap:///self";)
ACI文において、権限は次の構文を使用します:
allow|deny (
rights)
ここで、rightsはカッコで囲まれたコンマ区切りのキーワードのリストです。有効なキーワードは、read
、write
、add
、delete
、search
、compare
、selfwrite
、proxy
、import
、export
またはall
です。
all
のアクセス権限は、ターゲット・エントリに次の権限を与えません: proxy
、import
およびexport
。
次の例では、バインド・ルールがtrueと評価される場合、read
、search
およびcompare
のアクセスが許可されます:
aci: (target="ldap:///dc=example,dc=com") (version 3.0;acl \ "example"; allow (read, search, compare) bindRule;)
ディレクトリに対して定義されたACIに応じて、いくつかの操作では、ディレクトリにバインドが必要です。次の項では、バインド・ルールがアクセスを制御するために使用される方法を説明します:
バインドとは、バインドDNおよびパスワードを入力して(SSLを使用する場合は、証明書を提示して)ディレクトリにログインするか、自身の認証を行うことです。バインド操作で提示される資格証明およびバインドの状況によって、ディレクトリへのアクセスが許可されるか拒否されるかが決定されます
ACI内のすべての権限セットには、必要な資格証明およびバインド・パラメータの詳細を示す、対応するバインド・ルールがあります。
単純なバインド・ルールでは、ディレクトリにアクセスするユーザーが特定のグループに属している必要があります。複雑なバインド・ルールでは、ユーザーが特定のグループに属し、特定のIPアドレスのマシンから午前8時から午後5時の間にログインする必要があることを設定できます。
バインド・ルールは、誰が、いつ、どこからディレクトリにアクセスできるかを定義します。具体的には、バインド・ルールは次の内容を指定できます:
アクセス権が付与されるユーザー、グループおよびロール
エンティティがバインドする必要のある場所(ユーザーが認証を受ける場所はなりすましの可能性があるので、信頼できません。この情報のみでACIを判断しないでください。)
バインドを実行する必要がある時間または日付
バインド時に使用する必要がある認証のタイプ
セキュリティ強度係数(つまり、現在使用中の暗号化鍵の長さ)
また、第8.4項「バインドルールの構文」で説明されているように、バインド・ルールは、ブール演算子を使用して、これらの条件を組み合せた複雑な構造にできます。
ディレクトリ・サーバーは、3値ロジックに従って、ACIで使用される論理式を評価します。これは、RFC 4511 (http://www.ietf.org/rfc/rfc4511.txt
)「Lightweight Directory Access Protocol (LDAP): The Protocol」で説明されているLDAPフィルタの評価に使用されるものと類似しています。つまり、式の中の任意のコンポーネントが未定義と評価される(たとえば、リソースの制限により、式の評価が中断された場合など)と、ディレクトリ・サーバーはこの状況を正しく処理します。複雑なブール式で未定義値が発生しても、間違ってアクセス権を付与することはありません。
バインド・ルールは、ブール式AND
、OR
およびNOT
を使用する複合式で、細かいアクセス・ルールを設定できます。ブール・バインド・ルールを作成するときは、評価されるルールの順番を定義するために常にカッコを使用します。末尾のセミコロンは、最終ルールの後に出現する必要のある必須のデリミタです。
たとえば、bindRuleA
をbindRuleB
、またはbindRuleC
およびbindRuleD
とバインドするには、次の構文を使用します:
(bindRuleA and (bindRuleB or (bindRuleC and bindRuleD));)
別の例を使用すると、バインドDNクライアントがexample.com
ドメイン内からアクセスされ、管理者グループのメンバーまたはメール管理者グループとカレンダ管理者グループの両方のメンバーである場合は、次のバインド・ルールはtrueと評価されます。
(dns = "*.example.com" and (groupdn = "ldap:///cn=administrators,dc=example,dc=com" or (groupdn = "ldap:///cn=mail administrators,dc=example,dc=com" and groupdn = "ldap:///cn=calendar administrators,dc=example,dc=com"));)
||
演算子は、groupdn
バインド・ルール・キーワード式でのみ、許可されています。その他すべてのバインド・ルール式については、or
演算子を使用する必要があります。
アクセスが許可されるか拒否されるかは、ACIのバインド・ルールがtrueであると評価されるかどうかによります。次の項では、バインド・ルールの構文、およびアクセスを許可または拒否するために使用される様々なキーワードについて説明します。
バインド・ルールは、次のパターンのうちのどちらかを使用します:
keyword ="
expression";
keyword!="
expression";
ここで、等号(=
)は、バインド・ルールをtrueとするにはキーワードと式が一致する必要があることを示し、不等号(!=
)は、バインド・ルールをtrueとするにはキーワードと式が一致してはならないことを示します。
式の前後の引用符(""
)および区切りを示すセミコロン(;
)は必須です。使用できる式は、関連付けられたキーワードによります。
timeofday
キーワードは不等式(<
、<=
、>
、>=
)もサポートします。timeofday
キーワードはこれらの式をサポートする唯一のキーワードです。
次の表に、各キーワードと関連する式をリストし、式でワイルドカード文字を使用できるかどうかについても示します。
キーワード | 有効な式 | ワイルドカード使用の可否 |
---|---|---|
|
|
可(DNのみ) |
|
|
使用不可 |
値マッチングに基づくアクセスの定義( |
attribute |
使用不可 |
|
IPaddress |
使用可能 |
|
DNShostName |
使用可能 |
特定の時刻または曜日におけるアクセスの定義( |
|
使用不可 |
特定の時刻または曜日におけるアクセスの定義( |
hhmm、ここでhhは |
使用不可 |
認証メソッドに基づくアクセスの定義( |
authenticationMethod |
使用不可 |
接続のセキュリティ強度係数に基づくアクセスの定義( |
0-256 |
使用不可 |
次の項では、各キーワードのバインド・ルール構文の詳細を説明します。
userdn
キーワード)ユーザー・アクセスは、userdn
キーワードを使用して定義されます。userdn
キーワードでは、次の書式で1つ以上の有効な識別名が必要です:
userdn = "ldap:///
dn [|| ldap:///
dn]..."
userdn!= "ldap:///
dn [|| ldap:///
dn]..."
ここで、dnはDNまたは式(anyone
、all
、self
またはparent
)の1つです。これらの式は次のユーザーを参照します:
userdn = "ldap:///anyone"
匿名ユーザーと認証ユーザーの両方
userdn = "ldap:///all"
認証ユーザーのみ
userdn = "ldap:///self"
ACIのターゲット・エントリと同じユーザーのみ
userdn = "ldap:///parent"
ACIターゲットの親エントリのみ
userdn
キーワードは、次の書式でLDAPフィルタとして表すこともできます:
userdn = ldap:///
suffix??sub?(
filter)
カンマなどのDNの文法的な意味を持つ文字は、単一の円記号(\
)でエスケープする必要があります。
次の項では、userdn
キーワードを使用してユーザー・アクセスを定義する方法を説明します:
all
キーワード)ディレクトリに正常にバインドしたすべてのユーザーに権限が適用されることを示すために、バインド・ルールを使用することができます。したがって、all
キーワードはすべての認証ユーザーによるアクセスを許可します。これは、匿名アクセスを防ぐ一方で、汎用アクセスを許可します。
たとえば、すべての認証ユーザーに、ツリー全体に対する読取りアクセスを許可するには、dc=example,dc=com
ノードに次のACIを作成します:
aci: (version 3.0; acl "all-read"; allow (read) userdn="ldap:///all";)
anyone
キーワード)ディレクトリへの匿名アクセスを許可すると、バインドの状況にかかわりなく、バインドDNやパスワードを入力することなく誰でもそのディレクトリにアクセスすることができます。匿名アクセスを特定のアクセスのタイプ(たとえば、読取り用のアクセスや検索用のアクセスなど)に制限したり、ディレクトリ内の特定のサブツリーや個々のエントリに制限できます。anyone
キーワードを使用した匿名アクセスは、認証ユーザーによるアクセスも許可します。
たとえば、example.com
ツリー全体に対する匿名の読取りおよび検索アクセスを許可するには、dc=example,dc=com
ノードに次のACIを作成します:
aci: (version 3.0; acl "anonymous-read-search"; allow (read, search) userdn = "ldap:///anyone";)
self
キーワード)ユーザー自身のエントリに対して、ユーザーがアクセス権を付与または拒否されていることを指定します。この場合、バインドDNがターゲット・エントリのDNと一致しているかどうかで、アクセスが許可または拒否されます。たとえば、example.com
ツリーのすべてのユーザーにuserPassword
属性への書込み権限を付与するには、dc=example,dc=com
ノードに次のACIを作成します。
aci: (targetattr = "userPassword") (version 3.0; acl "modify own password"; allow (write) userdn = "ldap:///self";)
parent
キーワード)ユーザーのバインドDNがターゲット・エントリの親である場合にかぎり、ユーザーがエントリへのアクセスを許可または拒否されることを指定します。たとえば、バインドDNの任意の子エントリをユーザーが変更できるようにするには、dc=example,dc=com
ノードに次のACIを作成します:
aci: (version 3.0; acl "parent access"; allow (write) userdn="ldap:///parent";)
次の例に示されているようなフィルタ付きのURLを使用して、ACI内で動的にユーザーをターゲットにできます:
userdn = "ldap:///suffix??sub?(filter)"
たとえば、example.com
ツリーのaccounting分岐とengineering分岐のすべてのユーザーは、次のURLに基づいて動的にターゲット・リソースへのアクセスを許可または拒否されます:
userdn = "ldap:///dc=example,dc=com??sub?(|(ou=eng)(ou=acct))"
LDAP URL内でホスト名またはポート番号を指定しないでください。LDAP URLは常にローカル・ディレクトリ・サーバーに適用されます。
ワイルドカード文字(*
)を使用して、ユーザーのセットを指定することもできます。たとえば、uid=b*,dc=example,dc=com
のユーザーDNを指定すると、文字b
で始まるバインドDNを持つユーザーのみが、設定された権限に基づいてアクセスを許可または拒否されることを示します。
ユーザー・アクセスに複雑なルールを作成するために、いくつかのLDAP URLまたはキーワード式を指定します。例:
userdn = "ldap:///uid=b*,c=example.com || ldap:///cn=b*,dc=example,dc=com";
バインド・ルールは、DNパターンのいずれかでバインドされたユーザーに対して、trueと評価されます。
特定のURLまたはDNを除外するユーザー・アクセスを定義するのに非等号(!=
)演算子を使用します。例:
userdn != "ldap:///uid=*,ou=Accounting,dc=example,dc=com";
クライアントがaccountingサブツリー内でUIDベースの識別名としてバインドしていない場合、バインド・ルールはtrueと評価されます。このバインド・ルールは、ターゲット・エントリがディレクトリ・ツリーのaccounting分岐の下にない場合にのみ、意味を持ちます。
groupdn
キーワード)特定のグループのメンバーは、ターゲット・リソースにアクセスできます。これはグループ・アクセスと呼ばれています。グループ・アクセスは、ユーザーが特定のグループに属するDNを使用してバインドする場合、ターゲット・エントリへのアクセスが許可または拒否されるのを指定するために、groupdn
キーワードを使用して定義されます。
groupdn
キーワードは、次の形式で1つ以上の識別名が必要です:
groupdn="ldap:///groupDN [|| ldap:///groupDN]..."
バインドDNが任意のグループDNで指定されたグループに属する場合、バインド・ルールはtrueと評価されます。次の項では、groupdn
キーワードを使用した例を示します。
カンマなどのDNの文法的な意味を持つ文字は、単一の円記号(\
)でエスケープする必要があります。
groupdn = "ldap:///cn=Administrators,dc=example,dc=com";
バインドDNが管理者グループに属する場合、バインド・ルールはtrueと評価されます。たとえば、管理者グループにディレクトリ・ツリー全体への書込みの権限を付与する場合は、次のACIをdc=example,dc=com
ノードに作成します:
aci: (version 3.0; acl "Administrators-write"; allow (write) groupdn="ldap:///cn=Administrators,dc=example,dc=com";)
groupdn = "ldap:///cn=Administrators,dc=example,dc=com || ldap:///cn=Mail Administrators,dc=example,dc=com";
バインドDNが管理者グループまたはメール管理者グループに属する場合、バインド・ルールはtrueと評価されます。
userattr
キーワード)userattr
キーワードは、バインドに使用するエントリ(バインド・エントリ)とターゲット・エントリの間で、一致する必要がある属性値を指定するのに使用できます。userattr
式は、バインド・タイプ・フォーマットと属性値フォーマットの2つの形式があります。
次の項では、値マッチングに基づいたアクセスを定義する方法を説明します:
この形式は、一致を評価するときにバインドDN、およびおそらくバインド・エントリを使用するため、バインド・タイプ・フォーマットと名付けられます。これは、2つの形式の中でより複雑な形式です。バインド・タイプ・フォーマットは、次の3つの方法で使用できます:
ターゲット・エントリの属性値をバインドDNに一致するDNとして扱います。
ターゲット・エントリの属性値を、バインドDNがメンバーである必要があるグループDNとして扱います。
バインドDNとバインド·エントリの両方が、ターゲット・エントリの属性値に指定されているLDAP URLと一致している必要があります。
バインド・タイプuserattr
形式は、次の構文を使用します:
userattr = "attrName#bindType"
ここで:
ターゲット・エントリの属性の名前です。
次のいずれかを指定する必要があります:
USERDN
— attrNameの値はバインドDNと一致する必要があります。
GROUPDN
— attrNameの値は、バインドDNを含む必要のあるグループです。
LDAPURL
— attrNameの値は、バインドDNとエントリが一致する必要がある検索として扱われる「URL」(付録D)です。検索を実行するためには、URLのdn値がベースDNとして使用されます。ベースDNは、バインドDNと一致するか、またはバインドDNが親DNとしてそれを持つ必要があります。URLのscope値は、ベースDNのどの程度下位までバインドDNが一致できるかを制限します。最終的に、バインド・エントリはURLのfilter値と一致する必要があります。
バインド・タイプuserattr
形式は、現在のターゲット・エントリの下のエントリ・レベルのターゲット指定を許可する特別な親キーワードを持っています。このキーワードに関する詳細は、第8.4.4.7項「継承」を参照してください。
属性値フォーマットは、次の2つの条件に一致する必要があります:
userattr
式で指定された属性は、ターゲット・エントリおよびバインド・エントリの両方で存在する必要があります。
これらの属性の両方の値は、userattr
式で指定された文字列の値に一致する必要があります。この文字列の値には、バインド・タイプのキーワード(USERDN
、GROUPDN
、LDAPURL
)のいずれも指定することはできません。
属性値userattr
形式は、次の構文を使用します:
userattr = "attrName#attrValue"
ここで:
ターゲット・エントリとバインド・エントリの両方の属性の名前です。
属性値(USERDN
、GROUPDN
またはLDAPURL
ではない)を示す文字列です。
USERDN
バインド・タイプの例バインド・ルールuserattr
キーワード式の次の例は、バインドDNとターゲット・エントリの属性manager
の値の一致を指定します。
userattr = "manager#USERDN"
バインドDNがターゲット・エントリのmanager
属性の値と一致する場合、このバインド・ルールはtrueと評価されます。ターゲット・エントリのmanager
属性は、バインドDNと一致する必要があります。ワイルドカードは使用できません。
次の例では、ACIは、DNdc=example, dc=comm
の下のサブツリーに位置するエントリのすべてのユーザー属性への完全なアクセス権をマネージャに付与します:
aci: (target="ldap:///dc=example,dc=com")(targetattr="*") (version 3.0;acl "manager all access"; allow (all) userattr = "manager#USERDN";)
GROUPDN
バインド・タイプの例次は、バインドDNがメンバーである必要があるグループDNを含む属性を指定するバインド・ルールuserattr
キーワード式の例です。
userattr = "owner#GROUPDN"
バインドDNがターゲット・エントリのowner
属性で指定されたグループのメンバーである場合、バインド・ルールはtrueと評価されます。
LDAPURL
バインド・タイプの例これは、バインドDNとエントリが一致している必要がある検索として扱われるLDAP URLを含む属性を指定するバインド・ルールuserattr
キーワード式の例です。
userattr = "aciurl#LDAPURL"
属性aciurl
は一例です。
バインドDNとバインド・エントリがLDAP URLで指定される検索要件のすべてを満たす場合、バインド・ルールはtrueと評価されます。たとえば、aciurl
の値がldap:///dc=example,dc=com??one?(cn=joe*)
である場合、バインドDNはdc=example,dc=com
のベースDNの下で1レベル検索を満たし、バインド・エントリはフィルタ(cn=joe*)
を満たす必要があります。
次は、バインド・エントリとターゲット・エントリの両方が一致する必要がある属性値を指定するバインド・ルールuserattr
キーワード式の例です。
userattr = "favoriteBeverage#Water"
バインド・エントリとターゲット・エントリにWater
の値のfavoriteBeverage
属性が含まれる場合、バインド・ルールはtrueと評価されます。
userattr
キーワードを使用してバインドに使用されるエントリをターゲット・エントリに関連付けると、ACIは指定されたターゲットにのみ適用され、下位のエントリには適用されません。状況によっては、ターゲット・エントリの数レベル下位のACIのアプリケーションを拡張することもできます。これは、parentキーワードを使用し、ACIを継承するターゲットの下のレベルの数を指定することで可能です。
parentキーワードと関連してuserattr
キーワードを使用する場合は、構文は次の例のようになります:
userattr = "parent[[inheritanceLevel].attribute#bindType"
ここで:
inheritanceLevelは、カンマ区切りのリストで、ターゲットのいくつ下のレベルまでACIを継承するかを示します。ターゲット・エントリの10レベル[0,1,2,3,4,..,9]下まで含めることができます。0は、ターゲット・エントリを示します。
attributeは、userattr
のターゲットとなる属性です。
bindTypeは、USERDN
またはGROUPDN
のどちらかです。LDAPURL
バインド・タイプは、継承ではサポートされていません。
たとえば、バインドDNがターゲット・エントリのmanager
属性と一致する場合、userattr = "parent[[0,1].manager#USERDN"
バインドルールはtrueと評価されます。また、バインド・ルールは、バインドDNと一致するmanager
属性を持つターゲット・エントリのすぐ下(ターゲットの1レベル下)のすべてのエントリに対して、trueと評価されます。
次の例は、ユーザーbjensen
が、cn=Profiles
エントリおよびcn=mail
とcn=news
を含む子エントリの最初のレベルに対して、読取りと検索を許可されることを示しています。
cn=Profiles aci:(targetattr="*")(version 3.0, acl "profiles access" allow(read, search) userattr="parent[[0,1].owner#USERDN;) owner=cn=bjensen, ou=people, dc=example, dc=com cn=mail, cn=Profiles mailuser: bjensen cn=news, cn=Profiles newuser: bjensen
継承がこの例で使用されない場合は、次のいずれかを実行する必要があります:
ディレクトリ内のcn=Profiles
、cn=mail
およびcn=news
エントリに、ユーザーbjensen
の読取りおよび検索アクセスを明示的に設定します。
cn=mail
、cn=Profiles
およびcn=news,cn=Profiles
エントリに所有者属性および次のACIを追加します:
aci: (targetattr="*") (version 3.0; acl "profiles access"; allow (read,search) userattr="owner#USERDN";)
userattr
キーワードをallまたはadd権限と組み合せて使用すると、サーバーの動作が想定どおりにならない場合があります。通常、新しいエントリがディレクトリに作成されると、ディレクトリ・サーバーは作成されたエントリのアクセス権を評価し、親エントリのアクセス権は評価しません。ただし、userattr
キーワードを使用するACIの場合は、この動作によってセキュリティ・ホールが生じる可能性があるので、これを避けるためにディレクトリ・サーバーの通常動作は変更されます。
次の例ACIを考えてみます:
aci: (target="ldap:///dc=example,dc=com")(targetattr="*") (version 3.0; acl "manager-write"; allow (all) userattr = "manager#USERDN";)
このACIは、部下のエントリに対するすべての権限をマネージャに与えます。ただし、新しく作成されるエントリについてアクセス権が評価されるので、このタイプのACIでは、すべての社員に対して、manager属性が自身のDNに設定されるエントリの作成を許可します。たとえば、会社に不満を抱くJoeという社員(cn=Joe,ou=eng,dc=example,dc=com
)は、ツリーのHuman Resources分岐にエントリを作成して、Human Resourcesの社員に付与された権限を使用(悪用)できます。
これは、次のエントリを作成することで可能です:
dn: cn= Trojan Horse,ou=Human Resources,dc=example,dc=com objectclass: top ... cn: Trojan Horse manager: cn=Joe,ou=eng,dc=example,dc=com
このようなセキュリティ上の危険を回避するために、ACIの評価プロセスでは、レベル0の追加権限、つまりエントリ自身に対する追加権限を付与しません。ただし、既存エントリの下位にあるエントリには、parent
キーワードを使用して追加アクセス権を付与できます。親のいくつ下のレベルまで追加アクセス権を許可するかを指定する必要があります。たとえば、次のACIでは、バインドDNと一致するmanager属性を持つdc=example,dc=com
内の任意のエントリに子エントリを追加できます:
aci: (target="ldap:///dc=example,dc=com")(targetattr="*") (version 3.0; acl "parent-access"; allow (add) userattr = "parent[1].manager#USERDN";)
このACIでは、バインドDNが親エントリのmanager
属性と一致しているユーザーのみに追加権限が付与されます。
ip
キーワード)バインド・ルールを使用して、バインド操作を特定のIPアドレスから行う必要があることを示すことができます。これは多くの場合、特定のマシンまたはネットワーク・ドメインからすべてのディレクトリの更新が強制的に実行されるようにするために使用されます。
IPアドレスに基づくバインド・ルールを設定するためのLDIF構文は、次のとおりです:
ip = "IPaddressList" ip != "IPaddressList"
IPaddressListは、次のうちの1つ以上のカンマ区切り要素のリストです:
特定のIPv4アドレス(123.45.6.7
など)
IPv4/CIDRに準拠したアドレス(192.168.0.0/16
など)
サブネットワークを指定するためのワイルドカードを含むIPv4アドレス(12.3.45.*
など)
サブネットワーク・マスクを含むIPv4アドレスまたはサブネットワーク(123.45.6.*+255.255.255.192
など)
有効な形式で大カッコ([
と]
)を含むIPv6アドレス(RFC 2373 (http://www.ietf.org/rfc/rfc2373.txt
)およびRFC 2732 (http://www.ietf.org/rfc/rfc2732.txt
)で定義されています)次のアドレスは同等です:
ldap://[12AB:0000:0000:CD30:0000:0000:0000:0000]
ldap://[12AB::CD30:0:0:0:0]
ldap://[12AB:0:0:CD30::]
サブネット接頭辞長を含むIPv6アドレス(ldap://[12AB::CD30:0:0:0:0]/60
など)
ディレクトリにアクセスするクライアントが指定されたIPアドレスに位置している場合、バインド・ルールはtrueと評価されます。これは、特定のサブネットまたはマシンのみから特定の種類のディレクトリ・アクセスを可能にするために役立ちます。ユーザーが認証を受けるIPアドレスはなりすまされる可能性があるため、信頼できないことに注意してください。ACIでは、これらの情報のみに依存にしないでください。
dns
キーワード)バインド・ルールによって、バインド操作を特定のドメインまたはホスト・マシンから行う必要があることを指定できます。これは多くの場合、特定のマシンまたはネットワーク・ドメインからすべてのディレクトリの更新が強制的に実行されるようにするために使用されます。
DNSホスト名に基づくバインド・ルールを設定するためのLDIF構文を次に示します:
dns = "DNShostname" dns != "DNShostname"
注意:
|
dns
キーワードには、完全修飾DNSドメイン名が必要です。ドメインを指定せずにホストへのアクセスを許可すると、セキュリティの脅威がもたらされる可能性があります。たとえば、次の式は使用できますが、お薦めできません:
dns = "legend.eng";
次のような完全修飾名を使用する必要があります:
dns = "legend.eng.example.com";
dns
キーワードでは、ワイルドカードを使用できます。例:
dns = "*.example.com";
ディレクトリにアクセスするクライアントが指定されたドメインに位置している場合、バインド・ルールはtrueと評価されます。これは、特定のドメインからのアクセスのみを許可する場合に役立ちます。システムでDNS以外のネーミング・サービスを使用している場合、ワイルドカードは機能しません。特定のドメインへのアクセスを制限したい場合は、第8.4.5項「特定のIPアドレスからのアクセスの定義(ip
キーワード)」に説明されているように、ip
キーワードを使用します。
timeofday
およびdayofweek
キーワード)バインド・ルールを使用して、特定の時刻または曜日だけにバインドするように指定できます。たとえば、月曜日から金曜日の午前8時から午後5時までの間のみ、アクセスを許可するようにルールを設定できます。アクセス権の評価に使用される時刻は、ディレクトリ・サーバー上の時刻で、クライアント上の時刻ではありません。
時刻に基づくバインド・ルールを設定するためのLDIF構文は、次のとおりです:
timeofday operator "time"
ここで、operatorは次の記号のいずれかになります:
=
(等しい)
!=
{等しくない}
>
(より大きい)
>=
(以上)
<
(より小さい)
<=
(以下)
時刻は、24時間制で時と分を表す4桁で表現されます(hhmm、ここでhhは00
-24
の範囲、mmは00
-60
の範囲です)。例:
timeofday = "1200";
は、システム時刻が正午を示す1分間にクライアントがディレクトリにアクセスする場合、trueになります。
timeofday!= "0100";
は、午前1時以外の任意の時刻のアクセスに対して、trueになります。
timeofday> "0800";
は、午前8:01から午後11:59のアクセスに対して、trueになります。
timeofday>= "0800";
は、午前8:00から午後11:59のアクセスに対して、trueになります。
timeofday< "1800";
は、夜12:00から午後5:59のアクセスに対して、trueになります。
timeofday
およびdayofweek
バインド・ルールの評価には、ディレクトリ・サーバー上の日付と時刻が使用されます(クライアント上の日時ではありません)。
曜日に基づくバインド・ルールを設定するためのLDIF構文は、次のとおりです:
dayofweek = "day1, day2 ..."
dayofweek
キーワードに指定できる値は、英語の曜日の3文字の略語で、sun
、mon
、tue
、wed
、thu
、fri
、sat
です。アクセスを許可するすべての曜日を指定します。例:
dayofweek = "mon, tue, wed, thu, fri";
リストされているいずれかの曜日にディレクトリにアクセスする場合、バインド・ルールはtrueになります。
authmethod
キーワード)クライアントが特定の認証メソッドを使用してディレクトリにバインドする必要があることを示すバインド・ルールを設定できます。次に示す認証メソッドを使用できます:
None
認証は不要です。これはデフォルトです。匿名アクセスを示します。
Simple
クライアントは、ディレクトリにバインドするためにユーザー名とパスワードを入力する必要があります。
SSL
クライアントは、Secure Sockets Layer (SSL)またはTransport Layer Security (TLS)接続でディレクトリにバインドする必要があります。
SSLの場合、接続はLDAPSの2番目のポートに確立されます。TLSの場合は、接続はStart TLS操作を介して確立されます。どちらの場合も、証明書が提供される必要があります。SSLの設定については、第20.6項「SASL認証の使用」を参照してください。
SASL
クライアントは、Simple Authentication and Security Layer (SASL)メカニズム(たとえば、DIGEST-MD5やGSSAPI)を使用してディレクトリにバインドする必要があります。
認証メソッドに基づくバインド・ルールを設定するためのLDIF構文を次に示します:
authmethod = "authentication_method"
ここで、authentication_method
はnone
、simple
、ssl
またはsasl sasl_mechanism
です。
次の例は、authmethod
キーワードの典型的な仕様を示します:
authmethod = "none"
バインド・ルールの評価時に、認証はチェックされません。
authmethod = "simple"
クライアントがユーザー名とパスワードを使用してディレクトリにアクセスする場合、バインド・ルールはtrueと評価されます。
authmethod = "ssl"
クライアントがLDAPSで証明書を使用してディレクトリに対して認証される場合、バインド・ルールはtrueと評価されます。クライアントがLDAPSで簡易認証(バインドDNとパスワード)を使用して認証される場合、trueにはなりません。
authmethod = "sasl DIGEST-MD5"
クライアントがSASL DIGEST-MD5メカニズムを使用してディレクトリにアクセスする場合、バインド・ルールはtrueと評価されます。この他にSASLメカニズムをサポートしているのは、EXTERNALおよびGSSAPIです。
ssf
キーワード)バインド・ルールを使用すると、確立された接続で適用されている特定のレベルのセキュリティ強度係数(SSF)のみに基づいてバインドするように指定できます。接続のSSFは、接続で適用されている暗号の鍵の強度に基づいており、TLS/SSLまたはDIGEST-MD5/GSSAPIの機密保護接続または整合性接続のみに関連します。
セキュリティ強度係数に基づくバインド・ルールを設定するためのLDIF構文は、次のとおりです:
ssf
operator "
strength"
ここで、operatorは次の記号のいずれかになります:
=
(等しい)
!=
(等しくない)
>
(より大きい)
>=
(以上)
<
(より小さい)
<=
(以下)
強度は、接続で必要とされている暗号の鍵の強度を示す値で、0
から256
の値です。整合性が適用されているDIGEST-MD5/GSSAPI接続は、1
のSSFを持ちます。TLS/SSLとDIGEST-MD5/GSSAPIの機密保護接続は、ディレクトリ·サーバーとクライアントとの間で行われる暗号ネゴシエーションに基づいて、SSFの変数の値を持つことができます。接続のネゴシエートされたSSFが大きいほど、接続における暗号化は強力になります。次に例を示します:
ssf = "1";
は、整合性ssf = 1
のみが接続で適用されている場合のアクセスに対して、trueになります。
ssf!= "40";
は、ssf not equal 40
が接続で適用されている場合のアクセスに対して、trueになります。
ssf> "128";
は、ssf greater than 128
が接続で適用されている場合のアクセスに対して、trueになります。
ssf>= "128";
は、ssf greater than or equal 128
が接続で適用されている場合のアクセスに対して、trueになります。
ssf< "56";
は、ssf less than 56
が接続で適用されている場合のアクセスに対して、trueになります。
クリアな接続は、SSF0
になります。
次の項では、接続のセキュリティ強化係数キーワードに基づいた定義の方法について説明します。
次の表は、キー・サイズ・マッピングを暗号化する保護の品質(QOP)を説明します。
暗号 | QOP | 説明 |
---|---|---|
RC4 (40) |
低 |
40ビット・キーを使用したRC4暗号(廃止) |
RC4 (56) |
中 |
56ビット・キーを使用したRC4暗号 |
DES |
中 |
56ビット・キーを使用した暗号ブロック連鎖(CBC)モードのデータ暗号化規格(DES)の暗号 |
RC4 (128) |
高 |
128ビット・キーを使用したRC4暗号 |
トリプルDES |
高 |
各Eステージで同じ鍵を持つEDEのCBCモード(2キー・モードとも呼ばれます)のトリプルDES暗号(鍵の長さの合計は112ビット) |
暗号 | TLS RFC | キー・サイズ | 説明 |
---|---|---|---|
RC2_CBC_40 |
4346 |
40 |
暗号ブロック連鎖(CBC)モードのRC2暗号(廃止) |
RC4_40 |
4346 |
40 |
RC4暗号(廃止) |
DES40_CBC |
4346 |
40 |
暗号ブロック連鎖(CBC)モードのDES 40ビット暗号(廃止) |
DES_CBC |
4346 |
56 |
暗号ブロック連鎖(CBC)モードのDES 56ビット暗号 |
3DES_EDE_CBC |
4346 |
112 |
TDES |
RC4_128 |
4346 |
128 |
RC4暗号 |
IDEA_CBC |
4346 |
128 |
暗号ブロック連鎖(CBC)モードの国際データ暗号化アルゴリズム(IDEA)の暗号 |
SEED_CBC |
4162 |
128 |
暗号ブロック連鎖(CBC)モードのSEED暗号 |
CAMELLIA_128_CBC |
4132 |
128 |
暗号ブロック連鎖(CBC)モードのCamellia暗号 |
AES_128_CBC |
3268 |
128 |
暗号ブロック連鎖(CBC)モードの拡張暗号化規格(AES) |
AES_256_CBC |
3268 |
256 |
暗号ブロック連鎖(CBC)モードの拡張暗号化規格(AES) |
CAMELLIA_256_CBC |
4132 |
256 |
暗号ブロック連鎖(CBC)モードのCamellia暗号 |
AES_256_GCM |
5288 |
256 |
Galois Counter Mode (GCM)のAES |
次のACIは、SSF強度が128以上の接続を介してのみ、ユーザーに自身のパスワードを変更することを許可します:
(targetattr="userPassword||authPassword")(version 3.0; acl "User change pwd"; (allow (write) userdn="ldap:///self" and ssf >= "128");)
次の項では、Oracle Unified Directoryのアクセス制御モデルがOracle Directory Server Enterprise Editionで提供されるアクセス制御モデルとどのように異なるのかを説明します。
グローバルACIの構成は、2つの点で、Oracle Directory Server Enterprise EditionのグローバルACIの実装と異なります:
ds-config-global-aci
属性は、ACIをルートのDSEエントリに配置するのではなく、cn=Access Control Handler,cn=config
エントリ(第8.1項「アクセス制御の原則」を参照)のグローバルACIを指定します。
ACIでターゲット・キーワードを指定することで、グローバルACIの有効範囲を絞り込むことができます。たとえば、次のグローバルACIは、接尾辞dc=example,dc=com
の下のエントリへの匿名の読取りアクセスを制限します:
ds-cfg-global-aci: (target="dc=example,dc=com") (targetattr!="userPassword||authPassword") (version 3.0; acl "Anonymous read access only under dc=example,dc=com suffix"; allow (read,search,compare) userdn="ldap:///anyone";)
(target="dc=example,dc=com")
式の削除は、Oracle Unified Directoryのすべてのエントリに対してACIをグローバルにします。
ACIのDNワイルドカード・マッチングの実装は、次の使用法をサポートしています:
ワイルドカードはいくつでも相対識別名(RDN)の属性値に使用することができ、それらはゼロ個以上の文字と一致します(文字列のフィルタと同様)。たとえば、バインド・ルールは次のDNに一致します。uid=bob jensen,dc=example,dc=com
およびuid=bjensen,dc=example,dc=com
:
userdn="ldap:///uid=b*jensen*,dc=example,dc=com"
最初のRDNの属性のタイプが一致しないため、DNcn=bill jensen,dc=example,dc=com
と一致しません。
単一のワイルドカードも、任意のRDNの属性タイプと一致させるために使用することができます。(この場合のワイルドカードは、簡略化して省略することができます)。たとえば、これら2つのバインド・ルールは、まったく同じ動作をします:
userdn="ldap:///*=bjensen, dc=example, dc=com" userdn="ldap:///bjensen, dc=example, dc=com"
それらは両方とも、次のDNに一致します: uid=bjensen,dc=example,dc=com
およびcn=bjensen,dc=example,dc=com
単一のワイルドカードは、単一または複数の値を持つことのできる1つのRDNコンポーネントと正確に一致させるのに使用することができます。たとえば、次のバインド・ルールはDNuid=jensen,dc=example,dc=com
およびcn=smith,dc=example,dc=com
に一致します:
userdn="ldap:///*,dc=example,dc=com"
ダブル・ワイルドカードは1つ以上のRDNコンポーネントを一致させるのに使用できます。たとえば、次のバインド・ルールはDNuid=jensen,ou=people,dc=example,dc=com
およびuid=jensen,ou=sales,ou=people,dc=example,dc=com
に一致します:
userdn="ldap:///uid=bjensen,**,dc=example,dc=com"
Oracle Directory Server Enterprise Editionは権限をサポートしていません。特権サブシステム(第23.2項「rootユーザーと特権サブシステム」を参照してください)は、2つの点でACIに影響を与えます:
ds-privilege-name: bypass-acl
権限を持つユーザーは、アクセス制御の評価をバイパスすることができます。
アクセス制御ルールを変更する必要のあるユーザーは、ds-privilege-name: modify-acl
権限が必要です。
注意: Lightweight Directory Access Protocol (LDAP)のプロキシ設定された認可制御( プロキシ・ユーザーがACIアクセス評価をバイパスするのを許可するため、一般に、ユーザーは |
targetscope
キーワードtargetscope
キーワードは新しいスコープが組み込まれていることにより、Oracle Directory Server Enterprise Editionとは異なります:
subordinate
ターゲット・リソースの下のサブツリーにのみACIを制限します。
Oracle Unified Directoryは、LDAPの変更増分の拡張(https://opends.dev.java.net/public/standards/rfc4525.txt
)をサポートします。この拡張は、Oracle Directory Server Enterprise Editionではサポートされていません。増分される属性は、書込み権限を持っている必要があります。
Oracle Unified DirectoryはACIでマクロをサポートします。
roledn
キーワードロールはOracle Unified Directoryでサポートされていないので、roledn
キーワードは使用できません。同等の機能は、グループを使用することで得ることができます。
ディレクトリ・ツリー構造を繰り返し使用する組織では、ディレクトリ・ツリー内のACIの数を最適化するためにマクロを使用することにより、パフォーマンスとACIのメモリー使用量を向上させることができます。ディレクトリ・ツリー内のACIの数を減らすことによって、アクセス制御ポリシーの管理が簡単になります。
この項では、マクロACIとその使用法について説明します。この項の内容は、次のとおりです:
マクロは、ACIの中でDN、またはDNの一部を表現するために使用されるプレースホルダです。マクロを使用すると、ACIのターゲット部分またはバインド・ルール部分、あるいはその両方のDNを表せます。実際の処理では、Directory ServerがLDAP操作を受け取ると、LDAP操作のターゲットとなるリソースに対してACIマクロのマッチングが行われます。このマッチングは、一致する部分文字列(存在する場合)を確認するために行われます。一致が検出された場合は、一致した部分文字列を使用してバインド・ルール側のマクロが展開され、その展開バインド・ルールを評価してリソースへのアクセス権が決定されます。
マクロACIを使用する利点と最も効果的に機能させる方法を、例を通して説明します。図8-1は、ACIの合計数を効果的に減らすために、マクロACIを使用しているディレクトリ・ツリーを示しています。
この例では、同じツリー構造のサブドメインが同じパターンで繰り返されています(ou=groups,
ou=people
)。example.com
ディレクトリ・ツリーには、dc=hostedCompany2, dc=example,dc=com
およびdc=hostedCompany3,dc=example,dc=com
という接尾辞が格納されているので、このパターンはツリー内でも繰り返されています。ただし、前述の図には示されていません。
ディレクトリ・ツリーに適用されるACIでも、同じパターンが繰り返されています。たとえば、次のACIはdc=hostedCompany1,dc=example,dc=com node:
上に置かれています。
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
このACIは、dc=hostedCompany1,dc=example,dc=com
ツリー内のすべてのエントリに対する読取りおよび検索権限をDomainAdminsグループに与えます。
次のACIは、dc=hostedCompany1,dc=example,dc=com
ノード上に置かれています:
aci: (targetattr="*") (targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
次のACIは、dc=subdomain1, dc=hostedCompany1, dc=example, dc=com
ノード上に置かれています:
aci: (targetattr="*") (targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1, dc=example,dc=com";)
次のACIは、dc=hostedCompany2, dc=example, dc=com
ノード上に置かれています:
aci: (targetattr="*") (targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany2, dc=example,dc=com";)
次のACIは、dc=subdomain1, dc=hostedCompany2, dc=example, dc=com node
上に置かれています:
aci: (targetattr="*") (targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany2, dc=example,dc=com";)
前述の4つのACIの違いは、groupdn
キーワード内で指定されているDNのみです。DN用のマクロを使用することによって、これらのACIを、1つのACIにまとめてルート・ツリーのdc=example,dc=com
ノードに置くことができます。このマクロACIは次のようになります:
aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com") (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
以前は使用されなかったtarget
キーワードは、新しいACIで使用されます。
この例では、ACIの数が4から1に減っています。本当の決定要因は、ディレクトリ・ツリー全体で繰り返されているパターンの数です。
マクロACIには、DNまたはDNの一部を置き換える次のタイプの式があります:
($dn)
[$dn]
($attr
.attrName
)。ここで、attrName
はターゲット・エントリに含まれる属性を表します。
この項では、userdn、roledn、groupdnおよびuserattrのようなバインド資格証明を提供するために使用されるACIキーワードをまとめてACIのサブジェクトと呼びます。サブジェクトは、ACIの適用対象を決定します。
表8-2は、特定のACIキーワードの置換に使用できるマクロを示しています。
表8-2 マクロACIキーワード
マクロ | 説明 | ACIキーワード |
---|---|---|
|
targetでマッチングに使用され、サブジェクト内で直接置き換えられます。たとえば、targetまたはtargetfilterと一致し、一致した値はuserdn、groupdnまたはuserattrに置き換えます。 |
(target、targetfilter)および(userdn、groupdn、userattr) |
|
サブジェクトのサブツリー内で機能する複数のRDNに置き換えられます。 |
(targetfilter)および(userdn、groupdn、userattr) |
|
ターゲット・エントリの |
userdn、groupdn、userattr |
マクロACIキーワードには、次のような制限が適用されます:
($dn)
マクロをサブジェクトで使用する場合は、($dn)
を含むターゲットを定義する必要があります。
[$dn]
マクロをサブジェクトで使用する場合は、($dn)
を含むターゲットを定義する必要があります。
($dn)
マクロと[$dn]
マクロの両方を、サブジェクトで($attr.
attrName
)
マクロと組み合せることができます。
次の項では、マクロACIの評価メカニズムを説明します。この項の内容は、次のとおりです:
($dn)
マッチングACIのtargetに含まれる($dn)
マクロを、LDAPリクエストのターゲットとなるエントリと比較することによって、実際に置き換えられる値が決定します。たとえば、このエントリをターゲットとするLDAPリクエストがあるとします:
cn=all, ou=groups, dc=subdomain1, dc=hostedCompany1, dc=example, dc=com
また、次のようなtargetを定義しているACIもあるとします:
(target="ldap:///ou=Groups,($dn),dc=example,dc=com")
($dn)
マクロは"dc=subdomain1, dc=hostedCompany1"
と一致します。この部分文字列は、その後、ACIのサブジェクトの置換に使用されます。
サブジェクト内での($dn)の置換
ACIのサブジェクト内では、($dn)
マクロはターゲット内で一致する部分文字列全体に置き換えられます。例:
groupdn="ldap:///cn=DomainAdmins,ou=Groups,($dn),dc=example,dc=com"
このシナリオでは、ターゲット内の($dn)
に一致する文字列がdc=subdomain1, dc=hostedCompany1
である場合、同じ文字列がサブジェクト内で使用されます。サブジェクトは次のように展開されます:
groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"
ACIのtargetfilter内では、($dn)
マクロはターゲット内で一致する部分文字列全体に置き換えられます。例:
(targetattr="*")(targetfilter=(&(objectClass=nsManagedPerson)(!(memberOf=cn=ServiceAdministrators,ou=Groups,($dn),o=ace industry,c=us))(!(memberOf=cn=Service Help Desk Administrators,ou=Groups,($dn),o=ace industry,c=us))))
targetfilterは次のようになります:
(targetattr="*")(targetfilter=(&(objectClass=nsManagedPerson) (!(memberOf=cn=ServiceAdministrators,ou=Groups,dc=subdomain1, dc=hostedCompany1,o=ace industry,c=us)) (!(memberOf=cn=Service Help Desk Administrators,ou=Groups,dc=subdomain1,dc=hostedCompany1,o=ace industry,c=us))))
マクロが展開されると、通常のプロセスに続いてDirectory ServerがACIを評価し、アクセス権が与えられるかどうかを決定します。
注意: 標準のACIとは異なり、マクロ置換を使用したACIはターゲット・エントリの子へのアクセスを許可する必要はありません。これは、子のDNがターゲットとなった場合に、置換によってサブジェクト文字列内に有効なDNが作成されない可能性があるためです。 |
サブジェクト内での[$dn]の置換
[$dn]
の置換メカニズムは、($dn)
と若干異なっています。一致する対象が見つかるまで、一番左にあるRDNコンポーネントを外しながら、ターゲット・リソースのDNが数回検証されます。
cn=all,ou=groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com
サブツリーをターゲットとするLDAPリクエストで、次のようなACIのシナリオがあるとします:
aci: (targetattr="*") (target="ldap:///ou=Groups,($dn),dc=example,dc=com") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:/cn=DomainAdmins,ou=Groups,[$dn], dc=example,dc=com";)
サーバーは次のように処理を続け、このACIを展開します:
targetの($dn)
とdc=subdomain1,
dc=hostedCompany1
が一致することをサーバーが確認します。
サブジェクトの[$dn]
をdc=subdomain1, dc=hostedCompany1
で置き換えます。
この結果、サブジェクトはgroupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"
になります。バインドDNがそのグループのメンバーであるため、アクセスが許可される場合は、マクロの展開は停止し、ACIが評価されます。バインドDNがメンバーでない場合は、処理を継続します。
サブジェクトの[$dn]
をdc=hostedCompany1
で置き換えます。
この結果、サブジェクトはgroupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com"
になります。バインドDNはこのグループのメンバーであることを再びテストされ、メンバーである場合は、ACIは完全に評価されます。ただし、バインドDNがメンバーでない場合は、マクロの展開は最後に一致したRDNで置き換えたところで終了し、このACIに対する評価は終了します。
[$dn]
マクロの利点は、ドメインレベルの管理者に対して、ディレクトリ・ツリー内のすべてのサブドメインへのアクセス権を柔軟な方法で与えられることです。したがって、[$dn]
マクロは、ドメイン間の階層的な関係を表す場合に便利です。
たとえば、次のようなACIがあるとします:
aci: (target="ldap:///ou=*,($dn),dc=example,dc=com") (targetattr="*") (targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn= "ldap:/cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
このACIは、cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com
のメンバーに対して、dc=hostedCompany1
の下にあるすべてのサブドメインへのアクセス権を与えます。したがって、そのグループに属する管理者は、たとえばサブツリーou=people,dc=subdomain1.1,dc=subdomain1
にアクセスできます。
ただし、同時に、cn=DomainAdmins,ou=Groups, dc=subdomain1.1
のメンバーのou=people,dc=subdomain1, dc=hostedCompany1
およびou=people,dc=hostedCompany1
ノードに対するアクセスは拒否されます。
($attr.attrname)
マクロは、常にACIのサブジェクト部分で使用されます。たとえば、次のgroupdn
を定義できます。
groupdn = "ldap:/cn=DomainAdmins,ou=($attr.ou),dc=HostedCompany1,dc=example,dc=com"
ここで、サーバーが次のエントリをターゲットとするLDAP操作を受け取ったとします:
dn: cn=Babs Jensen,ou=People,dc=HostedCompany1,dc=example,dc=com cn: Babs Jensen sn: Jensen ou: Sales ...
ACIのgroupdn
部分を評価するために、サーバーはターゲット・エントリに格納されているou
属性の値を読み取ります。その後、サブジェクト内でこの値を置換してマクロを展開します。この例では、groupdn
は次のように展開されます:
groupdn= "ldap:///cn=DomainAdmins,ou=Sales,dc=HostedCompany1,dc=example,dc=com"
続いて、通常のACI評価アルゴリズムに従って、Directory ServerがACIを評価します。
マクロ内で指定された属性が複数の値を持つ場合は、それぞれの値を使用して順にマクロが展開されます。最初にマッチングに成功した値が使用されます。