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
- Nome LDAP master: ldap1
- Domínio: douglasqsantos.com.br
- IP: 10.0.0.25
- Nome LDAP slave: ldap2
- Domínio: douglasqsantos.com.br
- 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
- -LLL print responses in LDIF format without comments and version
- -Q use SASL Quiet mode
- -Y mech SASL mechanism
- -H URI LDAP Uniform Resource Identifier(s)
- -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ãoAgora 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