Wesley Craig wrote:
On 30 May 2008, at 13:50, Igor Brezac wrote:
1) I suggest that you keep ldap_sasl for backward configuration
compatibility. ldap_sasl name is used for sasl vs non sasl binds.
Note that 'ldap_id' needs to have authorization to proxy.
I left ldap_sasl in place, but removed it's ability to control the
proxy function. Instead, it continues to control whether sasl bind is
used. Are you suggesting that both ldap_sasl & ldap_proxy_authz would
be required for proxy to be enabled? I'd be OK with that, presuming
that ldap_sasl is indeed required for proxy authz to work. The code
has a dependency on the proxy authz ldap control, I don't recall that
it requires sasl. I suspect not, but I haven't actually dug into it.
sasl used to be required for ldap proxy authz, but I do not think this
is the case any more. I suggested that both ldap_sasl and
ldap_proxy_authz do the same thing.
2) I suppose you can have ldap_group_method: attribute, but this is
not how ldap data is typically used for groups. Also, I suggest that
ldap_group_attribute be used instead of ldap_member_attribute. As
you correctly described ldap_group and ldap_member do two different
things and your implementation would be a bit confusing. You can
possibly default ldap_group_attribute to the value of
ldap_member_attribute.
I personally do not like ldap_group_method: none, mabe Kan can chime
in. This option basically allows for an arbitrary group identifier
(potentially non existing one) to be assigned to a mailbox.
There are two ways to obtain the list of groups a user is a member of,
corresponding to ldap_member_method "filter" and "attribute".
filter) A search is executed, typically (uid=%u) in an "ou=groups"
tree. The list of DNs found correspond to the groups the user is in.
attribute) Rather than execute a search, the attributes in the
users entry are used to form the list of groups the user is in.
The problem is that group name validation doesn't have both models.
I suppose you could have both methods, but is that really needed? Each
group should have one entry in DIT.
I'm not sure how this discrepancy jibes with your understanding of how
ldap data is typically used for groups.
As you can see from the patch, I haven't added a
"ldap_group_attribute" and don't use "ldap_member_attribute". Both
ldap_group_method's use ldap_group_filter. The difference is in how
the result is treated.
Perhaps you're suggesting that ldap_group_* just be dropped, since
having two distinct configurations for highly related group
information is confusing and probably unnecessary. I'd agree with
that, but I fixing the current flaw was simpler and more compatible
than refactoring ptclient/ldap.c entirely.
It'd be nice if there is a simpler way to configure group (membership
and validation) in pt/ldap. :)
I don't think the "none" method is any more worrisome than permitting
someone to assign rights to a group they are not in.
3) This seems unnecessary, but can you explain a little more?
It's probably not strictly necessary to change the default size limit,
but the previous error handling treats "size limit exceeded" the same
as "not found". That is a problem, since in some cases the "size
limit exceeded" is not an error at all. A very common result of the
current default & code is that when ldap_member_method is "filter",
the user gets exactly no groups and no error message indicating why.
A more sensible solution would be to make the limit 10 or 100. Is
there a limit on the number of groups Cyrus allows? For
ldap_member/group_method of "attribute", a limit of 1 is probably
smart, since it reduces extraneous traffic.
Now looking at the code both ldap_member methods are broken. :(
- The 'attribute' method stores group DNs in authstate struct which is
not correct. Additional search is needed to get group names.
- The 'filter' method, as you pointed out, gets one group at most.
Changing ldap sitezlimit would fix this issue.
Cyrus does not limit on the number of groups. I suppose LDAP_NO_LIMIT
can be used to match other mechanisms, or implement configurable limit
that can be used in other mechanisms.
It'd be nice if all this complexity can be moved to the ldap
configuration, similar to the way sasl simplified things for user stuff,
Dynlist/dyngroups looks interesting...
-Igor
:wes
Wesley Craig wrote:
I have a number of ptclient & ldap bug fixes and improvements to make:
1) In 2.3.12p2, if ldap_sasl is enabled, user DNs are obtained
through SASL authN/Z proxying. This assumes that the LDAP server
supports authN/Z proxying and that ptclient/ldap has authorization
to proxy for all users. I've moved this option under a new
configuration option, ldap_proxy_authz, since the authZ proxying is
more or less orthogonal to using SASL for LDAP authN.
2) Groups have two LDAP configurations, one for populating the
groups a user belongs to and a second for validating a (new) group
name. In 2.3.12p2, those two configurations suffer from
non-parallel construction. In particular, ldap_member_method allows
both "attribute" and "filter", while the ldap_group_* configuration
has no "_method" configuration, implicitly assuming "filter"
instead. I've added a ldap_group_method configuration, with three
options, "filter", "attribute" and "none". "none" allows any string
that can be canonicalized to be used. "filter" works just like
ldap_group_* was working -- exactly one DN may be returned.
"attribute" looks for at least one DN to be returned. A correct
"attribute" configuration searches for the attribute used in
ldap_member_attribute. The assumption is that if anyone has the
group attribute, it is a valid group name.
3) I changed the default ldap_size_limit to 2. I also inserted
some additional checks in the code to specifically look for cases
where size limit is exceeded. These may or may not be errors,
depending on what you're looking for.
4) I fixed two small bugs in ptloader.c, one where unused memory
to syslog'd and another where the error message returned from the
ptloader module isn't null terminated when being passed to auth_pts.c.