ldapquery um servidor do Active Directory para usuários que pertencem a um grupo chamado X

3

Quando faço isso no prompt do bash em um CentOS 6.4

ldapsearch -LLL -H ldap://adserver.example.com -x -D [email protected] -w somepass -b 'OU=Users,DC=example,DC=com' '(&(objectClass=person)(sAMAccountName=testuser))'

Eu obtenho

dn: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com
...
objectClass: person
...
cn: TestUser Surname
sn: Surname
...
distinguishedName: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com
...
memberOf: CN=Group1,OU=Area,OU=Users,DC=example,DC=com
memberOf: CN=Gropu2,OU=Users,DC=example,DC=com
...
sAMAccountName: testuser

Eu quero obter uma resposta apenas se testuser pertencer a um grupo chamado X, independentemente de onde o grupo X está localizado na hierarquia do AD. Por exemplo: Eu quero os dados de um usuário chamado testuser que é um membro de um grupo chamado Group1.

Eu tentei alterar os filtros para:

  1. (& (objectClass = person) (sAMAccountName = testuser) (memberOf = CN = Grupo1 *))
  2. (& (objectClass = person) (sAMAccountName = testuser) (memberOf = * Group1 *))

sem sucesso.

Você pode ver na saída acima, testuser pertence aos grupos

  1. CN = Grupo1, OU = Área, OU = Usuários, DC = exemplo, DC = com
  2. CN = Gropu2, OU = Usuários, DC = exemplo, DC = com.

Quando eu uso o filtro '(& (objectClass = person) (sAMAccountName = testuser) (memberOf = CN = Grupo1, OU = Área, OU = Usuários, DC = exemplo, DC = com))' funciona, mas preciso de uma consulta apenas com o nome do grupo (não usando o "caminho" completo).

Existe alguma maneira de fazer isso?

Estou tentando fazer isso porque preciso usar grupos definidos pelo Active Directory como ACLs do squid (o proxy do Linux). Para fazer isso, preciso definir um tipo de ACL externo, como

external_acl_type ADGroup %LOGIN /usr/lib64/squid/squid_ldap_group -R -b "OU=Users,DC=example,DC=com" -D [email protected] -w somepass -f "(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=example,DC=com))" -h adserver.example.com

e, em seguida, use o tipo para definir ACLs como este

acl ADGroup_Group1 external ADGroup Group1
acl ADGroup_Group2 external ADGroup Group2
...
http_access allow ADGroup_Group1;
http_access deny ADGroup_Group2;

Quando o squid estiver marcando este "allow", ele substituirá% u pelo nome de login do usuário e% g pelo nome do grupo definido na ACL (Group1, Group2) e depois fará a consulta LDAP acima.

Como você pode ver acima, "http_access allow ADGroup_Group1;" funcionará como pretendido, mas "http_access deny ADGroup_Group2;" não funcionará, porque a OU pai do Grupo1 e do Grupo2 é diferente.

Então eu tenho 3 alternativas:

  1. Encontre um filtro que funcione para qualquer nome de grupo, independentemente do caminho (esta questão)
  2. Mova (potencialmente) TODOS Grupos do AD para a mesma UO (ugh ... para mover um objeto para uma OU diferente Irá me trazer mais trabalho do que eu tenho para reajustar os GPOs - ou pelo menos para verificar os GPOs já definidos para qualquer alteração que essa mudança possa trazer)
  3. Defina (potencialmente) um external_acl_type para cada unidade organizacional com grupos. (Neste caso, terei N processos externos apenas para verificar uma mudança de caminho no filtro LDAP)
por Yanko Hernández Álvarez 30.07.2013 / 22:36

1 resposta

4

Infelizmente não. O nome comum de um objeto LDAP não é globalmente exclusivo; é único em relação à sua OU pai. Então, se você pudesse perguntar se um usuário era membro de um grupo, com base em um CN de um grupo, você poderia obter vários resultados.

É por esse motivo que o atributo memberOf de um objeto de usuário é uma lista de DNs (nomes distintos ou caminhos X.500 completos).

    
por 30.07.2013 / 22:44