LDAPのデータはいろいろ重要データが入っています。中には人に見られたくないデータもある。なもので、ユーザ間で見られても良いデータ、見られると嫌なデータを分けておこうと思います。
私のポリシーは以下で。
OpenLDAPにはアクセスリストという便利な機能があります。これを用いることで、各ユーザのアクセス制御が可能です。 SLAPD.ACCESSのManページ[3]とか見ると良いですかね。構文は
access to <what> [ by <who> <access> [ <control> ] ]+
詳しくは、SLAPD.ACCESSのManページ[3]を見てやってください。
さて、アクセスリストのポリシー実現方法を具体的に。
access to attrs=userPassword,sambaNTPassword by self write by dn="cn=Manager,dc=example,dc=com" write by dn="cn=syncuser,dc=example,dc=com" read by anonymous auth by * none
さて。userPasswordとsambaNTPasswordは、
access to dn.regex="ou=(.+),ou=Address,,dc=example,dc=com" by self write by dn="uid=$1,ou=People,dc=example,dc=com" write by dn="cn=Manager,dc=example,dc=com" write by dn="cn=syncuser,dc=example,dc=com" read by anonymous auth by * none
さてー、今度は記号が出てきましたね…正規表現です。(.+)は、任意の文字列にマッチする、を表現します。つまりうちのポリシーの場合は、ユーザごとにuidと一致したouのアドレス帳を持つ設定にしてますので、対応する文字列が出てきますね。
で、2行飛ばして、uid=$1ってあるのわかりますかね?これは、後方検索といって、先の正規表現にマッチした文字列が代入されます。つまり、あるユーザのアドレス帳は、あるユーザだけ書き込み可能を意味します。つまりあるユーザのアドレス帳は
access to * by self write by users read by anonymous auth by * none
他の情報全ては
以上の設定を/etc/openldap/slapd.confに反映します。
access to attrs=userPassword,sambaNTPassword by self write by dn="cn=Manager,dc=example,dc=com" write by dn="cn=syncuser,dc=example,dc=com" read by anonymous auth by * none access to dn.regex="ou=(.+),ou=Address,,dc=example,dc=com" by self write by dn="uid=$1,ou=People,dc=example,dc=com" write by dn="cn=Manager,dc=example,dc=com" write by dn="cn=syncuser,dc=example,dc=com" read by anonymous auth by * none access to * by self write by users read by anonymous auth by * none
このアクセスリストは、上から順に評価されていきますので、順序は誤らないように注意してね。特に一番最後のaccess to *が頭にあると、全てが台無しでございます。気をつけてねー。
(This host) = https://femt.ddo.jp