[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: Posix group with /etc/ldap.conf read priv



On Tuesday, 15 June 2010 09:01:13 Daniel wrote:
> Buchan Milne wrote:
> > On Monday, 14 June 2010 17:03:29 Ariel wrote:
> >> I don't like having the /etc/ldap.conf world readable because then
> >> anyone who has shell access can see our general ldap login credentials
> >> (without which you cannot see anything in the ldap tree).  So I have
> >> added a posixgroup in ldap, added our shell users to it and did:
> >>
> >> chown root:usergroup /etc/ldap.conf && chmod 640 /etc/ldap.conf
> >>
> >> But when logging in to the shell, users still get the "I have no name!"
> >>  problem because they cannot read the /etc/ldap.conf and cannot map
> >> their uid / guid numbers to names from the ldap tree.
> >>
> >> Advice?
> >
> > nss_ldap already caters to this, by the 'rootbinddn' option, and the
> > /etc/ldap.secret file. If rootbinddn is used, then process which are
> > running as root use this DN, and the password from the /etc/ldap.secret
> > file (which can thus be protected from non-root users).
> 
> The rootbinddn is just usefull/used in case of privileged (e.g. password
> reset by root) operations (which is normally done by root) therefore the
> file system permissions of /etc/ldap.secret can (should!) be protected.

No, this is not the only reason for the rootbindd option. In this case, I have 
no binddn/bindpw (I usually use SASL):

Without rootbinddn, getent passwd as root:
Jun 15 11:06:02 tiger slapd[4884]: conn=3144 fd=34 ACCEPT from 
IP=127.0.0.1:58579 (IP=0.0.0.0:389)
Jun 15 11:06:02 tiger slapd[4884]: conn=3144 op=0 BIND dn="" method=128
Jun 15 11:06:02 tiger slapd[4884]: conn=3144 op=0 RESULT tag=97 err=0 text=
Jun 15 11:06:02 tiger slapd[4884]: conn=3144 op=1 SRCH 
base="dc=ranger,dc=dnsalias,dc=com" scope=2 deref=0 
filter="(objectClass=posixAccount)"
Jun 15 11:06:02 tiger slapd[4884]: conn=3144 op=1 SRCH attr=uid userPassword 
uidNumber gidNumber cn homeDirectory loginShell gecos description objectClass
Jun 15 11:06:02 tiger slapd[4884]: conn=3144 op=1 SEARCH RESULT tag=101 err=0 
nentries=32 text=
Jun 15 11:06:02 tiger slapd[4884]: conn=3144 fd=34 closed (connection lost)


With rootbinddn, getent passwd as root:

Jun 15 11:02:01 tiger slapd[4884]: conn=3140 fd=35 ACCEPT from 
IP=127.0.0.1:37331 (IP=0.0.0.0:389)
Jun 15 11:02:01 tiger slapd[4884]: conn=3140 op=0 BIND dn="uid=LDAP 
Admin,ou=System Accounts,dc=ranger,dc=dnsalias,dc=com" method=128
Jun 15 11:02:01 tiger slapd[4884]: conn=3140 op=0 BIND dn="uid=LDAP 
Admin,ou=System Accounts,dc=ranger,dc=dnsalias,dc=com" mech=SIMPLE ssf=0
Jun 15 11:02:01 tiger slapd[4884]: conn=3140 op=0 RESULT tag=97 err=0 text=
Jun 15 11:02:01 tiger slapd[4884]: conn=3140 op=1 SRCH 
base="dc=ranger,dc=dnsalias,dc=com" scope=2 deref=0 
filter="(objectClass=posixAccount)"
Jun 15 11:02:01 tiger slapd[4884]: conn=3140 op=1 SRCH attr=uid userPassword 
uidNumber gidNumber cn homeDirectory loginShell gecos description objectClass
Jun 15 11:02:01 tiger slapd[4884]: conn=3140 op=1 SEARCH RESULT tag=101 err=0 
nentries=32 text=
Jun 15 11:02:01 tiger slapd[4884]: conn=3140 fd=35 closed (connection lost)


> rootbinddn and /etc/ldap.secret have no effect on standard nss
> operations invoked by unprivileged users.

Sure, but it *does* have an effect on any nss operations by a process running 
as root.

> > In order to make effective use of this, you probably need to run nscd (as
> > root, thus it is able to contact the LDAP server as rootbinddn).
> >
> > Of course, you need to consider:
> > 1)The fact that users who would have access to credentials already have
> > access to the information you are trying to protect
> > 2)The identity you use for nss_ldap should be least-privilege in any case
> 
> I've a question in regard to the exactly representation of
> "least-privilege" (hardening of slapd) to operate with nss_ldap. But
> first let me try to summarize my investigations:
> 
> The problem I see is that [nss|pam]_ldap's configuration file
> /etc/ldap.conf needs to be world readable to support a directory listing
> like for example "ls -al /home" wherein all the uidNumbers get resolved
> into names (uid/cn).

