ACL (Access Control List)

<what> - アクセス制御する対象の指定

【filter=<ldapfilter>】
filter=<ldapfilter>は、RFC4515に定義されている適正なLDAPフィルタを基にエントリを選択します。
filterを指定しない場合は、(objectclass=*)を指定したものとみなします。

リスト: アクセス制御規制を適用するフィルタの記述例

olcAccess: to filter="(&(objectClass=person)(cn=test*))"
by * read
olcAccess: to * by * none

この場合、フィルタにマッチ (objectClassにpersonが存在し、かつcnがtestで始まるエントリ)したエントリのみが参照可能です。

リスト: アクセス制御規制を適用するフィルタの記述例の確認
*次のエントリは、cn=guest0003のため、参照不可

# ldapsearch -LLL -x -b uid=guest0003,ou=people,dc=example,dc=valinux,dc=jp
No such object (32)

*次のエントリは条件を満たしているので参照可能

# ldapsearch -LLL -x -b uid=test0003,ou=people,dc=example,dc=valinux,dc=jp
dn: uid=test0003,ou=people,dc=example,dc=valinux,dc=jp
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: test0003
sn: test0003
givenName: test0003
uid: test0003
uidNumber: 1112
gidNumber: 513
homeDirectory: /home/test0003
loginShell: /bin/bash
gecos: System User
userPassword:: e2NyeXB0fXg=
sambaPwdLastSet: 0
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaPwdMustChange: 2147483647
displayName: test0003
sambaAcctFlags: [UX]
sambaSID: S-1-5-21-3826307713-1799070533-4243177101-3224

【attrs=<attrlist>】
attrs=<attrlist>は、アクセス制御規則を適用する属性を選択します。
属性型に加え、エントリ自体へのアクセス権を示すentry、エントリの子へのアクセス権を示すchildrenをカンマで区切って並べたものです。

リスト: アクセス制御規則を適用する属性の記述例

olcAccess: to *
    attrs=userPassword
    by self read
    by * auth
olcAccess: to * by * read

複数の属性を指定したい場合は、カンマ(‘,’)で区切ります。

リスト: アクセス制御規則を適用する複数属性の記述例

olcAccess: to *
    attrs=userPassword, homeDirectory
    by self read
    by * auth
olcAccess: to * by * read

上記例の場合、userPassword(複数属性指定の記述例の場合だと、併せてhomeDirectoryも)を除いた情報は参照可能です。
attrlistに加えた属性に関しては、自身のエントリ(バインドを行ったユーザ)のみ参照可能です。
下記の通り、userPasswordを除いた情報が参照できています。

リスト: アクセス制御規則を適用する複数属性の記述例の確認例(パスワード参照可能)

# ldapsearch -x -LLL -b uid=user002,ou=dev,dc=example,dc=valinux,dc=jp
dn: uid=user002,ou=dev,dc=example,dc=valinux,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user002
sn: user002
givenName: user002
cn: user002
displayName: test user002
uidNumber: 502
gidNumber: 500
gecos: user002
loginShell: /bin/bash
homeDirectory: /home/dev/user002
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 0
shadowMax: 99999
shadowLastChange: 15177 #

次のサンプルの場合、バインドを行っても、自身のエントリではないため、パスワードは参照できません。

リスト: アクセス制御規則を適用する複数属性の記述例の確認例(パスワード参照不可)

# ldapsearch -x -D uid=user001,ou=dev,dc=example,dc=valinux,dc=jp -w secret
-LLL -b uid=user002,ou=dev,dc=example,dc=valinux,dc=jp
dn: uid=user002,ou=dev,dc=example,dc=valinux,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user002
sn: user002
givenName: user002
cn: user002
displayName: test user002
uidNumber: 502
gidNumber: 500
gecos: user002
loginShell: /bin/bash
homeDirectory: /home/dev/user002
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 0
shadowMax: 99999
shadowLastChange: 15177

自身のエントリでは、パスワードの参照ができています。

リスト:アクセス制御規則を適用する複数属性の記述例の確認例(自身の場合パスワード参照可能)

# ldapsearch -x -D uid=user001,ou=dev,dc=example,dc=valinux,dc=jp -w secret
-LLL -b uid=user001,ou=dev,dc=example,dc=valinux,dc=jp
dn: uid=user001,ou=dev,dc=example,dc=valinux,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user001
sn: user001
givenName: user001
cn: user001
displayName: test user001
uidNumber: 501
gidNumber: 500
userPassword:: e1NTSEF9VEFzQWloM0VMQ3JVTjE1WU4rVk9veER0WXczQ0o4UGo=
gecos: user001
loginShell: /bin/bash
homeDirectory: /home/dev/user001
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 0
shadowMax: 99999
shadowLastChange: 15177

<who> - アクセス権を与える対象の指定

<who>には、アクセス権が与えられる実体 (entity) を指定します。1つのアクセス制御文には複数の <who>を指定可能です。すなわち、同じリソースへの異なるアクセス権を異なるアクセス者に適用することができます。 
<who>の書式は次の通りです。

リスト: <who>の書式

<who> ::= *
        anonymous
        users
        self[.<selfstyle>]

        dn[.<dnstyle>[,<modifier>]]=<DN>
        dnattr=<attrname>

        realanonymous
        realusers
        realself[.<selfstyle>]

        realdn[.<dnstyle>[,<modifier>]]=<DN>
        realdnattr=<attrname>

        group[/<objectclass>[/<attrname>]]
                [.<groupstyle>]=<group>
        peername[.<peernamestyle>]=<peername>
        sockname[.<style>]=<sockname>
        domain[.<domainstyle>[,<modifier>]]=<domain>
        sockurl[.<style>]=<sockurl>
        set[.<setstyle>]=<pattern>

        ssf=<n>
        transport_ssf=<n>
        tls_ssf=<n>
        sasl_ssf=<n>

        aci[=<attrname>]
        dynacl/name[/<options>][.<dynstyle>][=<pattern>]

        <style>={exact|regex|expand}
        <selfstyle>={level{<n>}}
        <dnstyle>={{exact|base(object)}|regex
                |one(level)|sub(tree)|children|level{<n>}}
        <groupstyle>={exact|expand}
        <peernamestyle>={<style>|ip|path}
        <domainstyle>={exact|regex|sub(tree)}
        <setstyle>={exact|regex}
        <modifier>={expand}

この中で使われているものは次の形式を持ちます。

<access> - 与えるアクセス権

<who> が持つアクセスレベルまたは固有のアクセス権を決定します。
アクセス権の指定には、アクセス権のレベルを指定する(<level>)ものと、アクセス権限を個別に指定する(<priv>)二通りの指定方法があります。
アクセス権を個別に指定する方法では、アクセス権限指示子という記号と併せて指定します。
<access>の書式は次の通りです。

リスト: <access>の書式

<access> ::= [[real]self]{<level>|<priv>}

<level> ::= none|disclose|auth|compare|search|read|write
        <priv> ::= {=|+|-}{w|r|s|c|x|d|0}+

指定可能なアクセス権のレベルは次の通りです。

指定可能なアクセス権限は次の通りです。

アクセス権限指示子の種類は次の通りです。

<control> - アクセス制御の評価

オプションの <control> はアクセス権限適用のフローを制御します。これには以下の表に示すパラメータを指定できます。