12.7. ACI ターゲットの定義
アクセス制御手順 (ACI) のターゲットルールは、Directory Server が ACI を適用するエントリーを定義します。ターゲットを設定しない場合、ACI は aci
属性が含まれるエントリーと以下のエントリーに適用されます。
ACI では、以下の強調表示された部分がターゲットルールになります。
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
複雑な ACI の場合、Directory Server は ACI で異なるキーワードを持つ複数のターゲットルールをサポートします。
(target_rule_1)(target_rule_2)(...)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
複数のターゲットルールを指定した場合に、その順番は関係ありません。以下のキーワードはそれぞれ、ACI で一度だけ使用できることに注意してください。
-
target
-
targetattr
-
targetattrfilters
-
targetfilter
-
target_from
-
target_to
12.7.1. ターゲットルールの構文
ターゲットルールの一般的な構文は、以下のとおりです。
(keyword comparison_operator "expression")
-
keyword
: ターゲットの種類を設定します。 comparison_operator
: 有効な値は=
および!=
で、ターゲットが式で指定されたオブジェクトであるかを示します。警告セキュリティー上の理由から、Red Hat は、他のすべてのエントリーまたは属性で指定の操作を許可するため、
!=
演算子を使用しないことを推奨します。以下に例を示します。(targetattr != "userPassword");(version 3.0; acl "example"); allow (write) ... );
前の例では、ACI を設定する識別名 (DN) の下にある
userPassword
属性以外の属性の設定、更新、または削除を行うことができます。ただし、これにより、ユーザーはこの属性への書き込みアクセスを許可するaci
属性を追加することもできます。-
expression
: ターゲットを設定し、引用符で囲む必要があります。式自体は使用するキーワードによって異なります。
12.7.2. ディレクトリーエントリーのターゲット
識別名 (DN) およびその下のエントリーに基づいてアクセスを制御するには、アクセス制御手順 (ACI) の target
キーワードを使用します。target
キーワードを使用するターゲットルールは、DN を式として取ります。
(target comparison_operator "ldap:///distinguished_name")
対象となる DN またはその上位 DN に、target
キーワードで ACI を設定する必要があります。たとえば、ou=People,dc=example,dc=com をターゲットにする場合、ACI を ou=People,dc=example,dc=com または dc=example,dc=com のいずれかに設定する必要があります。
例12.1 target キーワードの使用
ou=People,dc=example,dc=com エントリーに保存されているユーザーを有効にして、独自のエントリー内の全属性を検索および表示するには、以下を実行します。
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
acl "Allow users to read and search attributes of own entry"; allow (search, read)
(userdn = "ldap:///self");)
target キーワードでのワイルドカードの使用
*
ワイルドカード文字ターゲットに複数のエントリーを使用できます。
以下のターゲットルールの例は、uid 属性が文字 a
で始まる値に設定される ou=People,dc=example,dc=com
のすべてのエントリーと一致します。
(target = "ldap:///uid=a*,ou=People,dc=example,dc=com")
ワイルドカードの位置に応じて、ルールは属性値だけでなく、完全な DN にも適用されます。そのため、ワイルドカードを DN の一部の代わりに使用できます。
例12.2 ワイルドカードを使用したディレクトリーエントリーのターゲット
次のルールは、dc=example,dc=com
ツリー内のすべてのエントリーを対象とし、uid
属性が一致するもので、dc=example,dc=com
エントリー自体に格納されているエントリーだけではありません。
(target = "ldap:///uid=user_name*,dc=example,dc=com")
以前のターゲットルールは、以下のような複数のエントリーと一致します。
-
uid=user_name,dc=example,dc=com
-
uid=user_name,ou=People,dc=example,dc=com
-
uid=user_name2,dc=example,dc=com
Directory Server は、DN の接尾辞部分でのワイルドカードをサポートしません。たとえば、ディレクトリーの接尾辞が dc=example,dc=com
の場合は、(target = "ldap:///dc=*.com")
などのように、この接尾辞でワイルドカード付きのターゲットは使用できません。
12.7.3. ターゲット属性
アクセス制御手順 (ACI) のアクセスを特定の属性に制限するには、targetattr
キーワードを使用します。たとえば、このキーワードは以下を定義します。
- 読み取り操作では、どの属性がクライアントに返されるか
- 検索操作では、どのような属性が検索されるのか
- 書き込み操作では、どの属性がオブジェクトに書き込むことができるか
- add 操作では、新規オブジェクトの作成時に追加できる属性
特定の状況では、targetattr
キーワードを使用して、他のターゲットキーワードを targetattr
と組み合わせることで、ACI をセキュアにすることができます。ターゲットルールの高度な使用方法 を参照してください。
read
および search
操作では、デフォルトのターゲットは無属性です。targetattr
キーワードのない ACI は、add
、delete
などの完全なエントリーに影響する ACI にのみ役に立ちます。
targetattr
キーワードを使用するターゲットルールで複数の属性を分離するには、||
を使用します。
(targetattr comparison_operator "attribute_1 || attribute_2 || ...")
式に設定された属性はスキーマに定義する必要があります。
式に指定される属性は、ACI の作成先となるエントリーと、さらにターゲットルールによって制限されない場合は、それ以下のすべてのエントリーに適用されます。
例12.3 targetattr キーワードの使用
dc=example,dc=com
に保存されているユーザーとすべてのサブエントリーで、独自のエントリー内の userPassword
属性を更新するには、以下を実行します。
# ldapmodify -D "cn=Directory Manager" -W -H ldap::server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "userPassword") (version 3.0;
acl "Allow users updating own userPassword";
allow (write) (userdn = "ldap:///self");)
targetattr キーワードでのワイルドカードの使用
*
ワイルドカード文字を使用すると、たとえば全属性をターゲットにすることができます。
(targetattr = "*")
セキュリティー上の理由から、操作属性を含むすべての属性へのアクセスが許可されているため、targetattr
ではワイルドカードを使用しないでください。たとえば、ユーザーがすべての属性を追加または変更できると、ユーザーは追加の ACI を作成し、独自の権限を増やす可能性があります。
12.7.4. LDAP フィルターを使用したエントリーと属性の対象
特定の基準に一致するエントリーのグループを対象にするには、LDAP フィルターで targetfilter
キーワードを使用します。
(targetfilter comparison_operator "LDAP_filter")
フィルター式は、標準の LDAP 検索フィルターです。
例12.4 targetfilter キーワードの使用
department 属性が Engineering
または Sales
に設定されているすべてのエントリーを変更するために、cn=Human Resources,dc=example,dc.com
グループのメンバーにパーミッションを付与するには、以下を実行します。
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetfilter = "(|(department=Engineering)(department=Sales)")
(version 3.0; acl "Allow HR updating engineering and sales entries";
allow (write) (groupdn = "ldap:///cn=Human Resources,dc=example,dc.com");)
targetfilter
キーワードはエントリー全体を対象にします。これを targetattr
キーワードと組み合わせると、アクセス制御の手順 (ACI) はターゲットエントリーの属性のサブセットにのみ適用されます。フィルターに一致するエントリーの個別属性のターゲット設定 を参照してください。
LDAP フィルターは、ディレクトリーに分散されるエントリーおよび属性をターゲットにする場合に便利です。ただし、フィルターにはアクセスを管理するオブジェクトの名前を直接付けないため、結果が予測できないことがあります。フィルターが設定された ACI がターゲットとするエントリーのセットは、属性が追加または削除される際に変更する可能性が高くなります。したがって、ACI で LDAP フィルターを使用する場合は、ldapsearch
操作などで同じフィルターを使用して、正しいエントリーおよび属性を対象としていることを確認してください。
targetfilter キーワードでのワイルドカードの使用
targetfilter
キーワードは、標準の LDAP フィルターと同様にワイルドカードをサポートします。たとえば、値が adm
で始まるすべての uid 属性をターゲットにするには、次のコマンドを実行します。
(targetfilter = "(uid=adm*) ...)
12.7.5. LDAP フィルターを使用した属性値のターゲット
アクセス制御を使用すると、属性の特定値を対象にできます。つまり、ある属性の値がアクセス制御手順 (ACI) で定義されている基準を満たしていれば、その属性に対してパーミッションを付与したり、拒否したりすることができるのです。属性の値に基づいてアクセスを許可または拒否する ACI は、値ベースの ACI と呼ばれます。これは、ADD
および DEL
操作にのみ適用されます。検索権限を持つユーザーは、特定の値で制限できません。
値ベースの ACI を作成するには、以下の構文で targattrfilters
キーワードを使用します。
1 つの属性とフィルターの組み合わせが含まれる操作の場合:
(targattrfilters="operation=attribute:filter")
複数の属性とフィルターの組み合わせのある操作の場合:
(targattrfilters="operation=attribute_1:filter_1 && attribute_2:filter_2 ... && attribute_m:filter_m")
複数の属性とフィルターを組み合わせた 2 つの操作の場合。
(targattrfilters="operation_1=attribute_1_1:filter_1_1 && attribute_1_2:filter_1_2 ... && attribute_1_m:filter_1_m , operation_2=attribute_2_1:filter_2_1 && attribute_2_2:filter_2_2 ... & attribute_2_n:filter_2_n ")
上記の構文の例では、オペレーションを add
または del
のいずれかに設定できます。attribute:filter
の組み合わせは、フィルターと、フィルターが適用される属性を設定します。
以下では、フィルターを一致させる方法を説明します。
- エントリーを作成する際に、新しいエントリーの属性にフィルターが適用されると、その属性の各インスタンスがフィルターに一致する必要があります。
- エントリーとフィルターを削除するとエントリーの属性に適用される場合、その属性の各インスタンスはフィルターと一致する必要があります。
-
エントリーを変更し、操作が属性を追加する場合は、その属性に適用される
add
フィルターが一致している必要があります。 -
操作が属性を削除すると、その属性に適用される
del
フィルターが一致している必要があります。エントリーに属性の個別の値が置き換えられる場合は、add
およびdel
フィルターの両方が一致する必要があります。
例12.5 targattrfilters キーワードの使用
Admin
ロールを除く独自のエントリーにロールを追加できるようにする ACI を作成するには、値が 123
接頭辞で始まる限り、telephone
属性を追加するには、以下を実行します。
# ldapmodify -D "cn=Directory Manager" -W -H ldap::server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targattrfilters="add=nsroledn:(!(nsroledn=cn=Admin)) &&
telephoneNumber:(telephoneNumber=123*)") (version 3.0;
acl "Allow adding roles and telephone";
allow (add) (userdn = "ldap:///self");)
12.7.6. ソースおよび宛先 DN のターゲット
特定の状況では、管理者がディレクトリーエントリーを移動できるようにします。アクセス制御手順 (ACI) で target_from
および target_to
キーワードを使用すると、ユーザーを有効にしなくても、操作の送信元および宛先を指定できます。
- ACI に設定される別のソースからエントリーを移動します。
- エントリーを ACI のセットとして別の宛先に移動するには、以下のコマンドを実行します。
- ソースの識別名 (DN) から既存のエントリーを削除します。
- 宛先 DN に新規エントリーを追加するには、以下を行います。
例12.6 target_from および target_to キーワードの使用
uid=user,dc=example,dc=com
アカウントがユーザーアカウントを cn=staging,dc=example,dc=com
エントリーから cn=people,dc=example,dc=com
に移動するようにするには、以下を実行します。
# ldapmodify -D "cn=Directory Manager" -W -H ldap:server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target_from="ldap:///uid=*,cn=staging,dc=example,dc=com")
(target_to="ldap:///cn=People,dc=example,dc=com")
(version 3.0; acl "MODDN from"; allow (moddn))
userdn="ldap:///uid=user,dc=example,dc=com";)
ACI は、それらが定義されているサブツリーにのみ適用されます。この例では、ACI は dc=example,dc=com
サブツリーにのみ適用されます。
target_from
または target_to
キーワードが設定されていない場合は、ACI がソースまたは宛先と一致します。