Autenticação Linux Ubuntu com LDAP
10 de Agosto de 2009, 0:00 - 6 comentários(Autenticação de sistema Linux usando LDAP e mapeamento do home do usuário com o SAMBA em substituição ao NFS)
Pré-requisitos:
- Instalação do Gosa;
- Criação de usuário na base LDAP (conta UNIX);
1 Introdução
Nesse artigo será mostrado como habilitar autenticação em sistema Linux, mas especificamente os sistemas baseados em Debian, tais como Ubuntu. Autenticação um sistema Linux em um servidor de autenticação com o LDAP é algo necessário e fundamental para o bom funcionamento de uma rede.
A autenticação do sistema Linux dá ao usuário o acesso a uma shell, por meio da qual ele pode interagir com o sistema. Autenticação só é possível devido ao módulo de autenticação que o Linux utiliza que é o PAM. Quando instalamos o pacote libnss-ldap, todos os ajustes no módulo PAM são feitos automaticamente.
# apt-get install libnss-ldap
Durante a instalação, alguns passos devem ser preenchidos. O primeiro passo é definir o ip do servidor LDAP, como mostra a figura 1.
Figura 1 – Configuração do ip do servidor LDAP
Na tela seguinte é solicitado o suffix do servidor LDAP, como motra a figura 02.
Figura 02 – Configuração do suffix
Na próxima tela é solicitada a versão do LDAP. Normalmente estamos trabalhando com a versão 3 do LDAP.
A próxima tela é muito importante, porque permite o armazenamento da semana do administrador do LDAP e possibilita a utilização desses dados por outras aplicações como NFS. A senha do administrador será armazenada em outro arquivo. Portanto escolha a opção "YES" como mostra a figura 03.
Figura 03 – Armazenamento do administrador do LDAP
A próxima tela define que o sistema vai utilizar o login do database.
Figura 04 – definição do login
Na telas seguintes é definido o administrador da base LDAP e a sua senha.
Após a instalação do pacote libnss-ldap todos os ajustes no PAM foram feitas pelo instalador. Dentro do diretório /etc/pam.d/, temos os arquivos common-account, common-auth, common-password contém as linhas de integração do PAM com LDAP.
Configuração dos arquivos
O arquivo nsswitch.conf define os locais onde o sistema operacional pesquisará para realizar autenticação. Na maioria dos casos é definido mais de um local, como, por exemplo, "passwd: files ldap", sendo que, neste caso, o sistema irá procurar primeiro nos arquivos (files) e em seguida no LDAP.
passwd: files ldap
shadow: files ldap
group: files ldap
Neste ponto, o sistema estará buscando as senhas na base de dados LDAP. Para verificar se isso está realmente acontecendo, use o comando getent:
# getent passwd
Ele deverá retornar todos os usuários que estão no LDAP.
Compartilhamento do HOME
Com o libnss-ldap instalado e o arquivo nsswitch.conf configurado, podemos fazer o teste para verificar se o sistema está autenticando os usuários do LDAP.
Discher login: clodonil
Password: * * * *
No directory, logginf in with HOME=/
[clodonil@Discher] /$
No exemplo acima, não existe o diretório /home/clodonil no sistema. O diretório é definido na base LDAP. Por isso que o sistema não encontrou o HOME do usuário, porque não existe. Para resolver, podemos configurar para ser montando o HOME do usuário que deve estar no servidor de arquivo, através do SAMBA ou NFS.
Neste artigo vamos utilizar o SAMBA devido aos problemas e "fama" do NFS. O SAMBA deve estar configurado e o mesmo usuário deve estar cadastrado no servidor SAMBA.
Vamos instalar os pacotes para montar o smbfs durante o login, os dois pacotes são libpam-mount e smbfs.
# apt-get install libpam-mount smbfs
Após a instalação vamos fazer um teste no shell para termos a certeza que o SAMBA está funcionando corretamente. Para isso vamos montar o HOME do usuário no /mnt.
# mount –t smbfs –o username=clodonil,password=senha //servidor_samba/clodonil /mnt
Se o mapeamento funcionar corretamente, vamos passar para a configuração do arquivo pam_mount.conf.xml que é o arquivo que faz o mapeamento automático do usuário após o login.
Vamos editar o arquivo /etc/security/pam_mount.conf.xml, adicionando a seguinte linha.
<volume fstype="smbfs" server="ip_do_servidor_samba" path="%(USER)" mountpoint="/home/%(USER)" options="iocharset=utf8,file_mode=0700,dir_mode=0700" />
Essa linha adicionada define que será utilizado o protocolo "smbfs", e também deve ser definido o ip do servidor do SAMBA no campo server. Os outros campos como %(USER) será substituído automaticamente pelo sistema na hora do login pelo usuário em questão.
Segue o arquivo /etc/security/pam_mount.conf.xml completo.
<?xml version="1.0" encoding="utf-8" ?>
quot;pam_mount.conf.xml.dtd">
<pam_mount>
<volume fstype="smbfs" server="ip_do_servidor_samba" path="%(USER)" mountpoint="/home/%(USER)" options="iocharset=utf8,file_mode=0700,dir_mode=0700" />
<debug enable="0" />
<mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other" />
<mntoptions require="nosuid,nodev" />
<path>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin</path>
<logout wait="0" hup="0" term="0" kill="0" />
<mkmountpoint enable="1" remove="true" />
</pam_mount>
Feito isso, será montado no sistema de arquivo o HOME do usuário na hora do login.
Servidor DNS (BIND9) – Integração Perfeita com o GOsa
9 de Agosto de 2009, 0:00 - Um comentário<!-- Easy AdSense V2.72 --> <!-- Post[count: 3] -->1. Introdução
O servidor DNS é utilizado para resolver nomes de computadores, ou seja, toda vez que chega uma requisição com um nome (ex: www.nisled.org), ele o transforma em um endereço IP. O servidor DNS é a base da Internet. Para uma compreensão mais ampla, imagine a Internet sem o servidor DNS: tudo funcionaria sem problemas; no entanto, imagine que, ao invés de acessar os sites pelos nomes (www.uol.com.br, www.estadao.com.br, www.nisled.org, etc.), você teria que decorar o endereço IP dos servidores para poder acessá-los!
Se decorar número de telefone já é difícil, imagine decorar IPs.
Normalmente, o DNS mantém suas informações numa lista gravada num arquivo de texto simples. No entanto, ao estudar a sua estrutura, descobrimos que ele trabalha em forma de árvore. Portanto, é possível diminuir as despesas gerais de administração (gerenciamento dos domínios) guardando os dados do DNS em forma de árvore; a estrutura geral do OpenLDAP já contribui para isso.
Outro fator que contribui para o uso do OpenLDAP é o fato dos servidores DNS necessitarem de uma replicação de dados para o DNS secundário. Como esse serviço já vem implementado no OpenLDAP, torna-se muito mais fácil a sua implementação. Os requisitos de segurança para a replicação são satisfeitos pelo OpenLDAP, o que nem sempre acontece com os servidores DNS.
Vamos começar esse artigo, descrevendo como criar a estrutura do DNS dentro do LDAP com ajuda do GOsa. Neste artigo vamos utilizar como exemplo o domínio "curso.ldap" e o ip do servidor 192.168.0.1.
2. GOsa
O ambiente GOsa é uma poderosa ferramenta de gerenciamento de recursos de rede no LDAP, e como não poderia ser diferente, ele tem suporte para gerenciar as entradas para o servidor dns BIND.
Para começar a criar as entredas para o BIND, entre no ambiente GOsa e logo em seguida click no ícone "Systems" como mostra a figura 1.
Figura 1 – Ambiente central do GOsa
Ao entrar no "Systems" será mostrada todos os componentes cadastrados, caso existem. Na parte superior da tela temos as lista de sistemas que podem ser cadastrados. Escolha criar um novo servidor como mostra a figura 2.
Figura 2 – Lista de Sistemas
Ao entrar na tela para criar um novo servidor, automaticamente abrirá a aba "Generic". Nela devem ser preenchidos os campos "Server name" e o endereço de IP e MAC. Esses dados não são utilizados pelo DNS, apenas para cadastrar o servidor. A figura 3 mostra o cadastro desta tela.
Figura 3 – Cadastro do servidor
Após o cadastro dos dados na primeira aba, click na aba "DNS" para criar uma nova zona de DNS. Para isso click no botão "Add", como mostra a figura 4.
Figura 4 – Criação de uma zona de DNS
Para adicionar uma nova zona, preencha os dados de acordo com o domínio desejado. O campo "zone name" define o domínio que será criado. Também defina o endereço de rede e a mascara da rede. Os campo da área "SOA record" definem o cabeçalho do servidor dns, por isso preencha os campos "Primary dns Server for this zone" com o nome do servidor dns, como mostra a figura 5. Lembre-se de resolver esse nome no arquivo /etc/hosts do servidor dns. Também preencha os campos de email. Na área "MxRecords" registre os servidores de email deste domínio. Para editar os computadores deste domínio é necessário primeiramente salvar a zone para o botão "Zone records" habilitar.
Figura 5 – Criação da zona
Após salvar o registro da zona, aba novamente que o botão "Edit" estará habilitado e com ele podemos cadastrar os computadores do domínio, como mostra a figura 6.
Figura 6 – Criação das maquinas domínio
3. BIND9
Com a criação do domínio no GOsa, vamos passar para a instalação do servidor dns. Será utilizado o pacote pré-compilado para o servidor Ubuntu.
# apt-get install bind9
O próximo passo é a configuração da zona no bind9. Para isso altere o arquivo /etc/bind/named.conf acrescentando as seguintes linhas.
zone "curso.ldap" {
type master;
file "/etc/bind/db.curso.ldap";
};zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/rec.curso.ldap";
};
O próximo passo é criar os arquivos db.curso.ldap e o arquivo rec.curso.ldap. Esses arquivos são criados através de um script que exporta as informações do LDAP (GOsa).
4. ldap2zone
Utilizaremos o script ldap2zone para exportar os registros da base LDAP. Esse script foi escrito com a linguagem de C, portanto é preciso compilá-lo. Para realizar essa tarefa entre no diretório /usr/local/src, e faça download do script.
# cd /usr/local/src
# wget www.venaas.no/dns/ldap2zone/ldap2zone.c
Antes de começar a compilar os fontes do script, instale os pré-requisitos que são as bibliotecas do LDAP e os compiladores.
# apt-get install libc6-dev gcc libldap2-dev
A compilação do script de exportação é bem simples. Segue o passo para a compilação.
# gcc -o ldap2zone -lldap -llber ldap2zone.c
Após a compilação mova o arquivo binário compilado para o diretório /usr/local/bin.
# mv ldap2zone /usr/local/bin
Agora com o script compilado, vamos realizar alguns testes para verificar se exportação está sendo corretamente.
Primeiro vamos exportar o db.
# ldap2zone curso.ldap. ldap://192.168.0.10 604800
$TTL 604800
@ IN SOA ns1.curso.ldap. clodonil.nisled.org. (
2009080904 ; Serialnumber
3600 ; Refresh
1800 ; Retry
720000 ; Expire
6400 ) ; Minimum TTL
NS ns1.curso.ldap.
MX 0 mail.curso.ldap.
MX 1 server.curso.ldap.
www 7440 A 192.168.0.1
mail 7440 A 192.168.0.1
server 7440 A 192.168.0.1
ns1 7440 A 192.168.0.1
Como pode ver a exportação foi feita corretamente, também vamos testar a exportação do reverso.
# ldap2zone 0.168.192.in-addr.arpa ldap://192.168.0.10 604800
$TTL 604800
@ IN SOA ns1.curso.ldap. clodonil.nisled.org. (
2009080904 ; Serialnumber
3600 ; Refresh
1800 ; Retry
720000 ; Expire
6400 ) ; Minimum TTL
NS ns1.curso.ldap.
MX 0 mail.curso.ldap.
MX 1 server.curso.ldap.
1 7440 PTR www.curso.ldap.
7440 PTR mail.curso.ldap.
7440 PTR server.curso.ldap.
7440 PTR ns1.curso.ldap.
Para tornar a tarefa de exportação mais automatizada, vamos criar um script para exportar as entradas do LDAP e criar os respectivos arquivos. Segue o script.
#!/bin/bash
ldap2zone 0.168.192.in-addr.arpa ldap://192.168.0.10 604800 > /etc/bind/rev.curso.ldap
ldap2zone curso.ldap. ldap://192.168.0.10 604800 > /etc/bind/db.curso.ldap
Para não precisar ficar executando o script toda vez que fizer uma alteração pelo GOsa, vamos colocar o script no crontab e pedir para executar em 5 em 5 minutos.
*/5 * * * * /usr/local/bin/dns.sh
5. Teste
Para realizar os testes que precisamos, vamos alterar primeiramente reiniciar o servidor DNS.
# /etc/init.d/bind9 restart
O próximo passo é alterar o arquivo /etc/resolv.conf, e apontar para o servidor DNS que acabamos de configurar.
nameserver 192.168.0.1
Em seguida utilize o comando ping para verificar se o servidor tá "resolvendo" o nome pesquisa.
# ping www.curso.ldap
PING www.curso.ldap (192.168.0.1) 56(84) bytes of data.
64 bytes from nucleo.local (192.168.0.1): icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from nucleo.local (192.168.0.1): icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from nucleo.local (192.168.0.1): icmp_seq=3 ttl=64 time=0.056 ms
Conforme o resultado apresentado pelo comando ping, o servidor DNS tá funcionando corretamente.
6. Troubleshooting
- Verifique se os arquivos db e rev estão sendo gerados pelos scripts;
- Verifique os logs do bind9 (tail –f /var/log/daemon)
- No GOsa verifique se colocou ponto (.) no final dos nomes definidos como servidor de e-mail.
Réplica da base LDAP com SSL/TLS e SASL
4 de Agosto de 2009, 0:00 - sem comentários ainda<!-- Easy AdSense V2.72 --> <!-- Post[count: 3] -->A réplica na base LDAP é um elemento de fundamental importância para segurança dos dados e para balanceamento de carga. Como mostra a figura 1, podemos ter um servidor “master” que recebe os dados e distribui para outros “slave” que pode estar em qualquer parte da empresa, desde um servidor ao lado até em um servidor na matriz em outro país.
Figura 01 – Réplica da base LDAP
A réplica é uma solução bastante utilizada, porém também é um dos momentos mais críticos, pois os dados “inteiros” são transferidos pela rede e até pela Internet. Por isso é de fundamental importância a implementação de métodos que protejam essas informações de curiosos. Neste artigo vamos utilizar duas formas de proteção dos dados, que são:
- TLS/SSL – Criação de um canal criptografado para transferência dos dados; e
- SASL – Vamos utilizar Cyrus-SASL, que implementa uma camada de segurança na autenticação.
Para demonstrar os recursos do LDAP, vamos começar desde a instalação até a réplica da base LDAP. Vamos utilizara distribuição Ubuntu-Server.
1- Instalação do servidor LDAP
Para instalação do OpenLDAP vamos utilizar os pacotes pré-compilados da distribuição.
[root@master]# apt-get install slapd ldap-utils
Com a instalação feita, o próximo passo é a configuração do LDAP. Para isso apague o diretório slapd.d que está dentro do diretório /etc/ldap e crie o arquivo slapd.conf, conforme o exemplo a seguir:
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/misc.schemapassword-hash {CRYPT}
defaultsearchbase dc=curso,dc=ldap
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.argsloglevel 1024
modulepath /usr/lib/ldap
moduleload back_bdb
moduleload back_monitoraccess to dn.base=""
by * readaccess to dn.base="cn=Subschema"
by * readaccess to dn.subtree=cn=Monitor
by * readdatabase monitor
database bdb
cachesize 5000
mode 0600suffix "dc=curso,dc=ldap"
checkpoint 512 720rootdn "cn=manager,dc=curso,dc=ldap"
rootpw pedra# Indexing
index default sub
index uid,mail eq
directory "/var/lib/ldap "
lastmod on
Mude o dominio (dc=curso,dc=ldap) LDAP para aquele que desejar. Em seguida altere o arquivo /etc/default/slapd, e acresce altere a seguinte linha:
SLAPD_CONF="/etc/ldap/slapd.conf"
Feito essas configurações, já podemos iniciar o slapd.
[root@master]# /etc/init.d/slapd restart
Verifique se a porta 389 está aberta.
1.2 – Criação da base
A figura 2 mostra a estrutura que vamos utilizar na base LDAP.
Segue o arquivo estrutura.ldif
dn: dc=curso,dc=ldap
objectClass: top
objectClass: dcObject
objectClass: organization
dc: curso
o: Sistema de Backupdn:ou=people,dc=curso,dc=ldap
objectClass: top
objectClass: organizationalunit
objectClass: dcObject
dc: curso
ou:peopledn:ou=group,dc=curso,dc=ldap
objectClass: top
objectClass: organizationalunit
objectClass: dcObject
dc: curso
ou:groupdn:uid=jose,ou=people,dc=curso,dc=ldap
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
cn:jose
sn: sila
mail: jose@jose.com
telephonenumber:11-11-1-11
uid: jose
userPassword: x
homeDirectory: /home/jose
displayName: Jose Silva
loginShell: /dev/null
uidNumber: 512
gidNumber: 100dn: cn=administrador,ou=group,dc=curso,dc=ldap
objectClass: posixGroup
cn: administrador
gidNumber: 999
memberUid: jose
Com o arquivo criado, vamos utilizar o comando ldapadd para importar o arquivo LDIF para a base LDAP
[root@master]# ldapadd –f estrutura.ldif –x –D cn=manager,dc=curso,dc=ldap –W
2 – SSL
Com a estrutura da base LDAP feita, vamos implementar o TLS/SSL no servidor LDAP. Para isso certifique que o pacote opessl esteja instalado. No primeiro passo vamos criar o diretório que será criado o CA (certificador).
[root@master]# mkdir /opt/CAtls
Dentro do diretório criado, execute o script CA.sh –newca para criar um novo CA.
[root@master]opt/CAtls# /usr/lib/ssl/misc/CA.sh –newca
No campo “Enter PEM pass phrase” defina a senha para validação do certificado. Esta Senha vai ser usada para validação das chaves. Preencha os campos como mostra a figura 03;
} No campo “A challenge password []:”, não defina nada, pressione “enter”. Essa é uma senha além da chave. Toda vez que for utilizar a chave terá que digitar a senha.
} No campo “Enter pass phrase for” digite a senha definida no “Enter PEM pass phrase”
Após a criação do CA, vamos criar a chave:
[root@master]opt/CAtls# openssl req -newkey rsa:1024 -nodes -keyout newreq.pem -out newreq.pem
E para finalizar é necessário assinar a chave utilizando o CA criado.
[root@master]opt/CAtls# /usr/lib/ssl/misc/CA.sh –sign
} Digite a senha do CA e responda todos os questionamentos como “yes”
Agora temos as seguintes chaves:
Copie as chaves para o diretório LDAP:
Crie o diretório para chave no slapd:
[root@master]# mkdir /etc/ldap/tls
Copie as chaves:
[root@master]# cp /opt/CAtls/demoCA/cacert.pem /etc/ldap/tls/
[root@master]# mv /opt/CAtls/newcert.pem /etc/ldap/tls/servercrt.pem
[root@master]# mv /opt/CAtls/newreq.pem /etc/ldap/tls/serverkey.pem
E para terminar a configurar, temos que incluir as seguintes linhas no arquivo slapd.conf:
TLSCACertificateFile /etc/ldap/tls/cacert.pem
TLSCertificateFile /etc/ldap/tls/servercrt.pem
TLSCertificateKeyFile /etc/ldap/tls/serverkey.pem
# Verificação no cliente não é requirida
TLSVerifyClient never
Para o LDAP iniciar automaticamente o SSL, é necessário novamente alterar o arquivo /etc/default/slapd e mudar a seguinte linha:
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///“
Reinicie o servidor LDAP e verifique se a porta 636 está aberta.
2.1 – Cliente LDAP com SSL
Antes de iniciar a réplica da base LDAP, vamos testar se o servidor LDAP está respondendo corretamente com o SSL. Para fazermos os testes, crie as chaves no cliente igualmente como criamos no servidor.
Copei as chaves para o diretório /home/tls
[root@master]# cp /opt/CAtls/demoCA/cacert.pem /home/tls/
[root@master]# mv /opt/CAtls/newcert.pem /home/clientecrt.pem
[root@master]# mv /opt/CAtls/newreq.pem /home/clientekey.pem
No primeiro teste vamos utilizar o próprio openssl para fazer a conexão com o servidor.
[root@master]# openssl s_client –connect master.curso.ldap:636 –showcerts –state –CAfile /home/cacert.pem
Perceba o “Verify Return Code”, deve estar ok. Para finalizar o programa utilize o CTRL+ C.
Para ldapsearch ou alguém outro programa do LDAP poder funcionar utilizando a conexão SSL, vamos editar o arquivo /etc/ldap/ldap.conf acrescentando as configurações das chaves criadas no cliente.
BASE dc=curso,dc=ldap
URI ldaps://localhostTLS_CACERT /etc/ldap/cliente_tls/cacert.pem
TLS_CERT /etc/ldap/cliente_tls/ldap.cliente.pem
TLS_KEY /etc/ldap/cliente_tls/ldap.cliente.key.pemTLS_REQCERT never
Feito isso já podemos testar a conexão utilizando o comando LDAPSEARCH. Como mostra o comando seguinte:
[root@master]# ldapsearch -b dc=curso,dc=ldap -D cn=manager,dc=curso,dc=ldap -w pedra –Z
A opção “-Z” faz o ldapsearch utilizar a conexão tls. Esse comando deve retornar toda a estrutura da base LDAP.
3 – SASL
SASL é um acrônimo para Simple Authentication and Security Layer, como o nome diz é uma camada de segurança para autenticação simples, provendo uma camada de criptografia para os protocolos orientados à conexão.
A implementação SASL do slapd utiliza o software Cyrus SASL com suporte a vários mecanismos, incluindo DIGEST-MD5 e CRAM-MD5. Vamos instalar o SASL com suporte ao LDAP usando os pacotes do ubuntu-server, como mostra os comandos a seguir.
[root@master]# apt-get install sasl2-bin libsasl2-2 libsasl2-modules libsasl2-modules-ldap
O LDAP e o SASL irão se comunicar em ambas os lados. Isso significa que vamos fazer o LDAP reconhecer os usuário da base SASL e fazer o SASL reconhecer os usuários do LDAP.
3.1 – LDAP para SASL
Nessa primeira parte vamos fazer a configuração para que o SASL reconheça os usuários da base LDAP. Para fazer isso, primeiramente vamos configurar o arquivo /etc/default/ saslauthd.
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="ldap"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/run/saslauthd"
Neste arquivo o mais importante é mudar o comando “START” para “yes”, assim o SASL vai ser inicializado automaticamente, a outra alteração é o “MECHANISMS” para buscar os usuários no LDAP. Também é preciso configurar o arquivo /etc/ saslauthd.conf para fazer o SASL buscar as informações na base LDAP.
ldap_servers: ldap://localhost/
ldap_bind_dn: cn=manager,dc=curso,dc=ldap
ldap_bind_pw: pedra
ldap_version: 3
ldap_port: 389
ldap_search_base: dc=curso,dc=ldap
ldap_uidattr: uid
ldap_password_attr: userPassword
Neste arquivo mude os atributos, ldap_bind_dn e o ldap_bind_pw para as informações da sua base LDAP. Faça a mesma coisa com o atributo ldap_search_base.
Antes teste o SASL lembre-se de reinicar o SASL
[root@master]# /etc/init.d/saslauthd restart
Vamos testar para saber se o SASL tá buscando os usuário na base LDAP.
[root@master]# root@ldapserver:/etc# testsaslauthd -u jose -p x
0: OK "Success."
A parâmetro “–u” especifica o usuário e o “–p” a senha. Como você pode ver a configuração do SASL com LDAP tá funcionando perfeitamente.
Em alguns casos é necessário ajustar a permissão do diretório /etc/sasldb2 para que a autenticação funcione.
3.2 – SASL para LDAP
Neste ponto vamos fazer o LDAP reconhecer os usuários criados na base do SASL.
Primeiramente crie um usuário na base do SASL. É aconselhável ser o mesmo usuário do rootdn do LDAP. O comando que cria usuário no SASL
[root@master]# saslpasswd2 -c admin
Ao executar esse comando, será pedida uma senha para a criação do usuário.
Também é preciso executar o comando ldapsearch para verificar se o LDAP tem suporte ao SASL.
[root@master]# ldapsearch -x -LLL -s "base" -b "" supportedSASLMechanisms
dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: LOGIN
supportedSASLMechanisms: PLAIN
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5
A saída à cima mostra que o LDAP está com suporte ao SASL. O próximo comando que vamos utilizar é o ldapwhoami e ldapsearch para autenticar o usuário do SASL.
[root@master]# ldapwhoami -h localhost -U admin
SASL/DIGEST-MD5 authentication started
Please enter your password: senha
SASL username: admin
SASL SSF: 128
SASL data security layer installed.
dn:uid=admin,cn=digest-md5,cn=auth
Como mostra o comando acima, o LDAP autenticou o usuário do SASL corretamente. E agora podemos usar o usuário do SASL para outras aplicações do LDAP, tais como ldapsearch.
[root@master]# ldapsearch -U admin@ldapserver -b ‘dc=curso,dc=ldap’ ‘(objectclass=*)’
SASL/DIGEST-MD5 authentication started
Please enter your password:
SASL username: admin@ldapserver
SASL SSF: 128SASL data security layer installed.
# curso.ldap
dn: dc=curso,dc=ldap
objectClass: top
objectClass: dcObject
objectClass: organization
dc: curso
o: Clodonil Trigo# people, curso.ldap
dn: ou=people,dc=curso,dc=ldap
objectClass: organizationalUnit
ou: people
O ldapsearch autenticou o SASL corretamente, como mostra a saída acima.
4 – Réplica
Agora com o SSL/TLS e SASL configurados e funcionando, podemos passar para configuração da réplica de conforma segura. Vamos utilizar a réplica com Syncrepl, que é a forma mais moderna.
As principais características do syncrepl são:
- Trabalha no modo stateful. A réplica é baseado em status, não precisa de arquivo de logs;
- Sincronização completa;
- Cliente inicia a réplica;
- Sincronização baseado em eventos ou por períodos (rajadas);
- Multi-Master;
Vamos dividir a configuração em duas partes, sendo o master o servidor que recebe as alterações na base LDAP. Já o slave é o servidor que recebe as mudanças do servidor master.
MASTER:
A configuração do master que é o provider são as seguintes:
moduleload syncprov
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100index entryCSN eq
index entryUUID eq
Acrescente essas configurações no slapd.conf do master. Segue o slapd.conf do master completo.
SLAVE:
Já do lado slapd.conf do slave vamos mostar duas configurações que podem trocar a transferência dos arquivos durante a réplica bem segura.
O primeiro é usando SSL, mas com autenticação simple. As linhas a seguir deve ser incluídas no slapd.conf do slave (link do slapd.conf completo):
moduleload syncprov
syncrepl rid=007
provider=ldaps://10.0.0.102:636
type=refreshOnly
interval=00:00:00:10
searchbase="dc=curso,dc=ldap"
filter="(objectClass=*)"
scope=sub
schemachecking=off
bindmethod=simple
binddn="cn=Manager,dc=curso,dc=ldap"
credentials=pedra
A configuração do slave que estamos utilizando trabalha com SSL (ldaps://10.0.0.102:636) e trabalha em modo de rajada em cada 10 segundos. Perceba a tabulação após a primeira linha. Essa tabulação é de fundamental importância para o funcionando da réplica.
A outra configuração alternativa para slapd.conf dá réplica é utilizar o SSL com autenticação SASL.
A seguir estão as linhas para implementar a réplica com SASL e SSL juntos (slapd.conf completo com sasl).
moduleload syncprov
syncrepl rid=007
provider=ldaps://10.0.0.102:636
type=refreshOnly
interval=00:00:00:10
searchbase="dc=curso,dc=ldap"
filter="(objectClass=*)"
scope=sub
schemachecking=off
bindmethod=sasl
authcid=admin
credentials=x
A configuração do syncrepl com SASL e SSL é muito parecida com o anterior. As principais mudanças são os “bindmethod” que foi mudado para sasl e o “authcid” que define o usuário do SASL.
Após ter escolhido uma das formas de réplica, inicie o servidor master e em seguida inicie o servidor slave que automaticamente os atributos do master serão replicados no slave.
Em caso de erro, inicie o slapd em modo de debug para identificar os erros.
[root@master]# slapd –d 123 –u openldap
E com isso temos a configuração de um dos principais recursos do LDAP que é a réplica em modo seguro com SSL/TLS e com autenticação segura com SASL. Lembrando que esses recursos estão disponíveis para outros recursos.
Proxy SQUID – Integração Perfeita com o GOsa
28 de Julho de 2009, 0:00 - sem comentários aindaSquid com LDAP e controles de Sites por grupos e Quotas
Proxy é o elemento responsável pela ligação da rede interna do cliente com a rede externa, a internet. Quando o cliente da rede interna tenta acessar a Internet, ele solicita o acesso ao proxy. Este, por sua vez, acessa o conteúdo desejado e devolve-o para o cliente. Dessa forma, o cliente não tem acesso direto à Internet, o que constitui uma vantagem do ponto de vista da segurança.
Quando falo que é uma vantagem o cliente não ter acesso direto à Internet, significa que ele não pode utilizar ferramentas maliciosas contra outros hosts, em portas aleatórias. Um exemplo disso seria rodar um scanner ou tentar invadir um computador em outra porta que não seja a 80, que é utilizado para navegação.
Perceba que, neste caso, a preocupação é o cliente da rede interna tentar invadir alguma máquina na Internet. Lembre-se que a responsabilidade do que acontece na rede é do administrador da rede e, caso aconteça algum ataque a um host externo, este irá responsabilizar o administrador da rede na qual o invasor (usuário) estiver trabalhando.
Outra vantagem de instalar um Proxy é pelo recurso de cachê que normalmente acompanha o proxy. O cachê permite o armazenamento de sites dentro da rede interna. Ao usuário solicitar um site, o proxy verifica se o mesma encontra-se no cachê, e envia para o usuário sem precisar pesquisar na internet.
Para integração com o LDAP, vamos utilizar o Proxy SQUID que é um dos "open source" mais utilizado.
Instalação
A instalação do SQUID no Ubuntu Serve e Debian é simples é rápido. O comando "apt-get" faz a instalação.
[root@cabeca]# apt-get install squid3
Com a instalação feita, vamos passar para a configuração do SQUID. O arquivo de configuração é o squid.conf. Como ponto de partida, será adotado um squid.conf modelo. Este arquivo é funcional, porém exclui uma série de recursos que não será abordado neste documento. Para acrescer recursos no SQUID e fazer ajustes de outras configurações, é recomendável consultar a documentação no site oficial.
Crie um arquivo no diretório /etc/squid, chamado squid.conf e coloque a configuração do squid. Esta configuração tem algumas particularidades que vale a pena marcar.
- Porta 3128: Porta que o squid aceita as configurações, configure o proxy no browser com este ip.
- Acl rede src 10.0.0.0/24: Define a faixa de ip que corresponde à rede interna. Normalmente esta configuração é feita para permitir o acesso na internet da rede interna.
- Cachê_dir: Define o diretório que ficarão os cachês
- cache_effective_user: Define o usuário do squid.
Segue o arquivo squid.conf modelo:
- /etc/squid3/squid.conf
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
#Liberando a Rede Local
acl rede src 10.0.0.0/24
http_access allow rede
http_access deny all
icp_access deny all
htcp_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
cache_dir ufs /var/spool/squid3 100 16 256
access_log /var/log/squid3/access.log squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320
cache_effective_user proxy
cache_effective_group proxy
Antes de prosseguir, teste se o SQUID está funcionando corretamente.
Cenário 1
Com o SQUID básico funcionando, vamos adotar o cenário 1 como teste. Neste cenário vamos considerar que é necessário apenas o controle do usuário por autenticação. Cada usuário que desejar acessar a Internet, obrigatoriamente utilizará um login e uma senha. As políticas de acesso a sites podem ser feitas utilizado como regras todos os usuário. Neste caso não temos recursos para gerenciar políticas de acessos para grupos específicos de usuários.
Lembrando que os usuários já tem que estar criado no GOsa, vamos acrescentar as seguintes linhas no squid.conf.
#Autenticador
#Acrescente as 4 linhas abaixo no início do arquivo squid.conf
auth_param basic program /usr/lib/squid3/squid_ldap_auth -D "cn=manager,dc=trigo" -w x -b ou=people,dc=trigo -h servidor_ldap -p 389 -v 3 -f "uid=%s"
auth_param basic children 5
auth_param basic realm ACESSO A INTERNO DO DOMINIO BACULO
auth_param basic credentialsttl 2 hours
#Acrescente as duas linhas abaixo logo após a regra "http_access allow rede"
acl autenticacao proxy_auth REQUIRED
http_access allow autenticacao
squid.conf completo com autenticação de usuário.
auth_param: Este parâmetro ajusta a forma de autenticação, que em nosso caso é o OpenLDAP. Portanto altere conforme as suas configurações. Observe os parâmetros –D que define o administrador base LDAP, a opção –w que define a senha, a opção –b que define a sub-arvore que será pesquisa.
As outras linhas do auth_param definem na sequência:
- O Número de processos filhos que o SQUID vai abrir para receber as autenticações;
- Uma mensagem que vai aparecer na tela de autenticação do cliente; e
- Tempo que autenticação vai ser válida.
As últimas duas linhas são propriamente ditas à autenticação e permissão para navegação dos usuários autenticados.
Cenário 2
Com o cenário 1 funcionando, vamos passar para o cenário 2. Neste cenário vamos considerar que é necessário apenas o controle por grupos de usuários. Dessa forma podemos criar grupos e definir o que cada grupo pode acessar definindo assim uma política mais eficiente para controlar os usuários. Nesse cenário os usuários ainda continuam obrigatoriamente utilizando um login e uma senha para acessar a Internet, porém as políticas não são definidas por usuários individualmente.
Como exemplo. Vamos utilizar dois grupos, sendo compras e financeiro. Os usuários do grupo compras têm que acessar várias sites, já o grupo financeiro só deve acessar o site da empresa. A seguir segue as configurações para este cenário.
Lembrando que os usuários e os grupos já tem que estar criado no GOsa, como mostra a figura 1 e 2, vamos acrescentar as seguintes linhas no squid.conf.
Figura 1 – Grupo no Gosa
Figura 2 – Criação de grupos no Gosa
Com os grupos criados e usuários definidos, vamos configurar o squid.conf.
external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -d -b "ou=groups,dc=clodonil,dc=trigo" -B "ou=users,dc=clodonil,dc=trigo" -f "(&(memberUid=%u)(cn=%g))" -p 389 -v3 -H ldap://localhost -D cn=Manager,dc=clodonil,dc=trigo -w x
acl senha proxy_auth REQUIRED
acl financeiro external ldap_group financeiro
acl compras external ldap_group compras
acl tudo dst 0.0.0.0/0.0.0.0
#Crie o arquivo sites_financieiro e coloque dentro os sites que serão liberados ou os sites que
#serão negados. Lembrando que dentro do arquivo ou todos os sites serão negados ou todos
#serão permitidos.
acl sites_financeiro dstdomain -i "/etc/squid/sites_financeiro"
acl sites_compras dstdomain -i "/etc/squid/sites_compras"
http_access allow sites_financeiro financeiro
http_access allow !sites_compras compras
Percebe a linha "http_access allow !sites_compras compras", mas especificamente na !sites_compras que funciona como uma negação, dessa forma apenas os sites cadastrados no arquivo sites_compras NÃO poderam ser acessadas.
segue o squid.conf completo para autenticação de grupo.
Para finalizar teste no browser.
Cenário 3
Até este momento, mostramos como configurar o SQUID com autenticação por usuário e por grupo do LDAP criado pelo GOsa. O GOsa também tem a opção do SQUID na aba "Connectivity" que possibilita filtrar sites, limitar acesso a internet por tempo determinado ou por quota, como mostra a figura 03.
Figura 03 – Aba Connectivity do GOsa
Para fazer essas opções funcionarem é necessário utilizar os scripts que estão no diretório /usr/share/gosa/contrib/scripts que vem juntamente com a instalação do GOsa.
Uma breve descrição de cada script:
- goAgent.pl
Não é necessário para o SQUID, pode ser utilizado para criar o home do usuário.
- goQuota.pl
Esse script consulta o atributo quota no servidor LDAP e cria um banco de dados com essas quotas para uma leitura rápida pelo SQUID. O ideal é colocar esse script no crontab para ser executado de tempo em tempo para ativa mudanças feitas pelo GOsa.
- goQuotaView.pl
Permite visualizar a quota de um usuário no console, desde que o DB seja criado pelo script "goQuota.pl".
Nota: No script, comente a linha abaixo.
forma:
#time2str("%d.%m.%Y %H:%M:%S",$cache{TIMESTAMP}),
- goSquid.pl
Neste script é feito o redirecionamento para uma página caso a quota em MB seja excedido. Esse script verifica o tempo de navegação e o DB criado pelo "goQuota.pl".
Existe outros scripts que faz a censura de uma lista de sites, mas esse script não tem funcionando. Cada um desses scripts precisa ser editado para alguns ajustes, tais como os dados do servidor LDAP.
Como exemplo de como deve ser editado os scripts, vamos editar o goQuota.pl. A edição do script sempre estão na primeiras linhas
A alteração deve ser algo como:
my $LDAP_HOST = "servidor.trigo" ;
my $LDAP_PORT = "389";
my $LDAP_BASE = "ou=people,dc=trigo";
Todos os scripts foram feitos usando a linguagem Perl, por isso precisamos instalar o pacote de conexão entre o Perl e o LDAP. No ubuntu e debian, basta instalar o seguinte pacote:
# apt-get install libnet-ldap-perl
Para continuar a configuração, copie os scripts para o diretório /etc/gosa e adicione a seguinte linha no squid.conf
redirect_program /etc/squid/gosa/goSquid.pl
redirect_children 5
Essa linha verifica a base de dados criado pelo script "goQuota.pl" e quando a quota excede ele redireciona para um link definido no script.
Lembre-se de colocar o goQuota.pl no crontab.
Servidor DNS (BIND9) com OpenLDAP
23 de Junho de 2009, 0:00 - sem comentários aindaMuitas vezes, é desejável para armazenar informações de DNS em um banco de dados, e não em zonas em arquivos texto ASCII plano. Armazenar estes arquivos em uma zona de dados pode reduzir muito overhead desde associar informações, tais como contato de faturamento, gerenciamento de contas, backup simplificado, etc., podem ser armazenadas e processadas no interior do mesmo banco de dados. Além disso, devido à natureza do DNS(concepção), a informação deve ser armazenada redundantemente em dois ou mais hosts. O clássico de dados através da replicação zona transferência não é confiável, inseguro e muitas vezes difíceis de administrar.
Para ultrapassar este problema alguns projetos de DNS para armazenar informações em bancos de dados relacionais foram desenvolvidos. Como dito acima o DNS gravas sua informações em uma lista em arquivo de texto, no entanto se estudarmos sua estrutura veremos que ele trabalhar em forma de árvore, porque se trata de um sistema de diretório, igual ao LDAP. LDAP permite certa flexibilidade na sua base de dados usando esquema, assim como de uma organização cresce e muda constantemente; o banco de dados utilizado para armazenar informações tem que reflitam a organização.
1. BIND (Named)
BIND (Berkeley Internet Name Domain ou, como chamado previamente, Berkeley Internet Name Daemon) é o servidor para o protocolo DNS mais utilizado na Internet, especialmente em sistemas do tipo Unix, onde ele pode ser considerado um padrão de fato. Foi criado por quatro estudantes de graduação, membros de um grupo de pesquisas em ciência da computação da Universidade de Berkeley, e foi distribuído pela primeira vez com o sistema operacional BSD. O programador Paul Vixie, enquanto trabalhava para a empresa DEC, foi o primeiro mantenedor do BIND. Atualmente o BIND é suportado e mantido pelo Internet Systems Consortium. Seu site oficial é: https://www.isc.org/software/bind.
O BIND é uma implementação do protocolo DNS e inclui os seguintes serviços:
-
Um servidor de domínios (named)
-
As bibliotecas para conversão de nomes de domínio em endereços de IP.
-
Outras ferramentas para verificar o funcionamento do servidor DNS e suas respectivas Zonas configuradas.
- Para a versão 9, o BIND foi praticamente reescrito. Ele passou a suportar, dentre outras funcionalidades, a extensão DNSSEC e os protocolos TSIG e IPv6
1.1 Compilando BIND
Primeiro precisamos baixar e extrair a fonte do BIND-SDB-LDAP. Podemos realizar esta tarefa, que vai para o diretório BIND:
http://bind9-ldap.bayour.com/bind-sdb-ldap-1.1.0.tar.gz
Para maiores Informações de versões recentes do software:
http://www.venaas.no/ldap/bind-sdb/
BIND SDB LDAP é uma modificação do "Simplified Database" API que fornece uma interface LDAP para bind9 utilizando o "sdb". Com esta API, pode armazenar zonas do BIND no LDAP em vez de arquivos. Note que quando utiliza sdb, as zonas não são colocadas em cachê na memória, BIND irá efetivamente realizar uma pesquisa de dados sempre que recebe uma consulta.
Uma vez baixado, extraia-o para o diretório de sua escolha, executando o seguinte comando:
#root@host#tar -xzf bind-sdb-ldap-1.1.0.tar.gz
Isto irá criar um bind-sdb-ldap-1.0 diretórios com a fonte no mesmo.
Agora vamos ao BIND, faça o download da fonte em:
ou link direto
ftp://ftp.isc.org/isc/bind9/9.6.1rc1/bind-9.6.1rc1.tar.gz
Procure baixa sempre a versão mais recente.
Copie a ldapdb.c bin/named e ldapdb.h para bin/named /include na árvore fonte.
root@host#cp ldapdb.c ../bind-9.6.1rc1/bin/named/
root@host#cp ldapdb.h ../bind-9.6.1rc1/bin/named/include
root@host#cd /root/bind-9.6.1rc1
Após os arquivos de origem tenham sido copiados para o diretório do bind9, então precisamos fazer algumas modificações no fonte do bind9 para que seja compilado com a nova API.
Altere os diretórios para /root/bind-9.6.1rc1/bin/named/Makefile.in e editar o arquivo e faça as seguintes modificações quando você vê estas linhas:
1 2 3 4 |
DBDRIVER_OBJS = ldapdb.@O@ DBDRIVER_SRCS = ldapdb.c DBDRIVER_INCLUDES = -I/usr/local/include DBDRIVER_LIBS = -L/usr/local/lib -lldap -llber -lresolv |
Em seguida, será necessário modificar o arquivo para /root/bind-9.6.1rc1/bin/named/main.c no mesmo diretório do Makefile.in e procure a seguinte linha:
/* #include "xxdb.h" */
Temos que mudar-lo para utilizar a fonte LDAPDB arquivo:
#include <ldapdb.h>
No mesmo arquivo, procure a inicialização linha:
/* xxdb_init(); */
Temos que adicionar uma linha abaixo dessa para usar o LDAPDB inicialização função:
ldapdb_ini();
E finalmente, precisamos encontrar a limpeza rotineira linha:
/* xxdb_clear(); */
Temos que adicionar uma linha abaixo dessa LDAPDB limpeza para utilizar a função:
ldapdb_clear();
Assim que esse arquivo for salvo, deveremos ser capazes de retornar diretória base do bind9 para compilarmos com suporte a nova API.
root@host#cd /root/bind-9.6.1rc1
Utilizaremos estes parâmetros de compilação:
root@host :~/bind-9.6.1rc1#SLKCFLAGS="-O2 -march=i486 -mtune=i686" \ CFLAGS="$SLKCFLAGS" ./configure --prefix=/usr --libdir=/usr/lib${LIBDIRSUFFIX}\ --sysconfdir=/etc --localstatedir=/var \ --with-libtool --mandir=/usr/man --enable-shared \ --disable-static --enable-threads --with-openssl=/usr root@host:~/bind-9.6.1rc1#make root@host :~/bind-9.6.1rc1#make install
2. Configurações OpenLdap
Com o servidor OpenLDAP devidamente instalado adicionaremos uma nova schema, faça o download altere seu nome:
root@host:~# http://www.venaas.no/ldap/bind-sdb/dnszone-schema.txt root@host:~# mv dnszone-schema.txt dnszone-schema
Copie o schema para o diretório de schemas do OpenLDAP:
root@host:~# cp dnszone.schema /etc/openldap/schema
Vamos configura o arquivo slapd.conf que fica no diretório /etc/openldap:
root@host:~#vi /etc/openldap slapd.conf
Você irá adicionar este novo schema logo abaixo deste:
1 2 3 4 5 |
include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/openldap.schema |
Ficando assim:
1 2 3 4 5 6 |
include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/openldap.schema include /etc/openldap/schema/dnszone.schema |
No final do arquivo nos índices adicionará index zoneName,relativeDomainName eq,sub, ficará assim:
1 2 3 4 5 6 7 |
index cn eq index sn eq index objectClass eq index uid eq index gidNumber eq index uidNumber eq index zoneName,relativeDomainName eq,sub |
Uma vez que o esquema tenha sido incluído, é preciso reiniciar OpenLDAP para que o processo slapd:
root@host# /etc/rc.d/rc.openldap restart
Pronto nosso servidor OpenLDAP já está em funcionamento, vamos agora adicionar as entrada para configuração de nosso servidor. A maioria dos administradores já utiliza algum tipo de ferramenta de administração do LDAP para executar operações, como adicionar e remover as informações do banco de dados. Para este exemplo, nós iremos fornecer o que é comumente conhecido como um arquivo LDIF para usar como orientação para a inclusão de registros no banco de dados. Primeiro vamos olhar para uma norma zona normal configurada no /etc/named.conf arquivo pode ser semelhante a este:
Domínio dtux.no-ip.org no Na med:
dtux.no-ip.org.zone
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ORIGIN dtux.no-ip.org. $TTL 86400 @ IN SOA ns1.dtux.no-ip.org. root.dtux.no-ip.org. ( 2009061500 ; serial 28800 ; refresh (8 hours) 14400 ; retry (4 hours) 259200 ; expire (5 weeks 6 days 16 hours) 86400 ; minimum (1 day) ) A 192.168.5.10 NS dtux.no-ip.org. NS ns.dtux.no-ip.org. NS ns2.dtux.no-ip.org. MX 5 dtux.no-ip.org. mx1 IN CNAME mail.dtux.no-ip.org. dtux IN A 192.168.5.10 ftp IN A 192.168.5.10 www IN A 192.168.5.10 ldap IN A 192.168.5.10 ns IN A 192.168.5.10 ns2 IN A 192.168.5.3 cliente IN A 192.168.5.3 mail IN A 192.168.5.3 client IN A 192.168.5.1 |
Zona Reversa:
5.168.192.in-addr.arpa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ORIGIN 5.168.192.in-addr.arpa. $TTL 78000 @ IN SOA dtux.no-ip.org. diego@dtux.no-ip.org( 2009061500 ; versão 10800 ;refresh (3 horas) 3600 ;retry (1 hora) 432006 ;expire (5 dias) 86400 ;TTL (1 dia) ) ; @ IN NS dtux.no-ip.org. IN NS ns2.dtux.no-ip.org. 3 IN PTR 192-168-5-3.dtux.no-ip.org. 10 IN PTR 192-168-5-10.dtux.no-ip.org. |
No LDIF do domínio dtux.no-ip.org do OpenLDAP ficará assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
dn: dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dcObject objectClass: organization dc: BIND o: DTuX BIND dn: ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: organizationalUnit objectClass: dcObject dc: BIND ou: teste dn: zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: dtux.no-ip.org zoneName: dtux.no-ip.org dn: relativeDomainName=@,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: @ zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN sOARecord: ns1.dtux.no-ip.org. root.dtux.no-ip.org. 2009061500 28800 14400 2 59200 86400 aRecord: 192.168.5.10 nSRecord: dtux.no-ip.org. nSRecord: ns.dtux.no-ip.org. nSRecord: ns2.dtux.no-ip.org. mXRecord: 5 dtux.no-ip.org. dn: relativeDomainName=client,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: client zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.1 dn: relativeDomainName=cliente,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: cliente zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.3 dn: relativeDomainName=dtux,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux ,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: dtux zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.10 dn: relativeDomainName=ftp,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: ftp zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.10 |
dtux.no-ip.org.ldif
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
dn: relativeDomainName=ldap,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: ldap zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.10 dn: relativeDomainName=mail,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: mail zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.3 dn: relativeDomainName=mx1,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: mx1 zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN cNAMERecord: mail.dtux.no-ip.org. dn: relativeDomainName=ns,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: ns zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.10 dn: relativeDomainName=ns2,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: ns2 zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.3 dn: relativeDomainName=www,zoneName=dtux.no-ip.org,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: www zoneName: dtux.no-ip.org dNSTTL: 86400 dNSClass: IN aRecord: 192.168.5.10 |
Agora zona reversa:
5.168.192.in-addr.ldif
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
dn: zoneName=5.168.192.in-addr.arpa,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: 5.168.192.in-addr.arpa zoneName: 5.168.192.in-addr.arpa dn: relativeDomainName=10,zoneName=5.168.192.in-addr.arpa,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: 10 zoneName: 5.168.192.in-addr.arpa dNSTTL: 78000 dNSClass: IN pTRRecord: 192-168-5-10.dtux.no-ip.org. dn: relativeDomainName=3,zoneName=5.168.192.in-addr.arpa,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: 3 zoneName: 5.168.192.in-addr.arpa dNSTTL: 78000 dNSClass: IN pTRRecord: 192-168-5-3.dtux.no-ip.org. dn: relativeDomainName=@,zoneName=5.168.192.in-addr.arpa,ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org objectClass: top objectClass: dNSZone relativeDomainName: @ zoneName: 5.168.192.in-addr.arpa dNSTTL: 78000 dNSClass: IN nSRecord: dtux.no-ip.org. nSRecord: ns2.dtux.no-ip.org. sOARecord: dtux.no-ip.org. diego@dtux.no-ip.org 2009061500 10800 3600 432006 86400 |
Adicionaremos agora os LDIFs no servidor usando os seguintes comandos:
root@host#ldapadd -x -D cn=root,dc=dtux,dc=no-ip,dc=org -W -f dtux.no-ip.org.ldif
root@host# ldapadd -x -D cn=root,dc=dtux,dc=no-ip,dc=org -W -f 5.168.192.in-addr.ldif
3. Configurando o Named(Bind)
O named.conf é onde é armazenado as configurações em texto plano onde é indicado a localização das zonas no sistema. A configuração usual é parecida como está:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#Zona dtux.no-ip.org zone "dtux.no-ip.org." IN { type master; file /var/named dtux.no-ip.org.zone"; notify yes; }; #Reverso da Zona zone "11.168.192.in-addr.arpa" IN { type master; file "/var/named/11.168.192.in-addr.arpa"; notify yes; }; <span style="font-size:10pt">Agora ao invés de guarda as zonas em arquivos irão substituí-las com a opção do banco de dados LDAP, que irá fazer uma chamada utilizando a ldapclient com nova biblioteca: </span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#Zona dtux.no-ip.org zone "dtux.no-ip.org" IN { type master; database "ldap ldap://192.168.5.10/ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org 10800"; notify yes; }; #Reverso da Zona zone "5.168.192.in-addr.arpa" IN { type master; database "ldap ldap://192.168.5.10/ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org 10800"; notify yes; }; <span style="font-size:10pt"><span style="color:black">Ao fazer pesquisas BIND irá fazer uma sub-árvore abaixo da pesquisa base no URL. O número </span>10800<span style="color:black"> é o TTL, que será utilizado para todas as entradas que não têm o atributo dNSTTL definido no esquema. </span></span><span style="color:black; font-size:10pt">A partir daqui, devemos iniciar bind9 e testar a nossa configuração, simplesmente realizando uma pesquisa sobre o servidor de DNS: </span> |
root@host#named -u root
Verificando os log de mensagens.
root@host#tail -f /var/log/messages
Jun 23 11:35:53 CLIENTE named[9485]: starting BIND 9.6.1rc1
Jun 23 11:35:53 CLIENTE named[9485]: built with '--prefix=/usr' '--libdir=/usr/lib' '--sysconfdir=/etc' '--localstatedir=/var' '--with-libtool' '--mandir=/usr/man' '--enable-shared' '--disable-static' '--enable-threads' '--with-openssl=/usr' 'CFLAGS=-O2 -march=i486 -mtune=i686'
Jun 23 11:35:53 CLIENTE named[9485]: adjusted limit on open files from 1024 to 1048576
Jun 23 11:35:53 CLIENTE named[9485]: found 1 CPU, using 1 worker thread
Jun 23 11:35:53 CLIENTE named[9485]: using up to 4096 sockets
Jun 23 11:35:54 CLIENTE named[9485]: loading configuration from '/etc/named.conf'
Jun 23 11:35:54 CLIENTE named[9485]: using default UDP/IPv4 port range: [1024, 65535]
Jun 23 11:35:54 CLIENTE named[9485]: using default UDP/IPv6 port range: [1024, 65535]
Jun 23 11:35:54 CLIENTE named[9485]: listening on IPv6 interfaces, port 53
Jun 23 11:35:54 CLIENTE named[9485]: listening on IPv4 interface lo, 127.0.0.1#53
Jun 23 11:35:54 CLIENTE named[9485]: listening on IPv4 interface eth0, 192.168.5.3#53
Jun 23 11:35:54 CLIENTE named[9485]: command channel listening on 127.0.0.1#953
Testando o nosso servidor:
root@host# nslookup dtux.no-ip.org Server: ns.dtux.no-ip.org Address: 192.168.5.3 Name: dtux.no-ip.org Address: 192.168.5.3
Os nomes estão funcionando adequadamente ao buscar suas informações de que a zona de dados LDAP.
Segue um exemplo de named.conf completo:
#Aqui você deve informar o endereço da sua rede ou o ip das máquinas que podem utilizar este DNS acl minha-rede { 127.0.0.1; 192.168.5.0/24;); options { directory "/var/named"; dump-file "/var/log/named/named_dump.db"; statistics-file "/var/log/named/named.stats"; memstatistics-file "/var/log/named/named.memstats"; minimal-responses yes; empty-zones-enable no; transfer-format many-answers; forward only; forwarders { 192.168.5.3; 192.168.5.10; }; allow-transfer { 192.168.5.10; 192.168.5.3; 201.91.215.134;}; ## Aqui você pode colocar algum DNS para realizar um forwarders caso na ##queria utilizar deixe estas linhas comentadas version "[secured]"; listen-on-v6 { any; }; querylog yes;}; # Configuração de Log logging { channel custom { severity info; file "/var/log/named/named.log "; # Onde armazenar as mensagens print-time yes; # Imprimir informações temporais print-severity yes; print-category yes; # Mostrar a categoria da mensagem }; category config {custom;}; category notify {custom;}; category dnssec {custom;}; category general {custom;}; category security {custom;}; category xfer-in {custom;}; category xfer-out {custom;}; category lame-servers {custom;}; }; # Na seção controls encontram-se os parâmetros para comunicação entre rndc e named controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { rndc; }; }; # A chave especificada para comunicação com o rndc, igual a contida em rndc.conf key rndc { algorithm hmac-md5; secret "RgKH/lcrH7AKfyQV9QM7cQ=="; }; zone "." IN { type hint; file "caching-example/root.hints"; }; zone "localhost" IN { type master; file "caching-example/localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "caching-example/named.local"; allow-update { none; }; }; zone "dtux.no-ip.org" IN { type master; database "ldap ldap://192.168.5.10/ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org 10800"; notify yes; }; zone "5.168.192.in-addr.arpa" IN { type master; database "ldap ldap://192.168.5.10/ou=teste,dc=BIND,dc=dtux,dc=no-ip,dc=org 10800"; notify yes; };
Segue um exemplo de rndc.conf completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Use a chave rndc quando comunicar com o servidor "localhost" server localhost { key rndc; }; # Aqui estão os detalhes sobre a chave rndc key rndc { algorithm hmac-md5; secret "RgKH/lcrH7AKfyQV9QM7cQ=="; }; # Estas são as opções padrões options { default-server localhost; default-key "key"; default-port 953; }; <code><span style="font-family:Calibri">Segue um exemplo de <strong>slapd.conf</strong> completo: </span></code> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/openldap.schema include /etc/openldap/schema/dnszone.schema include /etc/openldap/schema/dhcp.schema include /etc/openldap/schema/ppolicy.schema include /etc/openldap/schema/samba.schema allow bind_v2 bind_anon_dn pidfile /var/run/slapd.pid argsfile /var/run/slapd.args sizelimit unlimited idletimeout 30 password-hash {SSHA} password-crypt-salt-format "$1$.8s" access to attrs=userPassword by self write by anonymous auth by dn="cn=root,dc=dtux,dc=no-ip,dc=org" write by * none access to * by * read database bdb suffix "dc=dtux,dc=no-ip,dc=org" rootdn "cn=root,dc=dtux,dc=no-ip,dc=org" rootpw dhcpserver directory /var/openldap-data # Indices index cn eq index sn eq index objectClass eq index gid eq index gidNumber eq index uidNumber eq index memberUid eq index loginShell eq index zoneName eq index relativeDomainName eq index dhcpHWAddress eq index dhcpClassData eq index dhcpPrimaryDN eq index dhcpSecondaryDN eq mode 0600 cachesize 2000 |