Autor: Koji
Data: 03/09/2001

Chroot em BIND 8.X

1. Introdução
2. chroot ?
3. Preparativos antes de começar
4. Compilando e configurando
5. Parcheando o ndc
6. Ultimos ajustes
7. Despedida

Configuração provada em FreeBSD 4.3 + BIND 8.2.3 

1. Introdução

Leste articulo vai destinado para aquelas pessoas que usam FreeBSD e que desejam obter algo mas de segurança em sua BIND. 
Durante todo o articulo se assume que o servo de nomes esta corretamente configurado e funcionando, assim que se só procuras configurar um servo de nomes este articulo não é para ti.

Há várias possibilidades à hora de configurar um meio chroot para o BIND, este articulo explica uma delas, concretamente a de como configurar um meio chroot usando um BIND compilado estaticamente. Não tenho nenhuma preferência por usar um BIND estático ou dinamico, simplesmente escolhi uma delas para que todo seja mas curto e claro.

Parto da base do BIND que incorpora FreeBSD em seu sistema base e de sua configuração por defeito. Se tens instalando posteriormente outro BIND mediante os ports ou compilandolo a mão, a informação que leias a continuação não pode ser do todo válida para ti.

Antes de começar assumo que:

  1. Tens o CD de FreeBSD com suas fontes ou ao menos as tens instaladas

  2. O diretório de trabalho de teu BIND é /etc/namedb (é o que vem por defeito)

  3. Tens conhecimentos básicos do significado de estático , dinamico, libreria etc.

Durante todo o documento me referirei aos arquivos mediante sua rota absoluta para que não tenha confusões e fique todo mas claro.

2. chroot ?

Podemos definir chroot como uma chamada ao sistema que permite configurar um diretório como raiz ("/") do sistema de ficheros para um processo e seus filhos.
Por exemplo, e em nosso caso, se configuramos o chroot sob /etc/namedb/chroot o BIND não poderá aceder a nenhum arquivo nem diretório que esteja por debaixo do diretório chroot.

Cuales são as vantagens de todo isto?
A maior vantagem é a de incrementar a segurança de nosso BIND. Se se desse alguma vulnerabilidade e alguma pessoa maliciosa conseguisse explodí-la tão só se poderia apoderar do diretório chroot, ficando a salvo o resto do sistema

Cuales são as desvantagens de todo isto?
Não muitas. A mas significativa é a de ter que tocar a configuração do BIND para que trabalhe no diretório chroot, copiando assim todos os arquivos especiais e configuração que precise para funcionar corretamente.

3. Preparativos antes de começar

Tão só precisaremos duas coisas para configurar o chroot em nosso FreeBSD: os sources e decidir onde colocaremos os binários e a configuração correspondente de nosso BIND.

Verdade é, que FreeBSD traz já o BIND em seu sistema base compilado e pronto para ser configurado, mas o que incorpora esta compilado dinamicamente, é por isso que deveremos de voltar a compilá-lo adicionando algumas opções de mas para que seja estático.

