OpenLDAP
O OpenLDAP é um software livre de código aberto que implementa o protocolo LDAP. Ele é um serviço de diretório baseado no padrão X.500.
O OpenLDAP é independente de sistema operativo. Várias distribuições Linux incluem o pacote do OpenLDAP. O software também corre nos sistemas operativos BSD, AIX, HP-UX, Mac OS X, Solaris, Microsoft Windows (2000, XP, 2003, 2008, Vista, win7 e win 8) e z/OS.
O OpenLDAP foi desenvolvido inicialmente pela Universidade de Michingan com as seguintes características principais:
- suporte a IPv4 e IPv6;
- autenticação (Cyrus Sasl-Kerberos V, GSSAPI, Digest-MD5);
- segurança no transporte – SSL e TLS;
- controle de acessos;
- escolha entre banco de dados;
- capacidade de atender a múltiplos bancos de dados simultaneamente;
- alta performance em múltiplas chamadas;
- replicação de base.
O OpenLDAP é composto pelos seguintes elementos:
- SLAPD (Stand Alone LDAP Daemon) – Servidor;
- SLURPD (Stand Alone LDAP Update Replication Daemon);
- Bibliotecas diversas de implementação do protocolo LDAP;
- Ferramentas, utilitários diversos e clientes de exemplo.
Possui basicamente 2 arquivos de configuração, que são, respectivamente:
- slapd.conf – configuração do daemon;
- ldap.conf – configuração para acesso dos clientes à base.
A base de dados se encontra no diretório:
- /var/lib/ldap/*
O OpenLDAP possui os arquivos padrões chamados de schemas. Sungaila (2008) afirma que “um esquema é um conjunto de regras que define atributos, classes de objetos, e controles indicando onde cada dado pode ser armazenado”. Já Malère (2008) explica um schema como sendo uma estrutura de objetos que especifica a lista total de atributos permitidos e necessários para uma entrada de dados no serviço de diretório. Os schemas permitem manter a consistência dos dados. Uma importante característica desses arquivos é serem extensíveis e assim pode-se adicionar mais atributos ou classes em função das necessidades. Para usar um schema é necessário incluí-lo no arquivo de configuração slapd.conf. Os schemas definem:
- quais as classes de objetos (object classes) podem ser inseridas num diretório;
- quais os atributos de uma determinada classe de objetos;
- os valores possíveis para os atributos;
Se um objeto (entrada) não obedecer às regras do schema, ele não pode ser inserido no diretório. Portanto cada entrada estará condicionada a uma hierarquia de armazenamento dos dados na base LDAP. Isto é especificado através do Distinguished Name (DN).
O DN é usado para identificar uma entrada de forma não ambígua num serviço de diretório. Esse atributo é composto por uma seqüência de Relative Distinguished Name (RDN) e cada RDN corresponde a um ramo na árvore do diretório, desde a raiz até a entrada à qual o DN faz referência. Um DN é formado por uma série de RD´s separados por vírgulas. Por exemplo:
dn: uid=rodrigo,ou=usuarios,dc=wikipedia,dc=org
A inserção dos dados na base LDAP será feita por meio de arquivos ldif (LDAP Data Interchange Format), um arquivo de texto comum que pode ser criado ou alterado com editores de texto convencionais, obedecendo-se, apenas, o schema do diretório.
LDAP Data Interchange Format (LDIF), é um formato de troca de dados em texto plano padrão para representar o conteúdo de diretório LDAP(Lightweight Directory Access Protocol) e requisições de atualização. LDIF transporta conteúdo de diretório como um conjunto de registros, um registro para cada objeto (ou entrada). Ele representa requisições de atualização, tais como Add, Modify, Delete e Rename, como um conjunto de registros, um registro para cada requisição de atualização.
O LDIF foi projetado no início de 1990 por Tim Howes, Mark C Smith e Gordon Good na Universidade de Michigan. Ele foi atualizado e estendido no final de 1990 para uso com a versão 3 do LDAP. Esta última versão do LDIF é chamada versão 1 e é formalmente especificada no RFC 2849, um Padrão RFC da IETF. O RFC 2849, desenvolvido por Gordon Good, foi publicado em Junho de 2000 e é um Padrão Sugerido atualmente. Um número de extensões para o LDIF foi proposto ao longo dos anos. Uma extensão foi formalmente especificada e publicada pela IETF. O RFC 4525, desenvolvido por Kurt Zeilenga, estendeu o TREFGLDIF para suportar a extensão LDAP Modify-Increment. Espera-se que extensões adicionais sejam publicadas pelo IETF futuramente.
As funções do arquivo ldif são:
- importar dados para o diretório;
- alterar objetos existentes;
- criar o backup do diretório;
- replicação do diretório.
Campos LDIF
DN: Distinguished Name(Nome distinto),refere-se ao nome que ideintifica unicamente uma entrada no diretório:
dn: distinguished name
DC: domain component(Componente de Domínio), refere-se a cada componente do domínio. Por exemplo http://www.google.com seria escrito como DC=www,DC=google,DC=com:
dc: domain component
OU: organizational unit(Unidade Organizacional), refere-se à unidade organizacional (ou algumas vezes o grupo do usuário) que o usuário faz parte. Se o usuário faz parte de mais de um grupo, você pode especificá-los como, por exemplo, OU= Advogado,OU= Juiz:
ou: organizational unit
CN: common name(Nome Comum),refere-se ao objeto individual (nome da pessoa; sala de reunião; nome de receita; cargo; etc.) para o qual/os quais vocês estiver consultando:
cn: common name
O: OrganizationName(Nome da Organização)
A seguir, um exemplo de arquivo ldif:
dn: uid=cleber,ou=aluno,dc=escola,dc=br
objectClass: top
objectClass: organizationPerson
objectClass: mailUser
uid: cleber
Uma linha em branco determina o fim de uma “entry”(registro). E linhas iniciadas com espaço são entendidas como continuação da linha anterior.
Instalando o OpenLDAP
Pacontes necessários CENTOS:
- compat-openldap.i386 0:2.1.30-6.4E
- openldap-clients.i386 0:2.2.13-6.4E
- openldap-devel.i386 0:2.2.13-6.4E
- openldap-servers.i386 0:2.2.13-6.4E
- openldap-servers-sql.i386 0:2.2.13-6.4E
Para instalar todos os pacotes você pode realizar da seguinte forma:
yum install *openldap* -y
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel
Pacotes necessários Debian:
$ sudo apt-get update
$ sudo apt-get -y install slapd ldap-utils
Para reconfigurar você pode realizar da seguinte forma:
$ sudo dpkg-reconfigure slapd
Então responda as perguntas da seguinte forma:
Omit OpenLdap server configuration? [NO]
DNS Domain Name? [ LINUX.LOCAL ]
Organization Name? [ LINUX ]
Administrator Password? [ password ]
Confirm Password? [ Password ]
Database backend to use: [HDB]
Do you want the database to be removed when slapd is purged? [ NO ]
Move old database? [ YES ]
Diretório no CentOS: /etc/openldap
[root@cobaia-one openldap]# ls -l
total 12
drwxr-xr-x. 2 root root 90 Fev 18 22:58 certs
-rw-r--r--. 1 root root 121 Ago 4 2017 check_password.conf
-rw-r--r--. 1 root root 363 Ago 4 2017 ldap.conf
drwxr-xr-x. 2 root root 4096 Fev 18 22:58 schema
drwxr-x---. 3 ldap ldap 45 Fev 18 22:58 slapd.d
Como já foi mencionado, o daemon do OpenLDAP é o slapd. A configuração do slapd é feita no arquivo /etc/ldap/slapd.conf. O arquivo de configuração do slapd é dividido em três seções: global, funcionamento interno(backend) e configuração de banco de dados.
Arquvios default para copiar:
[root@cobaia-one openldap]# find / -type f -iname slapd.conf
/usr/lib/tmpfiles.d/slapd.conf
/usr/share/doc/openldap-servers-sql-2.4.44/rdbms_depend/ibmdb2/slapd.conf
/usr/share/doc/openldap-servers-sql-2.4.44/rdbms_depend/mssql/slapd.conf
/usr/share/doc/openldap-servers-sql-2.4.44/rdbms_depend/mysql/slapd.conf
/usr/share/doc/openldap-servers-sql-2.4.44/rdbms_depend/oracle/slapd.conf
/usr/share/doc/openldap-servers-sql-2.4.44/rdbms_depend/pgsql/slapd.conf
/usr/share/doc/openldap-servers-sql-2.4.44/rdbms_depend/timesten/slapd.conf
Copiando o arquivo desejado, no caso foi referente à mysql
cp /usr/share/doc/openldap-servers-sql-2.4.44/rdbms_depend/mysql/slapd.conf /etc/openldap/
Ativando o serviço para inicialização automática:
systemctl status slapd
systemctl enable slapd
systemctl start slapd
Criando um usuário administrativo:
O comando abaixo vai gerar uma hash que deve ser adicionada no arquivo /etc/openldap/slapd.conf:
[root@cobaia-one centos]# slappasswd
New password:
Re-enter new password:
{SSHA}L3HB0HT4eJUKNcZP3i571HR6hHyfErdo
Agora vamos inserir a senha no arquivo /etc/openldap/slapd.conf da seguinte forma:
vim /etc/openldap/slapd.conf +/rootpw
A linha que encontrar tem que ficar mais ou menos assim:
## ANTES
database sql
suffix "o=sql,c=RU"
rootdn "cn=root,o=sql,c=RU"
rootpw secret
dbname ldap_mysql
dbuser root
dbpasswd
subtree_cond "ldap_entries.dn LIKE CONCAT('%',?)"
insentry_stmt "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)"
has_ldapinfo_dn_ru no
## DEPOIS
database sql
suffix "o=sql,c=RU"
rootdn "cn=root,o=sql,c=RU"
rootpw {SSHA}L3HB0HT4eJUKNcZP3i571HR6hHyfErdo
dbname ldap_mysql
dbuser root
dbpasswd
subtree_cond "ldap_entries.dn LIKE CONCAT('%',?)"
insentry_stmt "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)"
has_ldapinfo_dn_ru no
A diferença entre o slappasswd para o ldappasswd é que o primeiro apenas gera a hash. O segundo gera a hash e atualiza o diretório.
O ldapadd é implementado como um link para o ldapmodify(ldapmodify -a).
ldapadd -h myhost -p 389 -D "cn=orcladmin" -w welcome -f jhay.ldif
ldapdelete
ldapdelete -h myhost -p 389 -D "cn=orcladmin" -w welcome "uid=hricard,ou=sales,ou=people,dc=example,dc=com"
Versão provavelmente mais atualizada:
Configurações são realizadas no /etc/openldap/slapd.conf.d/
Criar um .ldif para atualizar as seguintes variaveis:
- olcRootPW – Password for the above RootDN.
- olcRootDN – Root Distinguished Name (DN) entry for the user who has the unrestricted access to perform all administration activities on LDAP, like a root user.
- olcSuffix – Database Suffix, it is the domain name for which the LDAP server provides the information. In simple words, it should be changed to your domain name.
Arquivos default para configurar:
/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
A ferramenta slapcat pode ser utilizada para exportar informações de uma base LDAP no formato LDIF.
slapcat -l all.ldif
O comando acima vai gerar um arquivo all.ldif
Para importar um arquivo LDIF, você pode utilizar o comando slapadd:
slapadd -l all.ldif
Algumas vezes pode ser necessário regerar os indexes de uma base LDAP, isso pode ser realizado com o comando slapindex:
slapindex uid
No exemplo acima, o atributo que foi regenerado foi o UID.
Note que o slapd não deve estar rodando, ou pelo menos não em RW.
Cliente LDAP
Para verificar se o servidor está funcionando e respondendo, uma pesquisa simples é realizada com o comando ldapsearch provido pelo pacote openldap-clients-2.4.44-5.el7.x86_64:
ldapsearch
-x -h ad.server.local
-D "myUserName"
-W
-b "dc=company,dc=local"
-s sub "(cn=*)" cn mail sn
Por padrão , qualquer usuário pode ralizar consultas.
Depois de criar o arquivo LDIF você pode adicionar os dados ao diretório da seguinte forma:
ldap -f exemplo.lfid -x -W -D 'cn=admin,o=lnm-br,c=BR'
Onde:
- -f especifica o arquivo LDIF.
- -x Indica autenticação simples(No lugar de autenticação SASL).
- -W Solicita a Senha.
- -D Informações do Administrador do diretório.
O comando ldapsearch é uma interface para a library ldap_search. Esse comando abre uma conexão com um servidor LDAP e realizada pesquisas usando parametros especificos.
A inclusão dos dados pode ser consultada com o comando ldapsearch:
ldapsearch -x -b 'o=lnm-br,c=BR' '(objectclass=*)'
Alguns filtros do LDAP
- = -> Equality
- =* -> Presente
- =string*string -> Return entries containing attributes
- containing the specified substring.
- ~= -> Approximate
- >= -> Greater than or equal to
- Less than or equal to
- () -> Separates filters to allow other logical operators to function
- & -> And
- | -> Or
- ! -> Not
Exemplos:
ldapsearch -h myhost -p 389 -s base -b "ou=people,dc=example,dc=com" "objectclass=*"
Esse comando pesquisa no host myhost na porta 389. O escopo da pesquisa (-s) é base, e a pesquisa é designada pelo filtro seguido depois de -b.
Configurando o sistema linux para login com ldap
Então vamos configurar aqui o servidor e no próprio servidor a gente vai configurar ele para realizar o login via ldap.
Instalação
$ sudo apt-get update
$ sudo apt-get -y install slapd ldap-utils
$ sudo dpkg-reconfigure slapd
Omit OpenLdap server configuration? [NO]
DNS Domain Name? [ LINUX.LOCAL ]
Organization Name? [ LINUX ]
Administrator Password? [ password ]
Confirm Password? [ Password ]
Database backend to use: [HDB]
Do you want the database to be removed when slapd is purged? [ NO ]
Move old database? [ YES ]
A saída do comando vai ficar assim:
root@nginx:/etc/ldap# dpkg-reconfigure slapd
Backing up /etc/ldap/slapd.d in /var/backups/slapd-2.4.44+dfsg-5+deb9u2... done.
Moving old database directory to /var/backups:
- directory unknown... done.
Creating initial configuration... done.
Creating LDAP directory... done.
Verificando se o serviço está rodando:
root@nginx:/etc/ldap# ss -antup | grep -i 389
tcp LISTEN 0 128 *:389 *:* users:(("slapd",pid=23795,fd=8))
tcp LISTEN 0 128 :::389 :::* users:(("slapd",pid=23795,fd=9))
Populando a base:
Crie e altere um arquivo ldif:
vim base.ldif
Popule com as informações referentes ao seu dominio, vamos criar dois objetos, People e Group:
root@nginx:/etc/ldap# cat base.ldif
dn: ou=People,dc=linux,dc=local
ObjectClass: organizationalUnit
ou: People
dn: ou=Group,dc=linux,dc=local
ObjectClass: organizationalUnit
ou: Group
Importando a base:
ldapadd -x -W -D "cn=admin,dc=linux,dc=local" -f base.ldif
Criando Usuários:
Easy steps for adding users:
1. Create unix user
2. Create unix user’s ldap passwd file
3. Convert passwd.file to ldif file
4. Add ldap file to LDAP Directory using ldapadd
Crie um arquivo ldif chamado users.ldif
vim users.ldif
Popule da seguinte forma:
root@nginx:/etc/ldap/ldiffiles# cat users.ldif
dn: uid=ldapuser,ou=People,dc=linux,dc=local
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: ldapuser
uid: ldapuser
uidNumber: 9999
gidNumber: 9999
homeDirectory: /home/ldapuser
loginShell: /bin/bash
gecos: Test LdapUser
userPassword: {crypt}x
shadowLastChange: 17058
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
Adicione o usuário:
root@nginx:/etc/ldap/ldiffiles# ldapadd -x -W -D "cn=admin,dc=linux,dc=local" -f users.ldif
Enter LDAP Password:
adding new entry "uid=ldapuser,ou=People,dc=linux,dc=local"
Defina uma senha para esse usuário:
root@nginx:/etc/ldap/ldiffiles# ldappasswd -s debian4life -W -D "cn=admin,dc=linux,dc=local" -x "cn=ldapuser,ou=People,dc=linux,dc=local"
Explicação do comando acima:
-s -> Define a nova senha do usuário
-W -> Autenticação
-D -> Usuário com perimssão para atualização.
-x -> Usuário que tera a senha alterada.
Realizando buscas
ldapsearch -LLL -x -b "ou=People,dc=linux,dc=local" "(objectClass=posixAccount)"
root@nginx:/etc/ldap/ldiffiles# ldapsearch -x cn=ldapuser -b dc=linux,dc=local -LL
-L -> No formato LDIF, quanto mais L’s, menos comentários.
-x -> Define autenticação simples
-b -> Diretório Ldap
Para deletar:
ldapdelete -W -D "cn=admin,dc=itzgeek,dc=local" "uid=ldapuser,ou=People,dc=itzgeek,dc=local"
Configuranod Autenticação do Ldap para ser usado pelo PAM
O processo resume-se em instalar o cliente Ldap, configurar o arquivo de resolução de nomes (nsswitch.conf ) e configurar o PAM.
Configurando clientes ldap:
apt-get install libpam-ldap libnss-ldap nscd
nsswitch
│ nsswitch.conf not managed automatically │
│ │
│ For the libnss-ldap package to work, you need to modify your │
│ /etc/nsswitch.conf to use the "ldap" datasource. There is an example │
│ file at /usr/share/doc/libnss-ldap/examples/nsswitch.ldap which can be │
│ used as an example for your nsswitch setup, or it can be copied over │
│ your current setup. │
│ │
│ Also, before removing this package, it is wise to remove the "ldap" │
│ entries from nsswitch.conf to keep basic services functioning.
Alterando o arquivon nsswitch.conf
root@nginx:~# vim /etc/nsswitch.conf
Alterando o PAM
Devemos alterar os seguintes arquivos, /etc/pam.d/common-account, /etc/pam.d/common-auth, /etc/pam.d/common-session , /etc/pam.d/common-passwd.
Abaixo todas as alterações feitas:
#Arquivo: common-account
account sufficient pam_ldap.so
account required pam_unix.so
#Arquivo:common-auth
auth sufficient pam_ldap.so
auth required pam_unix.so nullok_secure
#Arquivo: common-session
session required pam_mkhomedir.so skel=/etc/skel umask=0222
session required pam_unix.so
#Arquivo: common-passwd
password sufficient
pam_ldap.so
password required pam_unix.so nullok obscure md5
Migrando usuários do /etc/passwd para arquivo ldif para futura importação pra base do slapd
grep ldapuser /etc/passwd > /root/users
apt install migrationtools -y
Edit the /usr/share/migrationtools/migrate_common.ph file
Faça as seguintes alterações:
$DEFAULT_MAIL_DOMAIN = "linux.local";
$DEFAULT_BASE = "dc=linux,dc=local";
$EXTENDED_SCHEMA = 1;
Então gere o arquivo ldif usando o /usr/share/migrationtools/migrate_passwd.pl
Para migrar grupos, utilize /usr/share/migrationtools/migrate_group.pl
Erro:
root@nginx:/usr/share/migrationtools# ./migrate_passwd.pl /root/users /root/passwd.ldif
Can't locate migrate_common.ph in @INC (did you run h2ph?) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/x86_64-linux-gnu/perl5/5.24 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at ./migrate_passwd.pl line 41.
Como resolver:
Edite o arquivo:
vim migrate_passwd.pl +41
Altere a linha 41 para:
require './migrate_common.ph';
Outros erros:
root@nginx:~# ldapadd -x -W -D "cn=admin,dc=linux,dc=local" -f passwd.ldif
Enter LDAP Password:
adding new entry "uid=quorra,ou=People,dc=linux,dc=local"
ldap_add: Invalid syntax (21)
additional info: objectClass: value #5 invalid per syntax
Você precisará remover algumas declarações de objectClass assim como seus valores pois não existe tão pouco é permitido, meu arquivo ldif ficou da seguinte forma:
root@nginx:~# cat passwd.ldif
dn: uid=quorra,ou=People,dc=linux,dc=local
uid: quorra
cn: quorra
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: {crypt}!
shadowLastChange: 17791
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/quorra
gecos: ldap user
Então:
root@nginx:~# ldapadd -x -W -D "cn=admin,dc=linux,dc=local" -f passwd.ldif
Enter LDAP Password:
adding new entry "uid=quorra,ou=People,dc=linux,dc=local"
Então é isso!
Fontes:
Teorica:
https://pt.wikipedia.org/wiki/OpenLDAP
https://pt.wikipedia.org/wiki/LDAP_Data_Interchange_Format
https://www.vivaolinux.com.br/artigo/OpenLDAP-a-chave-e-a-centralizacao
Prática:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-ubuntu-16-04
https://www.howtoforge.com/linux_openldap_setup_server_client
https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-ldap-quickstart.html
https://www.vivaolinux.com.br/dica/OpenLDAP-basico-no-CentOS
https://www.itzgeek.com/how-tos/linux/centos-how-tos/step-step-openldap-server-configuration-centos-7-rhel-7.html
Debian:
https://www.itzgeek.com/how-tos/linux/debian/install-and-configure-openldap-on-ubuntu-16-04-debian-8.html
http://www.tldp.org/HOWTO/LDAP-HOWTO/unpacking.html
Click to access LDAP%20Parte%202.pdf
https://manpages.debian.org/stretch/slapd/slapd-config.5.en.html
