Como filtrar logins de usuários ldap no Linux?

Como filtrar logins de usuários ldap no Linux?

Eu tenho vários servidores Linux (ubuntu 12.04) configurados para autenticar logins de usuários em um LDAP externo (para minha filial) (especificamente Novell Edirectory). Isso está funcionando bem, mas estou tentando filtrar logins de usuários por associação a um grupo LDAP.

Uma conta de usuário fica assim no Edir:

dn: cn=mmcloud,ou=eng,o=lsi
loginShell: /bin/bash
homeDirectory: /home/mmcloud
gidNumber: 2001
uidNumber: 9418
mail: xxxxxx@xxxxxxxxx
uid: mmcloud
initials: Q
givenName: Moran
sn: McCloud
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: ndsLoginProperties
objectClass: Person
objectClass: Top
objectClass: posixAccount
eMailAddress: 7#xxxxx@xxxxxxxxxxxx
cn: mmcloud

Uma entrada de grupo fica assim no Edir:

dn: cn=shellacct,ou=groups,ou=eng,o=lsi
memberUid: jbarlin
memberUid: mmccloud
memberUid: ssemryn
memberUid: cdesmon
gidNumber: 2009
objectClass: groupOfNames
objectClass: Top
objectClass: posixGroup

Quero apenas que os usuários do shellacctgrupo façam login. Encontrei muitos exemplos usando pam_filterin /etc/ldap.conf, mas só consegui que o filtro funcionasse filtrando userDnatributos específicos, como:

 pam_filter                  &(objectclass=user)
 pam_filter                  &(objectclass=Person)
 pam_filter                  &(loginShell=/bin/bash)

O que eu quero é filtrar a associação do grupo. O groupDnécn=shellacct,ou=groups,ou=eng,o=lsi (gid=2009). Eu tentei em /etc/ldap.conf:

 pam_filter                  &(objectclass=posixAccount)(|(gidNumber=2009))
 pam_filter                  |(member=cn=shellacct,ou=groups,ou=eng,o=lsi)
 pam_filter                  |(memberUid=cn=shellacct,ou=groups,ou=eng,o=lsi)

Funcionará pam_filterpara o que eu quero fazer ou apenas olha userDnpara filtragem?

Responder1

Módulo PAMpam_succeed_if.soparece ser ideal para isso. Na verdade, eu uso dessa forma em vários dos meus servidores. Um exemplo de configuração do Ubuntu 14.04 autorizando o domínio MS AD, de /etc/pam.d/common-account:

account         sufficient              pam_unix.so
account         requisite               pam_ldap.so
account         sufficient              pam_succeed_if.so user ingroup unix-admins
account         sufficient              pam_succeed_if.so user ingroup auth-$hostname
account         requisite               pam_deny.so

Substitua o nome do servidor por$nome do host. Ser membro deadministradores unixouauth-$hostnameconcede acesso.

Considere também usar nslcd(0.9+), pois ele reconhece a associação a grupos aninhados (indiretos).

Responder2

Você pode usar a pam_groupdnopção /etc/ldap.confpara chegar aonde deseja. Eu usei pam_check_host_attrpara uma finalidade semelhante no passado e funcionou exatamente como eu queria (ou seja, a entrada LDAP precisava ter um hostatributo com o nome do host no qual você está tentando fazer login como valor).

Responder3

Só queria deixar isso aqui para quem procura esse tipo de coisa. Dê uma olhada em /etc/security/access.conf. Ele reconhece usuários/grupos/local/LDAP. Foi isso que acabei fazendo. É um ótimo balcão único para ACLs.

Você precisará ativar pam_access.confvários arquivos em/etc/pam.d/

Esteja cientede atualizações do sistema redefinindo essas edições. Não tenho certeza de como contornar isso. talvez a menção pam_succeedacima fosse um lugar melhor para isso.

# grep access /etc/pam.d/*
...
/etc/pam.d/login:# Uncomment and edit /etc/security/access.conf if you need to
...
/etc/pam.d/login:account required pam_access.so
/etc/pam.d/sshd:# Uncomment and edit /etc/security/access.conf if you need to set complex
...
/etc/pam.d/sshd:account required pam_access.so

exemplo access.conf:

# allow root from the backup system
+ : root : 10.10.16.2
# allow root from cron, serial port and tty consoles
+ : root : cron crond :0 ttyS0 tty1 tty2 tty3 tty4 tty5 tty6
# allow ldapusers on 10.0.0.0/8 subnet
+ : ldapuser4 ldapuser1 ldapuser7: 10.0.0.0/8
# allow users in ldap posixGroup on 10.10.16.0 subnet
+ : ldapssh : 10.10.16.0/24
# allow everyone in the localhost sftponly group from anywhere
+ : sftponly : ALL
# drop everyone else from anywhere
- : ALL : ALL

informação relacionada