Python e LDAP Search

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×

Esse post foi criado para mostrar como é possível fazer a conexão à um servidor LDAP através da linguagem Python.

Para começar, o primeiro passo é instalar o módulo ldap do python.

1
apt-get install python-ldap -y

O comando acima pode ser executado em distribuições baseadas em Debian, no meu caso estou usando o Debian 8 (Jessie).

Uma vez com o módulo instalado é possível efetuar a conexão com o servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/python
 
import ldap
 
# definindo variaveis de conexao
 
address = "ldap.exemplo.com.br"
user = "cn=admin,dc=exemplo,dc=com,dc=br"
password = "testepasswd"
base = "dc=exemplo,dc=com,dc=br"
 
# efetuando conexao
 
connection = ldap.initialize("ldap://%s"%address)
connection.protocol_version = ldap.VERSION3  #define versao 3 do protocolo ldap (recomendado)
connection.bind(user,password)
 
#efetuando uma busca
ldap_filter = '(mail=alisson.machado@exemplo.com.br)'
 
print connection.search_s(base,ldap.SCOPE_SUBTREE,ldap_filter)

No script acima logo no inicio foram definidas as variáveis de acesso ao servidor LDAP e logo mais abaixo do comentário efetuando conexao foram definidas as instruções que fazem conexão com o servidor.

1
connection = ldap.initialize("ldap://%s"%address)

A linha acima define qual é o servidor ldap em que vamos conectar.

1
connection.protocol_version = ldap.VERSION3

Logo na sequência é definido qual é o protocolo do LDAP que será usado, os mais comuns são ldapV2 e ldapV3, no meu caso estou utilizando o v3 mesmo.

1
connection.bind(user,password)

E na instrução acima é efetuada literalmente a conexão com o servidor passando as credenciais de acesso.

A partir dessa linha podem ser efetuadas todas as buscas, alterações e inserções na sua base ldap, mas lembre que toda a conexão foi armazenada na variável connection.

1
2
3
4
#efetuando uma busca
ldap_filter = '(mail=alisson.machado@exemplo.com.br)'
 
print connection.search_s(base,ldap.SCOPE_SUBTREE,ldap_filter)

No bloco de código acima, na variável ldap_filter foi armazenada uma string com um tipo de filtro do LDAP, uma vez definido esse filtro e feita a busca logo abaixo, sendo o primeiro parâmetro a base em que é efetuada a busca, o segundo é o escopo da busca e por último o filtro, no entanto o método search_s pode receber mais uma parâmetro que são os atributos de um registro no ldap que você quer retornar, caso você queira todos como é o meu caso é só omitir o último parâmetro, caso você queira projetar o seu retorno, é possível fazer da seguinte maneira.

1
print connection.search_s(base,ldap.SCOPE_SUBTREE,ldap_filter,['cn','mail','description'])

E serão retornados somente esses atributos da entrada LDAP que você está buscando.

No caso dos escopos, os possíveis são:
– subtree ( ldap.SCOPE_SUBTREE )
– base ( ldap.SCOPE_BASE )
– onelevel ( ldap.SCOPE_ONELEVEL )

Explicando um pouco sobre o escopo.

Subtree, significa que você quer buscar em todas as subarvores da sua base ldap.
base, significa que você quer buscar a entrada somente na base, assim a busca irá retornar um único valor.
onelevel, significa que a busca só vai um level abaixo da sua base.

A imagem abaixo mostra melhor.
theThreeScopeOptions

Mas voltando ao comando search_s, ele irá retornar uma lista com várias tuplas que representar os seus valores.

1
2
3
4
5
6
7
[
    (
        'cn=Alisson Machado de Menezes,cn=USERS,dc=exemplo,dc=com,dc=br', 
        {'userPassword': ['{SSHA}HASH_EM_ALGORITMO_SHA1'], 
        'uid': ['alisson.machado']}
    )
]

E agora você pode filtrar da maneira que achar melhor, por exemplo, vamos supor que eu tenha armazenado a consulta em uma variável chamada res e queria somente o dn (distinguished name) do usuário.

A linha poderia ficar da seguinte forma:

1
2
res = connection.search_s(base,ldap.SCOPE_SUBTREE,ldap_filter,['cn','mail','description'])
print res[0][1]

Se analisarmos a lista no penúltimo bloco de instrução, temos uma lista que tem apenas 1 valor, então eu pego a posição zero dessa lista, e nessa posição zero temos uma tupla com vários valores, sendo eles na sequencia:
– DN
– Password
– UID

Que estão nas seguintes posições, 0 (DN), 1 (Password), 2 (UID).

Bom, então é isso (=

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×
2 anos ago

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *