# LDAP

Lightweight Directory Access Protocol (LDAP) é um protocolo de aplicação aberto, livre de fornecedor e padrão de indústria para acessar e manter serviços de informação de diretório distribuído sobre uma rede de Protocolo da Internet (IP).
Serviços de diretório desempenham um papel importante no desenvolvimento de aplicações intranet e Internet permitindo o compartilhamento de informações sobre usuários, sistemas, redes, serviços e aplicações através da rede. Como exemplos, serviços de diretório podem fornecer qualquer conjunto de registros organizado, geralmente com uma estrutura hierárquica, como um diretório de e-mail corporativo. Da mesma forma, uma lista telefônica (diretório de telefones) é uma lista de assinantes com um endereço e um número de telefone. Um diretório LDAP geralmente segue o modelo X.500, que é uma árvore de nós, cada um consistindo de um conjunto de atributos com seus respectivos valores. O LDAP foi criado como uma alternativa ao Directory Access Protocol (DAP).
O LDAP é especificado em uma série de publicações de Sequência de Padronização do Internet Engineering Task Force (IETF) chamadas Request for Comments (RFCs), usando a linguagem de descrição ASN.1. A última especificação é a Versão 3, publicada como RFC 4511. Por exemplo, aqui está uma pesquisa LDAP traduzida em Português puro: "Procure no diretório de e-mails da companhia por todas as pessoas localizadas em Belém cujos nomes contêm "João" que possuem um endereço de e-mail. Por favor, retorne seus nomes completos, e-mail, título e descrição."
Uma utilização comum do LDAP é fornecer um "logon único" onde uma senha para um usuário é compartilhada entre muitos serviços, como a aplicação de um código de login da companhia para páginas web (de forma que a equipe loga apenas uma vez aos computadores da companhia e então são automaticamente logadas na intranet da companhia).
O LDAP é baseado em um subconjunto mais simples dos padrões contidos dentro do padrão X.500. Devido a este relacionamento, o LDAP é às vezes chamado X.500-lite.

## História

Um diretório LDAP tende a refletir vários limites políticos, geográficos e/ou organizacionais, dependendo do modelo adotado. A utilização do LDAP hoje em dia tende a se basear nos nomes já existentes do sistema Domain Name System (DNS), na estruturação dos níveis mais básicos de hierarquia. Mais profundamente, podem aparecer estruturas representando pessoas, unidades organizacionais, impressoras, documentos, grupos de pessoas ou qualquer outra coisa que represente um nó.
A versão atual é LDAPv3, especificado em uma série de RFC como mostra o RFC 4510.
Os autores deste protocolo foram Tim Howes da Universidade de Michigan, Steve Kille da ISODE (ISO Development Environment) e Wengyik Yeong da Performance Systems International.
LDAP influenciou protocolos de Internet subsequentes, incluindo versões posteriores do X.500, Directory Services Markup Language(DSML), Service Provisioning Markup Language (SPML) e o Service Location Protocol.

## Visão geral

Um cliente começa uma sessão de LDAP ligando-se a um servidor LDAP, normalmente pela porta padrão: 389, TCP. Este envia requisições para o servidor, o qual devolve respostas. As operações básicas são:
* Bind – autêntica e especifica a versão do protocolo LDAP;
* Search – procura por e/ou recupera entradas dos diretórios;
* Compare – testa se uma entrada tem determinado valor como atributo;
* ADD – adiciona uma nova entrada;
* Delete – apaga uma entrada;
* Modify – modifica uma entrada;
* Modify DN – move ou renomeia uma entrada;
* StartTLS – protege a conexão com a Transport Layer Security (TLS);
* Abandon – aborta uma requisição prévia;
* Extended Operation – operação genérica para definir outras operações;
* Unbind – fecha a conexão, não o inverso de Bind.
Em contrapartida o servidor pode mandar "Unsolicited Notifications” (Notificações não solicitadas) que são respostas a nenhuma requisição, ex. antes deste terminar uma conexão. Com algumas exceções o cliente não precisa esperar uma resposta antes de enviar a próxima requisição, e o servidor pode enviar a resposta em qualquer ordem.
LDAP é definido nos termos da ASN.1, e as mensagens de protocolos são codificadas no formato binário BER.
O LDAP é uma definição de protocolo para acesso a bancos de dados especializados chamados diretórios. É similar ao SQL no sentido que é uma linguagem para interagir com bancos de dados sem especificar um banco de dados particular. De fato, o banco de dados de suporte ao LDAP é quase sempre um sistema RDBMS geral, como o LDBM ou o Oracle.
Nas diversas tecnologias que empresas de médio e grande porte utilizam hoje em dia, uma área para autenticação é exigida por praticamente todos os sistemas, o que pode muitas vezes ocasionar uma variada quantidade de cadastro de utilizadores replicados entre os sistemas. Como exemplo daquele utilizador que tem muitos "logins" e "senhas" para acesso aos sistemas da empresa e toda semana precisa lembrar ou alterar alguma informação de seu cadastro. Ex: login e senha para acesso a máquina, a rede, ao e-mail, ao sistema de gestão, sistema de documentos, etc. Desta forma o usuário fica confuso e a equipe de TI simplesmente perde tempo com o serviço repetitivo e de suporte. Um servidor de diretórios como o Open LDAP ou MS Active Directory recebe esta autenticação dos muitos sistemas; o protocolo LDAP serve justamente para outras aplicações quaisquer da empresa se conectarem e consultarem um servidor de diretórios.

## Estrutura de diretório

O protocolo fornece uma interface com diretórios que segue a edição de 1993 do modelo X.500:
* Uma entrada consiste de um conjunto de atributos
* Um atributo possui um nome (um tipo de atributo ou descrição de atributo) e um ou mais valores. Os atributos são definidos em um esquema (ver abaixo).
* Cada entrada possui um identificador único: seu Distinguished Name (DN), em português Nome Distinto. Ele consiste de seu Relative Distinguished Name (RDN), em português Nome Distinto de Parente, construído de algum(ns) atributo(s) na entrada, seguido pelo DN da entrada pai. Pense no DN como o caminho completo de um arquivo e o RDN como seu nome de arquivo relativo em sua pasta pai (por exemplo, se /foo/bar/meuarquivo.txt fosse o DN, então meuarquivo.txt seria o RDN).
Um DN pode ser alterado durante o tempo de vida da entrada, por exemplo, quando entradas são movidas dentro de uma árvore. Para identificar entradas com segurança e sem ambiguidade, um UUID pode ser fornecido no conjunto de atributos operacionais da entrada.
Uma entrada pode parecer com isto quando representada no LDAP Data Interchange Format (LDIF) (o LDAP propriamente dito é um protocolo binário):
"dn" é o nome distinto da entrada. Ele não é um atributo nem uma parte da entrada. "cn=John Doe" é o RDN da entrada (Relative Distinguished Name) e "dc=exemplo,dc=com" é o DN da entrada pai, onde "dc" significa 'Domain Component'. As outras linhas mostram os atributos na entrada. Nomes de atributos são normalmente cadeias de caractere mnemônicas, como "cn" para common name (nome comum), "dc" para domain component (componente de domínio), "mail" para endereço de e-mail e "sn" para sobrenome.