OpenLDAP com Replicação + TLS + Debian Squeeze

O que é LDAP?

LDAP (Lightweight Directory Access Protocol) é um protocolo padrão inicialmente projetado para o acesso a serviços de diretório X.500. O LDAP é a versão reduzida de um protocolo chamado DAP (Directory Access Protocol). A principal função do DAP era a de estabelecer, de forma padrão, regras de comunicação de acesso com um diretório baseado no padrão X.500, mas por ser complexo permitiu o surgimento do LDAP que implementa apenas as operações básicas do DAP: Bind, Read, List, Search, Compare, Modify, Add, Delete e ModifyRDN.

Esta introdução é importante para que saibamos exatamente o que é um serviço de diretório. Aqueles que já têm claro este conceito podem, com segurança, ignorar o próximo parágrafo.

Um serviço de diretório contém informações em forma de entradas. Um bom exemplo poderia ser uma lista telefônica, que contém entradas: nomes de pessoas, nomes de empresas, etc. Cada entrada contém uma série de dados que, de maneira formal, chamamos de atributos. Estes dados podem ser o nome da empresa, telefone, endereço, etc. Uma lista telefônica destaca-se por ser um guia no qual podemos realizar consultas com freqüência, ao qual poucas vezes, porém, iremos adicionar novas entradas. Vale a pena destacar também que, muitas vezes, poderemos fazer consultas nesta lista por ordem alfabética, pelo tipo de empresa, por endereço. Em poucas palavras, um diretório é uma base de dados contendo diferentes tipos de informações (a lista telefônica foi apenas um exemplo) e oferece uma versatilidade muito grande na hora de buscar a informação desejada.

Então, para que serve o LDAP? O LDAP é simplesmente um protocolo encarregado por definir a maneira através da qual se realizam as pesquisas em uma base de dados de “entradas” (como o exemplo mencionado anteriormente). Protocolo é um conjunto de regras que devem ser seguidas na hora de se criar uma aplicação que siga um padrão, no caso, o padrão LDAP.

Anteriormente falamos sobre X.500. Este é um protocolo que era utilizado antigamente de forma bastante ampla como serviço de diretório. Inicialmente o LDAP foi criado somente para servir de interface entre os clientes que queriam fazer consultas ao servidor X.500. Isto foi decorrente das deficiências que este protocolo tinha e de sua extrema lentidão. Mais adiante concluiu-se que, como a maioria das consultas chegava normalmente através da interface LDAP, seria muito mais vantajoso utilizar o LDAP como um serviço independente de diretório sem a necessidade de se utilizar o X.500.

O que é OpenLDAP?

Agora que já sabemos o que é LDAP, veremos o que é OpenLDAP. OpenLDAP é simplesmente um projeto colaborativo livre e totalmente funcional que centraliza a criação de uma série de ferramentas que implementam o protocolo LDAP. Pode ser um servidor LDAP ou qualquer ferramenta onde o cliente possa acessar ou gerenciar a informação através deste servidor.

O servidor LDAP nada mais é que um pedaço de software encarregado de gerenciar de forma interna a informação, porém não é responsável por armazená-la. Isto ocorre porque o protocolo LDAP não é designado para o armazenamento, mas sim para a gestão da informação armazenada. Ou seja, o protocolo não define a forma de armazenar esta informação, como, por exemplo, a informação dos telefones de uma lista telefônica. Ele simplesmente é capaz de gerenciá-la, não importando aonde esta estiver armazenada.

Vejamos um exemplo:

O cliente faz uma consulta qualquer no diretório LDAP, que gerencia esta consulta devolvendo a informação solicitada, buscada na base de dados. Isto é feito de uma forma bastante simples, pois o cliente somente precisa saber como fazer a consulta. O servidor encarrega-se de buscar estes dados na base de dados correta.

O que é Active Directory?

Active Directory é uma outra implementação do protocolo LDAP, sob a responsabilidade da Microsoft. Isto somente é possível porque o protocolo LDAP é um padrão aberto, permitindo que cada um o implemente da sua maneira. Existem muitas outras implementações, mas neste handbook nosso foco será nas mais conhecidas: OpenLDAP e Active Directory.

A implementação do Active Directory é um bom exemplo do potencial do protocolo LDAP, não se limitando somente ao funcionamento definido pelo protocolo, mas estendendo-o com a criação de novas funcionalidades, o que o torna um sistema muito mais amplo que um simples serviço de diretórios. O Active Directory implementa, além do protocolo LDAP, outras funcionalidades como o DNS (Domain Name System) e o protocolo de autenticação Kerberos.

O Active Directory é utilizado como base de dados centralizada de informações necessárias para a operação de uma rede distribuída de computadores. Para poder operar como servidor central de uma rede distribuída, é necessário que armazene informações de usuários e suas permissões, grupos, máquinas existentes na rede, recursos comuns, seja de disco ou físicos, como impressoras e outros periféricos. Além disto, deve possuir um sistema de autenticação.

Conclusão

O LDAP trata-se de um protocolo aberto, rápido e eficaz que nos permite criar ferramentas de servidores ou de clientes compartilhando um mesmo padrão e facilitando a interoperabilidade em ambientes heterogêneos com diferentes máquinas, sistemas operacionais ou implementações do mesmo. Desta forma, um servidor OpenLDAP pode ser capaz de interoperar com clientes ou ferramentas de gestão desenvolvidas por outros fabricantes, como Microsoft, Novell, etc. Entretanto, com ferramentas livres desenvolvidas pelo projeto OpenLDAP é possível interoperar com um servidor Active Directory, inclusive chegando a integrar uma máquina em Linux dentro de um domínio gerenciado por Active Directory.

Ideia principal deste how to é mostrar como podemos centralizar a autenticação de nossos servidores Linux na rede de uma forma fácil, controlando os nosso usuário e grupos com um frontend web.

Temos que fazer alguns ajustes nos dois servidores LDAP

  1. Nome LDAP master: ldap1
  2. Domínio: douglasqsantos.com.br
  3. IP: 10.0.0.25
  4. Nome LDAP slave: ldap2
  5. Domínio: douglasqsantos.com.br
  6. IP: 10.0.0.26

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Sempre quanto terminar a edição de algum arquivo .ldif no vim sempre pressione F7 para ele remover os espaços nos finais de linha que sempre da merda ;)

Vamos acertar o arquivo /etc/hosts nos dois servidores

vim /etc/hosts
127.0.0.1       localhost
10.0.0.25       ldap1.douglasqsantos.com.br       ldap1
10.0.0.26       ldap2.douglasqsantos.com.br       ldap2

Vamos ajustar o nome do servidor ldap1 em /etc/hostname

vim /etc/hostname
ldap1

Vamos ajustar o nome do servidor ldap2 em /etc/hostname

vim /etc/hostname
ldap2

Vamos desabilitar o IPV6 nos dois servidores

echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf

Agora vamos reiniciar os dois servidores

reboot

Agora vamos atuailizar os repositórios e fazer um upgrade do sistema nos dois servidores

aptitude update && aptitude dist-upgrade -y

Agora vamos instalar os pacotes necessários para o LDAP no servidor master pois no servidor slave vamos ter que aplicar patch no ldap, aqui vai ser necessário informar uma senha para o admin do LDAP

aptitude install slapd ldap-utils -y

Agora vamos verificar se o LDAP está respondendo

nmap -sS localhost -T4

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-03 09:30 BRST
Interesting ports on localhost (127.0.0.1):
Not shown: 996 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
111/tcp open  rpcbind
389/tcp open  ldap

Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

Vamos agora verificar a base do LDAP

slapcat 
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas
structuralObjectClass: organization
entryUUID: c48f6bc0-9a5a-1030-93a1-df576de48c91
creatorsName: cn=admin,dc=douglasqsantos,dc=com,dc=br
createTimestamp: 20111103112859Z
entryCSN: 20111103112859.257910Z#000000#000#000000
modifiersName: cn=admin,dc=douglasqsantos,dc=com,dc=br
modifyTimestamp: 20111103112859Z

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WHYxbmxYMndxZ3h3VmFMVGU3cXRWL0pidG9NZjZYaUw=
structuralObjectClass: organizationalRole
entryUUID: c48facde-9a5a-1030-93a2-df576de48c91
creatorsName: cn=admin,dc=douglasqsantos,dc=com,dc=br
createTimestamp: 20111103112859Z
entryCSN: 20111103112859.259582Z#000000#000#000000
modifiersName: cn=admin,dc=douglasqsantos,dc=com,dc=br
modifyTimestamp: 20111103112859Z

Agora vamos ajustar o arquivo do cliente LDAP para o servidor Master pois ele vai ser cliente também

vim /etc/ldap/ldap.conf
BASE dc=douglasqsantos,dc=com,dc=br
URI ldap://ldap1.douglasqsantos.com.br/

Agora vamos consultar a configuração da base LDAP

slapcat -b cn=config

Agora vamos consultar os objetos da raiz do nosso LDAP master

ldapsearch -LLLQY EXTERNAL -H ldapi:// -b cn=config "(|(cn=config)(olcDatabase={1}hdb))"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=douglasqsantos,dc=com,dc=br
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" wri
 te by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=douglasqsantos,dc=com,dc=br
olcRootPW: {SSHA}Xv1nlX2wqgxwVaLTe7qtV/JbtoMf6XiL
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: objectClass eq

Opções que foram passadas para o comando

  1. -LLL print responses in LDIF format without comments and version
  2. -Q use SASL Quiet mode
  3. -Y mech SASL mechanism
  4. -H URI LDAP Uniform Resource Identifier(s)
  5. -b basedn base dn for search

