Bind consultando zonas em base LDAP

A ideia principal do artigo é a centralização do ambiente em uma base única, no caso uma das melhores, o LDAP. Imaginemos o cenário, uma empresa denominada Acme Lun fará seu atual servidor de DNS(Bind), em vez de consultar as zonas em arquivos locais (.db), consultar em uma base LDAP.

[ Hits: 21.135 ]

Por: Evandro Nabor em 17/02/2011


Criando a chroot



Criar diretórios:

# mkdir -p /chroot/named
# cd /chroot/named
# mkdir dev etc logs
# mkdir -p var/run
# mkdir - p conf/secondaries


Trazer o arquivo timezone para a chroot:

# cp /etc/localtime /chroot/named/etc

Criar os nodes:

# mknod /chroot/named/dev/null c 1 3
# mknod /chroot/named/dev/zero c 1 5
# mknod /chroot/named/dev/random c 1 8


Criar um usuário e grupo para o bind:

# groupadd named
# useradd -g named -d /chroot/named -s /bin/true named
# passwd -l named


Montando os arquivos de configuração

Primeiro criaremos o named.conf, que é o arquivo principal do bind, repare que as zonas de root servers e as outras zonas padrões ficaram na própria máquina, ou seja, não consultará no ldap.

# vim /chroot/named/etc/named.conf

Por hora adicione este conteúdo dentro do arquivo:

options {
   directory       "/conf";
   pid-file        "/var/run/named.pid";
   statistics-file "/var/run/named.stats";
   dump-file       "/var/run/named.db";
   empty-zones-enable no;

   # esconda sua "verdadeiro" numero de versao
   version         "[seguro]";
};

# root servers
zone "." {
   type   hint;
   file   "db.rootcache";
};

# localhost - zona de encaminhamento
zone   "localhost" {
   type    master;
   file   "db.localhost";
   notify  no;
};

# localhost - zona reversa
zone    "0.0.127.in-addr.arpa" {
   type   master;
   file   "db.127.0.0";
   notify no;
};

Cria também um link simbólico do named.conf para o /etc para facilitar administração:

# ln -sf /chroot/named/etc/named.conf /etc/named.conf

Perceba que nosso named.conf aponta para três arquivos:
  • db.127.0.0
  • db.localhost
  • db.rootcache

Criaremos agora eles, então a começar pelo db.rootcache.

Se a máquina que estamos instalando tem acesso a internet, ele pode ser criado com o comando:

# dig @a.root-servers.net . ns > /chroot/named/conf/db.rootcache

Criando os outros dois:

# vim /chroot/named/conf/db.127.0.0

E cole o conteúdo:

; db.127.0.0

$TTL  86400
@    IN   SOA   localhost. root.localhost. (
              1 ; Serial
              28800   ; Refresh
              14400   ; Retry
              3600000  ; Expire
              86400 )  ; Minimum
    IN   NS   localhost.
1    IN   PTR   localhost.

Salve e feche o arquivo.

# vim /chroot/named/conf/db.localhost

e cole o conteúdo:

; db.localhost

$TTL 86400

@ IN SOA  @ root (
            42       ; serial (d. adams)
            3H       ; refresh
            15M       ; retry
            1W       ; expiry
            1D )      ; minimum

    IN NS    @
    IN A     127.0.0.1

Salve e feche o arquivo.

Checando permissões no CHROOT

Este script gerencia perfeitamente todas as permissões que precisamos dentro do diretório chroot.

# verifica.permissoes

cd /chroot/named

chown -R root.named .

find . -type f -print | xargs chmod u=rw,og=r # regular files
find . -type d -print | xargs chmod u=rwx,og=rx # directories

