私はレプリケーション機能を備えた OpenLDAP サーバーを操作していますが、レプリケーション ユーザーにソース ホスト内のすべてのデータを読み取る権限を与えるために適切な ACL を設定する必要がありました。
読んだあとこの記事この一連のルールを作成しました:
olcAccess: {0}to * by dn.base="cn=admin,dc=example,dc=com" manage
olcAccess: {1}to * by dn.base="uid=rpuser,dc=example,dc=com" read
olcAccess: {2}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {3}to attrs=shadowLastChange by self write by * read
olcAccess: {4}to * by users read
私が達成したかったことは次のとおりです。
- 管理者は制限なく何でもできる
- レプリケーションユーザーはすべての内容を読み取ることができます
- ユーザーはパスワードを変更できる
- ディレクトリへのアクセスはログインしたユーザーのみ可能であり、匿名アクセスはできません。
上記の ACL をサーバーに設定した後、レプリケーション ユーザーがまったくログインできなくなります。なぜこのようなことが起こるのかわかりません。レプリケーション ユーザーの DN は正しく、私の知る限りでは一致するはずです...
ログイン試行後のサーバーログ:
slapd[3475]: => access_allowed: result not in cache (userPassword)
slapd[3475]: => access_allowed: auth access to "uid=rpuser,dc=example,dc=com" "userPassword" requested
slapd[3475]: => acl_get: [1] attr userPassword
slapd[3475]: => acl_mask: access to entry "uid=rpuser,dc=example,dc=com", attr "userPassword" requested
slapd[3475]: => acl_mask: to value by "", (=0)
slapd[3475]: <= check a_dn_pat: cn=admin,dc=example,dc=com
slapd[3475]: <= acl_mask: no more <who> clauses, returning =0 (stop)
slapd[3475]: => slap_access_allowed: auth access denied by =0
slapd[3475]: => access_allowed: no more rules
私の理解が正しければ、最初の ACL のみがチェックされるのでしょうか?
答え1
これらの ACL はテストされていませんが、動作するはずです:
olcAccess: {0}to * by dn.base="cn=admin,dc=example,dc=com" manage by * break
olcAccess: {1}to * by dn.base="uid=rpuser,dc=example,dc=com" read by * break
olcAccess: {2}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {3}to attrs=shadowLastChange by self write by * read
olcAccess: {4}to * by users read
最初の 2 つのルールでが必要なby * break
ので、特定の句に一致がない場合、by
次のルールがチェックされます。by * break
または はattrs=userPassword
必要ありませんattrs=shadowLastChange
。 へのフォールバックはありませんto * by users read
。