OBS: Os arquivos .ldif não podem conter espaços no final das linhas senão vamos encontrar erros como o ex:

Enter LDAP Password: 
ldapadd: attributeDescription "dn": (possible missing newline after line 7, entry "ou=Usuarios,dc=douglasqsantos,dc=com,dc=br"?)
ldapadd: attributeDescription "dn": (possible missing newline after line 8, entry "ou=Usuarios,dc=douglasqsantos,dc=com,dc=br"?)
adding new entry "ou=Usuarios,dc=douglasqsantos,dc=com,dc=br"
ldap_add: Type or value exists (20)
  additional info: objectClass: value #0 provided more than once

Agora vamos modificar a nossa base do LDAP, para adicionar índices de pesquisa e mudar o status do log, vamos fazer este processo no servidor Master

vim ~/olc-mod1.ldif
# 1.
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats

# 2.1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uid eq
-
# 2.2.
add: olcDbIndex
olcDbIndex: cn eq
-
# 2.3.
add: olcDbIndex
olcDbIndex: ou eq
-
# 2.4.
add: olcDbIndex
olcDbIndex: dc eq

Agora vamos importar a nossa configuração

ldapmodify -QY EXTERNAL -H ldapi:// -f ~/olc-mod1.ldif
modifying entry "cn=config"

modifying entry "olcDatabase={1}hdb,cn=config"

Agora vamos criar as OUs para o nosso LDAP

vim ~/tree.ldif
dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

Agora vamos importar as nossas OUs

ldapadd -cxWD cn=admin,dc=douglasqsantos,dc=com,dc=br -f ~/tree.ldif
Enter LDAP Password: 
adding new entry "ou=Usuarios,dc=douglasqsantos,dc=com,dc=br"

adding new entry "ou=Grupos,dc=douglasqsantos,dc=com,dc=br"

adding new entry "ou=Maquinas,dc=douglasqsantos,dc=com,dc=br"

Agora vamos listar a nossa base do LDAP

ldapsearch -xLLL
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

Se caso na consulta aparecer algo como

ldapsearch -xLLL
No such object (32)

Verifique a configuração do arquivo /etc/ldap/ldap.conf pois é ali que ele vai ser referênciar para efetuar a busca

Agora vamos criar um grupo e uma conta de usuário em nossa base LDAP

vim ~/douglas.ldif
dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword: {SSHA}aRCGttw+TMW0wp252fJrxUd4Bptta1M4

O valor do parametro userPassword foi gerado da seguinte forma

slappasswd -s 123
{SSHA}aRCGttw+TMW0wp252fJrxUd4Bptta1M4

Agora vamos importar o nosso grupo e usuário para o LDAP

ldapadd -cxWD cn=admin,dc=douglasqsantos,dc=com,dc=br -f ~/douglas.ldif
Enter LDAP Password: 
adding new entry "cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br"

adding new entry "uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br"

Agora vamos consultar o nosso grupo ti-admin

ldapsearch -xLLL '(cn=ti-admin)'
dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

Agora vamos consultar o nosso usuário

ldapsearch -xLLL '(uid=douglas)'
dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas

Agora vamos efetuar um teste de autenticação

ldapwhoami -xD uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br -w 123
dn:uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br

Vamos verificar com qual usuários estamos logados no sistema

ldapwhoami -x
anonymous

Agora vamos tirar a consulta anonima da nossa base LDAP

vi ~/pesquisador.ldif
dn: cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: pesquisador
userPassword: {SSHA}1hSWab/6wI3sWYXEouYP1sX1XsFsAEBx

O valor do parametro userPassword foi gerado da seguinte forma

slappasswd -s 123
{SSHA}1hSWab/6wI3sWYXEouYP1sX1XsFsAEBx

Vamos fazer a importação do pesquisador

ldapadd -x -a -W -D 'cn=admin,dc=douglasqsantos,dc=com,dc=br' -f ~/pesquisador.ldif
Enter LDAP Password: 
adding new entry "cn=pesquisador,dc=douglasqsantos,dc=com,dc=br"

Agora temos que acertar as acls do nosso LDAP

vim  ~/consultas.ldif
# 1.1.0.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
delete: olcAccess

# 1.1.1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write
  by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read
  by * none
-
# 1.1.2.
add: olcAccess
olcAccess: {1}to dn.base="" by * none
-
# 1.1.3
add: olcAccess
olcAccess: {2}to *
  by self write
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br"  write
  by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read
  by users read
  by * none

Agora vamos importar as nossas modificações

ldapmodify -cQY EXTERNAL -H ldapi:/// -f ~/consultas.ldif
modifying entry "olcDatabase={1}hdb,cn=config"

modifying entry "olcDatabase={1}hdb,cn=config"

Agora vamos testar essa modifivação

ldapsearch -xLLL
No such object (32)

Como pode ser notado pesquisa anonima não funciona mais agora vamos ver como efetuamos uma consulta

ldapsearch -xLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br -W
Enter LDAP Password: 
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WHYxbmxYMndxZ3h3VmFMVGU3cXRWL0pidG9NZjZYaUw=

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword:: e1NTSEF9YVJDR3R0dytUTVcwd3AyNTJmSnJ4VWQ0QnB0dGExTTQ=

dn: cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: pesquisador
userPassword:: e1NTSEF9MWhTV2FiLzZ3STNzV1lYRW91WVAxc1gxWHNGc0FFQng=

Agora vamos consultar com o usuario pesquisador que criamos

ldapsearch -xLLL -D cn=pesquisador,dc=douglasqsantos,dc=com,dc=br -W
Enter LDAP Password: 
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WHYxbmxYMndxZ3h3VmFMVGU3cXRWL0pidG9NZjZYaUw=

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword:: e1NTSEF9YVJDR3R0dytUTVcwd3AyNTJmSnJ4VWQ0QnB0dGExTTQ=

dn: cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: pesquisador
userPassword:: e1NTSEF9MWhTV2FiLzZ3STNzV1lYRW91WVAxc1gxWHNGc0FFQng=

Agora vamos consultar com um usuário normal

ldapsearch -xLLL -D uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br -W
Enter LDAP Password: 
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword:: e1NTSEF9YVJDR3R0dytUTVcwd3AyNTJmSnJ4VWQ0QnB0dGExTTQ=

dn: cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: pesquisador

Como pode ser notado o usuário somente consegue visualizar a sua propria senha

Agora vamos configurar o servidor LDAP Master para trabalhar como cliente é a mesma configuração para qualquer outro cliente por enquanto

Vamos acertar algumas variáveis do ambiente

export DEBIAN_PRIORITY=critical
export DEBIAN_FRONTEND=noninteractive

Agora vamos instalar os pacotes para o cliente LDAP

aptitude install libnss-ldap libpam-ldap ldap-utils -y

Agora vamos voltar as variáveis ao normal

unset DEBIAN_PRIORITY
unset DEBIAN_FRONTEND

Agora vamos acertar alguns arquivos de configuração

Vamos fazer backup do arquivo nsswitch.conf que controla aonde vai ser consultado os usuários senha e grupos

cp /etc/nsswitch.conf{,.bkp}

Agora vamos modificar ele

vim /etc/nsswitch.conf
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       ldap

Agora vamos acertar os arquivos de controle do ldap

Vamos fazer backup do libnss-ldap.conf

cp /etc/libnss-ldap.conf{,.bkp}

Agora vamos ajudar a sua configuração deixe ele como abaixo

vim /etc/libnss-ldap.conf
#qual base do ldap vai ser consultada
base dc=douglasqsantos,dc=com,dc=br
#qual o caminho para o servidor LDAP
uri ldap://ldap1.douglasqsantos.com.br/
#qual versão do protocolo que vamos estar utilizando
ldap_version 3
#usuário que vai ser utilizado para efetuar as consultas na base LDAP
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
#senha para o usuário poder efetuar as consultas
bindpw 123

Agora vamos acertar o arquivo de controle entre a PAM e o LDAP

Vamos fazer backup dele

cp /etc/pam_ldap.conf{,.bkp}

Agora vamos alterar ele deixe ele como abaixo

vim /etc/pam_ldap.conf
#qual base do ldap que vai ser consultada
base dc=douglasqsantos,dc=com,dc=br
#qual o caminho para o servidor ldap
uri ldap://ldap1.douglasqsantos.com.br/
#qual o a versão do protocolo que vai ser utilizada
ldap_version 3
#qual o tipo de criptografia utilizada pela pam
pam_password crypt
#usuário que vai efetuar as pesquisas na base LDAP
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
#senha o usuário que vai efetuar as pesquisas
bindpw 123

Agora vamos acertar a configuração da PAM

Vamos fazer backup dos arquivos primeiro

cp -Rfa /etc/pam.d{,.bkp}

Agora vamos acertar o arquivo de controle de sessão deixe o arquivo como abaixo

vim /etc/pam.d/common-session
session [default=1]                     pam_permit.so
session requisite                       pam_deny.so
session required                        pam_permit.so
session required                        pam_unix.so
session optional                        pam_ldap.so
session optional pam_mkhomedir.so skel=/etc/skel umask=077

Vamos acertar o arquivo de controle de senha deixe o arquivo como abaixo

vim /etc/pam.d/common-password
password        [success=2 default=ignore]      pam_unix.so obscure sha512
password        [success=1 user_unknown=ignore default=die]     pam_ldap.so try_first_pass
password        requisite                       pam_deny.so
password        required                        pam_permit.so

Vamos acertar agora o arquivo de controle do ssh deixe ele como abaixo

