OpenLDAPでユーザ管理 (10)

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つ目のブロックは、その他の場合。誰でも読める公開情報で、本人が更新できるようにする。