Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Configurando BIND 9 + chroot sem mistérios

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Artigo Configurando BIND 9 + chroot sem mistérios

    Cansado de procurar como fazer uma coisa tão baba como esta e não encontrar? Acabou seu martírio, este artigo ensina como fazer configurar seu servidor DNS.
    Por: MARCOLINO Alexandre de Jesus

    Introdução
    Este documento surgiu a partir de minhas incursões na WEB para conseguir configurar um DNS server direito, ou seja, estava cansado de informações desencontradas obtidas em lista de discussão ou de manuais obscuros que ensinavam tudo menos como começar. :-)

    O documento salvador foi obtido em:

    * Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

    Este documento é a principal base para este que estou escrevendo. O autor é o sr. Steve Friedl.

    Obrigado meu Deus pela existência da Internet e seus milhões de zilhões de usuários !

    Vamos parar de encher lingüiça e vamos ao trabalho !

    O ambiente

    Um Intel Pentium III 800 Mhz, 512 MB Ram rodando Slackware Linux 8.0 turbinado pela atualização do kernel para 2.4.20, biblioteca Openssl 0.9.7. Não tive coragem de atualizar o compilador C, que foi o gcc 2.95.3 20010315 .

    Os downloads.

    Para a compilação do bind, baixei a versão 9.2.1 em:

    * Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

    Compilando o BIND
    Após o download, fiz lá meus procedimentos padrão para a compilação do bind.

    cd /usr/local/src
    tar xzfv /root/bind-9.2.1.tar.gz
    cd bind-9.2.1


    As diretivas de compilação que eu utilizei foram executadas todas como root. Como a máquina ainda não estava em rede, isso é tranqüilo. Antes deste procedimento eu baixei e instalei a última versão da openssl e instalei em /usr/loca/openssl.

    ./configure --with-openssl=/usr/local/openssl --disable-ipv6 --disable-threads --prefix=/usr/local

    Onde:

    * --with-openssl: Indica que as bibliotecas openssl estão no endereço indicado. Apenas se você for usar DNSSEC (não explico como fazer neste documento)
    * --disable-ipv6: Remove o suporte a Ipv6
    * --disable-threads: Remove o suporte a multithread, isto é o ideal em sistemas de apenas 1 processador.
    * --prefix: Determina o local da instalação dos binários do bind.

    Após isso, vamos makear e instalar.

    ./make
    ./make install


    OBS: Normalmente as distribuições mandam uma versão do bind pré-instalado. Desinstale esta versão antes de instalar a que está compilada. Isto evitará alguma dor de cabeça. ;-)

    Tudo instalado, agora vamos ENGAIOLAR !
    Isso mesmo, vamos engaiolar o bind. Devido ao sua larga utilização na internet, o Bind também é sujeito à detecção de falhas por hackers que ficam o dia inteiro tentando detonar a rede dos outros. Por conta disto se inventou um jeito de limitar o acesso de um determinado serviço dentro do servidor que é chamado de chroot.

    Este sistema tem o objetivo de criar um mini-ambiente contendo apenas o necessário para aquele executável rodar com o propósito de minimizar uma possível invasão ao servidor. Este conceito chama-se Jail ( engaiolar mesmo ) o serviço.

    Para começar, vamos aos passos para a criação da Gaiola ! Tudo continua sendo executado como root.

    Criando usuário e grupo

    groupadd named
    useradd -g named -d /chroot/named -s /bin/true named
    passwd -l named # Comentário - Isto bloqueia (lock ) a conta para login.


    Removendo qualquer configuração de bind que exista

    rm -rf /chroot/named

    Criando a Gaiola

    mkdir -p /chroot/named
    cd /chroot/named


    Criando os diretório filhos


    mkdir dev
    mkdir etc
    mkdir logs
    mkdir -p var/run
    mkdir - p conf/secondaries


    Criando os devices

    mknod dev/null c 1 3
    mknod dev/zero c 1 5
    mknod dev/random c 1 8


    Copiando o arquivo de Timezone


    cp /etc/localtime etc

    Construindo os arquivos de configuração
    Vamos começar pelo arquivo named.conf. Ele é o principal arquivo de configuração do bind e aqui apresentaremos sua configuração passo-a-passo para um simples servidor secundário ( DNS SLAVE ). Para começar apresentaremos um simples arquivo de configuração que permitirá ao seu servidor atuar como um Cache Server de requisições de DNS.

    A partir deste arquivo estaremos incrementando ele até que este se torne um servidor secundário.

    O arquivo named.conf deve estar dentro do diretório etc dentro da gaiola. Isto significa que devemos criá-lo em /chroot/named/etc. Para facilitar sua administração, recomendo que você crie um link simbólico em /etc apontando para ele.

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

    Bom agora edite o arquivo /chroot/named/etc/named.conf e escreva as linhas abaixo OK.

    Código:
    options {
       directory       "/conf";
       pid-file        "/var/run/named.pid";
       statistics-file "/var/run/named.stats";
       dump-file       "/var/run/named.db";
    
       # hide our "real" version number
       version         "[secured]";
    };
    
    # The root nameservers
    zone "." {
       type   hint;
       file   "db.rootcache";
    };
    
    # localhost - forward zone
    zone   "localhost" {
       type    master;
       file   "db.localhost";
       notify  no;
    };
    
    # localhost - inverse zone
    zone    "0.0.127.in-addr.arpa" {
       type   master;
       file   "db.127.0.0";
       notify no;
    };
    ATENÇÃO: O directory é /conf mesmo e não /chroot/named/conf. Nossa intenção é engaiolar o named e por isso sua raiz e o /chroot/named.

    O arquivo de configuração se refere a três arquivos adicionais:

    * db.rootcache
    * db.localhost
    * db.127.0.0

    Todos eles precisam ser criados em /chroot/named/conf.

    O arquivo db.rootcache se refere à lista dos servidores de dns que compõem a rede de "root server", isto é, que possuem o cache para se chegar a qualquer outro IP do planeta. Cria-se este arquivo normalmente de forma automática consultando-os diretamente.

    Se sua maquina aponta para algum servidor de DNS válido na Internet (vide o /etc/resolv.conf), você consegue criar este arquivo com o comando:

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

    Os arquivos db.localhost e db.127.0.0 você terá que criar na unha mesmo. Abaixo as listagens para você copiar.

    Código:
    ;
    ; 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
    
    
    
    ;
    ; 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.
    Estes arquivos só precisam ser criados uma vez.

    Verificando as permissões dentro da gaiola
    Agora que nós já criamos os arquivos necessários dentro da gaiola, precisamos garantir que as permissões de acesso e os donos dos arquivos estejam acertados para perfeito funcionamento dentro da gaiola. É possível fazer isto na mão, mas imagine: cada vez que você alterar alguma coisa vai ter que checar tudo de novo. Se esquecer apenas uma coisa, todo esforco irá pelo ralo.

    Por causa disso, normalmente criamos um arquivo que contém as regras de permissões na raiz em /chroot para cada gaiola que criamos, assim fica menos fácil de errar alguma coisa. Em nosso caso, chamaremos o arquivo de named.perms e o colocaremos em /chroot.

    Abaixo uma listagem com os comandos para manter nossa gaiola em dia.

    Código:
    #
    # named.perms
    #
    # Configura os donos e as devidas permissões dentro do diretório named
    #
    
    cd /chroot/named
    
    
    # Por padrão, root é o dono de tudo e apenas ele pode gravar, mas os diretórios
    # tem execução para todos. Note que algumas plataformas usam como
    # marcador/separador um ponto entre usuário/grupo nos parâmetros do chown}
    
    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
    
    # os arquivos named.conf e rndc.conf precisam ter suas chaves protegidas
    chmod o= etc/*.conf
    
    # o diretório secondaries cria arquivos dinamicamente a partir dos
    # servidores de DNS Master e o daemon named precisa de poderes para gravar ali
    # afim de criar os arquivos das zonas.
    
    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/
    
    # Garante que a criação do arquivo de PID em var/run seja efetivado
    chown root.root var/
    chmod u=rwx,og=x var/
    
    chown root.named var/run/
    chmod ug=rwx,o=rx var/run/
    
    # Permite que o daemon named crie sossegado seus arquivos de log.
    chown root.named logs/
    chmod ug=rwx,o=rx logs/
    Após gravar os arquivo, você deve executá-lo com a seguinte linha de comando:

    sh -x /chroot/named.perms

    A saída vai se parecer com isso :

    + 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/

    Algumas considerações podem ser importantes:

    1. Nós não estamos limpando os diretórios etc/ e conf/ pois acreditamos que fazer isso manualmente contribui para que você mantenha seu sistema mais seguro já que cada arquivo nestes diretórios merecem uma atenção especial.
    2. O diretório conf/secondaries recebe arquivos gerados a partir do servidor de DNS MASTER e será constantemente alterado dinamicamente. Por isso ele possui direitos de gravação.

    Agora o mais importante é que o nameserver não possa ter modificados seus arquivos master, pois se alguma vulnerabilidade existir com relação ao bind isto poderá ser FATAL!
    3. Em etc/named.conf e etc/rndc.conf estão o segredo do servidor bind. É imprescindível que estes arquivos não possam ser alterados remotamente.

    Inicializando o servidor NAMED
    O script abaixo automatiza o processo de start do servidor.

    Código:
    #
    # named.start
    #
    # ATENÇÃO - O Path possui o parâmetro -c relacionado
    # com a raiz da gaiola e não com a raiz do sistema.
    #
    # Adicione "-n2" se você tiver múltiplos processadores
    #
    # uso: named [-c conffile] [-d debuglevel] [-f|-g] [-n number_of_cpus]
    # [-p port] [-s] [-t chrootdir] [-u username]
    
    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
    Agora transformamos este arquivo em um executável com:

    chmod a+x /chroot/named.start

    E executamos o seguinte para inicializar o servidor.

    sh /chroot/named.start

    Se tudo der certo o DNS SERVER estará rodando. Com o comando:

    ps -fCnamed


    você poderá verificar se ele está rodando. Você pode testar se ele está funcionando com o comando dig. Não se esqueça de alterar /etc/resolv.conf para apontar para este servidor !

    Controlando o daemon com rndc
    O comando rndc é o substituto do antigo ndc e tem uma funcionalidade a mais: ao invés de usar um socket Unix para controlar o daemon ele utiliza um socket TCP possibilitando então o controle remoto do daemon. Como conseqüência, o uso de criptografia e chaves e inevitável.

    Sua configuração também não é das mais fáceis. Abaixo a listagem do arquivo etc/rndc.conf

    Código:
    #
    # /chroot/named/etc/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 "secret key here";
    };
    Como em named.conf, o formato é muito peculiar e requer que todos os tabs estejam no lugar certo. Neste arquivo, o marcador ``rndckey'' é exatamente o que o nome sugere: a chave.

    Basicamente o que você precisa saber é que no lugar onde está o parâmetro secret você deve incluir entre aspas a chave que nós iremos gerar. ESTE É O SEGREDO !

    Vamos gera a chave agora.

    cd /chroot/named/etc
    /usr/local/sbin/dnssec-keygen -a HMAC-MD5 -b 256 -n HOST rndc

    Krndc.+157+13856

    cat Krndc.+157+13856.private
    Private-key-format: v1.2
    Algorithm: 157 (HMAC_MD5)
    Key: hU9utBAdP6/dVKKfxOlv0bPOTnAd4A1qosMbs/dwVJI=

    ...


    Pegue a string gerada após a palavra key e copie ela no arquivo rndc.conf, no marcador rndckey após o parâmetro secret entre aspas.

    Após ter feito isso, por segurança vamos DELETAR o arquivo com a chave.

    rm Krndc.+157+13856.*

    Agora vamos fazer um link simbólico para o arquivo rndc.conf para facilitar a administração e o rndc.conf funcionar adequadamente.

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

    Agora, o DNS Server precisa ser configurado para ser controlado pelo rndc. Vamos editar novamente o arquivo /chroot/named/etc/name.conf para adicionar as seções responsáveis por esta habilidade. Não se esqueça de copiar sua própria chave no lugar onde está o secret neste arquivo também.

    Código:
    controls {
        inet 127.0.0.1 allow { 127.0.0.1; } keys { rndckey; };
    };
    
    key "rndckey" {
        algorithm "hmac-md5";
        secret "hU9utBAdP6/dVKKfxOlv0bPOTnAd4A1qosMbs/dwVJI=";
    };
    As seções control e key devem estar no começo do arquivo de configuração.

    O arquivo acima permite que apenas a interface localhost escute e aceite instruções do rndc. É possível contudo que qualquer interface escute este comando para que a administração do named seja remota. Como consideramos isto inseguro demais, preferimos manter as coisas como estão.

    Agora que tudo esta configuradinho, vamos restartar o processo do named...

    killall -HUP named

    Vamos testar se o rndc esta funcionando ...

    rndc status
    number of zones: 2
    debug level: 0
    xfers running: 0
    xfers deferred: 0
    soa queries in progress: 0
    query logging is OFF
    server is up and running

    Isto indica que esta tudo OK !

    Inicializando o named quando a máquina da BOOT !!!

    Agora que o named está rodando legalzinho, que tal parar com este negócio de startar na unha...

    Deixa de brincadeiras e vamos ao que interessa. Abaixo um script chamado de rc.named para você usar em seu linux para startar, reiniciar e parar o serviço.

    Código:
    #!/bin/sh
    #
    # rc.named
    #
    
    export PATH=/usr/local/sbin:$PATH # needed for rndc
    
    case "$1" in
    start)
        # Start daemons.
        echo -n "Starting named: "
        sh /chroot/named.start
        echo
        ;;
    stop)
        # Stop daemons.
        echo -n "Shutting down named: "
        rndc stop
        echo "done"
        ;;
    esac
    
    exit 0
    Vamos permitir que o script acima seja executável OK.

    chmod a+x rc.named

    Consideracões finais
    Bom, acho que é isso. Se você chegou até aqui, certamente tem seu servidor de DNS funcionando. Um bom material de consulta agora para você seria o manual que acompanha o ISC-Bind 9 que pode ser baixado em formato PDF de:

    * Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

    Fonte: VivaoLinux
    Postado Por: RedDeviL

X
Working...
X