Para instalar as fontes (assegurai-vos antes de que não as tendes instaladas olhando em usr //src) tão só temos que executar /stand/sysinstall e ir ao menu Configure / Distributions onde marcaremos a seção src. Para não complicar a coisa elegeremos a opção All e selecionaremos o meio (normalmente CDROM). Isto instalará todas as fontes. 

*NOTA PARA Os QUE VÃO ESCASSOS EM MEGAS*:  Em princípio não faz defeituosa instalar todas as fontes. Se vais justo de megas seleciona as seções: contrib, libexec e usbin Essas seções deveriam bastar *

Agora que já temos as fontes necessárias elegeremos um diretório que será onde façamos o chroot. Eu durante todo o articulo vou usar como exemplo o diretório /etc/namedb/chroot vocês mudai-o a onde mas vos goste. Em princípio tanto dá onde o ubiquéis, assim que uma vez que o tenhais decidido creiamos os diretórios onde estarão os binários, configuração, etc.

mkdir /etc/namedb/chroot 
mkdir /etc/namedb/chroot/etc 
mkdir /etc/namedb/chroot/etc/namedb 
mkdir /etc/namedb/chroot/usr 
mkdir /etc/namedb/chroot/usr/sbin 
mkdir /etc/namedb/chroot/usr/libexec 
mkdir /etc/namedb/chroot/dev 
mkdir /etc/namedb/chroot/var 
mkdir /etc/namedb/chroot/var/run

mkdir /etc/namedb/chroot/etc/namedb/domínios

Este ultimo diretório faz referência ao diretório ou diretórios onde tenho a configuração de todos meus domínios, isto está especificado no /etc/namedb/named.conf para cada domínio:

%[...] 
zone "eldemonio.org" { type master; file "domínios/eldemonio.org";
 
%[...]

4. Compilando e configurando

Para compilar o BIND estaticamente faremos o seguinte:

cd /usr/src/usr.sbin/named
make NOMAN=YES NOSHARED=YES NOPROFILE=YES BINDIR=/etc/namedb/chroot/usr/sbin clean all install

cd /usr/src/libexec/named-xfer
make NOMAN=YES NOSHARED=YES NOPROFILE=YES BINDIR=/etc/namedb/chroot/usr/libexec clean all install

Todo isto instalasse os binários named e named-xfer estaticamente no diretório indicado e sem as paginas man. (já as temos)

Podeis fazer uma prova singela para ver se todo marcha corretamente já que chegados a este ponto temos o BIND que instala FreeBSD por defeito em usr //sbin/named (dinâmico) e o que nós compilámos que esta situado em etc //namedb/chroot/usr/sbin/named (estático). Para confirmar todo isto podemos teclear o seguinte:

ldd /usr/sbin/named /usr/libexec/named-xfer
/usr/sbin/named: libc.so.4 => /usr/lib/libc.so.4 (0x280dd000)
/usr/libexec/named-xfer: libc.so.4 => /usr/lib/libc.so.4 (0x2809c000)

(Depende de livrarias)

ldd /etc/namedb/chroot/usr/sbin/named /etc/namedb/chroot/usr/libexec/named-xfer
ldd: /etc/namedb/chroot/usr/sbin/named: not a dynamic executable
ldd: /etc/namedb/chroot/usr/libexec/named-xfer: not a dynamic executable

(Não depende de livrarias)

Mesmo falta copiar todos os arquivos de configuração do named e nossos domínios, em meu caso faço o seguinte:

cd /etc/namedb
cp -p localhost.rev named.conf named.root /etc/namedb/chroot/etc/namedb
cp -pr domínios /etc/namedb/chroot/etc/namedb

Nosso BIND correrá com o usuário e o grupo bind (menos privilégios que root, é dizer, maior segurança). FreeBSD vem por defeito com o usuário e grupo criado, mas nunca esta de mas comprová-lo:

grep bind /etc/passwd /etc/group
/etc/passwd:bind:*:53:53:Bind Sandbox:/:/sbin/nologin
/etc/group:bind:*:53:

Se os possuímos só fica dar os privilégios necessários:

chown bind:bind /etc/namedb/chroot/etc/namedb/domínios
chmod 750 /etc/namedb/chroot/etc/namedb/domínios

named também precisa o device null e o arquivo localtime para logear com a hora correta se fizéssemos uso de syslogd :

cd /etc/namedb/chroot/dev
mknod null c 2 2.
cp -p /etc/localtime /etc/namedb/chroot/etc

5. Parcheando o ndc

BIND traz uns scripts  para facilitar-nos a tarefa do reiniciado do named (/usr/sbin/named.reload e /usr/sbin/named.restart). Estes scripts fazem uso do programa ndc o qual serve para realizar muitas operações relacionadas com o named. No entanto este programa esta compilado para trabalhar nos diretórios /var/run /usr/sbin etc. Para poupar-nos a pesada faena de ir editando arquivos e compilar de novo o ndc faremos um pequeno parche para que possamos usá-lo em nosso diretório chroot.

Primeiro renombramos o original ndc a ndc .real

mv /usr/sbin/ndc /usr/sbin/ndc.real

Agora criaremos o arquivo /usr/sbin/ndc com o seguinte conteúdo:

#!/bin/sh 
exec ndc.real -c /etc/namedb/chroot/var/run/ndc "$@"

Só fica dar-lhe permissões de execução:

chmod 555 /usr/sbin/ndc

6. Ultimos ajustes

Temos que modificar ligeiramente nosso /etc/rc.conf para que comece a funcionar nosso named em chroot, assim que TODAS as opções referentes
ao BIND ficassem assim:

named_enable="YES"
named_program="/etc/namedb/chroot/usr/sbin/named"
named_flags="-ou bind -g bind -t /etc/namedb/chroot"
syslogd_flags="-s -l /etc/namedb/chroot/dev/log"

Como veis estamos indicando que o programa named (o estático) esta em etc //namedb/chroot/usr/sbin/named
Também indicámos que named se execute com privilégios de usuário e grupo bind e lhe passámos o diretório chroot com o parametro -t.
Por ultimo a linha referente a syslogd criará um arquivo especial chamado /etc/namedb/chroot/var/run/log que servirá para logear as ações do named através do syslogd. Se quereis guardar estes logs tão só temos que tocar ligeiramente o /etc/syslog.conf com a linha:

!named                                                                                                               
*.*                                                     /var/log/named

Assegurai-vos  de criar o arquivo /var/log/named antes de fazer o reboot

E agora já por fim, o mas fácil, reiniciar nossa maquina :-)

7. Despedida

Pois como digo sempre, qualquer dúvida, comentário ou rectificación hacedmelo saber ;-)

koji@jet.é

Hosted by www.Geocities.ws

1