vim /etc/pam.d/sshd
auth       required     pam_env.so # [1]
auth       required     pam_env.so envfile=/etc/default/locale
@include common-auth
account    required     pam_nologin.so
#A linha abaixo para limitarmos o acesso ao ssh dessa maquina somente aos usuarios do grupo ti-admin ou root
account    sufficient   pam_succeed_if.so user ingroup root
account    requisite    pam_succeed_if.so user ingroup ti-admin
@include common-account
@include common-session
session    optional     pam_motd.so # [1]
session    optional     pam_mail.so standard noenv # [1]
session    required     pam_limits.so
@include common-password

Agora vamos acertar o arquivo de login

vim /etc/pam.d/login
auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so
#A linha abaixo para limitarmos o acesso ao ssh dessa maquina somente aos usuarios do grupo ti-admin ou root
account    sufficient   pam_succeed_if.so user ingroup root
account    requisite    pam_succeed_if.so user ingroup ti-admin
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session       required   pam_env.so readenv=1
session       required   pam_env.so readenv=1 envfile=/etc/default/locale
@include   common-auth
auth       optional   pam_group.so
session    required   pam_limits.so
session    optional   pam_lastlog.so
session    optional   pam_motd.so
session    optional   pam_mail.so standard
@include common-account
@include common-session
@include common-password
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open

Como pode ser notado estou limitando o acesso somente do root ou do grupo ti-admin para efetuar login ou acesso ao ssh ao servidor LDAP

Agora vamos reiniciar o serviço nscd

/etc/init.d/nscd restart

Agora vamos testar a consulta em nossa base novamente

ldapsearch -xLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br -W
Enter LDAP Password: 
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WHYxbmxYMndxZ3h3VmFMVGU3cXRWL0pidG9NZjZYaUw=

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword:: e1NTSEF9YVJDR3R0dytUTVcwd3AyNTJmSnJ4VWQ0QnB0dGExTTQ=

dn: cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: pesquisador
userPassword:: e1NTSEF9MWhTV2FiLzZ3STNzV1lYRW91WVAxc1gxWHNGc0FFQng=

Agora vamos adicionar o usuário douglas ao grupo sudo

gpasswd -a douglas sudo

Agora vamos logar com ele para efetuar um teste

su - douglas
Criando o diretório '/home/douglas'.

Como pode ser notado o sistema achou o nosso usuário na base e já criou o diretório home

Agora vamos ver se é o usuário certo agora

whoami 
douglas

Agora vamos testar o sudo

[10:53:57] douglas@ldap1 [~] $ sudo su -

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for douglas: 
[10:54:00] root@ldap1 [~] # 

O usuário esta ok

Agora vamos configurar o Ldap-Account-Manager para podermos gerenciar o nosso LDAP pela Web

Vamos instalar alguns pacotes necessário

aptitude install ldap-account-manager php5-ldap php5-gd php-fpdf libjs-jquery libjs-jquery-ui debconf php5-mcrypt ldap-account-manager-lamdaemon -y

Agora vamos acertar a configuração do lam

vim /usr/share/ldap-account-manager/config/lam.conf
[...]
serverURL: ldap://ldap1.douglasqsantos.com.br
[...]
admins: cn=admin,dc=douglasqsantos,dc=com,dc=br
[...]
treesuffix: dc=douglasqsantos,dc=com,dc=br
[...]
defaultLanguage: pt_BR.utf8:UTF-8:Português (Brasil)
[...]
types: suffix_user: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
[...]
types: suffix_group: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
[...]
types: suffix_host: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
[...]
types: suffix_smbDomain: dc=douglasqsantos,dc=com,dc=br

Agora para acessar o LAM http://ip_servidor/lam informe a senha do admin e se divirta

Opcional: Agora vamos acertar o LAM para trabalhar com HTTPS

Vamos gerar as chaves para o https

Vamos preparar o diretório para receber as chaves

mkdir -p /etc/ssl/apache
cd /etc/ssl/apache

Agora vamos gerar a key

openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
..++++++
.++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

Agora vamos gerar o csr

openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:Douglas
Common Name (eg, YOUR name) []:ldap1.douglasqsantos.com.br
Email Address []:douglas@douglasqsantos.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Agora vamos assinar o nosso certificado

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=Douglas/CN=ldap1.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
Getting Private key
Enter pass phrase for server.key:

Agora vamos acertar as permissões das chave

chmod 0400 server.*
cp server.key server.key.orig

Agora vamos tirar a senha do certificado

openssl rsa -in server.key.orig -out server.key
Enter pass phrase for server.key.orig:
writing RSA key

Agora vamos acertar as permissões novamente

