OpenLDAPでユーザ管理 (7) で管理用のエントリを作成したが、それがどのように使われるかを書いていなかった。
slapd の ACL (Access Control List) によるアクセス制御に用いる。
openldap authentication on netbsd を参考に、/usr/pkg/etc/openldap/slapd.conf に以下のような記述を追加する。
access to attrs=userPassword by dn="cn=nss,dc=example,dc=co,dc=jp" write by anonymous auth by self write by * none access to attrs=uidNumber,gidNumber,uid,homeDirectory by dn="cn=nss,dc=example,dc=co,dc=jp" write by self read by * read access to * by dn="cn=nss,dc=example,dc=co,dc=jp" write by self write by * read
ここには “access to” で始まる3つのブロックがある。行頭が空白の行は継続行だ。
1つ目のブロックは、属性 (attrs) が “userPassword” に一致するデータに関するアクセス制御を表す。
つまり保存されたパスワード文字列 (またはその暗号化またはハッシュ化された文字列)に対するアクセス許可が記述されており、”attrs=userPassword” で制御の対象がマッチする条件を記述した後に、誰がどのようにアクセスできるかを示した記述が “by” で始まる記述として続く。こちらは先頭から順に検査され、先に一致したものが使用される。
1番目の ‘by dn=”cn=nss,dc=example,dc=co,dc=jp” write’ が、以前定義した管理用の DN “cn=nss,dc=example,dc=co,dc=jp” で接続した場合の制御で、ここでは “write”、つまり、管理者はパスワードの書き込みが許可される。
2番目の ‘by anonymous auth’ は、匿名 (anonymous) で接続した場合。この場合は “auth”、つまり匿名で接続した場合は認証に限って許可される。パスワード文字列を読み出すことはできない。
3番目の ‘by self write’ は、自分が接続した場合。参照している DN と接続に用いる DN が一致している場合だ。この場合は “write”、つまり、自分のパスワードだけは書き込みが許可される。
4番目、最後の ‘by * none’ は、その他の場合。管理者でもなく、自分でもなく、認証の際に使用される匿名でもない、という場合。ようするに、他人が接続した場合だ。この場合は “none”、全てが許可されない。パスワード文字列の読み出しは不要だし、認証の必要もない(通常の認証は匿名で行われる)
2つ目のブロックは、属性が “uidNumber”, “gidNumber”, “uid”, “homeDirectory” の場合。これらは誰でも読める必要がある。また、本人が書き換えてはいけない項目でもある。
3つ目のブロックは、その他の場合。誰でも読める公開情報で、本人が更新できるようにする。