chmod o= etc/*.conf

touch conf/secondaries/.empty # placeholder
find conf/secondaries/ -type f -print | xargs chown named.named
find conf/secondaries/ -type f -print | xargs chmod ug=r,o=

chown root.named conf/secondaries/
chmod ug=rwx,o= conf/secondaries/

chown root.root var/
chmod u=rwx,og=x var/

chown root.named var/run/
chmod ug=rwx,o=rx var/run/

chown root.named logs/
chmod ug=rwx,o=rx logs/

Copie o conteúdo acima e cole num arquivo novo em /chroot/verifica.permissoes.

Agora é só executarmos:

# sh -x /chroot/verifica.permissoes

A saída será algo como:

+ cd /chroot/named
+ chown -R root.named .
+ find . -type f -print
+ xargs chmod u=rw,og=r
+ find . -type d -print
+ xargs chmod u=rwx,og=rx
+ chmod o= etc/named.conf etc/rndc.conf
+ touch conf/secondaries/.empty
+ find conf/secondaries/ -type f -print
+ xargs chown named.named
+ find conf/secondaries/ -type f -print
+ xargs chmod ug=r,o=
+ chown root.named conf/secondaries/
+ chmod ug=rwx,o= conf/secondaries/
+ chown root.root var/
+ chmod u=rwx,og=x var/
+ chown root.named var/run/
+ chmod ug=rwx,o=rx var/run/


Agora as permissões dos nossos diretórios estão todas ok.

Script para inicialização do serviço:

#start.named

cd /chroot/named

touch named.run
chown named.named named.run
chmod ug=rw,o=r named.run

PATH=/usr/local/sbin:$PATH named \
   -t /chroot/named \
   -u named \
   -c /etc/named.conf

Crie um arquivo start.named dentro do /chroot/ e cole o conteúdo acima nele.

Transforme o mesmo em executável com o comando:

# chmod a+x /chroot/start.named

Não execute o script ainda!

Configurando o rndc

Crie o arquivo rndc.conf dentro de /chroot/named/etc/rndc.conf e adicione o seguinte conteúdo:

#rndc.conf

options {
    default-server 127.0.0.1;
    default-key "rndckey";
};

server 127.0.0.1 {
    key "rndckey";
};

key "rndckey" {
    algorithm "hmac-md5";
    secret "COLOQUE SUA CHAVE";
};

Adicione as seguintes entradas no início do arquivo /chroot/named/etc/named.conf:

controls {
    inet 127.0.0.1 allow { 127.0.0.1; } keys { rndckey; };
};

key "rndckey" {
    algorithm "hmac-md5";
    secret "COLOQUE SUA CHAVE";
};

Perceba que nos dois arquivos temos a frase COLOQUE SUA CHAVE, então, substituiremos esta por a respectiva chave.

Para gerar a chave faça:

# dnssec-kegen -a HMAC-MD5 -b 256 -n HOST rndc

Então você terá dois arquivos no diretório onde executou o comando.

Os nomes serão algo como Krndc.+157+48683.private e Krndc.+157+48683.key, mas nos estamos interessados somente no Krndc.+157+48683.private, dentro dele terá uma linha como essa informando a chave Key: QQMI5z8cceUIzA0UkPlbOEP3RH3sLEfSNVfWGmawjPo=, copie somente a chave e cole nos arquivos substituindo a frase COLOQUE SUA CHAVE.

Remova os dois arquivos que foram gerados.

Feito isso estamos prontos para iniciar o serviço e verificar se tudo está ok.

# cd /chroot/named
# ./start.named


Verifique se tudo está ok através do comando:

# rndc status

A saída deve ser algo parecido com:

version: 9.7.1rc1 ([seguro])
number of zones: 3
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running


Para facilitar a administração utilize o seguinte script:

#named init

export PATH=/usr/local/sbin:$PATH # needed for rndc

case "$1" in
start)
    # Start daemons.
    echo -n "Levantando o named: "
    sh /chroot/start.named
    echo
    ;;
stop)
    # Stop daemons.
    echo -n "Derrubando o named: "
    rndc stop
    echo "done"
    ;;
esac

exit 0

Cole o conteúdo dentro de um novo arquivo chamado named em /etc/init.d e de permissão de execução para ele.

Assim quando quiser levantar o processo use:

# /etc/init.d/named start

e pra derrubar:

# /etc/init.d/named stop

Inicialize o serviço e faça um teste com o dig, não se esqueça de alterar no arquivo /etc/resolv.conf apontar para o 127.0.0.1.

# dig www.google.com.br

Obrigatoriamente devemos ter algo parecido com o seguinte resultado:

; <<>> DiG 9.7.1rc1 <<>> www.google.com.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53404
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;www.google.com.br.             IN      A

;; ANSWER SECTION:
www.google.com.br.      345600  IN      CNAME   www.google.com.
www.google.com.         604800  IN      CNAME   www.l.google.com.
www.l.google.com.       300     IN      A       64.233.163.104

;; AUTHORITY SECTION:
google.com.             172799  IN      NS      ns2.google.com.
google.com.             172799  IN      NS      ns1.google.com.
google.com.             172799  IN      NS      ns3.google.com.
google.com.             172799  IN      NS      ns4.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.         345600  IN      A       216.239.32.10
ns2.google.com.         345600  IN      A       216.239.34.10
ns3.google.com.         345600  IN      A       216.239.36.10
ns4.google.com.         345600  IN      A       216.239.38.10

;; Query time: 1784 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Jan 24 20:31:15 2011
;; MSG SIZE  rcvd: 235

Ok, agora temos um servidor de DNS configurado e funcionando, esperando somente as zonas do LDAP.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Criando a chroot
   3. Montando as zonas
Outros artigos deste autor

Sincronizando Bases OpenLDAP e Active Directory

Leitura recomendada

Ansible AWX

Compiz - Janelas à 360 graus no Linux

Utilizando GNU/Autotools em Projetos

Instalação e configuração do QEMU + AQEMU no Slackware

Usando o start-stop-daemon no Slackware

  
Comentários
[1] Comentário enviado por rrossilva em 17/02/2011 - 16:02h

Seu artigo apareceu na hora certa meu caro. Estava procurando uma solução assim para um servidor de DNS novo que estou montando. Vou instalar tudo amanhã de manhã junto com meu server de hospedagem novo e posto um feedback aqui.
Parabéns pelo artigo...

[2] Comentário enviado por removido em 17/02/2011 - 16:31h

Muito bom artigo. Legal mesmo !


Abraço.

[3] Comentário enviado por rogeriojlle em 17/02/2011 - 20:46h

"O bind dos repositórios não vem com suporte ao LDAP"
No Opensuse o Bind conversa com o LDAP, voce inclusive configura tudo vai YasT.

[4] Comentário enviado por grandmaster em 23/02/2011 - 08:05h

Muito bom o artigo.
---
Renato de Castro Henriques
CobiT Foundation 4.1 Certified ID: 90391725
ITILv3 Foundation Certified
http://www.renato.henriques.nom.br


[5] Comentário enviado por dexter25 em 11/01/2012 - 17:17h

Olá, Evandro

Primeiramente, parabéns pelo artigo, realmente muito bom.

E se você puder, gostaria de tirar uma dúvida, estou configurando pela primeira vez um servidor DNS, fiz toda configuração padrão, mais quando vou tentar dar um restart ou stop no bind, ele me devolve esse erro :

* Stopping domain name service... bind9 rndc: connect failed: 127.0.0.1#953: connection refused


Segui o seu tutorial, gerei as chaves, coloquei no arquivo rndc, mais se eu coloco as opções options e server, ele reclama, só aceitando o key "rndckey" , mais somente com ele, continua dando erro.

Se puder me ajudar, agradeço demais.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts