web-dev-qa-db-ja.com

OpenLDAPの高度なACL構成

OpenLDAPサーバーに複数のDITがあります。ユーザーcn = configをルートにして、cn = configがすべてのDIT(各DIT)にルートアクセスできるようにしました。さらに、cn = admin、$ supfixとしてIDが付けられたDITごとの管理者がいます[たとえば、cn = admin、dc = example、dc = comなど]。

AdminオブジェクトとuserオブジェクトにカスタムNAME属性を追加しました。属性の名前は「serviceLevel」で、値は「一時停止」または「通常」のいずれかです。この属性はオプションであり、存在しない場合は通常と解釈され、一時停止されません。

現在、serviceLevelが「一時停止」に設定されている場合、ACLは通常のユーザーを一時停止し、ローカル/ DIT管理者を一時停止しません。通常のユーザーのように、管理者が認証できないようにする必要があります。

現在のLDIF設定ACLのサンプルは次のとおりです。

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
  filter=(serviceLevel=suspended)
  by dn="cn=config" write
  by * none
olcAccess: {1}to attrs=userPassword,shadowLastChange
  filter=(!(serviceLevel=suspended))
  by self write
  by anonymous auth
  by dn="cn=admin,dc=directory,dc=com" write
  by dn="cn=config" write
  by * none
olcAccess: {2}to dn.base="" by * read
olcAccess: {3}to *
  filter=(serviceLevel=suspended)
  by dn="cn=config" write
  by * none
olcAccess: {4}to *
  filter=(!(serviceLevel=suspended))
  by self write
  by dn="cn=admin,dc=directory,dc=com" write
  by dn="cn=config" write
  by * read

ドメイン管理者が私のACLをすり抜ける理由がわかれば教えてください。これらのルールを正しく設定する方法がわからないようです。

3
Moshe Shmukler

あなたは必要以上に複雑なアプローチを取っていると思います。 DITを無効にするには、対応するデータベースを無効にします。これは、olcHidden: TRUEを設定することで実現できます。

olcHidden:TRUE | FALSE
データベースを使用してクエリに回答するかどうかを制御します。非表示になっているデータベースは、クエリに応答するために選択されることはなく、データベースに設定されているサフィックスは、他のデータベースとの競合のチェックで無視されます。デフォルトでは、olcHiddenはFALSEです。

ldapmodify <<EOF
dn: olcDatabase={2}hdb,cn=config
replace: olcHidden
olcHidden: TRUE
EOF

追記:

定義されているアクセス制御ポリシーに関係なく、rootdnには、あらゆるものに対する完全な権限(つまり、認証、検索、比較、読み取り、書き込み)が常に許可されます。 。

結果として、句の中にrootdnを明示的にリストすることは無意味です(そしてパフォーマンスの低下につながります)。 -- OpenLDAP Software 2.4 Administrator's Guide

2
84104