By design, it should be world readable. If you want credentials to be 
protected, use rootbinddn and /etc/ldap.secret, and e.g. nscd to ensure 
lookups end up being done by root.

> In my opinion there are two kind of approaches in regard to slapd's
> privilege configuration (ACLs) which both result in nearly the same
> behavior:
> 
> 1.) don't use a bindDn in /etc/ldap.conf and allow anonymous read in
> slapd (limited to posix account objectClass' attributes)
> 
> 2.) use a bindDn in /etc/ldap.conf which also requires a "bindPw". Thus
> /etc/ldap.conf needs to be world readable this approach also results in
> some kind of "quasi-anonymous" access (in case a logged in user uses the
> bindDn/bindPw for his own experiments ;-))

3)Use rootbinddn and /etc/ldap.secret with nscd or similar, with or without 
binddn/bindpw.

> To limit the possible side-effects (information disclosure) slapd's ACL
> settings need to be very restrictive but there are not many
> possibilities to further restrict queries without "damaging" the
> standard nss behavior (e.g. resolving uidNumber and so on).
> 
> Even in case the ACLs are strictly limited to deliver only
> posixAccount/shadowAccount relevant attributes, in most commonly ldap
> driven environments the nss|pam_ldap deployments disclose more security
> relevant information than the previous (non-ldap) /etc/passwd
> /etc/shadow approach:

Only if you use ldap for shadow ... if you don't, you will disclose less.

> Regardless whether approach 1.) or 2.) (which you are forced to in case
> your directory does not support anonymous binds - e.g. MS AD

AD supports anonymous binds, but it is disabled by default, but then again SSL 
isn't available by default ...

> ) is
> deployed a simple ldapsearch (anonymous or by use of bindDn/bindPw)
> delivers the /etc/passwd similar content to satisfy/achieve the unix
> system's standard nss behavior:
> "user:uidNumber:gidNumer:gecos: ...."
> 
> That's fine, but how about ldapsearch "+" (querying for operational
> attributes)?

They are subject to ACLs, just like any other attributes.

> By querying the operational attributes any interested user could get for
> example "helpful" additional information in comparison to /etc/passwd to
> narrow valuable attacks:
> - createTimestamp could be a good indicator for "old" and might be
> higher privileged users?
> - modifyTimestamp could be used to identify users who have not changed
> their passwords for years...
> - and many more ideas regarding the other operational attributes

So, don't allow access to these attributes by your proxy DN or anonymous, in 
either of the 2 cases above.

> Summary: In my opinion the only (theoretical?) chance left to further
> "harden" nss|pam_ldap deployments (by further restricting slapd's ACLs)
> is to suppress delivery of some operational attributes (for the
> nss|pam_ldap's proxy-user bindDn!) to a minimum.
> 
> I've (just for fun) already experimented with this. And all I can say
> nss|pam_ldap and slapd are still working fine but - and now let me come
> to the question:
> 
> I'm completely unsure whether suppressing operational attributes could
> harm slapd's internal operations in any kind? Ok thinking of denying
> contextCSN in replicated environments - hehe - the answer seems clear to
> me but what about the entryDN, hasSubordinates, and all the others...
> are they needed by slapd to operate correctly (possibly the operational
> attributes need is backend depending)?

'Needed by slapd to operate' is orthogonal to 'needed by nss_ldap to operate'.

> > Finally, you may also want to consider per-host credentials ... easiest
> > in a Kerberos environment.
> 
> Using sasl external or kerberos in combination with nss|pam_ldap's
> /etc/ldap.conf does not seem to improve security: the certificate's key
> needs to be world readable

Not necessarily.

> so any interested user can take the key and
> the certificate to bind "-Y EXTERNAL" to investigate the posixAccount
> users (and - I'm not sure - the same should apply to kerberos
> system/server tickets which needs to be world readable, too).

Not necessarily. See 'use_sasl' and 'root_use_sasl' options. If users are 
getting tickets on login, and you have 'use_sasl', user lookups will use their 
own privileges (if you have appropriate mapping from the SASL identity to 
their DN on the LDAP server).

> > Did you read the nss_ldap documentation?
> >
> > (Aaron already replied, but the fact that nss_ldap supports what you
> > wanted originally was not covered).
> 
> In my opinion that's not sure.
> 
> BTW and in regard to the "just for fun section", mentioned above:
> nss|pam_ldap has obvious design deficits therefore "nss_ldapd" has been
> developed and the related "slapo-nssov" is currently in development.
> These two approaches represent another level of indirection and seem to
> solve the above described general problems regarding the
> "quasi-anonymous" access because the nss part can be run in privileged
> user context where the bindDn/bindPw is probably kept more secure.

But, using nscd with nss_ldap achieves the same. Now, using nscd (or, maybe 
nss_ldap with nscd ...) does come with its own issues ...


> nss_ldapd seems to be quite stable. nssov is in the contrib branch of
> slapd and need to be compiled manually. Possibly one should give them a
> try instead of betting on a dead horse (nss_ldap)...

But, the privilege issue isn't the biggest reason.

Regards,
Buchan