chmod 0400 /etc/ssl/apache/*

Agora vamos acertar o virtual host para o LAM

vim /etc/apache2/sites-available/lam
<VirtualHost *:443>
        ServerAdmin webmaster@douglasqsantos.com.br
        ServerName lam.douglasqsantos.com.br
        DocumentRoot "/usr/share/ldap-account-manager"
        <Directory /usr/share/ldap-account-manager>
                  Options +FollowSymLinks
                  AllowOverride All
                  Order allow,deny
                  Allow from all
                  DirectoryIndex index.html
        </Directory>

        <Directory /var/lib/ldap-account-manager/tmp>
                  Options -Indexes
        </Directory>

        <Directory /var/lib/ldap-account-manager/sess>
                  Options -Indexes
                  Order allow,deny
                  Deny from all
        </Directory>

        <Directory /var/lib/ldap-account-manager/config>
                  Options -Indexes
                  Order allow,deny
                  Deny from all
        </Directory>

        <Directory /usr/share/ldap-account-manager/lib>
                  Options -Indexes
                  Order allow,deny
                  Deny from all
        </Directory>

        <Directory /usr/share/ldap-account-manager/help>
                  Options -Indexes
                  Order allow,deny
                  Deny from all
        </Directory>
        <Directory /usr/share/ldap-account-manager/locale>
                  Options -Indexes
                  Order allow,deny
                  Deny from all
        </Directory>

         <IfModule mod_php5.c>
         AddType application/x-httpd-php .php
                 php_flag expose_php Off
                 php_flag allow_url_fopen Off
                 php_flag allow_url_include Off
                 php_flag magic_quotes_gpc Off
                 php_flag register_globals Off
                 php_flag disable_functions show_source
                 php_flag disable_functions system
                 php_flag disable_functions shell_exec
                 php_flag disable_functions passthru
                 php_flag disable_functions exec
                 php_flag disable_functions popen
                 php_flag disable_functions proc_open
                 php_flag disable_functions symlink
         </IfModule>
        CustomLog /var/log/apache2/lam.access.log combined
        ErrorLog /var/log/apache2/lam.error.log
        LogLevel warn
        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        SSLCertificateFile "/etc/ssl/apache/server.crt"
        SSLCertificateKeyFile "/etc/ssl/apache/server.key"
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                 SSLOptions +StdEnvVars
        </FilesMatch>
                 BrowserMatch ".*MSIE.*" \
                 nokeepalive ssl-unclean-shutdown \
                 downgrade-1.0 force-response-1.0
        ServerSignature Off
</VirtualHost>

Agora vamos configurar a porta que o nosso virtual host vai estar escutando

vim /etc/apache2/ports.conf
[...]
NameVirtualHost *:443
#NameVirtualHost *:80
#Listen 80

Vamos carregar agora o módulo ssl para o apache

a2enmod ssl

Agora vamos desabilitar os dois sites padrões do apache

a2dissite default
a2dissite default-ssl

Agora vamos habilitar o site do lam

a2ensite lam

Agora vamos reiniciar o apache

/etc/init.d/apache2 restart

Senão foi adicionada uma entrada no DNS pode ser utilizado a configuração do /etc/hosts no cliente

[...]
ip_servidor   lam.douglasqsantos.com.br lam

Agora podemos acessar o nosso lam em https://lam.douglasqsantos.com.br

O nosso LDAP até o momento não esta trabalhando com TLS agora vamos habilitar

Vamos instalar o gnutls-bin para gerarmos as chaves

apt-get install gnutls-bin -y

Agora vamos preparar o diretório para receber as chaves do TLS

mkdir /etc/ldap/certs
cd /etc/ldap/certs

Agora vamos gerar a chave ca

certtool --generate-privkey --outfile ca.key
Generating a 2048 bit RSA private key...

Agora vamos auto assinar a nossa chave

certtool --generate-self-signed --load-privkey ca.key --outfile ca.pem
Generating a self signed certificate...
Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
Country name (2 chars): BR
Organization name: Douglas
Organizational unit name: Douglas
Locality name: Curitiba
State or province name: Parana
Common name: ldap1.douglasqsantos.com.br
UID: 
This field should not be used in new certificates.
E-mail: douglas@douglasqsantos.com.br
Enter the certificate's serial number in decimal (default: 1320328622): 


Activation/Expiration time.
3650


Extensions.
Does the certificate belong to an authority? (y/N): n
Is this a TLS web client certificate? (y/N): n
Is this also a TLS web server certificate? (y/N): n
Enter the e-mail of the subject of the certificate: 
Will the certificate be used for signing (required for TLS)? (y/N): n
Will the certificate be used for encryption (not required for TLS)? (y/N): n
Enter the URI of the CRL distribution point: 
X.509 Certificate Information:
  Version: 3
  Serial Number (hex): 4eb29dae
  Validity:
    Not Before: Thu Nov 03 13:57:04 UTC 2011
    Not After: Sun Oct 31 13:57:14 UTC 2021
  Subject: C=BR,O=Douglas,OU=Douglas,L=Curitiba,ST=Parana,CN=ldap1.douglasqsantos.com.br,EMAIL=douglas@douglasqsantos.com.br
  Subject Public Key Algorithm: RSA
    Modulus (bits 2048):
      de:c0:84:03:97:a5:60:4c:89:6b:1e:69:e2:2b:24:9a
      26:87:79:51:6c:86:29:44:73:49:f4:d3:c0:82:79:24
      d9:cb:b4:73:f9:eb:2f:08:f5:0e:88:1e:84:0b:41:9f
      68:fb:52:06:04:f4:89:b2:e1:7a:fe:b6:6f:83:9a:b3
      e8:ca:5f:89:d8:15:34:03:58:38:81:50:1c:42:6f:0d
      29:42:76:18:e7:ed:fa:2d:af:71:48:bf:53:fe:02:fb
      a3:45:c2:6a:61:ee:b5:17:9d:bc:d5:ce:45:9a:50:7b
      5e:e6:de:c1:ce:f6:cf:cb:2a:8d:00:60:85:d5:fa:cd
      00:05:06:a6:8a:4d:a2:58:76:fd:29:f9:9f:4d:d0:44
      77:fa:a8:f6:91:db:83:d0:47:d2:75:8d:7c:0d:b2:f3
      63:37:6a:f1:d7:74:4f:a8:bd:13:a1:ac:f3:c0:9c:4b
      2c:4c:9e:97:6c:b7:c8:c7:7e:5a:28:2b:0e:1e:e7:4f
      13:fe:e9:59:df:60:25:5b:91:cd:d1:8c:5b:1d:46:ac
      d3:52:1d:aa:03:ee:35:f5:61:80:30:a7:c4:c7:ea:3d
      6b:44:cf:b5:05:0c:08:d9:84:cd:01:21:2f:f5:04:02
      31:e8:1f:95:51:e3:a8:19:82:aa:45:be:4e:e1:32:6b
    Exponent (bits 24):
      01:00:01
  Extensions:
    Basic Constraints (critical):
      Certificate Authority (CA): FALSE
    Subject Key Identifier (not critical):
      c7356a56c8bb335e0cf3dd23632c91b3aa4c1c9b
Other Information:
  Public Key Id:
    c7356a56c8bb335e0cf3dd23632c91b3aa4c1c9b

Is the above information ok? (Y/N): y


Signing certificate...

Agora vamos criar um CA para assinar a chave para o nosso servidor

certtool --generate-privkey --outfile server.key
Generating a 2048 bit RSA private key...

Agora vamos gerar o certificado dessa chave

certtool --generate-certificate --load-privkey server.key --outfile server.pem --load-ca-certificate ca.pem --load-ca-privkey ca.key
Generating a signed certificate...
Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
Country name (2 chars): BR
Organization name: Douglas
Organizational unit name: Douglas
Locality name: Curitiba
State or province name: Parana
Common name: ldap1.douglasqsantos.com.br
UID: 
This field should not be used in new certificates.
E-mail: douglas@douglasqsantos.com.br
Enter the certificate's serial number in decimal (default: 1320328847): 


Activation/Expiration time.
The certificate will expire in (days): 3650


Extensions.
Does the certificate belong to an authority? (y/N): n
Is this a TLS web client certificate? (y/N): n
Is this also a TLS web server certificate? (y/N): n
Enter the e-mail of the subject of the certificate: n
Will the certificate be used for signing (required for TLS)? (y/N): n
Will the certificate be used for encryption (not required for TLS)? (y/N): n
X.509 Certificate Information:
  Version: 3
  Serial Number (hex): 4eb29e8f
  Validity:
    Not Before: Thu Nov 03 14:00:48 UTC 2011
    Not After: Sun Oct 31 14:00:52 UTC 2021
  Subject: C=BR,O=Douglas,OU=Douglas,L=Curitiba,ST=Parana,CN=ldap1.douglasqsantos.com.br,EMAIL=douglas@douglasqsantos.com.br
  Subject Public Key Algorithm: RSA
    Modulus (bits 2048):
      a9:6a:8f:54:42:31:0a:2c:dc:77:11:1a:63:59:cc:2b
      da:d4:61:bf:2d:4f:7b:20:bb:8f:d4:ea:e7:cd:e6:1f
      cb:f4:9d:04:28:84:7d:0f:24:b3:7a:82:0c:af:5d:b9
      aa:d5:6b:5b:61:43:ee:f6:40:bf:f4:e9:49:ae:e6:fe
      7a:81:b6:d9:a7:c9:3c:a0:68:bb:0c:2f:ba:50:58:8e
      cd:49:fe:76:cb:ab:b9:57:2d:ce:4c:c5:81:b9:ef:18
      a1:73:c9:9a:29:7b:9c:0b:7a:01:da:20:2f:08:8b:5d
      37:d3:50:1d:a9:09:f2:bb:be:82:85:d9:2c:59:59:3b
      46:30:1d:48:4a:42:bc:3b:47:da:f3:01:d8:e5:ef:6b
      71:f2:dc:5a:56:12:f1:3f:d0:9d:87:31:b4:46:81:bb
      19:9a:f7:6c:94:6e:62:d1:22:30:eb:88:6c:c0:a9:ae
      1d:a7:e5:c6:b1:37:4c:4a:6c:31:e9:16:9a:44:63:64
      93:52:8d:dd:9b:9d:78:36:45:83:1a:8e:98:04:07:93
      24:c2:a5:7d:e8:7a:fe:e2:f1:d9:26:f3:37:6f:da:38
      3b:2d:b7:2d:00:45:92:c5:71:09:21:eb:6c:01:85:ea
      73:5e:e1:f2:0d:57:80:9d:f3:e7:3c:9a:06:d3:40:b1
    Exponent (bits 24):
      01:00:01
  Extensions:
    Basic Constraints (critical):
      Certificate Authority (CA): FALSE
    Subject Alternative Name (not critical):
      RFC822name: n
    Subject Key Identifier (not critical):
      fd2eba740dba64fdfbb132aafe3796668bd2347e
    Authority Key Identifier (not critical):
      c7356a56c8bb335e0cf3dd23632c91b3aa4c1c9b
Other Information:
  Public Key Id:
    fd2eba740dba64fdfbb132aafe3796668bd2347e

Is the above information ok? (Y/N): y


Signing certificate...

Agora vamos acertar as permissões das chaves

chmod 600 /etc/ldap/certs/*
chown openldap:openldap /etc/ldap/certs/*

Agora vamos criar o arquivo para que o LDAP reconheça as chaves e trabalhe com TLS

vim ~/tls_ldap.ldif
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/certs/ca.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/certs/server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/certs/server.key

Agora vamos importar as chaves

ldapmodify -QY EXTERNAL -H ldapi:// -f ~/tls_ldap.ldif
modifying entry "cn=config"

Agora vamos acertar o arquivo de inicialização do LDAP

vim /etc/default/slapd
[...]
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"

Agora vamos acertar a perte cliente para que possamos utilizar a conexão com TLS

Vamos fazer backup

cp -Rfa /etc/ldap/ldap.conf{,.bkp}

Agora vamos editar o arquivo

vim /etc/ldap/ldap.conf
BASE dc=douglasqsantos,dc=com,dc=br
URI ldaps://ldap1.douglasqsantos.com.br/
TLS_CACERT /etc/ldap/certs/ca.pem
TLS_REQCERT allow

Agora acertar o arquivo de controle da pam, mas primeiro vamos fazer backup do arquivo de configuração

cp /etc/pam_ldap.conf{,.bkp2}

Vamos modificar o arquivo

vim /etc/pam_ldap.conf
base dc=douglasqsantos,dc=com,dc=br
uri ldaps://ldap1.douglasqsantos.com.br/
ldap_version 3
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
bindpw 123
pam_password crypt
ssl on
sslpath /etc/ldap/certs

Vamos fazer o backup do arquivo

cp /etc/libnss-ldap.conf{,.bkp2}

Agora vamos acertar o arquivo

vim /etc/libnss-ldap.conf
base dc=douglasqsantos,dc=com,dc=br
uri ldaps://ldap1.douglasqsantos.com.br/
ldap_version 3
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
bindpw 123
ssl on
sslpath /etc/ldap/certs

Agora vamos reiniciar os serviços necessários

/etc/init.d/slapd restart
/etc/init.d/nscd restart

Agora vamos verificar os serviços rodando em nosso servidor

nmap -sS localhost -T4

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-03 12:24 BRST
Interesting ports on localhost (127.0.0.1):
Not shown: 994 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
111/tcp open  rpcbind
389/tcp open  ldap
443/tcp open  https
636/tcp open  ldapssl

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

Vamos agora efetuar uma consulta em nossa base LDAP

ldapsearch -xLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br -W 
Enter LDAP Password: 
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WHYxbmxYMndxZ3h3VmFMVGU3cXRWL0pidG9NZjZYaUw=

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword:: e1NTSEF9YVJDR3R0dytUTVcwd3AyNTJmSnJ4VWQ0QnB0dGExTTQ=

dn: cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: pesquisador
userPassword:: e1NTSEF9MWhTV2FiLzZ3STNzV1lYRW91WVAxc1gxWHNGc0FFQng=

Agora vamos ver o que apareceu em nossos logs

Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 fd=20 ACCEPT from IP=10.0.0.25:49168 (IP=0.0.0.0:636)
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 fd=20 TLS established tls_ssf=128 ssf=128
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 op=0 BIND dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" method=128
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 op=0 BIND dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" mech=SIMPLE ssf=0
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 op=0 RESULT tag=97 err=0 text=
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 op=1 SRCH base="dc=douglasqsantos,dc=com,dc=br" scope=2 deref=0 filter="(objectClass=*)"
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 op=1 SEARCH RESULT tag=101 err=0 nentries=8 text=
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 op=2 UNBIND
Nov  3 12:27:11 ldap1 slapd[3549]: conn=1005 fd=20 closed

Como pode ser notado a nossa consulta foi feita na porta 636 com tls então estamos com o ldap OK.

Agora vamos configurar o servidor LDAP slave

Agora vamos configurar um cliente qualquer não sendo o nosso servidor LDAP slave para trabalhar utilizando a autenticação no LDAP utilizando TLS

Vamos acertar as variáveis do ambiente

Nós vamos ter que compilar o ldap com um patch para ele trabalhar corretamente com a replicação

Vamos instalar alguns pacotes necessários

aptitude install dpkg-dev devscripts -y

Vamos agora acessar o /usr/src e obter o nosso ldap

cd /usr/src
apt-get source openldap

Agora vamos instalar as dependências para o nosso LDAP

apt-get build-dep openldap -y

Agora vamos obter os patchs e vamos aplicar eles

wget -c ftp://ftp.openldap.org/incoming/pierangelo-masarati-2010-04-29-chain.1.patch
patch openldap-2.4.23/servers/slapd/back-ldap/chain.c < pierangelo-masarati-2010-04-29-chain.1.patch
patching file openldap-2.4.23/servers/slapd/back-ldap/chain.c
Hunk #1 succeeded at 1137 (offset -3 lines).
Hunk #2 succeeded at 1148 (offset -3 lines).

Agora vamos mudar o suffix do nosso pacote

cd openldap-2.4.23/
dch -l patched 'Including a patch by Pierangelo Masarati, 2010-04-29.'
debuild -us -uc 

Após a compilação vamos ter alguns pacotes

cd ..
ldap-utils_2.4.23-7patched1_i386.deb
libldap-2.4-2-dbg_2.4.23-7patched1_i386.deb
libldap-2.4-2_2.4.23-7patched1_i386.deb
libldap2-dev_2.4.23-7patched1_i386.deb
slapd-dbg_2.4.23-7patched1_i386.deb
slapd-smbk5pwd_2.4.23-7patched1_i386.deb
slapd_2.4.23-7patched1_i386.deb

Agora vamos instalar os pacotes

dpkg -i libldap-2.4-2_2.4.23-7.2patched1_amd64.deb
dpkg -i ldap-utils_2.4.23-7.2patched1_amd64.deb
aptitude install libltdl7 libperl5.10 libslp1 unixodbc -y
dpkg -i slapd_2.4.23-7.2patched1_amd64.deb

Aqui informe uma senha qualquer para o adm pois como vamos fazer a replicação a senha do adm vai ser a mesma do master

Caso não apareça a tela pedindo a senha vamos reconfigurar o ldap

dpkg-reconfigure slapd
#responda da seguinte forma
1) Não
2) douglasqsantos.com.br
3) douglasqsantos.com.br
4) senha
5) senha
6) hdb
7) Sim
8) Sim
9) Não

Agora vamos verificar se a porta do LDAP esta escutando

nmap -p 389 -T4 localhost

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-03 13:47 BRST
Interesting ports on localhost (127.0.0.1):
PORT    STATE SERVICE
389/tcp open  ldap

Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds
export DEBIAN_PRIORITY=critical
export DEBIAN_FRONTEND=noninteractive

Agora vamos instalar os pacotes para o servidor LDAP slave ser cliente

aptitude install libnss-ldap libpam-ldap ldap-utils -y

Agora vamos voltar o valor das variáveis

unset DEBIAN_PRIORITY
unset DEBIAN_FRONTEND

Agora vamos acertar o TLS para o LDAP

Vamos instalar o pacote necessário

apt-get install gnutls-bin -y

Agora vamos copiar as chaves ca do master para o slave

mkdir /etc/ldap/certs
scp ldap1.douglasqsantos.com.br:/etc/ldap/certs/ca.* /etc/ldap/certs/

Agora vamos criar um CA para assinar a chave para o nosso servidor

cd /etc/ldap/certs
certtool --generate-privkey --outfile server.key
Generating a 2048 bit RSA private key...

Agora vamos gerar o certificado dessa chave

certtool --generate-certificate --load-privkey server.key --outfile server.pem --load-ca-certificate ca.pem --load-ca-privkey ca.key
Generating a signed certificate...
Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
Country name (2 chars): BR
Organization name: Douglas
Organizational unit name: Douglas
Locality name: Curitiba
State or province name: Parana
Common name: ldap2.douglasqsantos.com.br
UID: 
This field should not be used in new certificates.
E-mail: douglas@douglasqsantos.com.br
Enter the certificate's serial number in decimal (default: 1320335664): 


Activation/Expiration time.
The certificate will expire in (days): 3650


Extensions.
Does the certificate belong to an authority? (y/N): n
Is this a TLS web client certificate? (y/N): n
Is this also a TLS web server certificate? (y/N): n
Enter the e-mail of the subject of the certificate: 
Will the certificate be used for signing (required for TLS)? (y/N): n
Will the certificate be used for encryption (not required for TLS)? (y/N): n
X.509 Certificate Information:
  Version: 3
  Serial Number (hex): 4eb2b930
  Validity:
    Not Before: Thu Nov 03 15:54:25 UTC 2011
    Not After: Sun Oct 31 15:54:28 UTC 2021
  Subject: C=BR,O=Douglas,OU=Douglas,L=Curitiba,ST=Parana,CN=ldap2.douglasqsantos.com.br,EMAIL=douglas@douglasqsantos.com.br
  Subject Public Key Algorithm: RSA
    Modulus (bits 2048):
      ce:76:44:db:74:d3:d8:f5:1b:64:cb:20:f1:36:73:01
      d2:80:71:f5:28:12:cc:9d:31:30:b7:1b:12:d7:a2:b4
      0d:fa:aa:7f:22:a5:84:11:88:9b:2a:9e:e0:d3:e2:96
      18:7b:70:e8:26:b4:7f:6f:6b:49:0d:2d:9a:cd:ea:6e
      f4:6f:c2:53:10:b6:55:2c:0e:7a:e4:99:1c:00:15:8e
      16:d4:d1:80:b7:c5:62:9b:ae:37:6a:9f:c0:bd:89:3e
      3b:6c:a1:b6:c8:69:ec:9c:4e:99:a1:50:72:71:99:09
      2b:12:aa:f5:7a:0c:70:65:85:11:27:4a:c8:42:12:22
      84:39:6c:9c:59:55:16:26:92:41:87:9f:b0:0b:c2:21
      6d:6f:7c:af:6a:f1:6a:07:65:f3:f1:ff:e4:92:f7:af
      24:0c:4f:6b:9e:af:18:fd:67:ed:5f:68:5f:11:07:06
      e9:93:54:8a:f0:94:53:83:0c:b6:e5:6f:38:44:f8:10
      31:30:cc:19:15:fd:ca:db:1c:11:dd:d0:df:79:6e:20
      97:d4:30:9e:71:92:38:9d:95:b0:a7:82:d2:f8:13:be
      c3:2a:87:d7:6f:79:c6:61:44:44:8e:b5:77:8a:fc:5b
      08:50:66:f6:b8:17:66:27:ed:8c:93:d1:2e:a5:b4:93
    Exponent (bits 24):
      01:00:01
  Extensions:
    Basic Constraints (critical):
      Certificate Authority (CA): FALSE
    Subject Key Identifier (not critical):
      4e0267d96b11684cb19c25565b6f6403cf2383da
    Authority Key Identifier (not critical):
      c7356a56c8bb335e0cf3dd23632c91b3aa4c1c9b
Other Information:
  Public Key Id:
    4e0267d96b11684cb19c25565b6f6403cf2383da

Is the above information ok? (Y/N): y


Signing certificate...

Agora vamos acertar as permissões das chaves

chmod 600 /etc/ldap/certs/*
chown openldap:openldap /etc/ldap/certs/*

Agora vamos criar o arquivo para que o LDAP reconheça as chaves e trabalhe com TLS

vim ~/tls_ldap.ldif
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/certs/ca.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/certs/server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/certs/server.key

Agora vamos importar as chaves

ldapmodify -QY EXTERNAL -H ldapi:// -f ~/tls_ldap.ldif
modifying entry "cn=config"

Agora vamos acertar o arquivo de inicialização do LDAP

vim /etc/default/slapd
[...]
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"

Agora vamos acertar a perte cliente para que possamos utilizar a conexão com TLS

Vamos fazer backup

cp -Rfa /etc/ldap/ldap.conf{,.bkp}

Agora vamos editar o arquivo

vim /etc/ldap/ldap.conf
BASE dc=douglasqsantos,dc=com,dc=br
URI ldaps://ldap2.douglasqsantos.com.br/
TLS_CACERT /etc/ldap/certs/ca.pem
TLS_REQCERT allow

Agora acertar o arquivo de controle da pam, mas primeiro vamos fazer backup do arquivo de configuração

cp /etc/pam_ldap.conf{,.bkp}

Vamos modificar o arquivo

vim /etc/pam_ldap.conf
base dc=douglasqsantos,dc=com,dc=br
uri ldaps://ldap2.douglasqsantos.com.br/
ldap_version 3
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
bindpw 123
pam_password crypt
ssl on
sslpath /etc/ldap/certs

Vamos fazer o backup do arquivo

cp /etc/libnss-ldap.conf{,.bkp}

Agora vamos acertar o arquivo

vim /etc/libnss-ldap.conf
base dc=douglasqsantos,dc=com,dc=br
uri ldaps://ldap2.douglasqsantos.com.br/
ldap_version 3
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
bindpw 123
ssl on
sslpath /etc/ldap/certs

Vamos fazer backup do arquivo nsswitch.conf que controla aonde vai ser consultado os usuários senha e grupos

cp /etc/nsswitch.conf{,.bkp}

Agora vamos modificar ele

vim /etc/nsswitch.conf
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       ldap

Agora vamos acertar a configuração da PAM

Vamos fazer backup dos arquivos primeiro

cp -Rfa /etc/pam.d{,.bkp}

Agora vamos acertar o arquivo de controle de sessão deixe o arquivo como abaixo

vim /etc/pam.d/common-session
session [default=1]                     pam_permit.so
session requisite                       pam_deny.so
session required                        pam_permit.so
session required                        pam_unix.so
session optional                        pam_ldap.so
session optional pam_mkhomedir.so skel=/etc/skel umask=077

Vamos acertar o arquivo de controle de senha deixe o arquivo como abaixo

vim /etc/pam.d/common-password
password        [success=2 default=ignore]      pam_unix.so obscure sha512
password        [success=1 user_unknown=ignore default=die]     pam_ldap.so try_first_pass
password        requisite                       pam_deny.so
password        required                        pam_permit.so

Vamos acertar agora o arquivo de controle do ssh deixe ele como abaixo

vim /etc/pam.d/sshd
auth       required     pam_env.so # [1]
auth       required     pam_env.so envfile=/etc/default/locale
@include common-auth
account    required     pam_nologin.so
#A linha abaixo para limitarmos o acesso ao ssh dessa maquina somente aos usuarios do grupo ti-admin ou root
account    sufficient   pam_succeed_if.so user ingroup root
account    requisite    pam_succeed_if.so user ingroup ti-admin
@include common-account
@include common-session
session    optional     pam_motd.so # [1]
session    optional     pam_mail.so standard noenv # [1]
session    required     pam_limits.so
@include common-password

Agora vamos acertar o arquivo de login

vim /etc/pam.d/login
auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so
#A linha abaixo para limitarmos o acesso ao ssh dessa maquina somente aos usuarios do grupo ti-admin ou root
account    sufficient   pam_succeed_if.so user ingroup root
account    requisite    pam_succeed_if.so user ingroup ti-admin
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session       required   pam_env.so readenv=1
session       required   pam_env.so readenv=1 envfile=/etc/default/locale
@include   common-auth
auth       optional   pam_group.so
session    required   pam_limits.so
session    optional   pam_lastlog.so
session    optional   pam_motd.so
session    optional   pam_mail.so standard
@include common-account
@include common-session
@include common-password
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open

Como pode ser notado estou limitando o acesso somente do root ou do grupo ti-admin para efetuar login ou acesso ao ssh ao servidor LDAP

Agora vamos reiniciar os serviços necessários

/etc/init.d/slapd restart
/etc/init.d/nscd restart

Agora vamos verificar os serviços rodando em nosso servidor

nmap -sS -p 389,636 localhost -T4

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-03 15:37 BRST
Interesting ports on localhost (127.0.0.1):
PORT    STATE SERVICE
389/tcp open  ldap
636/tcp open  ldapssl

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds

Agora no servidor MASTER temos que criar uma entrada para o replicador

vim ~/replicador.ldif
dn: cn=replicador,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: replicador
description: Replicador para LDAP
userPassword: {SSHA}A7i24ok7aP8qPbMHGOV8vI7g/HaSslph

O valor do paramêtro userPassword foi gerado da seguinte forma

slappasswd -s 123
{SSHA}A7i24ok7aP8qPbMHGOV8vI7g/HaSslph

Agora vamos importar o nosso replicador para a base LDAP no servidor master

ldapadd -cxWD cn=admin,dc=douglasqsantos,dc=com,dc=br -f /root/replicador.ldif
Enter LDAP Password: 
adding new entry "cn=replicador,dc=douglasqsantos,dc=com,dc=br"

Agora vamos verificar as opções de sincronismo no servidor LDAP

ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(olcDatabase={1}hdb)(cn=module{0})(olcOverlay={0}syncprov))"
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=douglasqsantos,dc=com,dc=br
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write by dn="cn=pesquisador,
 dc=douglasqsantos,dc=com,dc=br" read by * none
olcAccess: {1}to dn.base="" by * none
olcAccess: {2}to * by self write by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br"  wr
 ite by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read by users read by * n
 one
olcLastMod: TRUE
olcRootDN: cn=admin,dc=douglasqsantos,dc=com,dc=br
olcRootPW: {SSHA}Xv1nlX2wqgxwVaLTe7qtV/JbtoMf6XiL
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcDbIndex: uid eq
olcDbIndex: cn eq
olcDbIndex: ou eq
olcDbIndex: dc eq

Ainda no servidor master vamos fazer mais alguns ajustes

vim ~/olc-mod2.ldif
# 1.1.1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write
  by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read
  by * none
-
# 1.1.2.
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
  by self write
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write
  by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read
  by dn="cn=replicador,dc=douglasqsantos,dc=com,dc=br" read
  by anonymous auth
  by * none
-
# 1.2.
add: olcDbIndex
olcDbIndex: entryUUID eq
-
# 1.3.
add: olcDbIndex
olcDbIndex: entryCSN eq

# 2.
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {1}syncprov

# 3.
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100

Agora vamos importar as novas configurações

ldapmodify -QY EXTERNAL -H ldapi:/// -f ~/olc-mod2.ldif
modifying entry "olcDatabase={1}hdb,cn=config"

modifying entry "cn=module{0},cn=config"

adding new entry "olcOverlay=syncprov,olcDatabase={1}hdb,cn=config"

Agora no servidor LDAP SLAVE

Vamos consultar as configurações

ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(cn=config)(olcDatabase={1}hdb))"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcTLSCACertificateFile: /etc/ldap/certs/ca.pem
olcTLSCertificateFile: /etc/ldap/certs/server.pem
olcTLSCertificateKeyFile: /etc/ldap/certs/server.key
olcToolThreads: 1

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=douglasqsantos,dc=com,dc=br
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" wri
 te by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=douglasqsantos,dc=com,dc=br
olcRootPW: {SSHA}ezGp86eHq70MH4D+yLQqA+zJAFt7SCr8
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: objectClass eq

Agora vamos acertar as configurações para a nossa replicação

vim ~/olc-mod1.ldif
# 1.
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats

# 2.1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write
  by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read
  by dn="cn=replicador,dc=douglasqsantos,dc=com,dc=br" read
  by * none
-
# 1.1.2.
add: olcAccess
olcAccess: {1}to dn.base="" by * none
-
# 1.1.3
add: olcAccess
olcAccess: {2}to *
  by self write
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br"  write
  by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read
  by users read
  by * none
-
# 2.2.
delete: olcRootPW
-
# 2.3.
add: olcDbIndex
olcDbIndex: entryCSN eq
-
# 2.4.
add: olcDbIndex
olcDbIndex: entryUUID eq
-
# 2.5.
add: olcDbIndex
olcDbIndex: uid eq
-
# 2.6.
add: olcDbIndex
olcDbIndex: cn eq
-
# 2.7.
add: olcDbIndex
olcDbIndex: ou eq
-
# 2.8.
add: olcDbIndex
olcDbIndex: dc eq
-
# 2.9.
add: olcSyncrepl
olcSyncrepl: rid=123
  provider="ldaps://ldap1.douglasqsantos.com.br/"
  type=refreshAndPersist
  retry="60 30 300 +"
  searchbase="dc=douglasqsantos,dc=com,dc=br"
  bindmethod=simple
  tls_cacert=/etc/ldap/certs/ca.pem
  tls_reqcert=allow
  binddn="cn=replicador,dc=douglasqsantos,dc=com,dc=br"
  credentials=123

Em credentials a senha tem que ser em texto puro ele não aceita o hash {SSHA}

Agora vamos importar as configurações

ldapmodify -QY EXTERNAL -H ldapi:/// -f /root/olc-mod1.ldif
modifying entry "cn=config"

modifying entry "olcDatabase={1}hdb,cn=config"

Agora vamos para o ldap remover a base e iniciar novamente para testar a replicação

/etc/init.d/slapd stop
Stopping OpenLDAP: slapd.
rm -rf /var/lib/ldap/*
/etc/init.d/slapd start
Starting OpenLDAP: slapd.

Agora vamos efetuar um teste de consulta em nossa base

ldapsearch -xLLL
No such object (32)

Como anonimous não conseguimos nenhum resultado agora vamos tentar consultar com o admin

ldapsearch -xLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br -W 
Enter LDAP Password: 
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: cn=admin,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9WHYxbmxYMndxZ3h3VmFMVGU3cXRWL0pidG9NZjZYaUw=

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
ou: Usuarios
objectClass: organizationalUnit

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
ou: Grupos
objectClass: organizationalUnit

dn: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
ou: Maquinas
objectClass: organizationalUnit

dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword:: e1NTSEF9YVJDR3R0dytUTVcwd3AyNTJmSnJ4VWQ0QnB0dGExTTQ=

dn: cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: pesquisador
userPassword:: e1NTSEF9MWhTV2FiLzZ3STNzV1lYRW91WVAxc1gxWHNGc0FFQng=

dn: cn=replicador,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: replicador
description: Replicador para LDAP
userPassword:: e1NTSEF9QTdpMjRvazdhUDhxUGJNSEdPVjh2STdnL0hhU3NscGg=

Podemos acompanhar os logs do LDAP em /var/log/syslog

tail -f /var/log/syslog 
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 fd=26 ACCEPT from IP=10.0.0.26:48328 (IP=0.0.0.0:636)
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 fd=26 TLS established tls_ssf=128 ssf=128
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 op=0 BIND dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" method=128
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 op=0 BIND dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" mech=SIMPLE ssf=0
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 op=0 RESULT tag=97 err=0 text=
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 op=1 SRCH base="dc=douglasqsantos,dc=com,dc=br" scope=2 deref=0 filter="(objectClass=*)"
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 op=1 SEARCH RESULT tag=101 err=0 nentries=9 text=
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 op=2 UNBIND
Nov  3 16:39:31 ldap2 slapd[2296]: conn=1001 fd=26 closed

Vamos testar a autenticação no ldap2

[16:48:55] root@ldap2 [/etc/ldap] # su - douglas
Criando o diretório '/home/douglas'.
[16:48:58] douglas@ldap2 [~] $ 

Vamos verificar com qual usuário estamos logados

[16:48:58] douglas@ldap2 [~] $ whoami 
douglas
[16:49:56] douglas@ldap2 [~] $ 

Agora vamos colocar o usuário douglas do grupo sudo do ldap2

gpasswd -a douglas sudo

Agora vamos fazer um teste de acesso via ssh

ssh douglas@10.0.0.26
douglas@10.0.0.26's password: 
Linux ldap2 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
[16:51:14] douglas@ldap2 [~] $ sudo su -

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for douglas: 
[16:51:22] root@ldap2 [~] # 

Vamos ver os logs que foram gerados no servidor ldap2

tail -f /var/log/auth.log
Nov  3 16:51:13 ldap2 sshd[2514]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.0.0.20  user=douglas
Nov  3 16:51:13 ldap2 sshd[2514]: pam_succeed_if(sshd:account): requirement "user ingroup root" not met by user "douglas"
Nov  3 16:51:13 ldap2 sshd[2514]: pam_succeed_if(sshd:account): requirement "user ingroup ti-admin" was met by user "douglas"
Nov  3 16:51:13 ldap2 sshd[2514]: Accepted password for douglas from 10.0.0.20 port 58820 ssh2
Nov  3 16:51:13 ldap2 sshd[2514]: pam_unix(sshd:session): session opened for user douglas by (uid=0)
Nov  3 16:51:22 ldap2 sudo: pam_unix(sudo:auth): authentication failure; logname=douglas uid=0 euid=0 tty=/dev/pts/1 ruser=douglas rhost=  user=douglas
Nov  3 16:51:22 ldap2 sudo:  douglas : TTY=pts/1 ; PWD=/home/douglas ; USER=root ; COMMAND=/bin/su -
Nov  3 16:51:22 ldap2 su[2533]: Successful su for root by root
Nov  3 16:51:22 ldap2 su[2533]: + /dev/pts/1 root:root
Nov  3 16:51:22 ldap2 su[2533]: pam_unix(su:session): session opened for user root by douglas(uid=0)

Agora vamos configurar o Ldap-Account-Manager para podermos gerenciar o nosso LDAP pela Web

Vamos instalar alguns pacotes necessário

aptitude install ldap-account-manager php5-ldap php5-gd php-fpdf libjs-jquery libjs-jquery-ui debconf php5-mcrypt ldap-account-manager-lamdaemon -y

Agora vamos acertar a configuração do lam

vim /usr/share/ldap-account-manager/config/lam.conf
[...]
serverURL: ldap://ldap2.douglasqsantos.com.br
[...]
admins: cn=admin,dc=douglasqsantos,dc=com,dc=br
[...]
treesuffix: dc=douglasqsantos,dc=com,dc=br
[...]
defaultLanguage: pt_BR.utf8:UTF-8:Português (Brasil)
[...]
types: suffix_user: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
[...]
types: suffix_group: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
[...]
types: suffix_host: ou=Maquinas,dc=douglasqsantos,dc=com,dc=br
[...]
types: suffix_smbDomain: dc=douglasqsantos,dc=com,dc=br

Agora para acessar o LAM http://ip_servidor/lam informe a senha do admin e se divirta

Opcional: Agora vamos acertar o LAM para trabalhar com HTTPS

Vamos gerar as chaves para o https

Vamos preparar o diretório para receber as chaves

mkdir -p /etc/ssl/apache
cd /etc/ssl/apache

Agora vamos gerar a key

openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
..++++++
.++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

Agora vamos gerar o csr

openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:Douglas
Common Name (eg, YOUR name) []:ldap2.douglasqsantos.com.br
Email Address []:douglas@douglasqsantos.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Agora vamos assinar o nosso certificado

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=Douglas/CN=ldap2.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
Getting Private key
Enter pass phrase for server.key:

Agora vamos acertar as permissões das chave

chmod 0400 server.*
cp server.key server.key.orig

Agora vamos tirar a senha do certificado

openssl rsa -in server.key.orig -out server.key
Enter pass phrase for server.key.orig:
writing RSA key

Agora vamos acertar as permissões novamente

chmod 0400 /etc/ssl/apache/*

Agora vamos acertar o virtual host para o LAM <code sxh> vim /etc/apache2/sites-available/lam2 <VirtualHost *:443>

      ServerAdmin webmaster@douglasqsantos.com.br
      ServerName lam2.douglasqsantos.com.br
      DocumentRoot "/usr/share/ldap-account-manager"
      <Directory /usr/share/ldap-account-manager>
                Options +FollowSymLinks
                AllowOverride All
                Order allow,deny
                Allow from all
                DirectoryIndex index.html
      </Directory>
      <Directory /var/lib/ldap-account-manager/tmp>
                Options -Indexes
      </Directory>
      <Directory /var/lib/ldap-account-manager/sess>
                Options -Indexes
                Order allow,deny
                Deny from all
      </Directory>
      <Directory /var/lib/ldap-account-manager/config>
                Options -Indexes
                Order allow,deny
                Deny from all
      </Directory>
      <Directory /usr/share/ldap-account-manager/lib>
                Options -Indexes
                Order allow,deny
                Deny from all
      </Directory>
      <Directory /usr/share/ldap-account-manager/help>
                Options -Indexes
                Order allow,deny
                Deny from all
      </Directory>
      <Directory /usr/share/ldap-account-manager/locale>
                Options -Indexes
                Order allow,deny
                Deny from all
      </Directory>
       <IfModule mod_php5.c>
       AddType application/x-httpd-php .php
               php_flag expose_php Off
               php_flag allow_url_fopen Off
               php_flag allow_url_include Off
               php_flag magic_quotes_gpc Off
               php_flag register_globals Off
               php_flag disable_functions show_source
               php_flag disable_functions system
               php_flag disable_functions shell_exec
               php_flag disable_functions passthru
               php_flag disable_functions exec
               php_flag disable_functions popen
               php_flag disable_functions proc_open
               php_flag disable_functions symlink
       </IfModule>
      CustomLog /var/log/apache2/lam.access.log combined
      ErrorLog /var/log/apache2/lam.error.log
      LogLevel warn
      SSLEngine on
      SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
      SSLCertificateFile "/etc/ssl/apache/server.crt"
      SSLCertificateKeyFile "/etc/ssl/apache/server.key"
      <FilesMatch "\.(cgi|shtml|phtml|php)$">
               SSLOptions +StdEnvVars
      </FilesMatch>
               BrowserMatch ".*MSIE.*" \
               nokeepalive ssl-unclean-shutdown \
               downgrade-1.0 force-response-1.0
      ServerSignature Off

</VirtualHost> </sxh>

Agora vamos configurar a porta que o nosso virtual host vai estar escutando

vim /etc/apache2/ports.conf
[...]
NameVirtualHost *:443
#NameVirtualHost *:80
#Listen 80

Vamos carregar agora o módulo ssl para o apache

a2enmod ssl

Agora vamos desabilitar os dois sites padrões do apache

a2dissite default
a2dissite default-ssl

Agora vamos habilitar o site do lam

a2ensite lam2

Agora vamos reiniciar o apache

/etc/init.d/apache2 restart

Agora podemos acessar o nosso lam em https://lam2.douglasqsantos.com.br

Senão foi adicionada uma entrada no DNS pode ser utilizado a configuração do /etc/hosts no cliente

[...]
ip_servidor   lam2.douglasqsantos.com.br lam

Agora vamos dar acesso ao servidor slave escrever na base vamos verificar os parametros antes da alteração

ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(cn=module{0}) (olcDatabase={1}hdb)(olcOverlay={0}chain)(olcDatabase={0}ldap))"
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=douglasqsantos,dc=com,dc=br
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write by dn="cn=pesquisador,
 dc=douglasqsantos,dc=com,dc=br" read by dn="cn=replicador,dc=douglasqsantos,dc=com,dc=br"
  read by * none
olcAccess: {1}to dn.base="" by * none
olcAccess: {2}to * by self write by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br"  wr
 ite by dn="cn=pesquisador,dc=douglasqsantos,dc=com,dc=br" read by users read by * n
 one
olcAccess: {3}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write by * none
olcAccess: {4}to dn.base="" by * read
olcAccess: {5}to * by self write by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" wri
 te by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=douglasqsantos,dc=com,dc=br
olcSyncrepl: {0}rid=123 provider="ldaps://ldap1.douglasqsantos.com.br/" type=refresh
 AndPersist retry="60 30 300 +" searchbase="dc=douglasqsantos,dc=com,dc=br" bindmeth
 od=simple tls_cacert=/etc/ldap/certs/ca.pem tls_reqcert=allow binddn="cn=repl
 icador,dc=douglasqsantos,dc=com,dc=br" credentials=123
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcDbIndex: entryCSN eq
olcDbIndex: entryUUID eq
olcDbIndex: uid eq
olcDbIndex: cn eq
olcDbIndex: ou eq
olcDbIndex: dc eq

Vamos fazer alguns acertos no servidor Slave

vim ~/olc-mod2.ldif
# 1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcUpdateref
olcUpdateref: "ldaps://ldap1.douglasqsantos.com.br/"

# 2.
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {1}back_ldap

# 3.
dn: olcOverlay=chain,olcDatabase={-1}frontend,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcChainConfig
olcOverlay: {0}chain
olcChainReturnError: TRUE

# 4.
dn: olcDatabase=ldap,olcOverlay={0}chain,olcDatabase={-1}frontend,
 cn=config
changetype: add
objectClass: olcLDAPConfig
objectClass: olcChainDatabase
olcDatabase: {0}ldap
olcDbURI: "ldaps://ldap1.douglasqsantos.com.br/"
olcDbRebindAsUser: TRUE
olcDbIDAssertBind: bindmethod=simple
  tls_cacert=/etc/ldap/certs/ca.pem
  tls_reqcert=allow
  binddn="cn=replicador,dc=douglasqsantos,dc=com,dc=br"
  credentials=123
  mode=self

Agora vamos importar a nova configuração

ldapmodify -QY EXTERNAL -H ldapi:/// -f /root/olc-mod2.ldif
modifying entry "olcDatabase={1}hdb,cn=config"

modifying entry "cn=module{0},cn=config"

adding new entry "olcOverlay=chain,olcDatabase={-1}frontend,cn=config"

adding new entry "olcDatabase=ldap,olcOverlay={0}chain,olcDatabase={-1}frontend,cn=config"

Agora no servidor master temos que autorizar o slave escrever na base

vim ~/replicador-authzto.ldif
dn: cn=replicador,dc=douglasqsantos,dc=com,dc=br
changetype: modify
add: authzTo
authzTo: {0}dn.regex:^uid=[^,]+,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br$
authzTo: {1}dn.exact:cn=admin,dc=douglasqsantos,dc=com,dc=br

Agora vamos importar a nova configuração no servidor master

ldapmodify -xWD "cn=admin,dc=douglasqsantos,dc=com,dc=br" -f /root/replicador-authzto.ldif
Enter LDAP Password: senha
modifying entry "cn=replicador,dc=douglasqsantos,dc=com,dc=br"
export DEBIAN_PRIORITY=critical
export DEBIAN_FRONTEND=noninteractive

Agora vamos verificar a configuração do nosso servidor master

ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config cn=config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: stats
olcPidFile: /var/run/slapd/slapd.pid
olcTLSCACertificateFile: /etc/ldap/certs/ca.pem
olcTLSCertificateFile: /etc/ldap/certs/server.pem
olcTLSCertificateKeyFile: /etc/ldap/certs/server.key
olcToolThreads: 1

Agora vamos criar o arquivo para que o servidor master aceita modificações efetuadas pelo slave

vim ~/olc-AuthzPolicy.ldif
dn: cn=config
changetype: modify
add: olcAuthzPolicy
olcAuthzPolicy: to

Agora vamos importar a configuração

ldapmodify -QY EXTERNAL -H ldapi:/// -f ~/olc-AuthzPolicy.ldif
modifying entry "cn=config"

Agora vamos fazer um teste vamos escrever na base slave e vai ter que replicar para o servidor master no servidor SLAVE

vim ~/replica.desc.ldif
dn: cn=replicador,dc=douglasqsantos,dc=com,dc=br
changetype: modify
replace: description
description: LDAP SLAVE REPLICATOR

Agora vamos importar a nova descrição para o replicador no servidor slave

ldapmodify -xWD "cn=admin,dc=douglasqsantos,dc=com,dc=br" -f /root/replica.desc.ldif
Enter LDAP Password: 
modifying entry "cn=replicador,dc=douglasqsantos,dc=com,dc=br"

Agora vamos consultar a base no servidor slave

ldapsearch -xLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br -W '(cn=replicador)'
Enter LDAP Password: 
dn: cn=replicador,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: replicador
userPassword:: e1NTSEF9QTdpMjRvazdhUDhxUGJNSEdPVjh2STdnL0hhU3NscGg=
description: LDAP SLAVE REPLICATOR

Como pode ser notado a descrição do replicador foi modificada agora vamos consultar no servidor master

ldapsearch -xLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br -W '(cn=replicador)'
Enter LDAP Password: 
dn: cn=replicador,dc=douglasqsantos,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: replicador
userPassword:: e1NTSEF9QTdpMjRvazdhUDhxUGJNSEdPVjh2STdnL0hhU3NscGg=
description: LDAP SLAVE REPLICATOR

Temos a mesma informação nas duas pontas

Agora vamos configurar um cliente para se conectar em nossa base LDAP

Vamos acertar as variáveis do ambiente

export DEBIAN_PRIORITY=critical
export DEBIAN_FRONTEND=noninteractive
aptitude install libnss-ldap libpam-ldap ldap-utils -y

Agora vamos voltar o valor das variáveis

unset DEBIAN_PRIORITY
unset DEBIAN_FRONTEND

Vamos acertar o arquivo /etc/hosts nos dois servidores

vim /etc/hosts
127.0.0.1       localhost
10.0.0.25       ldap1.douglasqsantos.com.br       ldap1
10.0.0.26       ldap2.douglasqsantos.com.br       ldap2
10.0.0.27       cliente.douglasqsantos.com.br     cliente

Vamos ajustar o nome do cliente em /etc/hostname

vim /etc/hostname
cliente

Vamos desabilitar o IPV6 no cliente

echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf

Vamos fazer backup do /etc/nsswitch

cp /etc/nsswitch.conf{,.bkp}

Agora vamos acertar o arquivo

vim /etc/nsswitch.conf
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       ldap

Agora vamos fazer um backup da pam

cp -Rfa /etc/pam.d{,.bkp}

Vamos acertar o arquivo que controla as sessões

vim /etc/pam.d/common-session
session [default=1]                     pam_permit.so
session requisite                       pam_deny.so
session required                        pam_permit.so
session required        pam_unix.so
session optional                        pam_ldap.so
session optional pam_mkhomedir.so skel=/etc/skel umask=077

Agora vamos configurar o arquivo que controla as senha

vim /etc/pam.d/common-password
password        [success=2 default=ignore]      pam_unix.so obscure sha512
password        [success=1 user_unknown=ignore default=die]     pam_ldap.so try_first_pass
password        requisite                       pam_deny.so
password        required                        pam_permit.so

Agora vamos criar o diretório para armazenar o certificado e vamos importar ele do servidor

mkdir /etc/ldap/certs
scp ldap1.douglasqsantos.com.br:/etc/ldap/certs/ca.pem /etc/ldap/certs/

Vamos acertar o arquivo que o cliente vai consultar para saber para qual servidor ele tem que efetuar pesquisa

vim /etc/ldap/ldap.conf
BASE dc=douglasqsantos,dc=com,dc=br
URI ldaps://ldap1.douglasqsantos.com.br/ ldaps://ldap2.douglasqsantos.com.br/
TLS_CACERT /etc/ldap/certs/ca.pem
TLS_REQCERT allow

Vamos acertar agora o arquivo de controle entra pam e ldap

Vamos fazer um backup do arquivo

cp /etc/pam_ldap.conf{,.bkp}

Agora vamos ajustar o arquivo

vim /etc/pam_ldap.conf
uri ldaps://ldap1.douglasqsantos.com.br/ ldaps://ldap2.douglasqsantos.com.br/
ldap_version 3
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
bindpw 123
pam_password crypt
ssl on
sslpath /etc/ldap/certs

Agora vamos acertar o libnss-ldap

Vamos fazer backup do arquivo

cp /etc/libnss-ldap.conf{,.bkp}

Agora vamos acertar o arquivo

vim /etc/libnss-ldap.conf
base dc=douglasqsantos,dc=com,dc=br
uri ldaps://ldap1.douglasqsantos.com.br/
ldap_version 3
binddn cn=pesquisador,dc=douglasqsantos,dc=com,dc=br
bindpw 123
ssl on
sslpath /etc/ldap/certs

Agora vamos reiniciar o nscd

/etc/init.d/nscd restart

Agora vamos efetuar uma consulta na base para ver se esta tudo ok

ldapsearch -xLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br -W '(cn=douglas)'
Enter LDAP Password: 
dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20000
gidNumber: 20000
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword:: e1NTSEF9YVJDR3R0dytUTVcwd3AyNTJmSnJ4VWQ0QnB0dGExTTQ=

Agora vamos adicionar o usuário douglas no grupo sudo

gpasswd -a douglas sudo

Agora vamos testar uma conexão ssh do servidor para o cliente

ssh douglas@10.0.0.27
The authenticity of host '10.0.0.27 (10.0.0.27)' can't be established.
RSA key fingerprint is 64:d9:04:30:7c:71:51:b0:21:95:a3:75:36:60:a9:eb.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.27' (RSA) to the list of known hosts.
douglas@10.0.0.27's password: 
Creating directory '/home/douglas'.
Linux cliente 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
[18:25:56] douglas@cliente [~] $ sudo su -

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for douglas: 
[18:26:03] root@cliente [~] # 

Como pode ser notado da um pouco de trabalho mais temos a autenticação das maquinas e servidores centralizada com redundancia e com tls

Referências