DNS – Melhorando a Segurança com o Bind

Continuando nossa saga do DNS perfeito ;-), vamos melhorar um pouco a segurança do Servidor Bind com alterações na seção de Options e fazendo o serviço ser executado enjaulado.

Temos agora um servidor funcional com separação por views, mas o serviço ainda pode ficar melhor, primeiro vamos editar o arquivo named correspondente( /etc/named.conf no Red Hat ou /etc/bind/named.conf.options no Debian) e dentro da seção options acrescentar as seguintes opções:

version “Não te interessa” ;
datasize 256M;

Assim esconderemos a versão do Bind, isso evita que descubram a versão do nosso servidor o utilizem algum exploit que explore alguma vulnerabilidade do Bind, e limita o uso de memória RAM para 256 MB para que o DNS quando em muito uso não esgote os recursos da máquina.

Vamos incrementar a segurança fazendo nosso DNS rodar em uma jaula. O concento de chroot, ou ser executado em jaula, é de que o programa ao ser executado entenda que o diretório onde ele está sendo executado é o raiz do sistema (/), assim ele “esquece” qualquer coisa que seja fora de seu diretório de funcionamento. No Red Hat podemos na instalação já colocar o Bind em chroot.

Ao configurar o Bind para funcionar em chroot no diretório /var/named:

/
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── lib32
├── lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── selinux
├── srv
├── sys
├── tmp
├── usr
└── var
    ├── bind
        ├── dev
        ├── etc
        └── var
            ├── cache
            └── run
                └── bind
                    └── run

O Bind entende que apenas do diretório /var/bind para frente é que “existe” o sistema, como ele desconsidera o resto, ainda que um atacante conseguisse derrubar o Bind e ganhasse acesso à área de memória não teria acesso ao Sistema real, apenas ao que o Bind “acreditar” ser o sistema, ou seja, apenas do /var/bind para frente.

Vamos à criação da jaula:
Primeiro vamos parar o serviço:

root # /etc/init.d/bind9 stop

Depois edite o arquivo de opções do script de inicialização, e altere a variável OPTIONS de:
OPTIONS=”-u bind”
Para:
OPTIONS=”-u bind -t /var/bind”

Agora vamos criar os diretórios que o Bind vai precisa para funcionar dentro da jaula:

root# mkdir -p /var/bind/{dev,etc,var/{cache,run/bind/run}}

Criados os diretórios devemos mover as configurações que temos dentro do /etc e do /var/cache para o diretório da jaula:
root# mv /etc/bind /var/bind/etc
root# mv /var/cache/bind /var/bind/var/cache/

Para continuar a manter o DNS nos mesmos diretórios que usávamos antes, vamos criar links simbólicos para que os novos diretórios com os nomes dos diretórios antigos:
root# ln -s /var/bind/etc/bind /etc/bind
root# ln -s /var/bind/var/cache/bind /var/cache/bind

Agora vamos criar os dispositivos do dev para que o Bind possa descartar informações (/dev/null) e sobrescrever dados com caracteres aleatórios (/dev/random):
root# mknod /var/bind/dev/null c 1 3
root# mknod /var/bind/dev/random c 1 8

Agora vamos corrigir as permissões e as propriedades dos diretórios para o usuário e grupo bind:
chmod 666 /var/bind/dev/null /var/bind/dev/random
chown -R bind:bind /var/bind/var/*
chown -R bind:bind /var/bind/etc/bind

Basta agora que editemos o servidor de Log para que possa capturar os logs gerados pelo Bind, já que mudamos o diretório de funcionamento do serviço ele não usa mais o /dev/log, usa agora o /var/bind/dev/log. Edite o arquivo /etc/rsyslog.conf e coloque esta linha abaixo da linha $ModLoad imuxsock:

$imuxsock /var/bind/dev/log

Feito isso basta reiniciar os serviços:
root# /etc/init.d/rsyslog restart
root# /etc/init.d/bind9 restart

Pronto temos agora um servidor que roda isolado no sistema, assim ele vai ser mais seguro mesmo em caso de ataques ou invasões pelo serviço.

Continuem comentando e votando em nosso Portal.

  • Junior

    Vagner, fiz o que vc informou e no log está aparecendo o seguinte:

    rsyslogd: the last error occured in /etc/rsyslog.conf, line 12:”$imuxsock /var/lib/named/dev/log”

    rsyslogd-2124: CONFIG ERROR: could not interpret master config file ‘/etc/rsyslog.conf’. [try http://www.rsyslog.com/e/2124 ]

    Já verifiquei 2x as configurações
    Obrigado
    Junior

    • Junior

      Vagner, se não for pedir muito, teria como postar um zip com os arquivos de todas as aulas, tem alguns passos que eu estou tendo problemas e queria conferir com o seu.

    • Tem um erro no artigo nesse caminho de arquivo.

      O correto é $imuxsock /var/bind/dev/log

  • Junior

    Vagner, ainda está com erro:
    rsyslogd: the last error occured in /etc/rsyslog.conf, line 12:”$imuxsock /var/bind/dev/log”
    Nov 14 11:04:43 ns1 rsyslogd-2124: CONFIG ERROR: could not interpret master config file ‘/etc/rsyslog.conf’. [try http://www.rsyslog.com/e/2124 ]

    • Junior,

      Existe essa linha descomentada no seu arquivo:

      $ModLoad imuxsock

      A linha a ser acrescentada deve estar abaixo desta.