Re: ACI

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Craig White wrote:

I have personal address books...each user would have one - i.e.

ou=AddressBook,uid=craig,ou=People,dc=azapple,dc=com
ou=AddressBook,uid=jennifer,ou=People,dc=azapple,dc=com

and my thinking is that each person can read/write/delete/etc. their own
address book, authenticated users can read and anonymous is denied.
First, a comment on this: Does user craig really want user jennifer to see his "personal" addressbooks? Typically, "personal" addressbooks are only visible by the person that owns them. I know I'm questioning your requirements rather than telling you how to implement what you want, but thought I'd ask :)

Thus I created 3 rules and they aren't working because an
unauthenticated/anonymous bind still can view them...
My guess is that at the top of your tree, you have an aci that allows anonymous to see stuff (probably something like anonymous can read/search all but userpassword, etc). Aci's at the top are inherited "down the tree", so they are visible because of that, not because of your new aci's. It's usually hard to create a deny aci for a lower branch of the tree that works without breaking something else, and I always try to avoid deny aci's (because they always take precedence and can never be overridden by any allow aci's, causing some potentially unexpected results).

These are the 3 rules (which are applied to ou=People with the
expectation that each address book would inherit)...

(targetattr = "*") (target =
"ldap:///ou=AddressBook,uid=*,ou=People,dc=azapple,dc=com";) (version
3.0;acl "Personal Address Books Owner";allow (all)(userdn =
"ldap:///self";);)
Keep in mind that self applies to the entry that is binding (i.e. the users entry), not entries under it - i.e. you are defining what the user can do to their own records, not the entries under the ou=addressbook,... What I believe this is saying is that if the users entry is, say uid=craig,ou=addressbook,uid=something,ou=people,dc=azapple,dc=com, they can edit any part of their own entry, which is clearly not what you want. (you want uid=craig,ou=people,dc=azapple,dc=com to edit anything under ou=addressbook,uid=craig,...). So, since you are never binding as the addressbook entries themselves, the self rule doesn't let you edit those entries.

(targetattr = "*") (target =
"ldap:///ou=AddressBook,uid=*,ou=People,dc=azapple,dc=com";) (version
3.0;acl "Personal Address Books Non Owner";allow
(read,compare,search)(userdn = "ldap:///all";);)

(targetattr = "") (target = "ldap:///ou=AddressBook,uid=*,ou=People,
dc=azapple,dc=com") (version 3.0;acl "Personal Address Books";deny
(all)(userdn = "ldap:///anyone";);)
OK - you have the deny rule, but you're targetattribute is "", which means no target attributes are defined. The default rule (probably in dc=azapple,dc=com) probably allows to all but userpassword or such - anything it allows that this does not deny is allowed, so this effectively does nothing - you can make targetattr=*, but... hmm - I never use deny, so I'm not sure if this will deny everyone (i.e. not just anonymous users, but _all_ users, irregardless how or if they are bound - like I said, deny can do unexpected things if you don't understand it really well).

are these supposed to be separate rules or combined into 1 rule?
Separate rules - to apply different things to different people (self, all, anyone) you have to have differnet rules.

and lastly...despite the documentation, I can't get ldapsearch to return
the list of ACI's...

./ldapsearch -h localhost -D 'cn=Directory Manager' -w - '(aci=*)'
aci's are operational attributes, which means you have to specifically ask for it - i.e.:

./ldapsearch -h localhost -D 'cn=Directory Manager' -w - '(aci=*)' aci

(note the aci added to the end.)

A couple ways to do what you want:
First, instead of putting the aci on the ou=people, put it on each ou=addressbook entry - i.e. something like:

dn: ou=addressbook,uid=craig,ou=people,dc=azapple,dc=com
ou: addressbook
objectclass: top
objectclass: organizationunit
aci: (targetattr = "*") (version 3.0;acl "Personal Address Books Owner";allow (all)(userdn =
"ldap:///uid=craig,ou=people,dc=azapple,dc=com";);)
aci: (targetattr = "*") (version 3.0;acl "Personal Address Books Non Owner";
allow(read,compare,search)(userdn = "ldap:///all";);)
aci: (targetattr = "*") (version 3.0;acl "Personal Address Books";deny (all)(userdn = "ldap:///anyone";);)

You don't need the target, because it defaults to the entry it's on, which is what you want. I'm still not sure that the deny is gonna work right, but give it a try. Note that you have to define the allow (all) to be the dn of the user you want. You might be able to use ldap:///parent, but I think you would then have to bind as ou=addressbook,uid=craig... to create entries directly under ou=addressbook,uid=craig..., which you can't do.

Another way to do this is to create ou=addressbooks,dc=azapple,dc=com, or even a separate tree to hold personal address books (i.e. o=pab), then create something like ou=craig,ou=addressbook,dc=azapple,dc=com (or ou=craig,o=pab) to hold things in a separate place - in that way, you can remove default anonymous access from dc=azapple,dc=com, and set anonymous access as appropriate on ou=people..., ou=groups..., ou=addressbooks..., etc as you want them. It makes cleanup of everything associated with a user a little more disjointed maybe, but it's a lot easier to manage/organize your aci's this way. Might be able to use roles to make creating appropriate aci's easier also.

- Jeff

--
Fedora-directory-users mailing list
Fedora-directory-users@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/fedora-directory-users

[Index of Archives]     [Fedora Directory Users]     [Fedora Directory Devel]     [Fedora Announce]     [Fedora Legacy Announce]     [Kernel]     [Fedora Legacy]     [Share Photos]     [Fedora Desktop]     [PAM]     [Red Hat Watch]     [Red Hat Development]     [Big List of Linux Books]     [Gimp]     [Yosemite News]

  Powered by Linux